1071d4279SBram Moolenaar /* ======================================================================= */
2071d4279SBram Moolenaar /* Project : VIM */
3071d4279SBram Moolenaar /* Module : ccfilter Version: 02.01.01 */
4071d4279SBram Moolenaar /* File : ccfilter.c */
5071d4279SBram Moolenaar /* Purpose : Filter gmake/cc output into a standardized form */
6071d4279SBram Moolenaar /* ======================================================================= */
7071d4279SBram Moolenaar /* Created On: 12-Sep-95 20:32 */
8071d4279SBram Moolenaar /* Last modification: 03-Feb-98 */
9071d4279SBram Moolenaar /* -e option added by Bernd Feige */
10071d4279SBram Moolenaar /* ======================================================================= */
11071d4279SBram Moolenaar /* Copyright : */
12071d4279SBram Moolenaar /* This source file is copyright (c) to Pablo Ariel Kohan */
13071d4279SBram Moolenaar /* ======================================================================= */
14071d4279SBram Moolenaar #define __CCFILTER_C__
15071d4279SBram Moolenaar
16071d4279SBram Moolenaar #include <ctype.h>
17071d4279SBram Moolenaar #include <stdio.h>
18071d4279SBram Moolenaar #include <string.h>
19071d4279SBram Moolenaar #include <unistd.h>
20071d4279SBram Moolenaar
21071d4279SBram Moolenaar #define LINELENGTH 2048
22071d4279SBram Moolenaar
23071d4279SBram Moolenaar /* Collector(s) */
24071d4279SBram Moolenaar char Line[LINELENGTH];
25071d4279SBram Moolenaar char Line2[LINELENGTH];
26071d4279SBram Moolenaar /* Components */
27071d4279SBram Moolenaar char FileName[1024];
28071d4279SBram Moolenaar char BasePath[1024];
29071d4279SBram Moolenaar char CWD[1024];
30071d4279SBram Moolenaar unsigned long Row;
31071d4279SBram Moolenaar unsigned long Col;
32071d4279SBram Moolenaar char Severity;
33071d4279SBram Moolenaar char Reason[LINELENGTH];
34071d4279SBram Moolenaar
35071d4279SBram Moolenaar #define COMPILER_UNKNOWN 0
36071d4279SBram Moolenaar #define COMPILER_GCC 1
37071d4279SBram Moolenaar #define COMPILER_AIX 2
38071d4279SBram Moolenaar #define COMPILER_ATT 3
39071d4279SBram Moolenaar #define COMPILER_IRIX 4
40071d4279SBram Moolenaar #define COMPILER_SOLARIS 5
41071d4279SBram Moolenaar #define COMPILER_HPUX 6
42071d4279SBram Moolenaar
43071d4279SBram Moolenaar char *COMPILER_Names[][2] =
44071d4279SBram Moolenaar {
45071d4279SBram Moolenaar /* Name Description */
46071d4279SBram Moolenaar { "N/A", "" },
47071d4279SBram Moolenaar { "GCC", "GCC compiler" },
48071d4279SBram Moolenaar { "AIX", "AIX's C compiler" },
49071d4279SBram Moolenaar { "ATT", "AT&T/NCR's High Performance C Compiler" },
50071d4279SBram Moolenaar { "IRIX", "IRIX's MIPS/MIPSpro C compiler" },
51071d4279SBram Moolenaar { "SOLARIS", "SOLARIS's SparcWorks C compiler" },
52071d4279SBram Moolenaar { "HPUX", "HPUX's C compiler" }
53071d4279SBram Moolenaar };
54071d4279SBram Moolenaar #define COMPILER_QTY (sizeof(COMPILER_Names)/sizeof(COMPILER_Names[0]))
55071d4279SBram Moolenaar
56071d4279SBram Moolenaar #if defined(_GCC)
57071d4279SBram Moolenaar # define COMPILER_DEFAULT COMPILER_GCC
58071d4279SBram Moolenaar #elif defined(_AIX)
59071d4279SBram Moolenaar # define COMPILER_DEFAULT COMPILER_AIX
60071d4279SBram Moolenaar #elif defined(_ATT)
61071d4279SBram Moolenaar # define COMPILER_DEFAULT COMPILER_ATT
62071d4279SBram Moolenaar #elif defined(_IRIX)
63071d4279SBram Moolenaar # define COMPILER_DEFAULT COMPILER_IRIX
64071d4279SBram Moolenaar #elif defined(_SOLARIS)
65071d4279SBram Moolenaar # define COMPILER_DEFAULT COMPILER_SOLARIS
66071d4279SBram Moolenaar #elif defined(_HPUX)
67071d4279SBram Moolenaar # define COMPILER_DEFAULT COMPILER_HPUX
68071d4279SBram Moolenaar #else
69071d4279SBram Moolenaar # define COMPILER_DEFAULT COMPILER_UNKNOWN
70071d4279SBram Moolenaar #endif
71071d4279SBram Moolenaar
72071d4279SBram Moolenaar const char USAGE[] =
73071d4279SBram Moolenaar "ccfilter v2.1 (c)1994-1997 by Pablo Ariel Kohan\n"
74071d4279SBram Moolenaar "Filter Out compiler's output, and converts it to fit VIM\n\n"
75071d4279SBram Moolenaar "Usage:\n"
76071d4279SBram Moolenaar " ccfilter [<options>]\n"
77071d4279SBram Moolenaar "Where: <options> is one or more of:\n"
78071d4279SBram Moolenaar " -c Decrement column by one\n"
79071d4279SBram Moolenaar " -r Decrement row by one\n"
80071d4279SBram Moolenaar " -e Echo stdin to stderr\n"
81071d4279SBram Moolenaar " -v Verbose (Outputs also invalid lines)\n"
82071d4279SBram Moolenaar " -o <COMPILER> Treat input as <COMPILER>'s output\n"
83071d4279SBram Moolenaar " Note: COMPILER may be preceded by an _\n"
84071d4279SBram Moolenaar " -h This usage.\n";
85071d4279SBram Moolenaar
86071d4279SBram Moolenaar
ShowUsage(char * szError)87071d4279SBram Moolenaar int ShowUsage( char *szError )
88779a7759SBram Moolenaar {
89779a7759SBram Moolenaar int i;
90071d4279SBram Moolenaar
91071d4279SBram Moolenaar fprintf( stderr, USAGE );
92071d4279SBram Moolenaar
93071d4279SBram Moolenaar fprintf( stderr, "Current default <COMPILER>: %s\n",
94071d4279SBram Moolenaar COMPILER_Names[COMPILER_DEFAULT][0] );
95071d4279SBram Moolenaar
96071d4279SBram Moolenaar fprintf( stderr, "Acceptable parameters for <COMPILER> are:\n" );
97071d4279SBram Moolenaar for (i=1; i < COMPILER_QTY; i++)
98071d4279SBram Moolenaar fprintf( stderr, " %-15.15s %s\n",
99071d4279SBram Moolenaar COMPILER_Names[i][0],
100071d4279SBram Moolenaar COMPILER_Names[i][1] );
101071d4279SBram Moolenaar fprintf(stderr, szError);
102071d4279SBram Moolenaar return 0;
103071d4279SBram Moolenaar }
104071d4279SBram Moolenaar
echogets(char * s,int echo)105779a7759SBram Moolenaar char *echogets(char *s, int echo)
106779a7759SBram Moolenaar {
107071d4279SBram Moolenaar char * const retval=fgets(s, LINELENGTH, stdin);
108071d4279SBram Moolenaar if (echo!=0 && retval!=NULL) {
109071d4279SBram Moolenaar fputs(retval, stderr);
110071d4279SBram Moolenaar }
111071d4279SBram Moolenaar return retval;
112071d4279SBram Moolenaar }
113071d4279SBram Moolenaar
main(int argc,char * argv[])114071d4279SBram Moolenaar int main( int argc, char *argv[] )
115071d4279SBram Moolenaar { int rv, i, j, ok;
116071d4279SBram Moolenaar int stay;
117071d4279SBram Moolenaar int prefetch;
118071d4279SBram Moolenaar char *p;
119071d4279SBram Moolenaar int dec_col = 0; /* Decrement column value by 1 */
120071d4279SBram Moolenaar int dec_row = 0; /* Decrement row value by 1 */
121071d4279SBram Moolenaar int echo = 0; /* Echo stdin to stderr */
122071d4279SBram Moolenaar int verbose = 0; /* Include Bad Formatted Lines */
123071d4279SBram Moolenaar int CWDlen;
124071d4279SBram Moolenaar int COMPILER = COMPILER_DEFAULT;
125071d4279SBram Moolenaar
126071d4279SBram Moolenaar getcwd( CWD, sizeof(CWD) );
127071d4279SBram Moolenaar CWDlen = strlen(CWD);
128071d4279SBram Moolenaar
129071d4279SBram Moolenaar for (i=1; i<argc; i++)
130071d4279SBram Moolenaar {
131071d4279SBram Moolenaar if (argv[i][0] != '-')
132071d4279SBram Moolenaar return ShowUsage("");
133071d4279SBram Moolenaar switch ( argv[i][1] )
134071d4279SBram Moolenaar {
135071d4279SBram Moolenaar case 'c':
136071d4279SBram Moolenaar dec_col = 1;
137071d4279SBram Moolenaar break;
138071d4279SBram Moolenaar case 'r':
139071d4279SBram Moolenaar dec_row = 1;
140071d4279SBram Moolenaar break;
141071d4279SBram Moolenaar case 'e':
142071d4279SBram Moolenaar echo = 1;
143071d4279SBram Moolenaar break;
144071d4279SBram Moolenaar case 'v':
145071d4279SBram Moolenaar verbose = 1;
146071d4279SBram Moolenaar break;
147071d4279SBram Moolenaar case 'o':
148071d4279SBram Moolenaar {
149071d4279SBram Moolenaar if (i+1 >= argc)
150071d4279SBram Moolenaar return ShowUsage("Error: Missing parameter for -o\n");
151071d4279SBram Moolenaar i++;
152071d4279SBram Moolenaar COMPILER = -1;
153071d4279SBram Moolenaar for (j=1; j<COMPILER_QTY; j++)
154071d4279SBram Moolenaar if ( (strcmp(argv[i], COMPILER_Names[j][0]) == 0) ||
155071d4279SBram Moolenaar ( (argv[i][0] == '_') &&
156071d4279SBram Moolenaar (strcmp(&argv[i][1], COMPILER_Names[j][0]) == 0) ) )
157071d4279SBram Moolenaar COMPILER = j;
158071d4279SBram Moolenaar if (COMPILER == -1)
159071d4279SBram Moolenaar return ShowUsage("Error: Invalid COMPILER specified\n");
160071d4279SBram Moolenaar }
161071d4279SBram Moolenaar break;
162071d4279SBram Moolenaar case 'h':
163071d4279SBram Moolenaar return ShowUsage("");
164071d4279SBram Moolenaar default:
165071d4279SBram Moolenaar return ShowUsage("Error: Invalid option\n");
166071d4279SBram Moolenaar }
167071d4279SBram Moolenaar }
168071d4279SBram Moolenaar if (COMPILER == 0)
169071d4279SBram Moolenaar return ShowUsage("Error: COMPILER must be specified in this system\n");
170071d4279SBram Moolenaar
171071d4279SBram Moolenaar stay = ( echogets(Line, echo) != NULL );
172071d4279SBram Moolenaar prefetch = 0;
173071d4279SBram Moolenaar
174071d4279SBram Moolenaar while( stay )
175071d4279SBram Moolenaar {
176071d4279SBram Moolenaar *FileName = 0;
177071d4279SBram Moolenaar Row = 0;
178071d4279SBram Moolenaar Col = 0;
179071d4279SBram Moolenaar Severity = ' ';
180071d4279SBram Moolenaar *Reason = 0;
181071d4279SBram Moolenaar ok = 0;
182071d4279SBram Moolenaar switch (COMPILER)
183071d4279SBram Moolenaar {
184071d4279SBram Moolenaar case COMPILER_GCC:
185071d4279SBram Moolenaar Severity = 'e';
186071d4279SBram Moolenaar #ifdef GOTO_FROM_WHERE_INCLUDED
187*b16ad968SBram Moolenaar rv = sscanf( Line, "In file included from %[^:]:%lu:",
188071d4279SBram Moolenaar FileName, &Row );
189071d4279SBram Moolenaar if ( rv == 2 )
190071d4279SBram Moolenaar {
191071d4279SBram Moolenaar ok = (echogets(Reason, echo) != NULL);
192071d4279SBram Moolenaar }
193071d4279SBram Moolenaar else
194071d4279SBram Moolenaar #endif
195071d4279SBram Moolenaar {
196*b16ad968SBram Moolenaar if ((rv = sscanf( Line, "%[^:]:%lu: warning: %[^\n]",
197071d4279SBram Moolenaar FileName, &Row, Reason ))==3) {
198071d4279SBram Moolenaar Severity = 'w';
199071d4279SBram Moolenaar } else {
200*b16ad968SBram Moolenaar rv = sscanf( Line, "%[^:]:%lu: %[^\n]",
201071d4279SBram Moolenaar FileName, &Row, Reason );
202071d4279SBram Moolenaar }
203071d4279SBram Moolenaar ok = ( rv == 3 );
204071d4279SBram Moolenaar }
205071d4279SBram Moolenaar Col = (dec_col ? 1 : 0 );
206071d4279SBram Moolenaar break;
207071d4279SBram Moolenaar case COMPILER_AIX:
208*b16ad968SBram Moolenaar rv = sscanf( Line, "\"%[^\"]\", line %lu.%lu: %*s (%c) %[^\n]",
209071d4279SBram Moolenaar FileName, &Row, &Col, &Severity, Reason );
210071d4279SBram Moolenaar ok = ( rv == 5 );
211071d4279SBram Moolenaar break;
212071d4279SBram Moolenaar case COMPILER_HPUX:
213*b16ad968SBram Moolenaar rv = sscanf( Line, "cc: \"%[^\"]\", line %lu: %c%*[^:]: %[^\n]",
214071d4279SBram Moolenaar FileName, &Row, &Severity, Reason );
215071d4279SBram Moolenaar ok = ( rv == 4 );
216071d4279SBram Moolenaar Col = (dec_col ? 1 : 0 );
217071d4279SBram Moolenaar break;
218071d4279SBram Moolenaar case COMPILER_SOLARIS:
219*b16ad968SBram Moolenaar rv = sscanf( Line, "\"%[^\"]\", line %lu: warning: %[^\n]",
220071d4279SBram Moolenaar FileName, &Row, Reason );
221071d4279SBram Moolenaar Severity = 'w';
222071d4279SBram Moolenaar ok = ( rv == 3 );
223071d4279SBram Moolenaar if ( rv != 3 )
224071d4279SBram Moolenaar {
225*b16ad968SBram Moolenaar rv = sscanf( Line, "\"%[^\"]\", line %lu: %[^\n]",
226071d4279SBram Moolenaar FileName, &Row, Reason );
227071d4279SBram Moolenaar Severity = 'e';
228071d4279SBram Moolenaar ok = ( rv == 3 );
229071d4279SBram Moolenaar }
230071d4279SBram Moolenaar Col = (dec_col ? 1 : 0 );
231071d4279SBram Moolenaar break;
232071d4279SBram Moolenaar case COMPILER_ATT:
233*b16ad968SBram Moolenaar rv = sscanf( Line, "%c \"%[^\"]\",L%lu/C%lu%*[^:]:%[^\n]",
234071d4279SBram Moolenaar &Severity, FileName, &Row, &Col, Reason );
235071d4279SBram Moolenaar ok = ( rv == 5 );
236071d4279SBram Moolenaar
237071d4279SBram Moolenaar if (rv != 5)
238*b16ad968SBram Moolenaar { rv = sscanf( Line, "%c \"%[^\"]\",L%lu/C%lu: %[^\n]",
239071d4279SBram Moolenaar &Severity, FileName, &Row, &Col, Reason );
240071d4279SBram Moolenaar ok = ( rv == 5 );
241071d4279SBram Moolenaar }
242071d4279SBram Moolenaar
243071d4279SBram Moolenaar if (rv != 5)
244*b16ad968SBram Moolenaar { rv = sscanf( Line, "%c \"%[^\"]\",L%lu: %[^\n]",
245071d4279SBram Moolenaar &Severity, FileName, &Row, Reason );
246071d4279SBram Moolenaar ok = ( rv == 4 );
247071d4279SBram Moolenaar Col = (dec_col ? 1 : 0 );
248071d4279SBram Moolenaar }
249071d4279SBram Moolenaar
250071d4279SBram Moolenaar stay = (echogets(Line2, echo) != NULL);
251071d4279SBram Moolenaar while ( stay && (Line2[0] == '|') )
252071d4279SBram Moolenaar { for (p=&Line2[2]; (*p) && (isspace(*p)); p++);
253071d4279SBram Moolenaar strcat( Reason, ": " );
254071d4279SBram Moolenaar strcat( Reason, p );
255071d4279SBram Moolenaar Line2[0] = 0;
256071d4279SBram Moolenaar stay = (echogets(Line2, echo) != NULL);
257071d4279SBram Moolenaar }
258071d4279SBram Moolenaar prefetch = 1;
259071d4279SBram Moolenaar strcpy( Line, Line2 );
260071d4279SBram Moolenaar break;
261071d4279SBram Moolenaar case COMPILER_IRIX:
262071d4279SBram Moolenaar Col = 1;
263071d4279SBram Moolenaar prefetch = 0;
264071d4279SBram Moolenaar rv = 0;
265071d4279SBram Moolenaar ok = 0;
266071d4279SBram Moolenaar if ( !strncmp(Line, "cfe: ", 5) )
267071d4279SBram Moolenaar { p = &Line[5];
268071d4279SBram Moolenaar Severity = tolower(*p);
269071d4279SBram Moolenaar p = strchr( &Line[5], ':' );
270071d4279SBram Moolenaar if (p == NULL)
271071d4279SBram Moolenaar { ok = 0;
272071d4279SBram Moolenaar }
273071d4279SBram Moolenaar else
274071d4279SBram Moolenaar {
275*b16ad968SBram Moolenaar rv = sscanf( p+2, "%[^:]: %lu: %[^\n]",
276071d4279SBram Moolenaar FileName, &Row, Reason );
277071d4279SBram Moolenaar if (rv != 3)
278*b16ad968SBram Moolenaar rv = sscanf( p+2, "%[^,], line %lu: %[^\n]",
279071d4279SBram Moolenaar FileName, &Row, Reason );
280071d4279SBram Moolenaar ok = ( rv == 3 );
281071d4279SBram Moolenaar }
282071d4279SBram Moolenaar
283071d4279SBram Moolenaar if (ok)
284071d4279SBram Moolenaar { prefetch = 1;
285071d4279SBram Moolenaar stay = (echogets(Line, echo) != NULL);
286071d4279SBram Moolenaar if (Line[0] == ' ')
287071d4279SBram Moolenaar stay = (echogets(Line2, echo) != NULL);
288071d4279SBram Moolenaar if ( (Line2[0] == ' ') &&
289071d4279SBram Moolenaar ( (Line2[1] == '-') || (Line2[1] == '^') ) )
290071d4279SBram Moolenaar { Col = strlen(Line2)-1;
291071d4279SBram Moolenaar prefetch = 0;
292071d4279SBram Moolenaar }
293071d4279SBram Moolenaar else
294071d4279SBram Moolenaar { strcat( Line, "\n" );
295071d4279SBram Moolenaar strcat( Line, Line2 );
296071d4279SBram Moolenaar }
297071d4279SBram Moolenaar }
298071d4279SBram Moolenaar }
299071d4279SBram Moolenaar break;
300071d4279SBram Moolenaar }
301071d4279SBram Moolenaar if (dec_col) Col--;
302071d4279SBram Moolenaar if (dec_row) Row--;
303071d4279SBram Moolenaar if (!ok)
304071d4279SBram Moolenaar {
305071d4279SBram Moolenaar if ( Line[0] == 'g' )
306071d4279SBram Moolenaar p = &Line[1];
307071d4279SBram Moolenaar else
308071d4279SBram Moolenaar p = &Line[0];
309071d4279SBram Moolenaar ok = sscanf( p, "make[%*d]: Entering directory `%[^']",
310071d4279SBram Moolenaar BasePath );
311071d4279SBram Moolenaar if (verbose)
31206d2d38aSBram Moolenaar printf( "[%u]?%s\n", (unsigned)ok, Line );
313071d4279SBram Moolenaar }
314071d4279SBram Moolenaar else
315071d4279SBram Moolenaar {
316071d4279SBram Moolenaar for (p=Reason; (*p) && (isspace(*p)); p++);
317071d4279SBram Moolenaar if ( BasePath[CWDlen] == 0 )
318*b16ad968SBram Moolenaar printf( "%s:%lu:%lu:%c:%s\n", FileName, Row, Col, Severity, p );
319071d4279SBram Moolenaar else
320071d4279SBram Moolenaar {
321*b16ad968SBram Moolenaar printf( "%s/%s:%lu:%lu:%c:%s\n", &BasePath[CWDlen+1], FileName, Row, Col, Severity, p );
322071d4279SBram Moolenaar }
323071d4279SBram Moolenaar }
324071d4279SBram Moolenaar if (!prefetch)
325071d4279SBram Moolenaar stay = ( echogets(Line, echo) != NULL );
326071d4279SBram Moolenaar }
327071d4279SBram Moolenaar return 0;
328071d4279SBram Moolenaar }
329