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
) {
26 case err_nomemory
: /* no arguments */
27 sprintf(error
, "out of memory");
31 sp
= va_arg(ap
, char *);
32 sprintf(error
, "option `-%.200s' requires an argument", sp
);
36 sp
= va_arg(ap
, char *);
37 sprintf(error
, "unrecognised option `-%.200s'", sp
);
41 sp
= va_arg(ap
, char *);
42 sprintf(error
, "character set `%.200s' not recognised", sp
);
46 sp
= va_arg(ap
, char *);
47 sp2
= va_arg(ap
, char *);
48 sprintf(error
, "warning: option `-%s' has no effect%s", sp
, sp2
);
51 case err_noinput
: /* no arguments */
52 sprintf(error
, "no input files");
56 sp
= va_arg(ap
, char *);
57 sprintf(error
, "unable to open input file `%.200s'", sp
);
60 case err_nodata
: /* no arguments */
61 sprintf(error
, "no data in input files");
64 case err_brokencodepara
:
65 fpos
= *va_arg(ap
, filepos
*);
66 sprintf(error
, "every line of a code paragraph should begin `\\c'");
70 fpos
= *va_arg(ap
, filepos
*);
71 sprintf(error
, "expected `}' after paragraph keyword");
75 fpos
= *va_arg(ap
, filepos
*);
76 sprintf(error
, "expected a paragraph keyword");
80 fpos
= *va_arg(ap
, filepos
*);
81 sprintf(error
, "expected no paragraph keyword");
85 fpos
= *va_arg(ap
, filepos
*);
86 sprintf(error
, "expected only one paragraph keyword");
90 fpos
= *va_arg(ap
, filepos
*);
91 sprintf(error
, "expected no text after paragraph keyword");
95 wsp
= va_arg(ap
, wchar_t *);
96 sp
= utoa_locale_dup(wsp
);
97 fpos
= *va_arg(ap
, filepos
*);
98 sprintf(error
, "command `%.200s' unrecognised at start of"
104 wsp
= va_arg(ap
, wchar_t *);
105 sp
= utoa_locale_dup(wsp
);
106 fpos
= *va_arg(ap
, filepos
*);
107 sprintf(error
, "command `%.200s' unexpected in mid-paragraph", sp
);
112 fpos
= *va_arg(ap
, filepos
*);
113 sprintf(error
, "brace character unexpected in mid-paragraph");
117 fpos
= *va_arg(ap
, filepos
*);
118 sprintf(error
, "expected `{' after command");
122 fpos
= *va_arg(ap
, filepos
*);
123 sprintf(error
, "end of file unexpected inside `\\#{...}' comment");
127 fpos
= *va_arg(ap
, filepos
*);
128 sprintf(error
, "expected `}' after cross-reference");
132 fpos
= *va_arg(ap
, filepos
*);
133 sprintf(error
, "unable to nest \\q{...} within \\c{...} or \\cw{...}");
136 case err_missingrbrace
:
137 fpos
= *va_arg(ap
, filepos
*);
138 sprintf(error
, "unclosed braces at end of paragraph");
141 case err_missingrbrace2
:
142 fpos
= *va_arg(ap
, filepos
*);
143 sprintf(error
, "unclosed braces at end of input file");
146 case err_nestedstyles
:
147 fpos
= *va_arg(ap
, filepos
*);
148 sprintf(error
, "unable to nest text styles");
151 case err_nestedindex
:
152 fpos
= *va_arg(ap
, filepos
*);
153 sprintf(error
, "unable to nest index markings");
157 fpos
= *va_arg(ap
, filepos
*);
158 wsp
= va_arg(ap
, wchar_t *);
159 sp
= utoa_locale_dup(wsp
);
160 fpos2
= *va_arg(ap
, filepos
*);
161 wsp2
= va_arg(ap
, wchar_t *);
162 sp2
= utoa_locale_dup(wsp2
);
163 sprintf(error
, "warning: index tag `%.200s' used with ", sp
);
164 sprintf(error
+ strlen(error
), "different case (`%.200s') at %s:%d",
165 sp2
, fpos2
.filename
, fpos2
.line
);
171 fpos
= *va_arg(ap
, filepos
*);
172 wsp
= va_arg(ap
, wchar_t *);
173 sp
= utoa_locale_dup(wsp
);
174 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
179 fpos
= *va_arg(ap
, filepos
*);
180 wsp
= va_arg(ap
, wchar_t *);
181 sp
= utoa_locale_dup(wsp
);
182 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
186 case err_nosuchidxtag
:
187 fpos
= *va_arg(ap
, filepos
*);
188 wsp
= va_arg(ap
, wchar_t *);
189 sp
= utoa_locale_dup(wsp
);
190 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
195 sp
= va_arg(ap
, char *);
196 sprintf(error
, "unable to open output file `%.200s'", sp
);
199 case err_macroexists
:
200 fpos
= *va_arg(ap
, filepos
*);
201 wsp
= va_arg(ap
, wchar_t *);
202 sp
= utoa_locale_dup(wsp
);
203 sprintf(error
, "macro `%.200s' already defined", sp
);
208 fpos
= *va_arg(ap
, filepos
*);
209 sprintf(error
, "expected higher heading levels before this one");
212 case err_winhelp_ctxclash
:
213 fpos
= *va_arg(ap
, filepos
*);
214 sp
= va_arg(ap
, char *);
215 sp2
= va_arg(ap
, char *);
216 sprintf(error
, "Windows Help context id `%.200s' clashes with "
217 "previously defined `%.200s'", sp
, sp2
);
221 fpos
= *va_arg(ap
, filepos
*);
222 fpos2
= *va_arg(ap
, filepos
*);
223 wsp
= va_arg(ap
, wchar_t *);
224 sp
= utoa_locale_dup(wsp
);
225 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
226 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
230 case err_misplacedlcont
:
231 fpos
= *va_arg(ap
, filepos
*);
232 sprintf(error
, "\\lcont is only expected after a list item");
235 case err_sectmarkerinblock
:
236 fpos
= *va_arg(ap
, filepos
*);
237 sp
= va_arg(ap
, char *);
238 sprintf(error
, "section headings are not supported within \\%.100s",
242 case err_infodirentry
:
243 fpos
= *va_arg(ap
, filepos
*);
244 sprintf(error
, "\\cfg{info-dir-entry} expects at least three"
248 case err_infonodechar
:
249 fpos
= *va_arg(ap
, filepos
*);
250 c
= (char)va_arg(ap
, int);
251 sprintf(error
, "info output format does not support '%c' in"
252 " node names; removing", c
);
255 case err_text_codeline
:
256 fpos
= *va_arg(ap
, filepos
*);
259 sprintf(error
, "warning: code paragraph line is %d chars wide, wider"
260 " than body width %d", i
, j
);
264 fpos
= *va_arg(ap
, filepos
*);
265 wsp
= va_arg(ap
, wchar_t *);
266 sp
= utoa_locale_dup(wsp
);
267 sprintf(error
, "unrecognised HTML version keyword `%.200s'", sp
);
272 fpos
= *va_arg(ap
, filepos
*);
273 wsp
= va_arg(ap
, wchar_t *);
274 sp
= utoa_locale_dup(wsp
);
275 sprintf(error
, "character set `%.200s' not recognised", sp
);
280 sp
= va_arg(ap
, char *);
281 vsprintf(error
, sp
, ap
);
287 fputs("halibut: ", stderr
);
288 if (flags
& FILEPOS
) {
289 fprintf(stderr
, "%s:", fpos
.filename
);
291 fprintf(stderr
, "%d:", fpos
.line
);
293 fprintf(stderr
, "%d:", fpos
.col
);
296 fputs(error
, stderr
);
300 void fatal(int code
, ...) {
308 void error(int code
, ...) {