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

thoni56 / c-xrefactory / 1780

16 Apr 2026 04:42PM UTC coverage: 85.081% (+0.04%) from 85.037%
1780

push

travis-ci

thoni56
[docs] Update with focus on the 1-second bug resolution

16350 of 19217 relevant lines covered (85.08%)

15937298.7 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 "timestamp.h"
15
#include "undo.h"
16

17

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

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

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

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

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

55
    registerEditorBuffer(buffer);
56

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

61
    return buffer;
62
}
461,962✔
63

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

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

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

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

461,962✔
89
    freeMarkersInEditorBuffer(buffer);
461,962✔
90

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

7,470✔
101
EditorBuffer *getOpenedAndLoadedEditorBuffer(char *fileName) {
7,470✔
102
    EditorBuffer *buffer = getEditorBufferForFile(fileName);
103
    if (buffer!=NULL && buffer->textLoaded)
104
        return buffer;
105
    return NULL;
8,603,235✔
106
}
8,603,235✔
107

108
EditorBuffer *findOrCreateAndLoadEditorBufferForFile(char *fileName) {
8,603,235✔
109
    EditorBuffer *editorBuffer = getEditorBufferForFile(fileName);
110

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

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

125
    return editorBuffer;
126
}
133✔
127

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

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

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

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

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

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

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

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

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

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

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

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

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

22✔
209
    // finally create a buffer with old name and empty text in order
22✔
210
    // to keep information that the file is no longer existing
22✔
211
    // so old references will be removed on update (fixing problem of
22✔
212
    // of moving a package into an existing package).
213
    EditorBuffer *removed = createNewEditorBuffer(oldName, NULL, buffer->modificationTime, buffer->size);
214
    allocateNewEditorBufferTextSpace(removed, 0);
215
    removed->textLoaded = true;
216
    setEditorBufferModified(removed);
217
}
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