X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/7136a6c7f094fa423c48ec319748c4fd7e1fa645..2223c2ddaa32c4979bb95188b87a70bc2abd8dda:/error.c diff --git a/error.c b/error.c index e9c681a..abd8d61 100644 --- 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);