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;
}
static void dospace(word ***wret) {
- word *mnewword = mknew(word);
+ word *mnewword = snew(word);
mnewword->text = NULL;
mnewword->type = word_WhiteSpace;
mnewword->alt = NULL;
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);
else
aton = INT_MAX;
}
- p = text + sizeof(text);
+ p = text + lenof(text);
*--p = L'\0';
while (nletters--) {
assert(p > text);
}
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++;
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++)
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;
}
/*
}
p->kwtext2 = *ret2;
+ *prev = thistype;
return ret;
}