xref: /vim-8.2.3635/runtime/tools/ccfilter.c (revision b16ad968)
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