summaryrefslogtreecommitdiff
path: root/contents.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2004-03-23 20:19:01 +0000
committerSimon Tatham <anakin@pobox.com>2004-03-23 20:19:01 +0000
commitc2dc0207e325bd3e15929bcf0397e92d5fe33bba (patch)
treec65c9e60ea46a9bfb7d7595df7b3e7eb6175cecb /contents.c
parent6cba4fa3f6c02db9994d6b6234f2ae5007839a5d (diff)
downloadhalibut-c2dc0207e325bd3e15929bcf0397e92d5fe33bba.zip
halibut-c2dc0207e325bd3e15929bcf0397e92d5fe33bba.tar.gz
halibut-c2dc0207e325bd3e15929bcf0397e92d5fe33bba.tar.bz2
halibut-c2dc0207e325bd3e15929bcf0397e92d5fe33bba.tar.xz
Oops, nearly forgot. Nesting one numbered list inside another should
not break the numbering of the outer one! [originally from svn r3955]
Diffstat (limited to 'contents.c')
-rw-r--r--contents.c28
1 files changed, 25 insertions, 3 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;
}