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
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
86 fpos
= *va_arg(ap
, filepos
*);
87 sprintf(error
, "command `%.200s' unrecognised at start of"
92 wsp
= va_arg(ap
, wchar_t *);
93 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
94 fpos
= *va_arg(ap
, filepos
*);
95 sprintf(error
, "command `%.200s' unexpected in mid-paragraph", sp
);
99 fpos
= *va_arg(ap
, filepos
*);
100 sprintf(error
, "brace character unexpected in mid-paragraph");
104 fpos
= *va_arg(ap
, filepos
*);
105 sprintf(error
, "expected `{' after command");
109 fpos
= *va_arg(ap
, filepos
*);
110 sprintf(error
, "end of file unexpected inside `\\#{...}' comment");
114 fpos
= *va_arg(ap
, filepos
*);
115 sprintf(error
, "expected `}' after cross-reference");
118 case err_missingrbrace
:
119 fpos
= *va_arg(ap
, filepos
*);
120 sprintf(error
, "unclosed braces at end of paragraph");
123 case err_missingrbrace2
:
124 fpos
= *va_arg(ap
, filepos
*);
125 sprintf(error
, "unclosed braces at end of input file");
128 case err_nestedstyles
:
129 fpos
= *va_arg(ap
, filepos
*);
130 sprintf(error
, "unable to nest text styles");
133 case err_nestedindex
:
134 fpos
= *va_arg(ap
, filepos
*);
135 sprintf(error
, "unable to nest index markings");
139 fpos
= *va_arg(ap
, filepos
*);
140 wsp
= va_arg(ap
, wchar_t *);
141 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
142 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
146 fpos
= *va_arg(ap
, filepos
*);
147 wsp
= va_arg(ap
, wchar_t *);
148 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
149 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
152 case err_nosuchidxtag
:
153 wsp
= va_arg(ap
, wchar_t *);
154 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
155 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
157 /* FIXME: need to get a filepos to here somehow */
160 sp
= va_arg(ap
, char *);
161 sprintf(error
, "unable to open output file `%.200s'", sp
);
164 case err_macroexists
:
165 fpos
= *va_arg(ap
, filepos
*);
166 wsp
= va_arg(ap
, wchar_t *);
167 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
168 sprintf(error
, "macro `%.200s' already defined", sp
);
172 fpos
= *va_arg(ap
, filepos
*);
173 sprintf(error
, "expected higher heading levels before this one");
176 case err_winhelp_ctxclash
:
177 fpos
= *va_arg(ap
, filepos
*);
178 sp
= va_arg(ap
, char *);
179 sp2
= va_arg(ap
, char *);
180 sprintf(error
, "Windows Help context id `%.200s' clashes with "
181 "previously defined `%.200s'", sp
, sp2
);
185 fpos
= *va_arg(ap
, filepos
*);
186 fpos2
= *va_arg(ap
, filepos
*);
187 wsp
= va_arg(ap
, wchar_t *);
188 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
189 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
190 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
193 case err_misplacedlcont
:
194 fpos
= *va_arg(ap
, filepos
*);
195 sprintf(error
, "\\lcont is only expected after a list item");
198 case err_sectmarkerinblock
:
199 fpos
= *va_arg(ap
, filepos
*);
200 sp
= va_arg(ap
, char *);
201 sprintf(error
, "section headings are not supported within \\%.100s",
205 case err_infodirentry
:
206 fpos
= *va_arg(ap
, filepos
*);
207 sprintf(error
, "\\cfg{info-dir-entry} expects at least three"
211 case err_infonodechar
:
212 fpos
= *va_arg(ap
, filepos
*);
213 c
= (char)va_arg(ap
, int);
214 sprintf(error
, "info output format does not support '%c' in"
215 " node names; removing", c
);
219 sp
= va_arg(ap
, char *);
220 vsprintf(error
, sp
, ap
);
226 fputs("halibut: ", stderr
);
227 if (flags
& FILEPOS
) {
228 fprintf(stderr
, "%s:", fpos
.filename
);
230 fprintf(stderr
, "%d:", fpos
.line
);
232 fprintf(stderr
, "%d:", fpos
.col
);
235 fputs(error
, stderr
);
239 void fatal(int code
, ...) {
247 void error(int code
, ...) {