Commit: 4b2171a12d0bee786015d73f521714feae06788c
Parent: b0a3ffce971b6c55739bb4669b684e7b0d1c08b1
Author: Randy Palamar
Date:   Fri, 21 Oct 2022 23:43:19 -0600
make_ent(): remove hack and parse token a little more correctly
Diffstat:
| M | jdict.c | | | 31 | ++++++++++++++++++++----------- | 
1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/jdict.c b/jdict.c
@@ -58,30 +58,39 @@ entcmp(const void *va, const void *vb)
 
 /* takes a token of type YOMI_ENTRY and creates a DictEnt */
 static DictEnt *
-make_ent(YomiTok *toks, size_t ntoks, char *data)
+make_ent(YomiTok *toks, char *data)
 {
 	size_t i;
 	DictEnt *d;
-	YomiTok *tstr, *tdefs;
+	YomiTok *tstr = NULL, *tdefs = NULL;
 
 	if (toks[0].type != YOMI_ENTRY)
 		return NULL;
 
-	/* FIXME: hacky but works */
-	/* definition array = YOMI_ENTRY tok + 6 */
-	if (ntoks - 6 < 0)
+	for (i = 1; i < toks[0].len; i++)
+		switch (toks[i].type) {
+		case YOMI_STR:
+			if (tstr == NULL)
+				tstr = &toks[i];
+			break;
+		case YOMI_ARRAY:
+			if (tdefs == NULL)
+				tdefs = &toks[i];
+		default: /* FALLTHROUGH */
+			break;
+		}
+
+	/* check if entry was valid */
+	if (tdefs == NULL || tstr == NULL)
 		return NULL;
-	tdefs = toks + 6;
-	/* term = YOMI_ENTRY tok + 1 */
-	tstr = toks + 1;
 
 	d = xreallocarray(NULL, 1, sizeof(DictEnt));
 	d->term = strndup(data + tstr->start, tstr->end - tstr->start);
 	d->ndefs = tdefs->len;
 	d->defs = xreallocarray(NULL, d->ndefs, sizeof(char *));
 	for (i = 1; i <= d->ndefs; i++)
-		d->defs[i-1] = strndup(data + (tdefs + i)->start,
-		                       (tdefs + i)->end - (tdefs + i)->start);
+		d->defs[i-1] = strndup(data + tdefs[i].start,
+		                       tdefs[i].end - tdefs[i].start);
 
 	return d;
 }
@@ -135,7 +144,7 @@ parse_term_bank(DictEnt *ents, size_t *nents, const char *tbank, size_t *stride)
 		if (toks[i].type != YOMI_ENTRY)
 			continue;
 
-		e = make_ent(&toks[i], r - i, data);
+		e = make_ent(&toks[i], data);
 		if (e != NULL) {
 			memcpy(&ents[(*nents)++], e, sizeof(DictEnt));
 		} else {