Add an error check for correct formatting in Deflate uncompressed
[sgt/halibut] / contents.c
index de45433..2acf81e 100644 (file)
@@ -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;
 }