~mdw
/
sgt
/
halibut
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revamp of the Halibut error handling mechanism.
[sgt/halibut]
/
index.c
diff --git
a/index.c
b/index.c
index
c312f07
..
1b03645
100644
(file)
--- a/
index.c
+++ b/
index.c
@@
-10,17
+10,18
@@
static int compare_tags(void *av, void *bv);
static int compare_entries(void *av, void *bv);
indexdata *make_index(void) {
static int compare_entries(void *av, void *bv);
indexdata *make_index(void) {
- indexdata *ret =
mk
new(indexdata);
+ indexdata *ret =
s
new(indexdata);
ret->tags = newtree234(compare_tags);
ret->entries = newtree234(compare_entries);
return ret;
}
static indextag *make_indextag(void) {
ret->tags = newtree234(compare_tags);
ret->entries = newtree234(compare_entries);
return ret;
}
static indextag *make_indextag(void) {
- indextag *ret =
mk
new(indextag);
+ indextag *ret =
s
new(indextag);
ret->name = NULL;
ret->implicit_text = NULL;
ret->explicit_texts = NULL;
ret->name = NULL;
ret->implicit_text = NULL;
ret->explicit_texts = NULL;
+ ret->explicit_fpos = NULL;
ret->nexplicit = ret->explicit_size = ret->nrefs = 0;
ret->refs = NULL;
return ret;
ret->nexplicit = ret->explicit_size = ret->nrefs = 0;
ret->refs = NULL;
return ret;
@@
-57,7
+58,8
@@
indextag *index_findtag(indexdata *idx, wchar_t *name) {
* Guarantee on calling sequence: all implicit merges are given
* before the explicit ones.
*/
* Guarantee on calling sequence: all implicit merges are given
* before the explicit ones.
*/
-void index_merge(indexdata *idx, int is_explicit, wchar_t *tags, word *text) {
+void index_merge(indexdata *idx, int is_explicit, wchar_t *tags, word *text,
+ filepos *fpos) {
indextag *t, *existing;
/*
indextag *t, *existing;
/*
@@
-97,7
+99,7
@@
void index_merge(indexdata *idx, int is_explicit, wchar_t *tags, word *text) {
* warn (and drop it, since it won't be referenced).
*/
if (is_explicit) {
* warn (and drop it, since it won't be referenced).
*/
if (is_explicit) {
- err
or(err_nosuchidxtag
, tags);
+ err
_nosuchidxtag(fpos
, tags);
continue;
}
continue;
}
@@
-105,9
+107,8
@@
void index_merge(indexdata *idx, int is_explicit, wchar_t *tags, word *text) {
* Otherwise, this is a new tag with an implicit \IM.
*/
t->implicit_text = text;
* Otherwise, this is a new tag with an implicit \IM.
*/
t->implicit_text = text;
+ t->implicit_fpos = *fpos;
} else {
} else {
- sfree(t);
- t = existing;
if (!is_explicit) {
/*
* An implicit \IM for a tag that's had an implicit
if (!is_explicit) {
/*
* An implicit \IM for a tag that's had an implicit
@@
-116,22
+117,39
@@
void index_merge(indexdata *idx, int is_explicit, wchar_t *tags, word *text) {
* differences. And check the tag for case match
* against the existing tag, likewise.
*/
* differences. And check the tag for case match
* against the existing tag, likewise.
*/
+
+ /*
+ * Check the tag against its previous occurrence to
+ * see if the cases match.
+ */
+ if (ustrcmp(t->name, existing->name)) {
+ err_indexcase(fpos, t->name,
+ &existing->implicit_fpos, existing->name);
+ }
+
+ sfree(t);
} else {
/*
* An explicit \IM added to a valid tag. In
* particular, this removes the implicit \IM if
* present.
*/
} else {
/*
* An explicit \IM added to a valid tag. In
* particular, this removes the implicit \IM if
* present.
*/
+ sfree(t);
+ t = existing;
if (t->implicit_text) {
free_word_list(t->implicit_text);
t->implicit_text = NULL;
}
if (t->nexplicit >= t->explicit_size) {
t->explicit_size = t->nexplicit + 8;
if (t->implicit_text) {
free_word_list(t->implicit_text);
t->implicit_text = NULL;
}
if (t->nexplicit >= t->explicit_size) {
t->explicit_size = t->nexplicit + 8;
- t->explicit_texts = resize(t->explicit_texts,
- t->explicit_size);
+ t->explicit_texts = sresize(t->explicit_texts,
+ t->explicit_size, word *);
+ t->explicit_fpos = sresize(t->explicit_fpos,
+ t->explicit_size, filepos);
}
}
- t->explicit_texts[t->nexplicit++] = text;
+ t->explicit_texts[t->nexplicit] = text;
+ t->explicit_fpos[t->nexplicit] = *fpos;
+ t->nexplicit++;
}
}
}
}
}
}
@@
-147,6
+165,7
@@
void index_merge(indexdata *idx, int is_explicit, wchar_t *tags, word *text) {
void build_index(indexdata *i) {
indextag *t;
word **ta;
void build_index(indexdata *i) {
indextag *t;
word **ta;
+ filepos *fa;
int ti;
int j;
int ti;
int j;
@@
-154,15
+173,18
@@
void build_index(indexdata *i) {
if (t->implicit_text) {
t->nrefs = 1;
ta = &t->implicit_text;
if (t->implicit_text) {
t->nrefs = 1;
ta = &t->implicit_text;
+ fa = &t->implicit_fpos;
} else {
t->nrefs = t->nexplicit;
ta = t->explicit_texts;
} else {
t->nrefs = t->nexplicit;
ta = t->explicit_texts;
+ fa = t->explicit_fpos;
}
if (t->nrefs) {
}
if (t->nrefs) {
- t->refs =
mknewa(indexentry *, t->nrefs
);
+ t->refs =
snewn(t->nrefs, indexentry *
);
for (j = 0; j < t->nrefs; j++) {
for (j = 0; j < t->nrefs; j++) {
- indexentry *ent =
mk
new(indexentry);
+ indexentry *ent =
s
new(indexentry);
ent->text = *ta++;
ent->text = *ta++;
+ ent->fpos = *fa++;
t->refs[j] = add234(i->entries, ent);
if (t->refs[j] != ent) /* duplicate */
sfree(ent);
t->refs[j] = add234(i->entries, ent);
if (t->refs[j] != ent) /* duplicate */
sfree(ent);