ba15d0e86dd49f2ee051bef8caf52d5e4f679595
[dragonfly.git] / usr.bin / xlint / lint1 / err.c
1 /*      $NetBSD: err.c,v 1.8 1995/10/02 17:37:00 jpo Exp $      */
2
3 /*
4  * Copyright (c) 1994, 1995 Jochen Pohl
5  * All Rights Reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Jochen Pohl for
18  *      The NetBSD Project.
19  * 4. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * $NetBSD: err.c,v 1.8 1995/10/02 17:37:00 jpo Exp $
34  * $DragonFly: src/usr.bin/xlint/lint1/err.c,v 1.3 2003/11/03 19:14:36 eirikn Exp $
35  */
36
37 /* number of errors found */
38 int     nerr;
39
40 /* number of syntax errors */
41 int     sytxerr;
42
43 #include <stdlib.h>
44 #ifdef __STDC__
45 #include <stdarg.h>
46 #else
47 #include <varargs.h>
48 #endif
49
50 #include "lint1.h"
51
52 static  const   char *basename __P((const char *));
53 static  void    verror __P((int, va_list));
54 static  void    vwarning __P((int, va_list));
55
56
57 const   char *msgs[] = {
58         "syntax error: empty declaration",                            /* 0 */
59         "old style declaration; add int",                             /* 1 */
60         "empty declaration",                                          /* 2 */
61         "%s declared in argument declaration list",                   /* 3 */
62         "illegal type combination",                                   /* 4 */
63         "modifying typedef with '%s'; only qualifiers allowed",       /* 5 */
64         "use 'double' instead of 'long float'",                       /* 6 */
65         "only one storage class allowed",                             /* 7 */
66         "illegal storage class",                                      /* 8 */
67         "only register valid as formal parameter storage class",      /* 9 */
68         "duplicate '%s'",                                             /* 10 */
69         "bit-field initializer out of range",                         /* 11 */
70         "compiler takes size of function",                            /* 12 */
71         "incomplete enum type: %s",                                   /* 13 */
72         "compiler takes alignment of function",                       /* 14 */
73         "function returns illegal type",                              /* 15 */
74         "array of function is illegal",                               /* 16 */
75         "null dimension",                                             /* 17 */
76         "illegal use of 'void'",                                      /* 18 */
77         "void type for %s",                                           /* 19 */
78         "zero or negative array dimension",                           /* 20 */
79         "redeclaration of formal parameter %s",                       /* 21 */
80         "incomplete or misplaced function definition",                /* 22 */
81         "undefined label %s",                                         /* 23 */
82         "cannot initialize function: %s",                             /* 24 */
83         "cannot initialize typedef: %s",                              /* 25 */
84         "cannot initialize extern declaration: %s",                   /* 26 */
85         "redeclaration of %s",                                        /* 27 */
86         "redefinition of %s",                                         /* 28 */
87         "previously declared extern, becomes static: %s",             /* 29 */
88         "redeclaration of %s; ANSI C requires static",                /* 30 */
89         "incomplete structure or union %s: %s",                       /* 31 */
90         "argument type defaults to 'int': %s",                        /* 32 */
91         "duplicate member name: %s",                                  /* 33 */
92         "nonportable bit-field type",                                 /* 34 */
93         "illegal bit-field type",                                     /* 35 */
94         "illegal bit-field size",                                     /* 36 */
95         "zero size bit-field",                                        /* 37 */
96         "function illegal in structure or union",                     /* 38 */
97         "illegal zero sized structure member: %s",                    /* 39 */
98         "unknown size: %s",                                           /* 40 */
99         "illegal use of bit-field",                                   /* 41 */
100         "forward reference to enum type",                             /* 42 */
101         "redefinition hides earlier one: %s",                         /* 43 */
102         "declaration introduces new type in ANSI C: %s %s",           /* 44 */
103         "base type is really '%s %s'",                                /* 45 */
104         "(%s) tag redeclared",                                        /* 46 */
105         "zero sized %s",                                              /* 47 */
106         "overflow in enumeration values: %s",                         /* 48 */
107         "struct or union member must be named",                       /* 49 */
108         "a function is declared as an argument: %s",                  /* 50 */
109         "parameter mismatch: %d declared, %d defined",                /* 51 */
110         "cannot initialize parameter: %s",                            /* 52 */
111         "declared argument %s is missing",                            /* 53 */
112         "trailing ',' prohibited in enum declaration",                /* 54 */
113         "integral constant expression expected",                      /* 55 */
114         "integral constant too large",                                /* 56 */
115         "enumeration constant hides parameter: %s",                   /* 57 */
116         "type does not match prototype: %s",                          /* 58 */
117         "formal parameter lacks name: param #%d",                     /* 59 */
118         "void must be sole parameter",                                /* 60 */
119         "void parameter cannot have name: %s",                        /* 61 */
120         "function prototype parameters must have types",              /* 62 */
121         "prototype does not match old-style definition",              /* 63 */
122         "()-less function definition",                                /* 64 */
123         "%s has no named members",                                    /* 65 */
124         "syntax requires ';' after last struct/union member",         /* 66 */
125         "cannot return incomplete type",                              /* 67 */
126         "typedef already qualified with '%s'",                        /* 68 */
127         "inappropriate qualifiers with 'void'",                       /* 69 */
128         "%soperand of '%s' is unsigned in ANSI C",                    /* 70 */
129         "too many characters in character constant",                  /* 71 */
130         "typedef declares no type name",                              /* 72 */
131         "empty character constant",                                   /* 73 */
132         "no hex digits follow \\x",                                   /* 74 */
133         "overflow in hex escape",                                     /* 75 */
134         "character escape does not fit in character",                 /* 76 */
135         "bad octal digit %c",                                         /* 77 */
136         "nonportable character escape",                               /* 78 */
137         "dubious escape \\%c",                                        /* 79 */
138         "dubious escape \\%o",                                        /* 80 */
139         "\\a undefined in traditional C",                             /* 81 */
140         "\\x undefined in traditional C",                             /* 82 */
141         "storage class after type is obsolescent",                    /* 83 */
142         "ANSI C requires formal parameter before '...'",              /* 84 */
143         "dubious tag declaration: %s %s",                             /* 85 */
144         "automatic hides external declaration: %s",                   /* 86 */
145         "static hides external declaration: %s",                      /* 87 */
146         "typedef hides external declaration: %s",                     /* 88 */
147         "typedef redeclared: %s",                                     /* 89 */
148         "inconsistent redeclaration of extern: %s",                   /* 90 */
149         "declaration hides parameter: %s",                            /* 91 */
150         "inconsistent redeclaration of static: %s",                   /* 92 */
151         "dubious static function at block level: %s",                 /* 93 */
152         "function has illegal storage class: %s",                     /* 94 */
153         "declaration hides earlier one: %s",                          /* 95 */
154         "cannot dereference non-pointer type",                        /* 96 */
155         "suffix U is illegal in traditional C",                       /* 97 */
156         "suffixes F and L are illegal in traditional C",              /* 98 */
157         "%s undefined",                                               /* 99 */
158         "unary + is illegal in traditional C",                        /* 100 */
159         "undefined struct/union member: %s",                          /* 101 */
160         "illegal member use: %s",                                     /* 102 */
161         "left operand of '.' must be struct/union object",            /* 103 */
162         "left operand of '->' must be pointer to struct/union",       /* 104 */
163         "non-unique member requires struct/union %s",                 /* 105 */
164         "left operand of '->' must be pointer",                       /* 106 */
165         "operands of '%s' have incompatible types",                   /* 107 */
166         "operand of '%s' has incompatible type",                      /* 108 */
167         "void type illegal in expression",                            /* 109 */
168         "pointer to function is not allowed here",                    /* 110 */
169         "unacceptable operand of '%s'",                               /* 111 */
170         "cannot take address of bit-field",                           /* 112 */
171         "cannot take address of register %s",                         /* 113 */
172         "%soperand of '%s' must be lvalue",                           /* 114 */
173         "%soperand of '%s' must be modifiable lvalue",                /* 115 */
174         "illegal pointer subtraction",                                /* 116 */
175         "bitwise operation on signed value possibly nonportable",     /* 117 */
176         "semantics of '%s' change in ANSI C; use explicit cast",      /* 118 */
177         "conversion of '%s' to '%s' is out of range",                 /* 119 */
178         "bitwise operation on signed value nonportable",              /* 120 */
179         "negative shift",                                             /* 121 */
180         "shift greater than size of object",                          /* 122 */
181         "illegal combination of pointer and integer, op %s",          /* 123 */
182         "illegal pointer combination, op %s",                         /* 124 */
183         "ANSI C forbids ordered comparisons of pointers to functions",/* 125 */
184         "incompatible types in conditional",                          /* 126 */
185         "'&' before array or function: ignored",                      /* 127 */
186         "operands have incompatible pointer types, op %s",            /* 128 */
187         "expression has null effect",                                 /* 129 */
188         "enum type mismatch, op %s",                                  /* 130 */
189         "conversion to '%s' may sign-extend incorrectly",             /* 131 */
190         "conversion from '%s' may lose accuracy",                     /* 132 */
191         "conversion of pointer to '%s' loses bits",                   /* 133 */
192         "conversion of pointer to '%s' may lose bits",                /* 134 */
193         "possible pointer alignment problem",                         /* 135 */
194         "cannot do pointer arithmetic on operand of unknown size",    /* 136 */
195         "use of incomplete enum type, op %s",                         /* 137 */
196         "unknown operand size, op %s",                                /* 138 */
197         "division by 0",                                              /* 139 */
198         "modulus by 0",                                               /* 140 */
199         "integer overflow detected, op %s",                           /* 141 */
200         "floating point overflow detected, op %s",                    /* 142 */
201         "cannot take size of incomplete type",                        /* 143 */
202         "cannot take size of function",                               /* 144 */
203         "cannot take size of bit-field",                              /* 145 */
204         "cannot take size of void",                                   /* 146 */
205         "invalid cast expression",                                    /* 147 */
206         "improper cast of void expression",                           /* 148 */
207         "illegal function",                                           /* 149 */
208         "argument mismatch: %d arg%s passed, %d expected",            /* 150 */
209         "void expressions may not be arguments, arg #%d",             /* 151 */
210         "argument cannot have unknown size, arg #%d",                 /* 152 */
211         "argument has incompatible pointer type, arg #%d",            /* 153 */
212         "illegal combination of pointer and integer, arg #%d",        /* 154 */
213         "argument is incompatible with prototype, arg #%d",           /* 155 */
214         "enum type mismatch, arg #%d",                                /* 156 */
215         "ANSI C treats constant as unsigned",                         /* 157 */
216         "%s may be used before set",                                  /* 158 */
217         "assignment in conditional context",                          /* 159 */
218         "operator '==' found where '=' was expected",                 /* 160 */
219         "constant in conditional context",                            /* 161 */
220         "comparision of %s with %s, op %s",                           /* 162 */
221         "a cast does not yield an lvalue",                            /* 163 */
222         "assignment of negative constant to unsigned type",           /* 164 */
223         "constant truncated by assignment",                           /* 165 */
224         "precision lost in bit-field assignment",                     /* 166 */
225         "array subscript cannot be negative: %ld",                    /* 167 */
226         "array subscript cannot be > %d: %ld",                        /* 168 */
227         "precedence confusion possible: parenthesize!",               /* 169 */
228         "first operand must have scalar type, op ? :",                /* 170 */
229         "assignment type mismatch",                                   /* 171 */
230         "too many struct/union initializers",                         /* 172 */
231         "too many array initializers",                                /* 173 */
232         "too many initializers",                                      /* 174 */
233         "initialisation of an incomplete type",                       /* 175 */
234         "invalid initializer",                                        /* 176 */
235         "non-constant initializer",                                   /* 177 */
236         "initializer does not fit",                                   /* 178 */
237         "cannot initialize struct/union with no named member",        /* 179 */
238         "bit-field initializer does not fit",                         /* 180 */
239         "{}-enclosed initializer required",                           /* 181 */
240         "incompatible pointer types",                                 /* 182 */
241         "illegal combination of pointer and integer",                 /* 183 */
242         "illegal pointer combination",                                /* 184 */
243         "initialisation type mismatch",                               /* 185 */
244         "bit-field initialisation is illegal in traditional C",       /* 186 */
245         "non-null byte ignored in string initializer",                /* 187 */
246         "no automatic aggregate initialization in traditional C",     /* 188 */
247         "assignment of struct/union illegal in traditional C",        /* 189 */
248         "empty array declaration: %s",                                /* 190 */
249         "%s set but not used in function %s",                         /* 191 */
250         "%s unused in function %s",                                   /* 192 */
251         "statement not reached",                                      /* 193 */
252         "label %s redefined",                                         /* 194 */
253         "case not in switch",                                         /* 195 */
254         "case label affected by conversion",                          /* 196 */
255         "non-constant case expression",                               /* 197 */
256         "non-integral case expression",                               /* 198 */
257         "duplicate case in switch: %ld",                              /* 199 */
258         "duplicate case in switch: %lu",                              /* 200 */
259         "default outside switch",                                     /* 201 */
260         "duplicate default in switch",                                /* 202 */
261         "case label must be of type `int' in traditional C",          /* 203 */
262         "controlling expressions must have scalar type",              /* 204 */
263         "switch expression must have integral type",                  /* 205 */
264         "enumeration value(s) not handled in switch",                 /* 206 */
265         "loop not entered at top",                                    /* 207 */
266         "break outside loop or switch",                               /* 208 */
267         "continue outside loop",                                      /* 209 */
268         "enum type mismatch in initialisation",                       /* 210 */
269         "return value type mismatch",                                 /* 211 */
270         "cannot return incomplete type",                              /* 212 */
271         "void function %s cannot return value",                       /* 213 */
272         "function %s expects to return value",                        /* 214 */
273         "function implicitly declared to return int",                 /* 215 */
274         "function %s has return (e); and return;",                    /* 216 */
275         "function %s falls off bottom without returning value",       /* 217 */
276         "ANSI C treats constant as unsigned, op %s",                  /* 218 */
277         "concatenated strings are illegal in traditional C",          /* 219 */
278         "fallthrough on case statement",                              /* 220 */
279         "initialisation of unsigned with negative constant",          /* 221 */
280         "conversion of negative constant to unsigned type",           /* 222 */
281         "end-of-loop code not reached",                               /* 223 */
282         "cannot recover from previous errors",                        /* 224 */
283         "static function called but not defined: %s()",               /* 225 */
284         "static variable %s unused",                                  /* 226 */
285         "const object %s should have initializer",                    /* 227 */
286         "function cannot return const or volatile object",            /* 228 */
287         "questionable conversion of function pointer",                /* 229 */
288         "nonportable character comparision, op %s",                   /* 230 */
289         "argument %s unused in function %s",                          /* 231 */
290         "label %s unused in function %s",                             /* 232 */
291         "struct %s never defined",                                    /* 233 */
292         "union %s never defined",                                     /* 234 */
293         "enum %s never defined",                                      /* 235 */
294         "static function %s unused",                                  /* 236 */
295         "redeclaration of formal parameter %s",                       /* 237 */
296         "initialisation of union is illegal in traditional C",        /* 238 */
297         "constant argument to NOT",                                   /* 239 */
298         "assignment of different structures",                         /* 240 */
299         "dubious operation on enum, op %s",                           /* 241 */
300         "combination of '%s' and '%s', op %s",                        /* 242 */
301         "dubious comparision of enums, op %s",                        /* 243 */
302         "illegal structure pointer combination",                      /* 244 */
303         "illegal structure pointer combination, op %s",               /* 245 */
304         "dubious conversion of enum to '%s'",                         /* 246 */
305         "pointer casts may be troublesome",                           /* 247 */
306         "floating-point constant out of range",                       /* 248 */
307         "syntax error",                                               /* 249 */
308         "unknown character \\%o",                                     /* 250 */
309         "malformed integer constant",                                 /* 251 */
310         "integer constant out of range",                              /* 252 */
311         "unterminated character constant",                            /* 253 */
312         "newline in string or char constant",                         /* 254 */
313         "undefined or invalid # directive",                           /* 255 */
314         "unterminated comment",                                       /* 256 */
315         "extra characters in lint comment",                           /* 257 */
316         "unterminated string constant",                               /* 258 */
317         "conversion to '%s' due to prototype, arg #%d",               /* 259 */
318         "previous declaration of %s",                                 /* 260 */
319         "previous definition of %s",                                  /* 261 */
320         "\\\" inside character constants undefined in traditional C", /* 262 */
321         "\\? undefined in traditional C",                             /* 263 */
322         "\\v undefined in traditional C",                             /* 264 */
323         "%s C does not support 'long long'",                          /* 265 */
324         "'long double' is illegal in traditional C",                  /* 266 */
325         "shift equal to size of object",                              /* 267 */
326         "variable declared inline: %s",                               /* 268 */
327         "argument declared inline: %s",                               /* 269 */
328         "function prototypes are illegal in traditional C",           /* 270 */
329         "switch expression must be of type `int' in traditional C",   /* 271 */
330         "empty translation unit",                                     /* 272 */
331         "bit-field type '%s' invalid in ANSI C",                      /* 273 */
332         "ANSI C forbids comparision of %s with %s",                   /* 274 */
333         "cast discards 'const' from pointer target type",             /* 275 */
334         "",                                                           /* 276 */
335         "initialisation of '%s' with '%s'",                           /* 277 */
336         "combination of '%s' and '%s', arg #%d",                      /* 278 */
337         "combination of '%s' and '%s' in return",                     /* 279 */
338         "must be outside function: /* %s */",                         /* 280 */
339         "duplicate use of /* %s */",                                  /* 281 */
340         "must precede function definition: /* %s */",                 /* 282 */
341         "argument number mismatch with directive: /* %s */",          /* 283 */
342         "fallthrough on default statement",                           /* 284 */
343         "prototype declaration",                                      /* 285 */
344         "function definition is not a prototype",                     /* 286 */
345         "function declaration is not a prototype",                    /* 287 */
346         "dubious use of /* VARARGS */ with /* %s */",                 /* 288 */
347         "can't be used together: /* PRINTFLIKE */ /* SCANFLIKE */",   /* 289 */
348         "static function %s declared but not defined",                /* 290 */
349         "invalid multibyte character",                                /* 291 */
350         "cannot concatenate wide and regular string literals",        /* 292 */
351         "argument %d must be 'char *' for PRINTFLIKE/SCANFLIKE",      /* 293 */
352         "multi-character character constant",                         /* 294 */
353         "conversion of '%s' to '%s' is out of range, arg #%d",        /* 295 */
354         "conversion of negative constant to unsigned type, arg #%d",  /* 296 */
355         "conversion to '%s' may sign-extend incorrectly, arg #%d",    /* 297 */
356         "conversion from '%s' may lose accuracy, arg #%d",            /* 298 */
357         "prototype does not match old style definition, arg #%d",     /* 299 */
358         "old style definition",                                       /* 300 */
359         "array of incomplete type",                                   /* 301 */
360         "%s returns pointer to automatic object",                     /* 302 */
361         "ANSI C forbids conversion of %s to %s",                      /* 303 */
362         "ANSI C forbids conversion of %s to %s, arg #%d",             /* 304 */
363         "ANSI C forbids conversion of %s to %s, op %s",               /* 305 */
364         "constant truncated by conversion, op %s",                    /* 306 */
365         "static variable %s set but not used",                        /* 307 */
366         "",                                                           /* 308 */
367         "extra bits set to 0 in conversion of '%s' to '%s', op %s",   /* 309 */
368 };
369
370 /*
371  * If Fflag is not set basename() returns a pointer to the last
372  * component of the path, otherwise it returns the argument.
373  */
374 static const char *
375 basename(path)
376         const   char *path;
377 {
378         const   char *cp, *cp1, *cp2;
379
380         if (Fflag)
381                 return (path);
382
383         cp = cp1 = cp2 = path;
384         while (*cp != '\0') {
385                 if (*cp++ == '/') {
386                         cp2 = cp1;
387                         cp1 = cp;
388                 }
389         }
390         return (*cp1 == '\0' ? cp2 : cp1);
391 }
392
393 static void
394 verror(n, ap)
395         int     n;
396         va_list ap;
397 {
398         const   char *fn;
399
400         fn = basename(curr_pos.p_file);
401         (void)printf("%s:%d: ", fn, curr_pos.p_line);
402         (void)vprintf(msgs[n], ap);
403         (void)printf("\n");
404         nerr++;
405 }
406
407 static void
408 vwarning(n, ap)
409         int     n;
410         va_list ap;
411 {
412         const   char *fn;
413
414         if (nowarn)
415                 /* this warning is suppressed by a LINTED comment */
416                 return;
417
418         fn = basename(curr_pos.p_file);
419         (void)printf("%s:%d: warning: ", fn, curr_pos.p_line);
420         (void)vprintf(msgs[n], ap);
421         (void)printf("\n");
422 }
423
424 void
425 #ifdef __STDC__
426 error(int n, ...)
427 #else
428 error(n, va_alist)
429         int     n;
430         va_dcl
431 #endif
432 {
433         va_list ap;
434
435 #ifdef __STDC__
436         va_start(ap, n);
437 #else
438         va_start(ap);
439 #endif
440         verror(n, ap);
441         va_end(ap);
442 }
443
444 void
445 #ifdef __STDC__
446 lerror(const char *msg, ...)
447 #else
448 lerror(msg, va_alist)
449         const   char *msg;
450         va_dcl
451 #endif
452 {
453         va_list ap;
454         const   char *fn;
455
456 #ifdef __STDC__
457         va_start(ap, msg);
458 #else
459         va_start(ap);
460 #endif
461         fn = basename(curr_pos.p_file);
462         (void)fprintf(stderr, "%s:%d: lint error: ", fn, curr_pos.p_line);
463         (void)vfprintf(stderr, msg, ap);
464         (void)fprintf(stderr, "\n");
465         va_end(ap);
466         exit(1);
467 }
468
469 void
470 #ifdef __STDC__
471 warning(int n, ...)
472 #else
473 warning(n, va_alist)
474         int     n;
475         va_dcl
476 #endif
477 {
478         va_list ap;
479
480 #ifdef __STDC__
481         va_start(ap, n);
482 #else
483         va_start(ap);
484 #endif
485         vwarning(n, ap);
486         va_end(ap);
487 }
488
489 void
490 #ifdef __STDC__
491 message(int n, ...)
492 #else
493 message(n, va_alist)
494         int     n;
495         va_dcl
496 #endif
497 {
498         va_list ap;
499         const   char *fn;
500
501 #ifdef __STDC__
502         va_start(ap, n);
503 #else
504         va_start(ap);
505 #endif
506         fn = basename(curr_pos.p_file);
507         (void)printf("%s:%d: ", fn, curr_pos.p_line);
508         (void)vprintf(msgs[n], ap);
509         (void)printf("\n");
510         va_end(ap);
511 }
512
513 int
514 #ifdef __STDC__
515 gnuism(int n, ...)
516 #else
517 gnuism(n, va_alist)
518         int     n;
519         va_dcl
520 #endif
521 {
522         va_list ap;
523         int     msg;
524
525 #ifdef __STDC__
526         va_start(ap, n);
527 #else
528         va_start(ap);
529 #endif
530         if (sflag && !gflag) {
531                 verror(n, ap);
532                 msg = 1;
533         } else if (!sflag && gflag) {
534                 msg = 0;
535         } else {
536                 vwarning(n, ap);
537                 msg = 1;
538         }
539         va_end(ap);
540
541         return (msg);
542 }