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
);
40 case err_noinput
: /* no arguments */
41 sprintf(error
, "no input files");
45 sp
= va_arg(ap
, char *);
46 sprintf(error
, "unable to open input file `%.200s'", sp
);
49 case err_nodata
: /* no arguments */
50 sprintf(error
, "no data in input files");
53 case err_brokencodepara
:
54 fpos
= *va_arg(ap
, filepos
*);
55 sprintf(error
, "every line of a code paragraph should begin `\\c'");
59 fpos
= *va_arg(ap
, filepos
*);
60 sprintf(error
, "expected `}' after paragraph keyword");
64 fpos
= *va_arg(ap
, filepos
*);
65 sprintf(error
, "expected a paragraph keyword");
69 fpos
= *va_arg(ap
, filepos
*);
70 sprintf(error
, "expected no paragraph keyword");
74 fpos
= *va_arg(ap
, filepos
*);
75 sprintf(error
, "expected only one paragraph keyword");
79 fpos
= *va_arg(ap
, filepos
*);
80 sprintf(error
, "expected no text after paragraph keyword");
84 wsp
= va_arg(ap
, wchar_t *);
85 sp
= utoa_locale_dup(wsp
);
86 fpos
= *va_arg(ap
, filepos
*);
87 sprintf(error
, "command `%.200s' unrecognised at start of"
93 wsp
= va_arg(ap
, wchar_t *);
94 sp
= utoa_locale_dup(wsp
);
95 fpos
= *va_arg(ap
, filepos
*);
96 sprintf(error
, "command `%.200s' unexpected in mid-paragraph", sp
);
101 fpos
= *va_arg(ap
, filepos
*);
102 sprintf(error
, "brace character unexpected in mid-paragraph");
106 fpos
= *va_arg(ap
, filepos
*);
107 sprintf(error
, "expected `{' after command");
111 fpos
= *va_arg(ap
, filepos
*);
112 sprintf(error
, "end of file unexpected inside `\\#{...}' comment");
116 fpos
= *va_arg(ap
, filepos
*);
117 sprintf(error
, "expected `}' after cross-reference");
121 fpos
= *va_arg(ap
, filepos
*);
122 sprintf(error
, "unable to nest \\q{...} within \\c{...} or \\cw{...}");
125 case err_missingrbrace
:
126 fpos
= *va_arg(ap
, filepos
*);
127 sprintf(error
, "unclosed braces at end of paragraph");
130 case err_missingrbrace2
:
131 fpos
= *va_arg(ap
, filepos
*);
132 sprintf(error
, "unclosed braces at end of input file");
135 case err_nestedstyles
:
136 fpos
= *va_arg(ap
, filepos
*);
137 sprintf(error
, "unable to nest text styles");
140 case err_nestedindex
:
141 fpos
= *va_arg(ap
, filepos
*);
142 sprintf(error
, "unable to nest index markings");
146 fpos
= *va_arg(ap
, filepos
*);
147 wsp
= va_arg(ap
, wchar_t *);
148 sp
= utoa_locale_dup(wsp
);
149 fpos2
= *va_arg(ap
, filepos
*);
150 wsp2
= va_arg(ap
, wchar_t *);
151 sp2
= utoa_locale_dup(wsp2
);
152 sprintf(error
, "warning: index tag `%.200s' used with ", sp
);
153 sprintf(error
+ strlen(error
), "different case (`%.200s') at %s:%d",
154 sp2
, fpos2
.filename
, fpos2
.line
);
160 fpos
= *va_arg(ap
, filepos
*);
161 wsp
= va_arg(ap
, wchar_t *);
162 sp
= utoa_locale_dup(wsp
);
163 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
168 fpos
= *va_arg(ap
, filepos
*);
169 wsp
= va_arg(ap
, wchar_t *);
170 sp
= utoa_locale_dup(wsp
);
171 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
175 case err_nosuchidxtag
:
176 fpos
= *va_arg(ap
, filepos
*);
177 wsp
= va_arg(ap
, wchar_t *);
178 sp
= utoa_locale_dup(wsp
);
179 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
184 sp
= va_arg(ap
, char *);
185 sprintf(error
, "unable to open output file `%.200s'", sp
);
188 case err_macroexists
:
189 fpos
= *va_arg(ap
, filepos
*);
190 wsp
= va_arg(ap
, wchar_t *);
191 sp
= utoa_locale_dup(wsp
);
192 sprintf(error
, "macro `%.200s' already defined", sp
);
197 fpos
= *va_arg(ap
, filepos
*);
198 sprintf(error
, "expected higher heading levels before this one");
201 case err_winhelp_ctxclash
:
202 fpos
= *va_arg(ap
, filepos
*);
203 sp
= va_arg(ap
, char *);
204 sp2
= va_arg(ap
, char *);
205 sprintf(error
, "Windows Help context id `%.200s' clashes with "
206 "previously defined `%.200s'", sp
, sp2
);
210 fpos
= *va_arg(ap
, filepos
*);
211 fpos2
= *va_arg(ap
, filepos
*);
212 wsp
= va_arg(ap
, wchar_t *);
213 sp
= utoa_locale_dup(wsp
);
214 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
215 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
219 case err_misplacedlcont
:
220 fpos
= *va_arg(ap
, filepos
*);
221 sprintf(error
, "\\lcont is only expected after a list item");
224 case err_sectmarkerinblock
:
225 fpos
= *va_arg(ap
, filepos
*);
226 sp
= va_arg(ap
, char *);
227 sprintf(error
, "section headings are not supported within \\%.100s",
231 case err_infodirentry
:
232 fpos
= *va_arg(ap
, filepos
*);
233 sprintf(error
, "\\cfg{info-dir-entry} expects at least three"
237 case err_infonodechar
:
238 fpos
= *va_arg(ap
, filepos
*);
239 c
= (char)va_arg(ap
, int);
240 sprintf(error
, "info output format does not support '%c' in"
241 " node names; removing", c
);
244 case err_text_codeline
:
245 fpos
= *va_arg(ap
, filepos
*);
248 sprintf(error
, "warning: code paragraph line is %d chars wide, wider"
249 " than body width %d", i
, j
);
253 fpos
= *va_arg(ap
, filepos
*);
254 wsp
= va_arg(ap
, wchar_t *);
255 sp
= utoa_locale_dup(wsp
);
256 sprintf(error
, "unrecognised HTML version keyword `%.200s'", sp
);
261 sp
= va_arg(ap
, char *);
262 vsprintf(error
, sp
, ap
);
268 fputs("halibut: ", stderr
);
269 if (flags
& FILEPOS
) {
270 fprintf(stderr
, "%s:", fpos
.filename
);
272 fprintf(stderr
, "%d:", fpos
.line
);
274 fprintf(stderr
, "%d:", fpos
.col
);
277 fputs(error
, stderr
);
281 void fatal(int code
, ...) {
289 void error(int code
, ...) {