X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/d7482997dd1ca71b70df43c15dd5956f435a1a7e..8f664e7e91c918cd13248f6b684580c4dd2cdb31:/contents.c diff --git a/contents.c b/contents.c index de45433..2acf81e 100644 --- a/contents.c +++ b/contents.c @@ -18,34 +18,37 @@ struct numberstate_Tag { int oklevel; int maxsectlevel; int listitem; + stack listitem_stack; wchar_t *chaptertext; /* the word for a chapter */ wchar_t *sectiontext; /* the word for a section */ wchar_t *apptext; /* the word for an appendix */ }; numberstate *number_init(void) { - numberstate *ret = mknew(numberstate); + numberstate *ret = snew(numberstate); ret->chapternum = 0; ret->appendixnum = -1; ret->ischapter = 1; ret->oklevel = -1; /* not even in a chapter yet */ ret->maxsectlevel = 32; - ret->sectionlevels = mknewa(int, ret->maxsectlevel); - ret->currentsects = mknewa(paragraph *, ret->maxsectlevel+1); + ret->sectionlevels = snewn(ret->maxsectlevel, int); + ret->currentsects = snewn(ret->maxsectlevel+1, paragraph *); memset(ret->currentsects, 0, (ret->maxsectlevel+1)*sizeof(paragraph *)); ret->lastsect = NULL; ret->listitem = -1; + ret->listitem_stack = stk_new(); return ret; } void number_free(numberstate *state) { + stk_free(state->listitem_stack); sfree(state->sectionlevels); sfree(state->currentsects); sfree(state); } static void dotext(word ***wret, wchar_t *text) { - word *mnewword = mknew(word); + word *mnewword = snew(word); mnewword->text = ustrdup(text); mnewword->type = word_Normal; mnewword->alt = NULL; @@ -55,7 +58,7 @@ static void dotext(word ***wret, wchar_t *text) { } static void dospace(word ***wret) { - word *mnewword = mknew(word); + word *mnewword = snew(word); mnewword->text = NULL; mnewword->type = word_WhiteSpace; mnewword->alt = NULL; @@ -66,7 +69,7 @@ static void dospace(word ***wret) { static void donumber(word ***wret, int num) { wchar_t text[20]; - wchar_t *p = text + sizeof(text); + wchar_t *p = text + lenof(text); *--p = L'\0'; while (num != 0) { assert(p > text); @@ -90,7 +93,7 @@ static void doanumber(word ***wret, int num) { else aton = INT_MAX; } - p = text + sizeof(text); + p = text + lenof(text); *--p = L'\0'; while (nletters--) { assert(p > text); @@ -122,13 +125,18 @@ void number_cfg(numberstate *state, paragraph *source) { } word *number_mktext(numberstate *state, paragraph *p, wchar_t *category, - int prev, int *errflag) { + int *prev, int *errflag) { word *ret = NULL; word **ret2 = &ret; word **pret = &ret; - int i, level; + int i, level, thistype; + struct listitem_stack_entry { + int listitem; + int prev; + } *lse; level = -2; /* default for non-section-heading */ + thistype = p->type; switch (p->type) { case para_Chapter: state->chapternum++; @@ -154,8 +162,8 @@ word *number_mktext(numberstate *state, paragraph *p, wchar_t *category, state->oklevel = level+1; if (state->maxsectlevel <= level) { state->maxsectlevel = level + 32; - state->sectionlevels = resize(state->sectionlevels, - state->maxsectlevel); + state->sectionlevels = sresize(state->sectionlevels, + state->maxsectlevel, int); } state->sectionlevels[level]++; for (i = level+1; i < state->maxsectlevel; i++) @@ -191,11 +199,24 @@ word *number_mktext(numberstate *state, paragraph *p, wchar_t *category, break; case para_NumberedList: ret2 = pret; - if (prev != para_NumberedList) + if (*prev != para_NumberedList) state->listitem = 0; state->listitem++; donumber(&pret, state->listitem); break; + case para_LcontPush: + lse = snew(struct listitem_stack_entry); + lse->listitem = state->listitem; + lse->prev = *prev; + stk_push(state->listitem_stack, lse); + state->listitem = 0; + break; + case para_LcontPop: + lse = (struct listitem_stack_entry *)stk_pop(state->listitem_stack); + state->listitem = lse->listitem; + thistype = lse->prev; + sfree(lse); + break; } /* @@ -218,5 +239,6 @@ word *number_mktext(numberstate *state, paragraph *p, wchar_t *category, } p->kwtext2 = *ret2; + *prev = thistype; return ret; }