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
) {
25 case err_nomemory
: /* no arguments */
26 sprintf(error
, "out of memory");
30 sp
= va_arg(ap
, char *);
31 sprintf(error
, "option `-%.200s' requires an argument", sp
);
35 sp
= va_arg(ap
, char *);
36 sprintf(error
, "unrecognised option `-%.200s'", sp
);
39 case err_noinput
: /* no arguments */
40 sprintf(error
, "no input files");
44 sp
= va_arg(ap
, char *);
45 sprintf(error
, "unable to open input file `%.200s'", sp
);
48 case err_nodata
: /* no arguments */
49 sprintf(error
, "no data in input files");
52 case err_brokencodepara
:
53 fpos
= *va_arg(ap
, filepos
*);
54 sprintf(error
, "every line of a code paragraph should begin `\\c'");
58 fpos
= *va_arg(ap
, filepos
*);
59 sprintf(error
, "expected `}' after paragraph keyword");
63 fpos
= *va_arg(ap
, filepos
*);
64 sprintf(error
, "expected a paragraph keyword");
68 fpos
= *va_arg(ap
, filepos
*);
69 sprintf(error
, "expected no paragraph keyword");
73 fpos
= *va_arg(ap
, filepos
*);
74 sprintf(error
, "expected only one paragraph keyword");
78 fpos
= *va_arg(ap
, filepos
*);
79 sprintf(error
, "expected no text after paragraph keyword");
83 wsp
= va_arg(ap
, wchar_t *);
84 sp
= utoa_locale_dup(wsp
);
85 fpos
= *va_arg(ap
, filepos
*);
86 sprintf(error
, "command `%.200s' unrecognised at start of"
92 wsp
= va_arg(ap
, wchar_t *);
93 sp
= utoa_locale_dup(wsp
);
94 fpos
= *va_arg(ap
, filepos
*);
95 sprintf(error
, "command `%.200s' unexpected in mid-paragraph", sp
);
100 fpos
= *va_arg(ap
, filepos
*);
101 sprintf(error
, "brace character unexpected in mid-paragraph");
105 fpos
= *va_arg(ap
, filepos
*);
106 sprintf(error
, "expected `{' after command");
110 fpos
= *va_arg(ap
, filepos
*);
111 sprintf(error
, "end of file unexpected inside `\\#{...}' comment");
115 fpos
= *va_arg(ap
, filepos
*);
116 sprintf(error
, "expected `}' after cross-reference");
119 case err_missingrbrace
:
120 fpos
= *va_arg(ap
, filepos
*);
121 sprintf(error
, "unclosed braces at end of paragraph");
124 case err_missingrbrace2
:
125 fpos
= *va_arg(ap
, filepos
*);
126 sprintf(error
, "unclosed braces at end of input file");
129 case err_nestedstyles
:
130 fpos
= *va_arg(ap
, filepos
*);
131 sprintf(error
, "unable to nest text styles");
134 case err_nestedindex
:
135 fpos
= *va_arg(ap
, filepos
*);
136 sprintf(error
, "unable to nest index markings");
140 fpos
= *va_arg(ap
, filepos
*);
141 wsp
= va_arg(ap
, wchar_t *);
142 sp
= utoa_locale_dup(wsp
);
143 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
148 fpos
= *va_arg(ap
, filepos
*);
149 wsp
= va_arg(ap
, wchar_t *);
150 sp
= utoa_locale_dup(wsp
);
151 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
155 case err_nosuchidxtag
:
156 fpos
= *va_arg(ap
, filepos
*);
157 wsp
= va_arg(ap
, wchar_t *);
158 sp
= utoa_locale_dup(wsp
);
159 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
164 sp
= va_arg(ap
, char *);
165 sprintf(error
, "unable to open output file `%.200s'", sp
);
168 case err_macroexists
:
169 fpos
= *va_arg(ap
, filepos
*);
170 wsp
= va_arg(ap
, wchar_t *);
171 sp
= utoa_locale_dup(wsp
);
172 sprintf(error
, "macro `%.200s' already defined", sp
);
177 fpos
= *va_arg(ap
, filepos
*);
178 sprintf(error
, "expected higher heading levels before this one");
181 case err_winhelp_ctxclash
:
182 fpos
= *va_arg(ap
, filepos
*);
183 sp
= va_arg(ap
, char *);
184 sp2
= va_arg(ap
, char *);
185 sprintf(error
, "Windows Help context id `%.200s' clashes with "
186 "previously defined `%.200s'", sp
, sp2
);
190 fpos
= *va_arg(ap
, filepos
*);
191 fpos2
= *va_arg(ap
, filepos
*);
192 wsp
= va_arg(ap
, wchar_t *);
193 sp
= utoa_locale_dup(wsp
);
194 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
195 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
199 case err_misplacedlcont
:
200 fpos
= *va_arg(ap
, filepos
*);
201 sprintf(error
, "\\lcont is only expected after a list item");
204 case err_sectmarkerinblock
:
205 fpos
= *va_arg(ap
, filepos
*);
206 sp
= va_arg(ap
, char *);
207 sprintf(error
, "section headings are not supported within \\%.100s",
211 case err_infodirentry
:
212 fpos
= *va_arg(ap
, filepos
*);
213 sprintf(error
, "\\cfg{info-dir-entry} expects at least three"
217 case err_infonodechar
:
218 fpos
= *va_arg(ap
, filepos
*);
219 c
= (char)va_arg(ap
, int);
220 sprintf(error
, "info output format does not support '%c' in"
221 " node names; removing", c
);
225 sp
= va_arg(ap
, char *);
226 vsprintf(error
, sp
, ap
);
232 fputs("halibut: ", stderr
);
233 if (flags
& FILEPOS
) {
234 fprintf(stderr
, "%s:", fpos
.filename
);
236 fprintf(stderr
, "%d:", fpos
.line
);
238 fprintf(stderr
, "%d:", fpos
.col
);
241 fputs(error
, stderr
);
245 void fatal(int code
, ...) {
253 void error(int code
, ...) {