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
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
85 fpos
= *va_arg(ap
, filepos
*);
86 sprintf(error
, "command `%.200s' unrecognised at start of"
91 wsp
= va_arg(ap
, wchar_t *);
92 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
93 fpos
= *va_arg(ap
, filepos
*);
94 sprintf(error
, "command `%.200s' unexpected in mid-paragraph", sp
);
98 fpos
= *va_arg(ap
, filepos
*);
99 sprintf(error
, "brace character unexpected in mid-paragraph");
103 fpos
= *va_arg(ap
, filepos
*);
104 sprintf(error
, "expected `{' after command");
108 fpos
= *va_arg(ap
, filepos
*);
109 sprintf(error
, "end of file unexpected inside `\\#{...}' comment");
113 fpos
= *va_arg(ap
, filepos
*);
114 sprintf(error
, "expected `}' after cross-reference");
117 case err_missingrbrace
:
118 fpos
= *va_arg(ap
, filepos
*);
119 sprintf(error
, "unclosed braces at end of paragraph");
122 case err_missingrbrace2
:
123 fpos
= *va_arg(ap
, filepos
*);
124 sprintf(error
, "unclosed braces at end of input file");
127 case err_nestedstyles
:
128 fpos
= *va_arg(ap
, filepos
*);
129 sprintf(error
, "unable to nest text styles");
132 case err_nestedindex
:
133 fpos
= *va_arg(ap
, filepos
*);
134 sprintf(error
, "unable to nest index markings");
138 fpos
= *va_arg(ap
, filepos
*);
139 wsp
= va_arg(ap
, wchar_t *);
140 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
141 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
145 fpos
= *va_arg(ap
, filepos
*);
146 wsp
= va_arg(ap
, wchar_t *);
147 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
148 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
151 case err_nosuchidxtag
:
152 wsp
= va_arg(ap
, wchar_t *);
153 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
154 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
156 /* FIXME: need to get a filepos to here somehow */
159 sp
= va_arg(ap
, char *);
160 sprintf(error
, "unable to open output file `%.200s'", sp
);
163 case err_macroexists
:
164 fpos
= *va_arg(ap
, filepos
*);
165 wsp
= va_arg(ap
, wchar_t *);
166 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
167 sprintf(error
, "macro `%.200s' already defined", sp
);
171 fpos
= *va_arg(ap
, filepos
*);
172 sprintf(error
, "expected higher heading levels before this one");
175 case err_winhelp_ctxclash
:
176 fpos
= *va_arg(ap
, filepos
*);
177 sp
= va_arg(ap
, char *);
178 sp2
= va_arg(ap
, char *);
179 sprintf(error
, "Windows Help context id `%.200s' clashes with "
180 "previously defined `%.200s'", sp
, sp2
);
184 fpos
= *va_arg(ap
, filepos
*);
185 fpos2
= *va_arg(ap
, filepos
*);
186 wsp
= va_arg(ap
, wchar_t *);
187 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
188 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
189 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
192 case err_misplacedlcont
:
193 fpos
= *va_arg(ap
, filepos
*);
194 sprintf(error
, "\\lcont is only expected after a list item");
197 case err_sectmarkerinblock
:
198 fpos
= *va_arg(ap
, filepos
*);
199 sp
= va_arg(ap
, char *);
200 sprintf(error
, "section headings are not supported within \\%.100s",
205 sp
= va_arg(ap
, char *);
206 vsprintf(error
, sp
, ap
);
212 fputs("halibut: ", stderr
);
213 if (flags
& FILEPOS
) {
214 fprintf(stderr
, "%s:", fpos
.filename
);
216 fprintf(stderr
, "%d:", fpos
.line
);
218 fprintf(stderr
, "%d:", fpos
.col
);
221 fputs(error
, stderr
);
225 void fatal(int code
, ...) {
233 void error(int code
, ...) {