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(int code
, va_list ap
) {
23 filepos fpos
, fpos2
, *fposp
;
27 case err_nomemory
: /* no arguments */
28 sprintf(error
, "out of memory");
32 sp
= va_arg(ap
, char *);
33 sprintf(error
, "option `-%.200s' requires an argument", sp
);
37 sp
= va_arg(ap
, char *);
38 sprintf(error
, "unrecognised option `-%.200s'", sp
);
42 sp
= va_arg(ap
, char *);
43 sprintf(error
, "character set `%.200s' not recognised", sp
);
47 sp
= va_arg(ap
, char *);
48 sp2
= va_arg(ap
, char *);
49 sprintf(error
, "warning: option `-%s' has no effect%s", sp
, sp2
);
52 case err_noinput
: /* no arguments */
53 sprintf(error
, "no input files");
57 sp
= va_arg(ap
, char *);
58 sprintf(error
, "unable to open input file `%.200s'", sp
);
61 case err_nodata
: /* no arguments */
62 sprintf(error
, "no data in input files");
65 case err_brokencodepara
:
66 fpos
= *va_arg(ap
, filepos
*);
67 sprintf(error
, "every line of a code paragraph should begin `\\c'");
71 fpos
= *va_arg(ap
, filepos
*);
72 sprintf(error
, "expected `}' after paragraph keyword");
76 fpos
= *va_arg(ap
, filepos
*);
77 sprintf(error
, "expected a paragraph keyword");
81 fpos
= *va_arg(ap
, filepos
*);
82 sprintf(error
, "expected no paragraph keyword");
86 fpos
= *va_arg(ap
, filepos
*);
87 sprintf(error
, "expected only one paragraph keyword");
91 fpos
= *va_arg(ap
, filepos
*);
92 sprintf(error
, "expected no text after paragraph keyword");
96 wsp
= va_arg(ap
, wchar_t *);
97 sp
= utoa_locale_dup(wsp
);
98 fpos
= *va_arg(ap
, filepos
*);
99 sprintf(error
, "command `%.200s' unrecognised at start of"
105 wsp
= va_arg(ap
, wchar_t *);
106 sp
= utoa_locale_dup(wsp
);
107 fpos
= *va_arg(ap
, filepos
*);
108 sprintf(error
, "command `%.200s' unexpected in mid-paragraph", sp
);
113 fpos
= *va_arg(ap
, filepos
*);
114 sprintf(error
, "brace character unexpected in mid-paragraph");
118 fpos
= *va_arg(ap
, filepos
*);
119 sprintf(error
, "expected `{' after command");
123 fpos
= *va_arg(ap
, filepos
*);
124 sprintf(error
, "end of file unexpected inside `\\#{...}' comment");
128 fpos
= *va_arg(ap
, filepos
*);
129 sprintf(error
, "expected `}' after cross-reference");
133 fpos
= *va_arg(ap
, filepos
*);
134 sprintf(error
, "unable to nest \\q{...} within \\c{...} or \\cw{...}");
137 case err_missingrbrace
:
138 fpos
= *va_arg(ap
, filepos
*);
139 sprintf(error
, "unclosed braces at end of paragraph");
142 case err_missingrbrace2
:
143 fpos
= *va_arg(ap
, filepos
*);
144 sprintf(error
, "unclosed braces at end of input file");
147 case err_nestedstyles
:
148 fpos
= *va_arg(ap
, filepos
*);
149 sprintf(error
, "unable to nest text styles");
152 case err_nestedindex
:
153 fpos
= *va_arg(ap
, filepos
*);
154 sprintf(error
, "unable to nest index markings");
158 fpos
= *va_arg(ap
, filepos
*);
159 wsp
= va_arg(ap
, wchar_t *);
160 sp
= utoa_locale_dup(wsp
);
161 fpos2
= *va_arg(ap
, filepos
*);
162 wsp2
= va_arg(ap
, wchar_t *);
163 sp2
= utoa_locale_dup(wsp2
);
164 sprintf(error
, "warning: index tag `%.200s' used with ", sp
);
165 sprintf(error
+ strlen(error
), "different case (`%.200s') at %s:%d",
166 sp2
, fpos2
.filename
, fpos2
.line
);
172 fpos
= *va_arg(ap
, filepos
*);
173 wsp
= va_arg(ap
, wchar_t *);
174 sp
= utoa_locale_dup(wsp
);
175 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
180 fpos
= *va_arg(ap
, filepos
*);
181 wsp
= va_arg(ap
, wchar_t *);
182 sp
= utoa_locale_dup(wsp
);
183 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
187 case err_nosuchidxtag
:
188 fpos
= *va_arg(ap
, filepos
*);
189 wsp
= va_arg(ap
, wchar_t *);
190 sp
= utoa_locale_dup(wsp
);
191 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
196 sp
= va_arg(ap
, char *);
197 sprintf(error
, "unable to open output file `%.200s'", sp
);
200 case err_macroexists
:
201 fpos
= *va_arg(ap
, filepos
*);
202 wsp
= va_arg(ap
, wchar_t *);
203 sp
= utoa_locale_dup(wsp
);
204 sprintf(error
, "macro `%.200s' already defined", sp
);
209 fpos
= *va_arg(ap
, filepos
*);
210 sprintf(error
, "expected higher heading levels before this one");
213 case err_winhelp_ctxclash
:
214 fpos
= *va_arg(ap
, filepos
*);
215 sp
= va_arg(ap
, char *);
216 sp2
= va_arg(ap
, char *);
217 sprintf(error
, "Windows Help context id `%.200s' clashes with "
218 "previously defined `%.200s'", sp
, sp2
);
222 fpos
= *va_arg(ap
, filepos
*);
223 fpos2
= *va_arg(ap
, filepos
*);
224 wsp
= va_arg(ap
, wchar_t *);
225 sp
= utoa_locale_dup(wsp
);
226 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
227 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
231 case err_misplacedlcont
:
232 fpos
= *va_arg(ap
, filepos
*);
233 sprintf(error
, "\\lcont is only expected after a list item");
236 case err_sectmarkerinblock
:
237 fpos
= *va_arg(ap
, filepos
*);
238 sp
= va_arg(ap
, char *);
239 sprintf(error
, "section headings are not supported within \\%.100s",
243 case err_cfginsufarg
:
244 fpos
= *va_arg(ap
, filepos
*);
245 sp
= va_arg(ap
, char *);
247 sprintf(error
, "\\cfg{%s} expects at least %d parameter%s", sp
,
251 case err_infonodechar
:
252 fposp
= va_arg(ap
, filepos
*);
253 c
= (char)va_arg(ap
, int);
254 sprintf(error
, "info output format does not support '%c' in"
255 " node names; removing", c
);
261 case err_text_codeline
:
262 fpos
= *va_arg(ap
, filepos
*);
265 sprintf(error
, "warning: code paragraph line is %d chars wide, wider"
266 " than body width %d", i
, j
);
270 fpos
= *va_arg(ap
, filepos
*);
271 wsp
= va_arg(ap
, wchar_t *);
272 sp
= utoa_locale_dup(wsp
);
273 sprintf(error
, "unrecognised HTML version keyword `%.200s'", sp
);
278 fpos
= *va_arg(ap
, filepos
*);
279 wsp
= va_arg(ap
, wchar_t *);
280 sp
= utoa_locale_dup(wsp
);
281 sprintf(error
, "character set `%.200s' not recognised", sp
);
286 fpos
= *va_arg(ap
, filepos
*);
287 wsp
= va_arg(ap
, wchar_t *);
288 sp
= utoa_locale_dup(wsp
);
289 sprintf(error
, "font `%.200s' not recognised", sp
);
294 fpos
= *va_arg(ap
, filepos
*);
295 sprintf(error
, "AFM file ended unexpectedly");
299 fpos
= *va_arg(ap
, filepos
*);
300 sp
= va_arg(ap
, char *);
301 sprintf(error
, "required AFM key '%.200s' missing", sp
);
305 fpos
= *va_arg(ap
, filepos
*);
306 sprintf(error
, "unsupported AFM version");
310 fpos
= *va_arg(ap
, filepos
*);
311 sp
= va_arg(ap
, char *);
314 sprintf(error
, "AFM key '%.200s' requires a value", sp
);
316 sprintf(error
, "AFM key '%.200s' requires %d values", sp
, i
);
320 fpos
= *va_arg(ap
, filepos
*);
321 sprintf(error
, "Type 1 font file ended unexpectedly");
325 fpos
= *va_arg(ap
, filepos
*);
326 sprintf(error
, "Type 1 font file header line invalid");
330 fpos
= *va_arg(ap
, filepos
*);
331 sprintf(error
, "Type 1 font file invalid");
335 fpos
= *va_arg(ap
, filepos
*);
336 sp
= va_arg(ap
, char *);
337 sprintf(error
, "no metrics available for Type 1 font '%.200s'", sp
);
341 sprintf(error
, "only one of html-mshtmlhelp-chm and "
342 "html-mshtmlhelp-hhp found");
345 case err_sfntnotable
:
346 fpos
= *va_arg(ap
, filepos
*);
347 sp
= va_arg(ap
, char *);
348 sprintf(error
, "font has no '%.4s' table", sp
);
351 case err_sfntnopsname
:
352 fpos
= *va_arg(ap
, filepos
*);
353 sprintf(error
, "font has no PostScript name");
356 case err_sfntbadtable
:
357 fpos
= *va_arg(ap
, filepos
*);
358 sp
= va_arg(ap
, char *);
359 sprintf(error
, "font has an invalid '%.4s' table", sp
);
362 case err_sfntnounicmap
:
363 fpos
= *va_arg(ap
, filepos
*);
364 sprintf(error
, "font has no UCS-2 character map");
367 case err_sfnttablevers
:
368 fpos
= *va_arg(ap
, filepos
*);
369 sp
= va_arg(ap
, char *);
370 sprintf(error
, "font has an unsupported '%.4s' table version", sp
);
374 fpos
= *va_arg(ap
, filepos
*);
375 sprintf(error
, "font has an invalid header");
378 case err_sfntbadglyph
:
379 fpos
= *va_arg(ap
, filepos
*);
380 wc
= va_arg(ap
, unsigned);
382 "warning: character U+%04X references an non-existent glyph",
387 sp
= va_arg(ap
, char *);
388 vsprintf(error
, sp
, ap
);
394 fputs("halibut: ", stderr
);
395 if (flags
& FILEPOS
) {
396 fprintf(stderr
, "%s:", fpos
.filename ? fpos
.filename
: "<standard input>");
398 fprintf(stderr
, "%d:", fpos
.line
);
400 fprintf(stderr
, "%d:", fpos
.col
);
403 fputs(error
, stderr
);
407 void fatal(int code
, ...) {
415 void error(int code
, ...) {