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");
120 case err_missingrbrace
:
121 fpos
= *va_arg(ap
, filepos
*);
122 sprintf(error
, "unclosed braces at end of paragraph");
125 case err_missingrbrace2
:
126 fpos
= *va_arg(ap
, filepos
*);
127 sprintf(error
, "unclosed braces at end of input file");
130 case err_nestedstyles
:
131 fpos
= *va_arg(ap
, filepos
*);
132 sprintf(error
, "unable to nest text styles");
135 case err_nestedindex
:
136 fpos
= *va_arg(ap
, filepos
*);
137 sprintf(error
, "unable to nest index markings");
141 fpos
= *va_arg(ap
, filepos
*);
142 wsp
= va_arg(ap
, wchar_t *);
143 sp
= utoa_locale_dup(wsp
);
144 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
149 fpos
= *va_arg(ap
, filepos
*);
150 wsp
= va_arg(ap
, wchar_t *);
151 sp
= utoa_locale_dup(wsp
);
152 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
156 case err_nosuchidxtag
:
157 fpos
= *va_arg(ap
, filepos
*);
158 wsp
= va_arg(ap
, wchar_t *);
159 sp
= utoa_locale_dup(wsp
);
160 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
165 sp
= va_arg(ap
, char *);
166 sprintf(error
, "unable to open output file `%.200s'", sp
);
169 case err_macroexists
:
170 fpos
= *va_arg(ap
, filepos
*);
171 wsp
= va_arg(ap
, wchar_t *);
172 sp
= utoa_locale_dup(wsp
);
173 sprintf(error
, "macro `%.200s' already defined", sp
);
178 fpos
= *va_arg(ap
, filepos
*);
179 sprintf(error
, "expected higher heading levels before this one");
182 case err_winhelp_ctxclash
:
183 fpos
= *va_arg(ap
, filepos
*);
184 sp
= va_arg(ap
, char *);
185 sp2
= va_arg(ap
, char *);
186 sprintf(error
, "Windows Help context id `%.200s' clashes with "
187 "previously defined `%.200s'", sp
, sp2
);
191 fpos
= *va_arg(ap
, filepos
*);
192 fpos2
= *va_arg(ap
, filepos
*);
193 wsp
= va_arg(ap
, wchar_t *);
194 sp
= utoa_locale_dup(wsp
);
195 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
196 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
200 case err_misplacedlcont
:
201 fpos
= *va_arg(ap
, filepos
*);
202 sprintf(error
, "\\lcont is only expected after a list item");
205 case err_sectmarkerinblock
:
206 fpos
= *va_arg(ap
, filepos
*);
207 sp
= va_arg(ap
, char *);
208 sprintf(error
, "section headings are not supported within \\%.100s",
212 case err_infodirentry
:
213 fpos
= *va_arg(ap
, filepos
*);
214 sprintf(error
, "\\cfg{info-dir-entry} expects at least three"
218 case err_infonodechar
:
219 fpos
= *va_arg(ap
, filepos
*);
220 c
= (char)va_arg(ap
, int);
221 sprintf(error
, "info output format does not support '%c' in"
222 " node names; removing", c
);
225 case err_text_codeline
:
226 fpos
= *va_arg(ap
, filepos
*);
229 sprintf(error
, "warning: code paragraph line is %d chars wide, wider"
230 " than body width %d", i
, j
);
234 sp
= va_arg(ap
, char *);
235 vsprintf(error
, sp
, ap
);
241 fputs("halibut: ", stderr
);
242 if (flags
& FILEPOS
) {
243 fprintf(stderr
, "%s:", fpos
.filename
);
245 fprintf(stderr
, "%d:", fpos
.line
);
247 fprintf(stderr
, "%d:", fpos
.col
);
250 fputs(error
, stderr
);
254 void fatal(int code
, ...) {
262 void error(int code
, ...) {