X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/6a0b9d08e202b6cedbc6fa8f99175ff5e2f5fbc3..b9b5ae9cd316d85a2aac4132e19ea54795b712e8:/error.c diff --git a/error.c b/error.c index 5819e00..7b9ceaa 100644 --- a/error.c +++ b/error.c @@ -15,9 +15,10 @@ 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; + wchar_t *wsp, *wsp2; filepos fpos, fpos2; int flags; @@ -81,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 *); @@ -114,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"); @@ -134,26 +142,43 @@ static void do_error(int code, va_list ap) { sprintf(error, "unable to nest index markings"); flags = FILEPOS; break; + case err_indexcase: + fpos = *va_arg(ap, filepos *); + wsp = va_arg(ap, wchar_t *); + sp = utoa_locale_dup(wsp); + fpos2 = *va_arg(ap, filepos *); + wsp2 = va_arg(ap, wchar_t *); + sp2 = utoa_locale_dup(wsp2); + sprintf(error, "warning: index tag `%.200s' used with ", sp); + sprintf(error + strlen(error), "different case (`%.200s') at %s:%d", + sp2, fpos2.filename, fpos2.line); + flags = FILEPOS; + sfree(sp); + sfree(sp2); + break; 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 *); @@ -163,9 +188,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 *); @@ -184,10 +210,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 *); @@ -200,7 +227,44 @@ static void do_error(int code, va_list ap) { sprintf(error, "section headings are not supported within \\%.100s", sp); flags = FILEPOS; - break; + break; + case err_infodirentry: + fpos = *va_arg(ap, filepos *); + sprintf(error, "\\cfg{info-dir-entry} expects at least three" + " parameters"); + flags = FILEPOS; + 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_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_htmlver: + fpos = *va_arg(ap, filepos *); + wsp = va_arg(ap, wchar_t *); + sp = utoa_locale_dup(wsp); + sprintf(error, "unrecognised HTML version keyword `%.200s'", sp); + sfree(sp); + flags = FILEPOS; + break; + case err_charset: + fpos = *va_arg(ap, filepos *); + wsp = va_arg(ap, wchar_t *); + sp = utoa_locale_dup(wsp); + sprintf(error, "character set `%.200s' not recognised", sp); + flags = FILEPOS; + sfree(sp); + break; case err_whatever: sp = va_arg(ap, char *); vsprintf(error, sp, ap);