1 /* ======================================================================= */
3 /* Module : ccfilter Version: 02.01.01 */
4 /* File : ccfilter.c */
5 /* Purpose : Filter gmake/cc output into a standardized form */
6 /* ======================================================================= */
7 /* Created On: 12-Sep-95 20:32 */
8 /* Last modification: 03-Feb-98 */
9 /* -e option added by Bernd Feige */
10 /* ======================================================================= */
12 /* This source file is copyright (c) to Pablo Ariel Kohan */
13 /* ======================================================================= */
14 #define __CCFILTER_C__
21 #define LINELENGTH 2048
24 char Line
[LINELENGTH
];
25 char Line2
[LINELENGTH
];
33 char Reason
[LINELENGTH
];
35 #define COMPILER_UNKNOWN 0
36 #define COMPILER_GCC 1
37 #define COMPILER_AIX 2
38 #define COMPILER_ATT 3
39 #define COMPILER_IRIX 4
40 #define COMPILER_SOLARIS 5
41 #define COMPILER_HPUX 6
43 char *COMPILER_Names
[][2] =
45 /* Name Description */
47 { "GCC", "GCC compiler" },
48 { "AIX", "AIX's C compiler" },
49 { "ATT", "AT&T/NCR's High Performance C Compiler" },
50 { "IRIX", "IRIX's MIPS/MIPSpro C compiler" },
51 { "SOLARIS", "SOLARIS's SparcWorks C compiler" },
52 { "HPUX", "HPUX's C compiler" }
54 #define COMPILER_QTY (sizeof(COMPILER_Names)/sizeof(COMPILER_Names[0]))
57 # define COMPILER_DEFAULT COMPILER_GCC
59 # define COMPILER_DEFAULT COMPILER_AIX
61 # define COMPILER_DEFAULT COMPILER_ATT
63 # define COMPILER_DEFAULT COMPILER_IRIX
64 #elif defined(_SOLARIS)
65 # define COMPILER_DEFAULT COMPILER_SOLARIS
67 # define COMPILER_DEFAULT COMPILER_HPUX
69 # define COMPILER_DEFAULT COMPILER_UNKNOWN
73 "ccfilter v2.1 (c)1994-1997 by Pablo Ariel Kohan\n"
74 "Filter Out compiler's output, and converts it to fit VIM\n\n"
76 " ccfilter [<options>]\n"
77 "Where: <options> is one or more of:\n"
78 " -c Decrement column by one\n"
79 " -r Decrement row by one\n"
80 " -e Echo stdin to stderr\n"
81 " -v Verbose (Outputs also invalid lines)\n"
82 " -o <COMPILER> Treat input as <COMPILER>'s output\n"
83 " Note: COMPILER may be preceded by an _\n"
87 int ShowUsage( char *szError
)
90 fprintf( stderr
, USAGE
);
92 fprintf( stderr
, "Current default <COMPILER>: %s\n",
93 COMPILER_Names
[COMPILER_DEFAULT
][0] );
95 fprintf( stderr
, "Acceptable parameters for <COMPILER> are:\n" );
96 for (i
=1; i
< COMPILER_QTY
; i
++)
97 fprintf( stderr
, " %-15.15s %s\n",
99 COMPILER_Names
[i
][1] );
100 fprintf(stderr
, szError
);
104 char *echogets(char *s
, int echo
) {
105 char * const retval
=fgets(s
, LINELENGTH
, stdin
);
106 if (echo
!=0 && retval
!=NULL
) {
107 fputs(retval
, stderr
);
112 int main( int argc
, char *argv
[] )
117 int dec_col
= 0; /* Decrement column value by 1 */
118 int dec_row
= 0; /* Decrement row value by 1 */
119 int echo
= 0; /* Echo stdin to stderr */
120 int verbose
= 0; /* Include Bad Formatted Lines */
122 int COMPILER
= COMPILER_DEFAULT
;
124 getcwd( CWD
, sizeof(CWD
) );
125 CWDlen
= strlen(CWD
);
127 for (i
=1; i
<argc
; i
++)
129 if (argv
[i
][0] != '-')
130 return ShowUsage("");
131 switch ( argv
[i
][1] )
148 return ShowUsage("Error: Missing parameter for -o\n");
151 for (j
=1; j
<COMPILER_QTY
; j
++)
152 if ( (strcmp(argv
[i
], COMPILER_Names
[j
][0]) == 0) ||
153 ( (argv
[i
][0] == '_') &&
154 (strcmp(&argv
[i
][1], COMPILER_Names
[j
][0]) == 0) ) )
157 return ShowUsage("Error: Invalid COMPILER specified\n");
161 return ShowUsage("");
163 return ShowUsage("Error: Invalid option\n");
167 return ShowUsage("Error: COMPILER must be specified in this system\n");
169 stay
= ( echogets(Line
, echo
) != NULL
);
184 #ifdef GOTO_FROM_WHERE_INCLUDED
185 rv
= sscanf( Line
, "In file included from %[^:]:%u:",
189 ok
= (echogets(Reason
, echo
) != NULL
);
194 if ((rv
= sscanf( Line
, "%[^:]:%u: warning: %[^\n]",
195 FileName
, &Row
, Reason
))==3) {
198 rv
= sscanf( Line
, "%[^:]:%u: %[^\n]",
199 FileName
, &Row
, Reason
);
203 Col
= (dec_col
? 1 : 0 );
206 rv
= sscanf( Line
, "\"%[^\"]\", line %u.%u: %*s (%c) %[^\n]",
207 FileName
, &Row
, &Col
, &Severity
, Reason
);
211 rv
= sscanf( Line
, "cc: \"%[^\"]\", line %u: %c%*[^:]: %[^\n]",
212 FileName
, &Row
, &Severity
, Reason
);
214 Col
= (dec_col
? 1 : 0 );
216 case COMPILER_SOLARIS
:
217 rv
= sscanf( Line
, "\"%[^\"]\", line %u: warning: %[^\n]",
218 FileName
, &Row
, Reason
);
223 rv
= sscanf( Line
, "\"%[^\"]\", line %u: %[^\n]",
224 FileName
, &Row
, Reason
);
228 Col
= (dec_col
? 1 : 0 );
231 rv
= sscanf( Line
, "%c \"%[^\"]\",L%u/C%u%*[^:]:%[^\n]",
232 &Severity
, FileName
, &Row
, &Col
, Reason
);
236 { rv
= sscanf( Line
, "%c \"%[^\"]\",L%u/C%u: %[^\n]",
237 &Severity
, FileName
, &Row
, &Col
, Reason
);
242 { rv
= sscanf( Line
, "%c \"%[^\"]\",L%u: %[^\n]",
243 &Severity
, FileName
, &Row
, Reason
);
245 Col
= (dec_col
? 1 : 0 );
248 stay
= (echogets(Line2
, echo
) != NULL
);
249 while ( stay
&& (Line2
[0] == '|') )
250 { for (p
=&Line2
[2]; (*p
) && (isspace(*p
)); p
++);
251 strcat( Reason
, ": " );
254 stay
= (echogets(Line2
, echo
) != NULL
);
257 strcpy( Line
, Line2
);
264 if ( !strncmp(Line
, "cfe: ", 5) )
266 Severity
= tolower(*p
);
267 p
= strchr( &Line
[5], ':' );
273 rv
= sscanf( p
+2, "%[^:]: %u: %[^\n]",
274 FileName
, &Row
, Reason
);
276 rv
= sscanf( p
+2, "%[^,], line %u: %[^\n]",
277 FileName
, &Row
, Reason
);
283 stay
= (echogets(Line
, echo
) != NULL
);
285 stay
= (echogets(Line2
, echo
) != NULL
);
286 if ( (Line2
[0] == ' ') &&
287 ( (Line2
[1] == '-') || (Line2
[1] == '^') ) )
288 { Col
= strlen(Line2
)-1;
292 { strcat( Line
, "\n" );
293 strcat( Line
, Line2
);
303 if ( Line
[0] == 'g' )
307 ok
= sscanf( p
, "make[%*d]: Entering directory `%[^']",
310 printf( "[%u]?%s\n", ok
, Line
);
314 for (p
=Reason
; (*p
) && (isspace(*p
)); p
++);
315 if ( BasePath
[CWDlen
] == 0 )
316 printf( "%s:%u:%u:%c:%s\n", FileName
, Row
, Col
, Severity
, p
);
319 printf( "%s/%s:%u:%u:%c:%s\n", &BasePath
[CWDlen
+1], FileName
, Row
, Col
, Severity
, p
);
323 stay
= ( echogets(Line
, echo
) != NULL
);