From 96f3af166d2258373cdb68eb37a78cc9ff851b80 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 23 Mar 2004 20:19:01 +0000 Subject: [PATCH] Oops, nearly forgot. Nesting one numbered list inside another should not break the numbering of the outer one! git-svn-id: svn://svn.tartarus.org/sgt/halibut@3955 cda61777-01e9-0310-a592-d414129be87e --- contents.c | 28 +++++++++++++++++++++++++--- halibut.h | 2 +- keywords.c | 3 +-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/contents.c b/contents.c index de45433..f6bedba 100644 --- a/contents.c +++ b/contents.c @@ -18,6 +18,7 @@ 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 */ @@ -35,10 +36,12 @@ numberstate *number_init(void) { 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); @@ -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++; @@ -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 = mknew(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; } diff --git a/halibut.h b/halibut.h index 6b3d383..1312cd4 100644 --- a/halibut.h +++ b/halibut.h @@ -392,7 +392,7 @@ indextag *index_findtag(indexdata *idx, wchar_t *name); */ numberstate *number_init(void); void number_cfg(numberstate *, paragraph *); -word *number_mktext(numberstate *, paragraph *, wchar_t *, int , int *); +word *number_mktext(numberstate *, paragraph *, wchar_t *, int *, int *); void number_free(numberstate *); /* diff --git a/keywords.c b/keywords.c index 6e8a230..eef96a6 100644 --- a/keywords.c +++ b/keywords.c @@ -62,8 +62,7 @@ keywordlist *get_keywords(paragraph *source) { * This also sets up the `parent', `child' and `sibling' * links. */ - source->kwtext = number_mktext(n, source, q, prevpara, &errors); - prevpara = source->type; + source->kwtext = number_mktext(n, source, q, &prevpara, &errors); if (p && *p) { if (source->kwtext || source->type == para_Biblio) { -- 2.11.0