2 * error.c: Halibut error handling
13 #define PREFIX 0x0001 /* give `halibut:' prefix */
14 #define FILEPOS 0x0002 /* give file position prefix */
16 static void do_error(const filepos
*fpos
, const char *fmt
, ...)
21 fprintf(stderr
, "%s:",
22 fpos
->filename ? fpos
->filename
: "<standard input>");
24 fprintf(stderr
, "%d:", fpos
->line
);
26 fprintf(stderr
, "%d:", fpos
->col
);
29 fputs("halibut: ", stderr
);
33 vfprintf(stderr
, fmt
, ap
);
39 void fatalerr_nomemory(void)
41 do_error(NULL
, "out of memory");
45 void err_optnoarg(const char *sp
)
47 do_error(NULL
, "option `-%s' requires an argument", sp
);
50 void err_nosuchopt(const char *sp
)
52 do_error(NULL
, "unrecognised option `-%s'", sp
);
55 void err_cmdcharset(const char *sp
)
57 do_error(NULL
, "character set `%s' not recognised", sp
);
60 void err_futileopt(const char *sp
, const char *sp2
)
62 do_error(NULL
, "warning: option `-%s' has no effect%s", sp
, sp2
);
65 void err_noinput(void)
67 do_error(NULL
, "no input files");
70 void err_cantopen(const char *sp
)
72 do_error(NULL
, "unable to open input file `%s'", sp
);
77 do_error(NULL
, "no data in input files");
80 void err_brokencodepara(const filepos
*fpos
)
82 do_error(fpos
, "every line of a code paragraph should begin `\\c'");
85 void err_kwunclosed(const filepos
*fpos
)
87 do_error(fpos
, "expected `}' after paragraph keyword");
90 void err_kwexpected(const filepos
*fpos
)
92 do_error(fpos
, "expected a paragraph keyword");
95 void err_kwillegal(const filepos
*fpos
)
97 do_error(fpos
, "expected no paragraph keyword");
100 void err_kwtoomany(const filepos
*fpos
)
102 do_error(fpos
, "expected only one paragraph keyword");
105 void err_bodyillegal(const filepos
*fpos
)
107 do_error(fpos
, "expected no text after paragraph keyword");
110 void err_badparatype(const wchar_t *wsp
, const filepos
*fpos
)
112 char *sp
= utoa_locale_dup(wsp
);
113 do_error(fpos
, "command `%s' unrecognised at start of paragraph", sp
);
117 void err_badmidcmd(const wchar_t *wsp
, const filepos
*fpos
)
119 char *sp
= utoa_locale_dup(wsp
);
120 do_error(fpos
, "command `%s' unexpected in mid-paragraph", sp
);
124 void err_unexbrace(const filepos
*fpos
)
126 do_error(fpos
, "brace character unexpected in mid-paragraph");
129 void err_explbr(const filepos
*fpos
)
131 do_error(fpos
, "expected `{' after command");
134 void err_commenteof(const filepos
*fpos
)
136 do_error(fpos
, "end of file unexpected inside `\\#{...}' comment");
139 void err_kwexprbr(const filepos
*fpos
)
141 do_error(fpos
, "expected `}' after cross-reference");
144 void err_codequote(const filepos
*fpos
)
146 do_error(fpos
, "unable to nest \\q{...} within \\c{...} or \\cw{...}");
149 void err_missingrbrace(const filepos
*fpos
)
151 do_error(fpos
, "unclosed braces at end of paragraph");
154 void err_missingrbrace2(const filepos
*fpos
)
156 do_error(fpos
, "unclosed braces at end of input file");
159 void err_nestedstyles(const filepos
*fpos
)
161 do_error(fpos
, "unable to nest text styles");
164 void err_nestedindex(const filepos
*fpos
)
166 do_error(fpos
, "unable to nest index markings");
169 void err_indexcase(const filepos
*fpos
, const wchar_t *wsp
,
170 const filepos
*fpos2
, const wchar_t *wsp2
)
172 char *sp
= utoa_locale_dup(wsp
), *sp2
= utoa_locale_dup(wsp2
);
173 do_error(fpos
, "warning: index tag `%s' used with different "
174 "case (`%s') at %s:%d",
175 sp
, sp2
, fpos2
->filename
, fpos2
->line
);
180 void err_nosuchkw(const filepos
*fpos
, const wchar_t *wsp
)
182 char *sp
= utoa_locale_dup(wsp
);
183 do_error(fpos
, "unable to resolve cross-reference to `%s'", sp
);
187 void err_multiBR(const filepos
*fpos
, const wchar_t *wsp
)
189 char *sp
= utoa_locale_dup(wsp
);
190 do_error(fpos
, "multiple `\\BR' entries given for `%s'", sp
);
194 void err_nosuchidxtag(const filepos
*fpos
, const wchar_t *wsp
)
196 char *sp
= utoa_locale_dup(wsp
);
197 do_error(fpos
, "`\\IM' on unknown index tag `%s'", sp
);
201 void err_cantopenw(const char *sp
)
203 do_error(NULL
, "unable to open output file `%s'", sp
);
206 void err_macroexists(const filepos
*fpos
, const wchar_t *wsp
)
208 char *sp
= utoa_locale_dup(wsp
);
209 do_error(fpos
, "macro `%s' already defined", sp
);
213 void err_sectjump(const filepos
*fpos
)
215 do_error(fpos
, "expected higher heading levels before this one");
218 void err_winhelp_ctxclash(const filepos
*fpos
, const char *sp
, const char *sp2
)
220 do_error(fpos
, "Windows Help context id `%s' clashes with "
221 "previously defined `%s'", sp
, sp2
);
224 void err_multikw(const filepos
*fpos
, const filepos
*fpos2
, const wchar_t *wsp
)
226 char *sp
= utoa_locale_dup(wsp
);
227 do_error(fpos
, "paragraph keyword `%s' already defined at %s:%d",
228 sp
, fpos2
->filename
, fpos2
->line
);
232 void err_misplacedlcont(const filepos
*fpos
)
234 do_error(fpos
, "\\lcont is only expected after a list item");
237 void err_sectmarkerinblock(const filepos
*fpos
, const char *sp
)
239 do_error(fpos
, "section headings are not supported within \\%s", sp
);
242 void err_cfginsufarg(const filepos
*fpos
, const char *sp
, int i
)
244 do_error(fpos
, "\\cfg{%s} expects at least %d parameter%s",
245 sp
, i
, (i
==1)?
"":"s");
248 void err_infonodechar(const filepos
*fpos
, char c
) /* fpos might be NULL */
250 do_error(fpos
, "info output format does not support '%c' in"
251 " node names; removing", c
);
254 void err_text_codeline(const filepos
*fpos
, int i
, int j
)
256 do_error(fpos
, "warning: code paragraph line is %d chars wide, wider"
257 " than body width %d", i
, j
);
260 void err_htmlver(const filepos
*fpos
, const wchar_t *wsp
)
262 char *sp
= utoa_locale_dup(wsp
);
263 do_error(fpos
, "unrecognised HTML version keyword `%s'", sp
);
267 void err_charset(const filepos
*fpos
, const wchar_t *wsp
)
269 char *sp
= utoa_locale_dup(wsp
);
270 do_error(fpos
, "character set `%s' not recognised", sp
);
274 void err_nofont(const filepos
*fpos
, const wchar_t *wsp
)
276 char *sp
= utoa_locale_dup(wsp
);
277 do_error(fpos
, "font `%s' not recognised", sp
);
281 void err_afmeof(const filepos
*fpos
)
283 do_error(fpos
, "AFM file ended unexpectedly");
286 void err_afmkey(const filepos
*fpos
, const char *sp
)
288 do_error(fpos
, "required AFM key '%s' missing", sp
);
291 void err_afmvers(const filepos
*fpos
)
293 do_error(fpos
, "unsupported AFM version");
296 void err_afmval(const filepos
*fpos
, const char *sp
, int i
)
299 do_error(fpos
, "AFM key '%s' requires a value", sp
);
301 do_error(fpos
, "AFM key '%s' requires %d values", sp
, i
);
304 void err_pfeof(const filepos
*fpos
)
306 do_error(fpos
, "Type 1 font file ended unexpectedly");
309 void err_pfhead(const filepos
*fpos
)
311 do_error(fpos
, "Type 1 font file header line invalid");
314 void err_pfbad(const filepos
*fpos
)
316 do_error(fpos
, "Type 1 font file invalid");
319 void err_pfnoafm(const filepos
*fpos
, const char *sp
)
321 do_error(fpos
, "no metrics available for Type 1 font '%s'", sp
);
324 void err_chmnames(void)
326 do_error(NULL
, "only one of html-mshtmlhelp-chm and "
327 "html-mshtmlhelp-hhp found");
330 void err_sfntnotable(const filepos
*fpos
, const char *sp
)
332 do_error(fpos
, "font has no '%s' table", sp
);
335 void err_sfntnopsname(const filepos
*fpos
)
337 do_error(fpos
, "font has no PostScript name");
340 void err_sfntbadtable(const filepos
*fpos
, const char *sp
)
342 do_error(fpos
, "font has an invalid '%s' table", sp
);
345 void err_sfntnounicmap(const filepos
*fpos
)
347 do_error(fpos
, "font has no UCS-2 character map");
350 void err_sfnttablevers(const filepos
*fpos
, const char *sp
)
352 do_error(fpos
, "font has an unsupported '%s' table version", sp
);
355 void err_sfntbadhdr(const filepos
*fpos
)
357 do_error(fpos
, "font has an invalid header");
360 void err_sfntbadglyph(const filepos
*fpos
, unsigned wc
)
363 "warning: character U+%04X references a non-existent glyph",