The Windows Help backend now uses libcharset to the maximum extent
[sgt/halibut] / error.c
diff --git a/error.c b/error.c
index e9c681a..abd8d61 100644 (file)
--- a/error.c
+++ b/error.c
@@ -16,6 +16,7 @@
 static void do_error(int code, va_list ap) {
     char error[1024];
     char auxbuf[256];
+    char c;
     char *sp, *sp2;
     wchar_t *wsp;
     filepos fpos, fpos2;
@@ -81,7 +82,7 @@ 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 = ustrtoa(wsp, auxbuf, sizeof(auxbuf), CS_LOCAL);
        fpos = *va_arg(ap, filepos *);
        sprintf(error, "command `%.200s' unrecognised at start of"
                " paragraph", sp);
@@ -89,7 +90,7 @@ static void do_error(int code, va_list ap) {
        break;
       case err_badmidcmd:
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf), CS_LOCAL);
        fpos = *va_arg(ap, filepos *);
        sprintf(error, "command `%.200s' unexpected in mid-paragraph", sp);
        flags = FILEPOS;
@@ -137,20 +138,20 @@ 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 = ustrtoa(wsp, auxbuf, sizeof(auxbuf), CS_LOCAL);
        sprintf(error, "unable to resolve cross-reference to `%.200s'", sp);
        flags = FILEPOS;
        break;
       case err_multiBR:
        fpos = *va_arg(ap, filepos *);
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf), CS_LOCAL);
        sprintf(error, "multiple `\\BR' entries given for `%.200s'", sp);
        flags = FILEPOS;
        break;
       case err_nosuchidxtag:
        wsp = va_arg(ap, wchar_t *);
-       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf));
+       sp = ustrtoa(wsp, auxbuf, sizeof(auxbuf), CS_LOCAL);
        sprintf(error, "`\\IM' on unknown index tag `%.200s'", sp);
        flags = 0;
        /* FIXME: need to get a filepos to here somehow */
@@ -163,7 +164,7 @@ 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 = ustrtoa(wsp, auxbuf, sizeof(auxbuf), CS_LOCAL);
        sprintf(error, "macro `%.200s' already defined", sp);
        flags = FILEPOS;
        break;
@@ -184,7 +185,7 @@ 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 = ustrtoa(wsp, auxbuf, sizeof(auxbuf), CS_LOCAL);
        sprintf(error, "paragraph keyword `%.200s' already defined at ", sp);
        sprintf(error + strlen(error), "%s:%d", fpos2.filename, fpos2.line);
        flags = FILEPOS;
@@ -194,11 +195,26 @@ static void do_error(int code, va_list ap) {
        sprintf(error, "\\lcont is only expected after a list item");
        flags = FILEPOS;
        break;
-      case err_sectmarkerinlcont:
+      case err_sectmarkerinblock:
        fpos = *va_arg(ap, filepos *);
-       sprintf(error, "section headings are not supported within \\lcont");
+       sp = va_arg(ap, char *);
+       sprintf(error, "section headings are not supported within \\%.100s",
+               sp);
+       flags = FILEPOS;
+       break;
+      case err_infodirentry:
+       fpos = *va_arg(ap, filepos *);
+       sprintf(error, "\\cfg{info-dir-entry} expects at least three"
+               " parameters");
        flags = FILEPOS;
-       break; 
+       break;
+      case err_infonodechar:
+       fpos = *va_arg(ap, filepos *);
+       c = (char)va_arg(ap, int);
+       sprintf(error, "info output format does not support '%c' in"
+               " node names; removing", c);
+       flags = FILEPOS;
+       break;
       case err_whatever:
        sp = va_arg(ap, char *);
         vsprintf(error, sp, ap);
@@ -209,7 +225,9 @@ static void do_error(int code, va_list ap) {
     if (flags & PREFIX)
        fputs("halibut: ", stderr);
     if (flags & FILEPOS) {
-       fprintf(stderr, "%s:%d:", fpos.filename, fpos.line);
+       fprintf(stderr, "%s:", fpos.filename);
+       if (fpos.line > 0)
+           fprintf(stderr, "%d:", fpos.line);
        if (fpos.col > 0)
            fprintf(stderr, "%d:", fpos.col);
        fputc(' ', stderr);