1 /* $NetBSD: main1.c,v 1.21 2013/04/19 17:43: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.21 2013/04/19 17:43: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*/ 55 int 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 */ 63 int aflag; 64 65 /* Print a warning if a break statement cannot be reached. */ 66 int bflag; 67 68 /* Print warnings for pointer casts. */ 69 int cflag; 70 71 /* Print various debug information. */ 72 int dflag; 73 74 /* Perform stricter checking of enum types and operations on enum types. */ 75 int eflag; 76 77 /* Print complete pathnames, not only the basename. */ 78 int Fflag; 79 80 /* Enable some extensions of gcc */ 81 int gflag; 82 83 /* Treat warnings as errors */ 84 int wflag; 85 86 /* 87 * Apply a number of heuristic tests to attempt to intuit bugs, improve 88 * style, and reduce waste. 89 */ 90 int hflag; 91 92 /* Attempt to check portability to other dialects of C. */ 93 int pflag; 94 95 /* 96 * In case of redeclarations/redefinitions print the location of the 97 * previous declaration/definition. 98 */ 99 int rflag; 100 101 /* Strict ANSI C mode. */ 102 int sflag; 103 104 /* Traditional C mode. */ 105 int tflag; 106 107 /* Enable C9X extensions */ 108 int Sflag; 109 110 /* Picky flag */ 111 int Pflag; 112 113 /* 114 * Complain about functions and external variables used and not defined, 115 * or defined and not used. 116 */ 117 int uflag = 1; 118 119 /* Complain about unused function arguments. */ 120 int vflag = 1; 121 122 /* Complain about structures which are never defined. */ 123 int zflag = 1; 124 125 err_set msgset; 126 127 sig_atomic_t fpe; 128 129 static void usage(void); 130 131 int main(int, char *[]); 132 133 /*ARGSUSED*/ 134 static void 135 sigfpe(int s) 136 { 137 fpe = 1; 138 } 139 140 int 141 main(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 == TARG_LONG_MIN || msg == TARG_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 lwarn = LWARN_ALL; 226 #ifdef DEBUG 227 printf("%s, %d: lwarn = %d\n", curr_pos.p_file, curr_pos.p_line, lwarn); 228 #endif 229 230 chkglsyms(); 231 232 outclose(); 233 234 return (nerr != 0); 235 } 236 237 static void 238 usage(void) 239 { 240 (void)fprintf(stderr, 241 "Usage: %s [-abcdeghmprstuvwyzFS] [-X <id>[,<id>]... src dest\n", 242 getprogname()); 243 exit(1); 244 } 245 246 void 247 norecover(void) 248 { 249 /* cannot recover from previous errors */ 250 error(224); 251 exit(1); 252 } 253