• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

thoni56 / c-xrefactory / 1779

16 Apr 2026 02:51PM UTC coverage: 85.037% (+1.7%) from 83.31%
1779

push

travis-ci

thoni56
[snapshot][version] Ignore snapshots with mismatching version, they will be recreated

16282 of 19147 relevant lines covered (85.04%)

15994227.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

93.91
src/editorbuffer.c
1
#include "editorbuffer.h"
2

3
#include <string.h>
4
#include <stdlib.h>
5

6
#include "commons.h"
7
#include "editor.h"
8
#include "editorbuffertable.h"
9
#include "fileio.h"
10
#include "filetable.h"
11
#include "globals.h"
12
#include "log.h"
13
#include "memory.h"
14
#include "undo.h"
15

16

17
static void fillEmptyEditorBuffer(EditorBuffer *buffer, char *realFileName, int fileNumber, char *preLoadedFromFile) {
462,061✔
18
    buffer->allocation = (EditorBufferAllocationData){
462,061✔
19
        .bufferSize = 0, .text = NULL, .allocatedFreePrefixSize = 0,
20
        .allocatedBlock = NULL, .allocatedIndex = 0,
21
        .allocatedSize = 0};
22
    *buffer = (EditorBuffer){
462,061✔
23
        .fileName = realFileName, .fileNumber = fileNumber, .preLoadedFromFile = preLoadedFromFile,
24
        .markers = NULL, .allocation = buffer->allocation};
25
    buffer->modificationTime = 0;
462,061✔
26
    buffer->size = 0;
462,061✔
27
    buffer->textLoaded = false;
462,061✔
28
    assert(buffer->preLoadedFromFile == NULL || buffer->preLoadedFromFile != buffer->fileName);
462,061✔
29
}
30

462,061✔
31
EditorBuffer *newEditorBuffer(char *realFileName, int fileNumber, char *preLoadedFromFile, FileTimestamp modificationTime,
32
                              size_t size) {
462,061✔
33
    EditorBuffer *editorBuffer = malloc(sizeof(EditorBuffer));
462,061✔
34
    fillEmptyEditorBuffer(editorBuffer, realFileName, fileNumber, preLoadedFromFile);
462,061✔
35
    editorBuffer->modificationTime = modificationTime;
462,061✔
36
    editorBuffer->size = size;
462,061✔
37
    return editorBuffer;
38
}
39

462,061✔
40
EditorBuffer *createNewEditorBuffer(char *realFileName, char *preLoadedFromFile, FileTimestamp modificationTime,
41
                                    size_t size) {
462,061✔
42
    char *normalizedRealFileName = strdup(normalizeFileName_static(realFileName, cwd));
43

462,061✔
44
    assert(preLoadedFromFile == NULL || strcmp(realFileName, preLoadedFromFile) != 0);
462,061✔
45
    char *normalizedLoadedFromFile = NULL;
47✔
46
    if (preLoadedFromFile != NULL) {
47✔
47
        normalizedLoadedFromFile = normalizeFileName_static(preLoadedFromFile, cwd);
48
        normalizedLoadedFromFile = strdup(normalizedLoadedFromFile);
49
    }
462,061✔
50

462,108✔
51
    EditorBuffer *buffer = newEditorBuffer(normalizedRealFileName, 0, normalizedLoadedFromFile, modificationTime, size);
52
    log_trace("created buffer '%s'('%s')", buffer->fileName, buffer->preLoadedFromFile?buffer->preLoadedFromFile:"(null)");
462,061✔
53

54
    registerEditorBuffer(buffer);
55

56
    // set fileNumber last, because, addfiletabitem calls back the statb
462,061✔
57
    // from editor, so be tip-top at this moment!
58
    buffer->fileNumber = addFileNameToFileTable(normalizedRealFileName);
462,061✔
59

60
    return buffer;
61
}
461,908✔
62

461,908✔
63
static void checkForMagicMarker(EditorBufferAllocationData *allocation) {
64
    assert(allocation->allocatedBlock[allocation->allocatedSize] == 0x3b);
461,908✔
65
}
461,908✔
66

×
67
static void freeMarkersInEditorBuffer(EditorBuffer *buffer) {
×
68
    for (EditorMarker *marker = buffer->markers; marker != NULL;) {
×
69
        EditorMarker *next = marker->next;
70
        free(marker);
461,908✔
71
        marker = next;
72
    }
463,407✔
73
}
463,407✔
74

75
bool isPreloaded(EditorBuffer *buffer) {
76
    return buffer != NULL && buffer->preLoadedFromFile != NULL;
461,909✔
77
}
461,909✔
78

79
void freeEditorBuffer(EditorBuffer *buffer) {
461,928✔
80
    if (buffer == NULL)
461,908✔
81
        return;
20✔
82
    log_trace("freeing buffer %s==%s", buffer->fileName, buffer->preLoadedFromFile?buffer->preLoadedFromFile:"(null)");
83
    if (isPreloaded(buffer)) {
461,908✔
84
        free(buffer->preLoadedFromFile);
85
    }
461,908✔
86
    free(buffer->fileName);
87

461,908✔
88
    freeMarkersInEditorBuffer(buffer);
461,908✔
89

90
    if (buffer->textLoaded) {
461,908✔
91
        log_trace("freeing allocated block 0x%x of size %d", buffer->allocation.allocatedBlock,
461,908✔
92
                  buffer->allocation.allocatedSize);
93
        checkForMagicMarker(&buffer->allocation);
94
        freeTextSpace(buffer->allocation.allocatedBlock,
461,908✔
95
                      buffer->allocation.allocatedIndex);
96
    }
97
    free(buffer);
7,466✔
98
}
7,466✔
99

7,466✔
100
EditorBuffer *getOpenedAndLoadedEditorBuffer(char *fileName) {
7,466✔
101
    EditorBuffer *buffer = getEditorBufferForFile(fileName);
102
    if (buffer!=NULL && buffer->textLoaded)
103
        return buffer;
104
    return NULL;
8,602,978✔
105
}
8,602,978✔
106

107
EditorBuffer *findOrCreateAndLoadEditorBufferForFile(char *fileName) {
8,602,978✔
108
    EditorBuffer *editorBuffer = getEditorBufferForFile(fileName);
109

110
    if (editorBuffer != NULL && editorBuffer->textLoaded)
111
        /* Found one with text loaded, return it */
8,048,681✔
112
        return editorBuffer;
113

8,048,681✔
114
    if (editorBuffer == NULL) {
461,988✔
115
        /* No buffer found, create one unless it is a directory */
116
        if (fileExists(fileName) && !isDirectory(fileName)) {
461,988✔
117
            editorBuffer = createNewEditorBuffer(fileName, NULL, fileModificationTime(fileName),
118
                                                 fileSize(fileName));
7,586,693✔
119
            loadFileIntoEditorBuffer(editorBuffer, fileModificationTime(fileName), fileSize(fileName));
120
        } else
121
            return NULL;
122
    }
123

124
    return editorBuffer;
125
}
133✔
126

133✔
127
// Only used from Options for preload
133✔
128
EditorBuffer *openEditorBufferFromPreload(char *fileName, char *preLoadedFromFile) {
86✔
129
    EditorBuffer *buffer = getEditorBufferForFile(fileName);
86✔
130
    if (buffer != NULL) {
77✔
131
        FileTimestamp incomingMtime = fileModificationTime(preLoadedFromFile);
77✔
132
        if (incomingMtime == buffer->modificationTime) {
77✔
133
            log_debug("Preload '%s': unchanged (mtime %ld), keeping existing buffer", fileName, (long)incomingMtime);
134
            buffer->preloadedThisRequest = true;
9✔
135
            return buffer;
136
        }
9✔
137
        log_debug("Preload '%s': content changed (mtime %ld -> %ld), reloading", fileName,
9✔
138
                  (long)buffer->modificationTime, (long)incomingMtime);
9✔
139
        free(buffer->preLoadedFromFile);
9✔
140
        buffer->preLoadedFromFile = strdup(normalizeFileName_static(preLoadedFromFile, cwd));
9✔
141
        loadFileIntoEditorBuffer(buffer, incomingMtime, fileSize(preLoadedFromFile));
142
        buffer->preloadedThisRequest = true;
47✔
143
        return buffer;
144
    }
47✔
145
    buffer = createNewEditorBuffer(fileName, preLoadedFromFile, fileModificationTime(preLoadedFromFile),
47✔
146
                                   fileSize(preLoadedFromFile));
147
    buffer->preloadedThisRequest = true;
148
    return buffer;
462,044✔
149
}
462,044✔
150

151
char *getTextInEditorBuffer(EditorBuffer *buffer) {
152
    return buffer->allocation.text;
462,050✔
153
}
462,050✔
154

155
size_t getSizeOfEditorBuffer(EditorBuffer *buffer) {
156
    return buffer->allocation.bufferSize;
462,044✔
157
}
462,044✔
158

462,044✔
159
void setSizeOfEditorBuffer(EditorBuffer *buffer, size_t size) {
160
    buffer->allocation.bufferSize = size;
581✔
161
}
581✔
162

581✔
163
void setEditorBufferModified(EditorBuffer *buffer) {
581✔
164
    buffer->modified = true;
165
    buffer->modifiedSinceLastQuasiSave = true;
22✔
166
}
22✔
167

168
void renameEditorBuffer(EditorBuffer *buffer, char *newName, EditorUndo **undo) {
22✔
169
    char newFileName[MAX_FILE_NAME_SIZE];
170

22✔
171
    strcpy(newFileName, normalizeFileName_static(newName, cwd));
22✔
172

×
173
    EditorBuffer *existing_buffer = getEditorBufferForFile(buffer->fileName);
×
174
    if (existing_buffer == NULL) {
×
175
        char tmpBuffer[TMP_BUFF_SIZE];
×
176
        sprintf(tmpBuffer, "Trying to rename non existing buffer %s", buffer->fileName);
177
        errorMessage(ERR_INTERNAL, tmpBuffer);
178
        return;
22✔
179
    }
180
    assert(existing_buffer == buffer);
22✔
181

22✔
182
    EditorBuffer *deregistered_original = deregisterEditorBuffer(buffer->fileName);
183
    assert(deregistered_original == buffer);
184

22✔
185
    char *oldName = buffer->fileName;
22✔
186
    buffer->fileName = strdup(newFileName);
22✔
187

22✔
188
    // Update fileNumber — mark old entry as deleted since the file is being renamed
22✔
189
    int oldFileNumber = buffer->fileNumber;
190
    int newFileNumber = addFileNameToFileTable(newFileName);
22✔
191
    getFileItemWithFileNumber(newFileNumber)->isArgument = getFileItemWithFileNumber(oldFileNumber)->isArgument;
22✔
192
    markFileAsDeleted(oldFileNumber);
14✔
193
    buffer->fileNumber = newFileNumber;
14✔
194

195
    EditorBuffer *existing_buffer_with_the_new_name = getEditorBufferForFile(newFileName);
22✔
196
    if (existing_buffer_with_the_new_name != NULL) {
197
        EditorBuffer *deleted = deregisterEditorBuffer(newFileName);
198
        freeEditorBuffer(deleted);
22✔
199
    }
15✔
200
    registerEditorBuffer(buffer);
201

22✔
202
    // note undo operation
203
    if (undo!=NULL) {
204
        *undo = newUndoRename(buffer, oldName, *undo);
205
    }
206
    setEditorBufferModified(buffer);
207

22✔
208
    // finally create a buffer with old name and empty text in order
22✔
209
    // to keep information that the file is no longer existing
22✔
210
    // so old references will be removed on update (fixing problem of
22✔
211
    // of moving a package into an existing package).
212
    EditorBuffer *removed = createNewEditorBuffer(oldName, NULL, buffer->modificationTime, buffer->size);
213
    allocateNewEditorBufferTextSpace(removed, 0);
214
    removed->textLoaded = true;
215
    setEditorBufferModified(removed);
216
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc