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_nestedstyles
:
123 fpos
= *va_arg(ap
, filepos
*);
124 sprintf(error
, "unable to nest text styles");
127 case err_nestedindex
:
128 fpos
= *va_arg(ap
, filepos
*);
129 sprintf(error
, "unable to nest index markings");
133 fpos
= *va_arg(ap
, filepos
*);
134 wsp
= va_arg(ap
, wchar_t *);
135 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
136 sprintf(error
, "unable to resolve cross-reference to `%.200s'", sp
);
140 fpos
= *va_arg(ap
, filepos
*);
141 wsp
= va_arg(ap
, wchar_t *);
142 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
143 sprintf(error
, "multiple `\\BR' entries given for `%.200s'", sp
);
146 case err_nosuchidxtag
:
147 wsp
= va_arg(ap
, wchar_t *);
148 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
149 sprintf(error
, "`\\IM' on unknown index tag `%.200s'", sp
);
151 /* FIXME: need to get a filepos to here somehow */
154 sp
= va_arg(ap
, char *);
155 sprintf(error
, "unable to open output file `%.200s'", sp
);
158 case err_macroexists
:
159 fpos
= *va_arg(ap
, filepos
*);
160 wsp
= va_arg(ap
, wchar_t *);
161 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
162 sprintf(error
, "macro `%.200s' already defined", sp
);
166 fpos
= *va_arg(ap
, filepos
*);
167 sprintf(error
, "expected higher heading levels before this one");
170 case err_winhelp_ctxclash
:
171 fpos
= *va_arg(ap
, filepos
*);
172 sp
= va_arg(ap
, char *);
173 sp2
= va_arg(ap
, char *);
174 sprintf(error
, "Windows Help context id `%.200s' clashes with "
175 "previously defined `%.200s'", sp
, sp2
);
179 fpos
= *va_arg(ap
, filepos
*);
180 fpos2
= *va_arg(ap
, filepos
*);
181 wsp
= va_arg(ap
, wchar_t *);
182 sp
= ustrtoa(wsp
, auxbuf
, sizeof(auxbuf
));
183 sprintf(error
, "paragraph keyword `%.200s' already defined at ", sp
);
184 sprintf(error
+ strlen(error
), "%s:%d", fpos2
.filename
, fpos2
.line
);
188 sp
= va_arg(ap
, char *);
189 vsprintf(error
, sp
, ap
);
195 fputs("halibut: ", stderr
);
196 if (flags
& FILEPOS
) {
197 fprintf(stderr
, "%s:%d:", fpos
.filename
, fpos
.line
);
199 fprintf(stderr
, "%d:", fpos
.col
);
202 fputs(error
, stderr
);
206 void fatal(int code
, ...) {
214 void error(int code
, ...) {