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

thoni56 / c-xrefactory / 1763

01 Apr 2026 03:04PM UTC coverage: 82.698% (+0.3%) from 82.407%
1763

push

travis-ci

thoni56
[tests][flaky] One test captured logging output which contained source line references

15658 of 18934 relevant lines covered (82.7%)

15517812.5 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) {
461,929✔
18
    buffer->allocation = (EditorBufferAllocationData){
461,929✔
19
        .bufferSize = 0, .text = NULL, .allocatedFreePrefixSize = 0,
20
        .allocatedBlock = NULL, .allocatedIndex = 0,
21
        .allocatedSize = 0};
22
    *buffer = (EditorBuffer){
461,929✔
23
        .fileName = realFileName, .fileNumber = fileNumber, .preLoadedFromFile = preLoadedFromFile,
24
        .markers = NULL, .allocation = buffer->allocation};
461,929✔
25
    buffer->modificationTime = 0;
461,929✔
26
    buffer->size = 0;
461,929✔
27
    buffer->textLoaded = false;
461,929✔
28
    assert(buffer->preLoadedFromFile == NULL || buffer->preLoadedFromFile != buffer->fileName);
461,929✔
29
}
30

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

461,929✔
40
EditorBuffer *createNewEditorBuffer(char *realFileName, char *preLoadedFromFile, time_t modificationTime,
41
                                    size_t size) {
42
    char safeFileName[MAX_FILE_NAME_SIZE];
461,929✔
43
    strcpy(safeFileName, realFileName);
461,929✔
44
    char *normalizedRealFileName = strdup(normalizeFileName_static(safeFileName, cwd));
45

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

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

56
    registerEditorBuffer(buffer);
57

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

62
    return buffer;
63
}
461,791✔
64

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

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

1✔
77
void freeEditorBuffer(EditorBuffer *buffer) {
461,791✔
78
    if (buffer == NULL)
461,791✔
79
        return;
20✔
80
    log_trace("freeing buffer %s==%s", buffer->fileName, buffer->preLoadedFromFile?buffer->preLoadedFromFile:"(null)");
81
    if (buffer->preLoadedFromFile != NULL) {
461,791✔
82
        free(buffer->preLoadedFromFile);
83
    }
461,791✔
84
    free(buffer->fileName);
85

461,791✔
86
    freeMarkersInEditorBuffer(buffer);
461,791✔
87

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

7,394✔
98
EditorBuffer *getOpenedAndLoadedEditorBuffer(char *fileName) {
7,394✔
99
    EditorBuffer *buffer = getEditorBufferForFile(fileName);
×
100
    if (buffer!=NULL && buffer->textLoaded)
101
        return buffer;
102
    return NULL;
8,601,866✔
103
}
8,601,866✔
104

105
EditorBuffer *findOrCreateAndLoadEditorBufferForFile(char *fileName) {
8,601,866✔
106
    EditorBuffer *editorBuffer = getEditorBufferForFile(fileName);
107

554,047✔
108
    if (editorBuffer != NULL && editorBuffer->textLoaded)
109
        /* Found one with text loaded, return it */
8,047,819✔
110
        return editorBuffer;
111

8,047,819✔
112
    if (editorBuffer == NULL) {
461,874✔
113
        /* No buffer found, create one unless it is a directory */
114
        if (fileExists(fileName) && !isDirectory(fileName)) {
461,874✔
115
            editorBuffer = createNewEditorBuffer(fileName, NULL, fileModificationTime(fileName),
116
                                                 fileSize(fileName));
7,585,945✔
117
            loadFileIntoEditorBuffer(editorBuffer, fileModificationTime(fileName), fileSize(fileName));
118
        } else
119
            return NULL;
461,874✔
120
    }
121

122
    return editorBuffer;
123
}
127✔
124

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

149
char *getTextInEditorBuffer(EditorBuffer *buffer) {
150
    return buffer->allocation.text;
461,933✔
151
}
461,933✔
152

153
size_t getSizeOfEditorBuffer(EditorBuffer *buffer) {
154
    return buffer->allocation.bufferSize;
461,927✔
155
}
461,927✔
156

461,927✔
157
void setSizeOfEditorBuffer(EditorBuffer *buffer, size_t size) {
158
    buffer->allocation.bufferSize = size;
515✔
159
}
515✔
160

515✔
161
void setEditorBufferModified(EditorBuffer *buffer) {
515✔
162
    buffer->modified = true;
163
    buffer->modifiedSinceLastQuasiSave = true;
4✔
164
}
165

166
void renameEditorBuffer(EditorBuffer *buffer, char *newName, EditorUndo **undo) {
4✔
167
    char newFileName[MAX_FILE_NAME_SIZE];
168

4✔
169
    strcpy(newFileName, normalizeFileName_static(newName, cwd));
4✔
170

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

4✔
180
    EditorBuffer *deregistered_original = deregisterEditorBuffer(buffer->fileName);
181
    assert(deregistered_original == buffer);
182

4✔
183
    char *oldName = buffer->fileName;
4✔
184
    buffer->fileName = strdup(newFileName);
4✔
185

186
    // Update fileNumber
4✔
187
    int newFileNumber = addFileNameToFileTable(newFileName);
4✔
188
    getFileItemWithFileNumber(newFileNumber)->isArgument = getFileItemWithFileNumber(buffer->fileNumber)->isArgument;
2✔
189
    buffer->fileNumber = newFileNumber;
2✔
190

191
    EditorBuffer *existing_buffer_with_the_new_name = getEditorBufferForFile(newFileName);
4✔
192
    if (existing_buffer_with_the_new_name != NULL) {
193
        EditorBuffer *deleted = deregisterEditorBuffer(newFileName);
194
        freeEditorBuffer(deleted);
4✔
195
    }
3✔
196
    registerEditorBuffer(buffer);
197

4✔
198
    // note undo operation
199
    if (undo!=NULL) {
200
        *undo = newUndoRename(buffer, oldName, *undo);
201
    }
202
    setEditorBufferModified(buffer);
203

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

© 2026 Coveralls, Inc