@@ -24,12 +24,13 @@ import unistd; // getcwd()
2424
2525type Issue struct {
2626 u32 filename; // into Issues' string pool
27- i32 line_nr;
27+ u32 line_nr;
2828 u32 msg; // index into Issues' string pool
29+ bool found;
2930}
3031
3132public type Iter struct {
32- const Issues* issues;
33+ Issues* issues;
3334 u32 idx;
3435}
3536
@@ -44,12 +45,22 @@ public fn const char* relativeFilename(const char *name) {
4445 return name;
4546}
4647
48+ public fn bool Iter.find(Iter* iter, const char* filename, u32 line_nr) {
49+ const Issues* i = iter.issues;
50+ for (; iter.more(); iter.next()) {
51+ const Issue* cur = &i.issues[iter.idx];
52+ if (cur.line_nr == line_nr && !strcmp(&i.pool[cur.filename], filename))
53+ return true;
54+ }
55+ return false;
56+ }
57+
4758public fn const char* Iter.getFilename(const Iter* iter) {
4859 const Issue* cur = &iter.issues.issues[iter.idx];
4960 return relativeFilename(&iter.issues.pool[cur.filename]);
5061}
5162
52- public fn i32 Iter.getLineNr(const Iter* iter) {
63+ public fn u32 Iter.getLineNr(const Iter* iter) {
5364 const Issue* cur = &iter.issues.issues[iter.idx];
5465 return cur.line_nr;
5566}
@@ -59,6 +70,19 @@ public fn const char* Iter.getMsg(const Iter* iter) {
5970 return &iter.issues.pool[cur.msg];
6071}
6172
73+ public fn bool Iter.getFound(const Iter* iter) {
74+ const Issue* cur = &iter.issues.issues[iter.idx];
75+ return cur.found;
76+ }
77+
78+ public fn void Iter.setFound(const Iter* iter) {
79+ Issue* cur = &iter.issues.issues[iter.idx];
80+ if (!cur.found) {
81+ cur.found = true;
82+ iter.issues.found_count++;
83+ }
84+ }
85+
6286public fn bool Iter.more(const Iter* iter) {
6387 return iter.idx < iter.issues.count;
6488}
@@ -75,6 +99,8 @@ public type Issues struct @(opaque) {
7599 char* pool;
76100 u32 pool_count;
77101 u32 pool_capacity;
102+
103+ u32 found_count;
78104}
79105
80106public fn Issues* create() {
@@ -101,12 +127,12 @@ fn void Issues.resizePool(Issues* i, u32 capacity) {
101127}
102128
103129fn u32 Issues.addPool(Issues* i, const char* text) {
104- u32 len = (u32)strlen(text) + 1; // includes 0-terminator
105- while (i.pool_count + len >= i.pool_capacity) i.resizePool(i.pool_capacity * 2);
130+ u32 size = (u32)strlen(text) + 1; // includes 0-terminator
131+ while (i.pool_count + size > i.pool_capacity) i.resizePool(i.pool_capacity * 2);
106132
107133 u32 idx = i.pool_count;
108- memcpy(i.pool + i.pool_count, text, len );
109- i.pool_count += len ;
134+ memcpy(i.pool + i.pool_count, text, size );
135+ i.pool_count += size ;
110136 return idx;
111137}
112138
@@ -125,42 +151,17 @@ public fn void Issues.add(Issues* i, const char* filename, u32 line_nr, const ch
125151
126152 Issue* cur = &i.issues[i.count];
127153 cur.filename = i.addPool(filename);
128- cur.line_nr = (i32) line_nr;
154+ cur.line_nr = line_nr;
129155 cur.msg = i.addPool(msg);
156+ cur.found = false;
130157 i.count++;
131158}
132159
133- fn void Issues.erase_idx(Issues* i, u32 idx) {
134- // Note: does not erase text from pool
135- for (u32 j = idx; j < i.count-1; j++) i.issues[j] = i.issues[j+1];
136- i.count--;
137- }
138-
139- public fn void Issues.erase(Issues* i, const char* filename, i32 line_nr) {
140- for (u32 j=0; j<i.count; j++) {
141- const Issue* cur = &i.issues[j];
142- if (cur.line_nr != line_nr) continue;
143- if (strcmp(&i.pool[cur.filename], filename) == 0) {
144- i.erase_idx(j);
145- return;
146- }
147- }
148- }
149-
150- public fn const char* Issues.find(Issues* i, const char* filename, i32 line_nr) {
151- for (u32 j=0; j<i.count; j++) {
152- const Issue* cur = &i.issues[j];
153- if (cur.line_nr != line_nr) continue;
154- if (strcmp(&i.pool[cur.filename], filename) == 0) return &i.pool[cur.msg];
155- }
156- return nil;
157- }
158-
159- public fn bool Issues.empty(const Issues* i) {
160- return i.count == 0;
160+ public fn bool Issues.allFound(const Issues* i) {
161+ return i.count == i.found_count;
161162}
162163
163- public fn Iter Issues.getIter(const Issues* i) {
164+ public fn Iter Issues.getIter(Issues* i) {
164165 Iter iter = { i, 0 }
165166 return iter;
166167}
0 commit comments