Obsoleted the `\preamble' command. Preamble text is now taken to be
[sgt/halibut] / input.c
diff --git a/input.c b/input.c
index 6cad0f7..9d165fa 100644 (file)
--- a/input.c
+++ b/input.c
@@ -190,8 +190,9 @@ enum {
     c_lcont,                          /* continuation para(s) for list item */
     c_n,                              /* numbered list */
     c_nocite,                         /* bibliography trickery */
-    c_preamble,                               /* document preamble text */
+    c_preamble,                               /* (obsolete) preamble text */
     c_q,                              /* quote marks */
+    c_quote,                          /* block-quoted paragraphs */
     c_rule,                           /* horizontal rule */
     c_title,                          /* document title */
     c_u,                              /* aux field is char code */
@@ -258,8 +259,9 @@ static void match_kw(token *tok) {
        {"lcont", c_lcont},            /* continuation para(s) for list item */
        {"n", c_n},                    /* numbered list */
        {"nocite", c_nocite},          /* bibliography trickery */
-       {"preamble", c_preamble},      /* document preamble text */
+       {"preamble", c_preamble},      /* (obsolete) preamble text */
        {"q", c_q},                    /* quote marks */
+       {"quote", c_quote},            /* block-quoted paragraphs */
        {"rule", c_rule},              /* horizontal rule */
        {"title", c_title},            /* document title */
        {"versionid", c_versionid},    /* document RCS id */
@@ -527,8 +529,8 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
     } *sitem;
     stack parsestk;
     struct crossparaitem {
-       int type;                      /* currently c_lcont or -1 */
-       int seen_lcont;
+       int type;                      /* currently c_lcont, c_quote or -1 */
+       int seen_lcont, seen_quote;
     };
     stack crossparastk;
     word *indexword, *uword, *iword;
@@ -569,11 +571,13 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
         * Parse code paragraphs separately.
         */
        if (t.type == tok_cmd && t.cmd == c_c && !isbrace(in)) {
+           int wtype = word_WeakCode;
+
            par.type = para_Code;
            par.fpos = t.pos;
            while (1) {
                dtor(t), t = get_codepar_token(in);
-               wd.type = word_WeakCode;
+               wd.type = wtype;
                wd.breaks = FALSE;     /* shouldn't need this... */
                wd.text = ustrdup(t.text);
                wd.alt = NULL;
@@ -588,7 +592,12 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
                }
                if (t.type == tok_eop || t.type == tok_eof)
                    break;
-               else if (t.type != tok_cmd || t.cmd != c_c) {
+               else if (t.type == tok_cmd && t.cmd == c_c)
+                   wtype = word_WeakCode;
+               else if (t.type == tok_cmd && t.cmd == c_e &&
+                        wtype == word_WeakCode)
+                   wtype = word_Emph;
+               else {
                    error(err_brokencodepara, &t.pos);
                    prev_para_type = par.type;
                    addpara(par, ret);
@@ -609,8 +618,9 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
         * finish them.
         */
        if (t.type == tok_cmd &&
-           t.cmd == c_lcont) {
+           (t.cmd == c_lcont || t.cmd == c_quote)) {
            struct crossparaitem *sitem, *stop;
+           int cmd = t.cmd;
 
            /*
             * Expect, and swallow, an open brace.
@@ -621,31 +631,54 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
                continue;
            }
 
-           /*
-            * \lcont causes a continuation of a list item into
-            * multiple paragraphs (which may in turn contain
-            * nested lists, code paras etc). Hence, the previous
-            * paragraph must be of a list type.
-            */
-           sitem = mknew(struct crossparaitem);
-           stop = (struct crossparaitem *)stk_top(crossparastk);
-           if (prev_para_type == para_Bullet ||
-               prev_para_type == para_NumberedList ||
-               prev_para_type == para_Description) {
-               sitem->type = c_lcont;
-               sitem->seen_lcont = 1;
-               par.type = para_LcontPush;
-               prev_para_type = par.type;
-               addpara(par, ret);
+           if (cmd == c_lcont) {
+               /*
+                * \lcont causes a continuation of a list item into
+                * multiple paragraphs (which may in turn contain
+                * nested lists, code paras etc). Hence, the previous
+                * paragraph must be of a list type.
+                */
+               sitem = mknew(struct crossparaitem);
+               stop = (struct crossparaitem *)stk_top(crossparastk);
+               if (stop)
+                   *sitem = *stop;
+               else
+                   sitem->seen_quote = sitem->seen_lcont = 0;
+
+               if (prev_para_type == para_Bullet ||
+                   prev_para_type == para_NumberedList ||
+                   prev_para_type == para_Description) {
+                   sitem->type = c_lcont;
+                   sitem->seen_lcont = 1;
+                   par.type = para_LcontPush;
+                   prev_para_type = par.type;
+                   addpara(par, ret);
+               } else {
+                   /*
+                    * Push a null item on the cross-para stack so that
+                    * when we see the corresponding closing brace we
+                    * don't give a cascade error.
+                    */
+                   sitem->type = -1;
+                   error(err_misplacedlcont, &t.pos);
+               }
            } else {
                /*
-                * Push a null item on the cross-para stack so that
-                * when we see the corresponding closing brace we
-                * don't give a cascade error.
+                * \quote causes a group of paragraphs to be
+                * block-quoted (typically they will be indented a
+                * bit).
                 */
-               sitem->type = -1;
-               sitem->seen_lcont = (stop ? stop->seen_lcont : 0);
-               error(err_misplacedlcont, &t.pos);
+               sitem = mknew(struct crossparaitem);
+               stop = (struct crossparaitem *)stk_top(crossparastk);
+               if (stop)
+                   *sitem = *stop;
+               else
+                   sitem->seen_quote = sitem->seen_lcont = 0;
+               sitem->type = c_quote;
+               sitem->seen_quote = 1;
+               par.type = para_QuotePush;
+               prev_para_type = par.type;
+               addpara(par, ret);
            }
            stk_push(crossparastk, sitem);
            continue;
@@ -660,6 +693,11 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
                    prev_para_type = par.type;
                    addpara(par, ret);
                    break;
+                 case c_quote:
+                   par.type = para_QuotePop;
+                   prev_para_type = par.type;
+                   addpara(par, ret);
+                   break;
                }
                sfree(sitem);
            }
@@ -728,7 +766,7 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
              case c_define: is_macro = TRUE; needkw = 1; break;
                /* For \nocite the keyword is _everything_ */
              case c_nocite: needkw = 8; par.type = para_NoCite; break;
-             case c_preamble: needkw = 32; par.type = para_Preamble; break;
+             case c_preamble: needkw = 32; par.type = para_Normal; break;
              case c_rule: needkw = 16; par.type = para_Rule; break;
              case c_title: needkw = 32; par.type = para_Title; break;
              case c_versionid: needkw = 32; par.type = para_VersionID; break;
@@ -740,8 +778,10 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx) {
                par.type == para_Appendix ||
                par.type == para_UnnumberedChapter) {
                struct crossparaitem *sitem = stk_top(crossparastk);
-               if (sitem && sitem->seen_lcont) {
-                   error(err_sectmarkerinlcont, &t.pos);
+               if (sitem && (sitem->seen_lcont || sitem->seen_quote)) {
+                   error(err_sectmarkerinblock,
+                         &t.pos,
+                         (sitem->seen_lcont ? "lcont" : "quote"));
                }
            }