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 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
154 fpos
= *va_arg(ap
, filepos
*);
155 wsp
= va_arg(ap
, wchar_t *);
156 sp
= utoa_locale_dup(wsp
);
157 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
161 case err_nosuchidxtag
:
162 fpos
= *va_arg(ap
, filepos
*);
163 wsp
= va_arg(ap
, wchar_t *);
164 sp
= utoa_locale_dup(wsp
);
165 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
170 sp
= va_arg(ap
, char *);
171 sprintf(error
, "unable to open output file `%.200s'", sp
);
174 case err_macroexists
:
175 fpos
= *va_arg(ap
, filepos
*);
176 wsp
= va_arg(ap
, wchar_t *);
177 sp
= utoa_locale_dup(wsp
);
178 sprintf(error
, "macro `%.200s' already defined", sp
);
183 fpos
= *va_arg(ap
, filepos
*);
184 sprintf(error
, "expected higher heading levels before this one");
187 case err_winhelp_ctxclash
:
188 fpos
= *va_arg(ap
, filepos
*);
189 sp
= va_arg(ap
, char *);
190 sp2
= va_arg(ap
, char *);
191 sprintf(error
, "Windows Help context id `%.200s' clashes with "
192 "previously defined `%.200s'", sp
, sp2
);
196 fpos
= *va_arg(ap
, filepos
*);
197 fpos2
= *va_arg(ap
, filepos
*);
198 wsp
= va_arg(ap
, wchar_t *);
199 sp
= utoa_locale_dup(wsp
);
200 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
201 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
205 case err_misplacedlcont
:
206 fpos
= *va_arg(ap
, filepos
*);
207 sprintf(error
, "\\lcont is only expected after a list item");
210 case err_sectmarkerinblock
:
211 fpos
= *va_arg(ap
, filepos
*);
212 sp
= va_arg(ap
, char *);
213 sprintf(error
, "section headings are not supported within \\%.100s",
217 case err_infodirentry
:
218 fpos
= *va_arg(ap
, filepos
*);
219 sprintf(error
, "\\cfg{info-dir-entry} expects at least three"
223 case err_infonodechar
:
224 fpos
= *va_arg(ap
, filepos
*);
225 c
= (char)va_arg(ap
, int);
226 sprintf(error
, "info output format does not support '%c' in"
227 " node names; removing", c
);
230 case err_text_codeline
:
231 fpos
= *va_arg(ap
, filepos
*);
234 sprintf(error
, "warning: code paragraph line is %d chars wide, wider"
235 " than body width %d", i
, j
);
239 sp
= va_arg(ap
, char *);
240 vsprintf(error
, sp
, ap
);
246 fputs("halibut: ", stderr
);
247 if (flags
& FILEPOS
) {
248 fprintf(stderr
, "%s:", fpos
.filename
);
250 fprintf(stderr
, "%d:", fpos
.line
);
252 fprintf(stderr
, "%d:", fpos
.col
);
255 fputs(error
, stderr
);
259 void fatal(int code
, ...) {
267 void error(int code
, ...) {