Er, don't forget to document the disallowing of \q within \c. Ahem.
[sgt/halibut] / error.c
diff --git a/error.c b/error.c
index 3bfa78b..350e71a 100644 (file)
--- a/error.c
+++ b/error.c
@@ -15,8 +15,8 @@
 
 static void do_error(int code, va_list ap) {
     char error[1024];
-    char auxbuf[256];
     char c;
+    int i, j;
     char *sp, *sp2;
     wchar_t *wsp;
     filepos fpos, fpos2;
@@ -82,18 +82,20 @@ static void do_error(int code, va_list ap) {
        break;
       case err_badparatype:
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = utoa_locale_dup(wsp);
        fpos = *va_arg(ap, filepos *);
        sprintf(error, "command `%.200s' unrecognised at start of"
                " paragraph", sp);
        flags = FILEPOS;
+       sfree(sp);
        break;
       case err_badmidcmd:
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = utoa_locale_dup(wsp);
        fpos = *va_arg(ap, filepos *);
        sprintf(error, "command `%.200s' unexpected in mid-paragraph", sp);
        flags = FILEPOS;
+       sfree(sp);
        break;
       case err_unexbrace:
        fpos = *va_arg(ap, filepos *);
@@ -115,6 +117,11 @@ static void do_error(int code, va_list ap) {
        sprintf(error, "expected `}' after cross-reference");
        flags = FILEPOS;
        break;
+      case err_codequote:
+       fpos = *va_arg(ap, filepos *);
+       sprintf(error, "unable to nest \\q{...} within \\c{...} or \\cw{...}");
+       flags = FILEPOS;
+       break;  
       case err_missingrbrace:
        fpos = *va_arg(ap, filepos *);
        sprintf(error, "unclosed braces at end of paragraph");
@@ -138,23 +145,26 @@ static void do_error(int code, va_list ap) {
       case err_nosuchkw:
        fpos = *va_arg(ap, filepos *);
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = utoa_locale_dup(wsp);
        sprintf(error, "unable to resolve cross-reference to `%.200s'", sp);
        flags = FILEPOS;
+       sfree(sp);
        break;
       case err_multiBR:
        fpos = *va_arg(ap, filepos *);
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = utoa_locale_dup(wsp);
        sprintf(error, "multiple `\\BR' entries given for `%.200s'", sp);
        flags = FILEPOS;
+       sfree(sp);
        break;
       case err_nosuchidxtag:
+       fpos = *va_arg(ap, filepos *);
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = utoa_locale_dup(wsp);
        sprintf(error, "`\\IM' on unknown index tag `%.200s'", sp);
-       flags = 0;
-       /* FIXME: need to get a filepos to here somehow */
+       sfree(sp);
+       flags = FILEPOS;
        break;
       case err_cantopenw:
        sp = va_arg(ap, char *);
@@ -164,9 +174,10 @@ static void do_error(int code, va_list ap) {
       case err_macroexists:
        fpos = *va_arg(ap, filepos *);
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = utoa_locale_dup(wsp);
        sprintf(error, "macro `%.200s' already defined", sp);
        flags = FILEPOS;
+       sfree(sp);
        break;
       case err_sectjump:
        fpos = *va_arg(ap, filepos *);
@@ -185,10 +196,11 @@ static void do_error(int code, va_list ap) {
        fpos = *va_arg(ap, filepos *);
        fpos2 = *va_arg(ap, filepos *);
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = utoa_locale_dup(wsp);
        sprintf(error, "paragraph keyword `%.200s' already defined at ", sp);
        sprintf(error + strlen(error), "%s:%d", fpos2.filename, fpos2.line);
        flags = FILEPOS;
+       sfree(sp);
        break;
       case err_misplacedlcont:
        fpos = *va_arg(ap, filepos *);
@@ -208,12 +220,6 @@ static void do_error(int code, va_list ap) {
                " parameters");
        flags = FILEPOS;
        break;
-      case err_infoindexcolon:
-       fpos = *va_arg(ap, filepos *);
-       sprintf(error, "info output format does not support colons in"
-               " index terms; removing");
-       flags = FILEPOS;
-       break;
       case err_infonodechar:
        fpos = *va_arg(ap, filepos *);
        c = (char)va_arg(ap, int);
@@ -221,6 +227,14 @@ static void do_error(int code, va_list ap) {
                " node names; removing", c);
        flags = FILEPOS;
        break;
+      case err_text_codeline:
+       fpos = *va_arg(ap, filepos *);
+       i = va_arg(ap, int);
+       j = va_arg(ap, int);
+       sprintf(error, "warning: code paragraph line is %d chars wide, wider"
+               " than body width %d", i, j);
+       flags = FILEPOS;
+       break;
       case err_whatever:
        sp = va_arg(ap, char *);
         vsprintf(error, sp, ap);