1/* $NetBSD: main1.c,v 1.18 2008/05/02 15:10:05 christos 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 34#if HAVE_NBTOOL_CONFIG_H 35#include "nbtool_config.h" 36#endif 37 38#include <sys/cdefs.h> 39#if defined(__RCSID) && !defined(lint) 40__RCSID("$NetBSD: main1.c,v 1.18 2008/05/02 15:10:05 christos Exp $"); 41#endif 42 43#include <sys/types.h> 44#include <stdio.h> 45#include <string.h> 46#include <stdlib.h> 47#include <unistd.h> 48#include <errno.h> 49#include <limits.h> 50#include <signal.h> 51 52#include "lint1.h" 53 54/* set yydebug to 1*/ 55int yflag; 56 57/* 58 * Print warnings if an assignment of an integertype to another integertype 59 * causes an implicit narrowing conversion. If aflag is 1, these warnings 60 * are printed only if the source type is at least as wide as long. If aflag 61 * is greater than 1, they are always printed. 62 */ 63int aflag; 64 65/* Print a warning if a break statement cannot be reached. */ 66int bflag; 67 68/* Print warnings for pointer casts. */ 69int cflag; 70 71/* Print various debug information. */ 72int dflag; 73 74/* Perform stricter checking of enum types and operations on enum types. */ 75int eflag; 76 77/* Print complete pathnames, not only the basename. */ 78int Fflag; 79 80/* Enable some extensions of gcc */ 81int gflag; 82 83/* Treat warnings as errors */ 84int wflag; 85 86/* 87 * Apply a number of heuristic tests to attempt to intuit bugs, improve 88 * style, and reduce waste. 89 */ 90int hflag; 91 92/* Attempt to check portability to other dialects of C. */ 93int pflag; 94 95/* 96 * In case of redeclarations/redefinitions print the location of the 97 * previous declaration/definition. 98 */ 99int rflag; 100 101/* Strict ANSI C mode. */ 102int sflag; 103 104/* Traditional C mode. */ 105int tflag; 106 107/* Enable C9X extensions */ 108int Sflag; 109 110/* Picky flag */ 111int Pflag; 112 113/* 114 * Complain about functions and external variables used and not defined, 115 * or defined and not used. 116 */ 117int uflag = 1; 118 119/* Complain about unused function arguments. */ 120int vflag = 1; 121 122/* Complain about structures which are never defined. */ 123int zflag = 1; 124 125err_set msgset; 126 127sig_atomic_t fpe; 128 129static void usage(void); 130 131int main(int, char *[]); 132 133/*ARGSUSED*/ 134static void 135sigfpe(int s) 136{ 137 fpe = 1; 138} 139 140int 141main(int argc, char *argv[]) 142{ 143 int c; 144 char *ptr; 145 146 setprogname(argv[0]); 147 148 ERR_ZERO(&msgset); 149 while ((c = getopt(argc, argv, "abcdeghmprstuvwyzFPSX:")) != -1) { 150 switch (c) { 151 case 'a': aflag++; break; 152 case 'b': bflag = 1; break; 153 case 'c': cflag = 1; break; 154 case 'd': dflag = 1; break; 155 case 'e': eflag = 1; break; 156 case 'F': Fflag = 1; break; 157 case 'g': gflag = 1; break; 158 case 'h': hflag = 1; break; 159 case 'p': pflag = 1; break; 160 case 'P': Pflag = 1; break; 161 case 'r': rflag = 1; break; 162 case 's': sflag = 1; break; 163 case 'S': Sflag = 1; break; 164 case 't': tflag = 1; break; 165 case 'u': uflag = 0; break; 166 case 'w': wflag = 1; break; 167 case 'v': vflag = 0; break; 168 case 'y': yflag = 1; break; 169 case 'z': zflag = 0; break; 170 171 case 'm': 172 msglist(); 173 return(0); 174 175 case 'X': 176 for (ptr = strtok(optarg, ","); ptr; 177 ptr = strtok(NULL, ",")) { 178 char *eptr; 179 long msg; 180 181 errno = 0; 182 msg = strtol(ptr, &eptr, 0); 183 if ((msg == LONG_MIN || msg == LONG_MAX) && 184 errno == ERANGE) 185 err(1, "invalid error message id '%s'", 186 ptr); 187 if (*eptr || ptr == eptr || msg < 0 || 188 msg >= ERR_SETSIZE) 189 errx(1, "invalid error message id '%s'", 190 ptr); 191 ERR_SET(msg, &msgset); 192 } 193 break; 194 case '?': 195 default: 196 usage(); 197 break; 198 } 199 } 200 argc -= optind; 201 argv += optind; 202 203 if (argc != 2) 204 usage(); 205 206 /* open the input file */ 207 if ((yyin = fopen(argv[0], "r")) == NULL) 208 err(1, "cannot open '%s'", argv[0]); 209 210 /* initialize output */ 211 outopen(argv[1]); 212 213 if (yflag) 214 yydebug = 1; 215 216 (void)signal(SIGFPE, sigfpe); 217 initmem(); 218 initdecl(); 219 initscan(); 220 initmtab(); 221 222 yyparse(); 223 224 /* Following warnings cannot be suppressed by LINTED */ 225 nowarn = 0; 226#ifdef DEBUG 227 printf("%s, %d: nowarn = 0\n", curr_pos.p_file, curr_pos.p_line); 228#endif 229 230 chkglsyms(); 231 232 outclose(); 233 234 return (nerr != 0); 235} 236 237static void 238usage(void) 239{ 240 (void)fprintf(stderr, 241 "Usage: %s [-abcdeghmprstuvwyzFS] [-X <id>[,<id>]... src dest\n", 242 getprogname()); 243 exit(1); 244} 245 246void 247norecover(void) 248{ 249 /* cannot recover from previous errors */ 250 error(224); 251 exit(1); 252} 253