Commit | Line | Data |
---|---|---|
58195f21 | 1 | static char *sccsid = "@(#)filter.c 1.2 (Berkeley) %G%"; |
3a5a3cc6 BJ |
2 | #include <stdio.h> |
3 | #include <ctype.h> | |
4 | #include <pwd.h> | |
5 | #include "error.h" | |
6 | ||
7 | char *lint_libs[] = { | |
8 | IG_FILE1, | |
9 | IG_FILE2, | |
10 | IG_FILE3, | |
11 | IG_FILE4, | |
12 | 0 | |
13 | }; | |
14 | extern char* processname; | |
15 | int lexsort(); | |
16 | /* | |
17 | * Read the file ERRORNAME of the names of functions in lint | |
18 | * to ignore complaints about. | |
19 | */ | |
20 | getignored(auxname) | |
21 | char *auxname; | |
22 | { | |
58195f21 RH |
23 | reg int i; |
24 | FILE *fyle; | |
25 | char inbuffer[256]; | |
26 | int uid; | |
27 | char filename[128]; | |
28 | char *username; | |
29 | struct passwd *passwdentry; | |
3a5a3cc6 BJ |
30 | |
31 | nignored = 0; | |
32 | if (auxname == 0){ /* use the default */ | |
33 | if ( (username = (char *)getlogin()) == NULL){ | |
34 | username = "Unknown"; | |
35 | uid = getuid(); | |
36 | if ( (passwdentry = (struct passwd *)getpwuid(uid)) == NULL){ | |
37 | return; | |
38 | } | |
39 | } else { | |
40 | if ( (passwdentry = (struct passwd *)getpwnam(username)) == NULL) | |
41 | return; | |
42 | } | |
43 | strcpy(filename, passwdentry->pw_dir); | |
58195f21 | 44 | (void)strcat(filename, ERRORNAME); |
3a5a3cc6 | 45 | } else |
58195f21 | 46 | (void)strcpy(filename, auxname); |
3a5a3cc6 BJ |
47 | #ifdef FULLDEBUG |
48 | printf("Opening file \"%s\" to read names to ignore.\n", | |
49 | filename); | |
50 | #endif | |
51 | if ( (fyle = fopen(filename, "r")) == NULL){ | |
52 | #ifdef FULLDEBUG | |
53 | fprintf(stderr, "%s: Can't open file \"%s\"\n", | |
54 | processname, filename); | |
55 | #endif | |
56 | return; | |
57 | } | |
58 | /* | |
59 | * Make the first pass through the file, counting lines | |
60 | */ | |
61 | for (nignored = 0; fgets(inbuffer, 255, fyle) != NULL; nignored++) | |
62 | continue; | |
63 | names_ignored = (char **)Calloc(nignored+1, sizeof (char *)); | |
64 | fclose(fyle); | |
65 | if (freopen(filename, "r", fyle) == NULL){ | |
66 | #ifdef FULLDEBUG | |
67 | fprintf(stderr, "%s: Failure to open \"%s\" for second read.\n", | |
68 | processname, filename); | |
69 | #endif | |
70 | nignored = 0; | |
71 | return; | |
72 | } | |
73 | for (i=0; i < nignored && (fgets (inbuffer, 255, fyle) != NULL); i++){ | |
74 | names_ignored[i] = strsave(inbuffer); | |
58195f21 | 75 | (void)substitute(names_ignored[i], '\n', '\0'); |
3a5a3cc6 BJ |
76 | } |
77 | qsort(names_ignored, nignored, sizeof *names_ignored, lexsort); | |
78 | #ifdef FULLDEBUG | |
79 | printf("Names to ignore follow.\n"); | |
80 | for (i=0; i < nignored; i++){ | |
81 | printf("\tIgnore: %s\n", names_ignored[i]); | |
82 | } | |
83 | #endif | |
84 | } | |
85 | ||
86 | int lexsort(cpp1, cpp2) | |
87 | char **cpp1, **cpp2; | |
88 | { | |
89 | return(strcmp(*cpp1, *cpp2)); | |
90 | } | |
91 | ||
92 | int search_ignore(key) | |
93 | char *key; | |
94 | { | |
58195f21 RH |
95 | reg int ub, lb; |
96 | reg int halfway; | |
97 | int order; | |
3a5a3cc6 BJ |
98 | |
99 | if (nignored == 0) | |
100 | return(-1); | |
101 | for(lb = 0, ub = nignored - 1; ub >= lb; ){ | |
102 | halfway = (ub + lb)/2; | |
103 | if ( (order = strcmp(key, names_ignored[halfway])) == 0) | |
104 | return(halfway); | |
105 | if (order < 0) /*key is less than probe, throw away above*/ | |
106 | ub = halfway - 1; | |
107 | else | |
108 | lb = halfway + 1; | |
109 | } | |
110 | return(-1); | |
111 | } | |
112 | ||
113 | /* | |
114 | * Tell if the error text is to be ignored. | |
115 | * The error must have been canonicalized, with | |
116 | * the file name the zeroth entry in the errorv, | |
117 | * and the linenumber the second. | |
118 | * Return the new categorization of the error class. | |
119 | */ | |
120 | Errorclass discardit(errorp) | |
58195f21 | 121 | reg Eptr errorp; |
3a5a3cc6 | 122 | { |
58195f21 RH |
123 | int language; |
124 | reg int i; | |
3a5a3cc6 BJ |
125 | Errorclass errorclass = errorp->error_e_class; |
126 | ||
127 | switch(errorclass){ | |
128 | case C_SYNC: | |
129 | case C_NONSPEC: | |
130 | case C_UNKNOWN: return(errorclass); | |
131 | default: ; | |
132 | } | |
133 | if(errorp->error_lgtext < 2){ | |
134 | return(C_NONSPEC); | |
135 | } | |
136 | language = errorp->error_language; | |
137 | if(language == INLINT){ | |
138 | if (errorclass != C_NONSPEC){ /* no file */ | |
139 | for(i=0; lint_libs[i] != 0; i++){ | |
140 | if (strcmp(errorp->error_text[0], lint_libs[i]) == 0){ | |
141 | return(C_DISCARD); | |
142 | } | |
143 | } | |
144 | } | |
145 | /* check if the argument to the error message is to be ignored*/ | |
146 | if (ispunct(lastchar(errorp->error_text[2]))) | |
147 | clob_last(errorp->error_text[2], '\0'); | |
148 | if (search_ignore(errorp->error_text[errorclass == C_NONSPEC ? 0 : 2]) >= 0){ | |
149 | return(C_NULLED); | |
150 | } | |
151 | } | |
152 | return(errorclass); | |
153 | } |