input.c was capable of generating a paragraph structure with no text
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 12 Apr 2005 08:38:28 +0000 (08:38 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 12 Apr 2005 08:38:28 +0000 (08:38 +0000)
in it, if the input paragraph contained (say) an unrecognised
control command and nothing else. Such paragraphs can confuse back
ends later on, so input.c should refrain from generating them. Added
a check and a polite error message (just in case the user manages to
generate an empty paragraph using otherwise legal syntax).

git-svn-id: svn://svn.tartarus.org/sgt/halibut@5629 cda61777-01e9-0310-a592-d414129be87e

error.c
halibut.h
input.c

diff --git a/error.c b/error.c
index 3635f0f..b1e74a1 100644 (file)
--- a/error.c
+++ b/error.c
@@ -278,6 +278,11 @@ static void do_error(int code, va_list ap) {
        flags = FILEPOS;
        sfree(sp);
        break;
+      case err_emptypara:
+       fpos = *va_arg(ap, filepos *);
+       sprintf(error, "found no text in paragraph");
+       flags = FILEPOS;
+       break;
       case err_whatever:
        sp = va_arg(ap, char *);
         vsprintf(error, sp, ap);
index ed2a0da..99b9a0e 100644 (file)
--- a/halibut.h
+++ b/halibut.h
@@ -244,6 +244,7 @@ enum {
     err_text_codeline,                /* \c line too long in text backend */
     err_htmlver,                      /* unrecognised HTML version keyword */
     err_charset,                      /* unrecognised character set name */
+    err_emptypara,                    /* paragraph contains no actual text */
     err_whatever                       /* random error of another type */
 };
 
diff --git a/input.c b/input.c
index 493449c..d8d44f9 100644 (file)
--- a/input.c
+++ b/input.c
@@ -1529,7 +1529,19 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx,
        }
        stk_free(parsestk);
        prev_para_type = par.type;
-       addpara(par, ret);
+       /*
+        * Before we add the paragraph to the output list, we
+        * should check that there was any text in it at all; there
+        * might not be if (for example) the paragraph contained
+        * nothing but an unrecognised command sequence, and if we
+        * put an empty paragraph on the list it may confuse the
+        * back ends later on.
+        */
+       if (par.words) {
+           addpara(par, ret);
+       } else {
+           error(err_emptypara, &par.fpos);
+       }
        if (t.type == tok_eof)
            already = TRUE;
     }