version 1.26, 2020/01/19 18:02:00 |
version 1.27, 2020/01/20 10:37:15 |
|
|
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
|
#include <assert.h> |
#include <errno.h> |
#include <errno.h> |
#include <limits.h> |
#include <limits.h> |
#include <signal.h> |
#include <signal.h> |
Line 146 tag_put(const char *s, int prio, size_t line) |
|
Line 147 tag_put(const char *s, int prio, size_t line) |
|
size_t len; |
size_t len; |
unsigned int slot; |
unsigned int slot; |
|
|
|
assert(prio <= TAG_FALLBACK); |
if (tag_files.tfd <= 0) |
if (tag_files.tfd <= 0) |
return; |
return; |
|
|
Line 162 tag_put(const char *s, int prio, size_t line) |
|
Line 164 tag_put(const char *s, int prio, size_t line) |
|
return; |
return; |
|
|
se = s + len; |
se = s + len; |
if (*se != '\0') |
if (*se != '\0' && prio < TAG_WEAK) |
prio = INT_MAX; |
prio = TAG_WEAK; |
|
|
slot = ohash_qlookupi(&tag_data, s, &se); |
slot = ohash_qlookupi(&tag_data, s, &se); |
entry = ohash_find(&tag_data, slot); |
entry = ohash_find(&tag_data, slot); |
Line 183 tag_put(const char *s, int prio, size_t line) |
|
Line 185 tag_put(const char *s, int prio, size_t line) |
|
|
|
/* |
/* |
* Lower priority numbers take precedence, |
* Lower priority numbers take precedence, |
* but 0 is special. |
* but TAG_FALLBACK is special. |
* A tag with priority 0 is only used |
* A tag with priority TAG_FALLBACK is only used |
* if the tag occurs exactly once. |
* if the tag occurs exactly once. |
*/ |
*/ |
|
|
if (prio == 0) { |
if (prio == TAG_FALLBACK) { |
if (entry->prio == 0) |
if (entry->prio == TAG_FALLBACK) |
entry->prio = -1; |
entry->prio = TAG_DELETE; |
return; |
return; |
} |
} |
|
|
/* A better entry is already present, ignore the new one. */ |
/* A better entry is already present, ignore the new one. */ |
|
|
if (entry->prio != -1 && entry->prio < prio) |
if (entry->prio < prio) |
return; |
return; |
|
|
/* The existing entry is worse, clear it. */ |
/* The existing entry is worse, clear it. */ |
|
|
if (entry->prio == -1 || entry->prio == 0 || |
if (entry->prio > prio) |
entry->prio > prio) |
|
entry->nlines = 0; |
entry->nlines = 0; |
} |
} |
|
|
|
|
empty = 1; |
empty = 1; |
entry = ohash_first(&tag_data, &slot); |
entry = ohash_first(&tag_data, &slot); |
while (entry != NULL) { |
while (entry != NULL) { |
if (stream != NULL && entry->prio != -1) { |
if (stream != NULL && entry->prio < TAG_DELETE) { |
for (i = 0; i < entry->nlines; i++) { |
for (i = 0; i < entry->nlines; i++) { |
fprintf(stream, "%s %s %zu\n", |
fprintf(stream, "%s %s %zu\n", |
entry->s, tag_files.ofn, entry->lines[i]); |
entry->s, tag_files.ofn, entry->lines[i]); |