static char *sccsid
= "@(#)main.c 1.4 (Berkeley) %G%";
Eptr
**files
; /* array of pointers into errors*/
char *currentfilename
= "????";
char *im_on
; /* my tty name */
boolean query
= FALSE
; /* query the operator if touch files */
boolean notouch
= FALSE
; /* don't touch ANY files */
boolean piflag
= FALSE
; /* this is not pi */
boolean terse
= FALSE
; /* Terse output */
char *suffixlist
= ".*"; /* initially, can touch any file */
* error [-I ignorename] [-n] [-q] [-t suffixlist] [-s] [-v] [infile]
* -I: the following name, `ignorename' contains a list of
* function names that are not to be treated as hard errors.
* -n: don't touch ANY files!
* -q: The user is to be queried before touching each
* file; if not specified, all files with hard, non
* ignorable errors are touched (assuming they can be).
* -t: touch only files ending with the list of suffices, each
* suffix preceded by a dot.
* will touch only files ending with .c, .y or .l
* -s: print a summary of the error's categories.
* -v: after touching all files, overlay vi(1), ex(1) or ed(1)
* on top of error, entered in the first file with
* an error in it, with the appropriate editor
* set up to use the "next" command to get the other
* files containing errors.
* -p: (obsolete: for older versions of pi without bug
* fix regarding printing out the name of the main file
* Take the following argument and use it as the name of
* the pascal source file, suffix .p
* -E: show the errors in sorted order; intended for
* -S: show the errors in unsorted order
* (as they come from the error file)
* infile: The error messages come from this file.
char **ed_argv
; /*return from touchfiles*/
boolean show_errors
= FALSE
;
boolean Show_Errors
= FALSE
;
boolean pr_summary
= FALSE
;
boolean edit_files
= FALSE
;
if (argc
> 1) for(; (argc
> 1) && (argv
[1][0] == '-'); argc
--, argv
++){
for (cp
= argv
[1] + 1; *cp
; cp
++) switch(*cp
){
fprintf(stderr
, "%s: -%c: Unknown flag\n",
case 'n': notouch
= TRUE
; break;
case 'q': query
= TRUE
; break;
case 'S': Show_Errors
= TRUE
; break;
case 's': pr_summary
= TRUE
; break;
case 'v': edit_files
= TRUE
; break;
case 'T': terse
= TRUE
; break;
*cp
-- = 0; argv
++; argc
--;
case 'I': /*ignore file name*/
*cp
-- = 0; argv
++; argc
--;
fprintf(stderr
, "%s: Only takes 0 or 1 arguments\n",
if ( (errorfile
= fopen(argv
[1], "r")) == NULL
){
fprintf(stderr
, "%s: %s: No such file or directory for reading errors.\n",
if ( (queryfile
= fopen(im_on
, "r")) == NULL
){
fprintf(stderr
,"%s: Can't open \"%s\" to query the user.\n",
if (signal(SIGINT
, onintr
) == SIG_IGN
)
if (signal(SIGTERM
, onintr
) == SIG_IGN
)
signal(SIGTERM
, SIG_IGN
);
eaterrors(&nerrors
, &errors
);
printerrors(TRUE
, nerrors
, errors
);
qsort(errors
, nerrors
, sizeof(Eptr
), errorsort
);
printerrors(FALSE
, nerrors
, errors
);
findfiles(nerrors
, errors
, &nfiles
, &files
);
#define P(msg, arg) fprintf(stdout, msg, arg)
P("%d Errors are unclassifiable.\n", nunknown
);
P("%d Errors are classifiable, but totally discarded.\n",nignore
);
P("%d Errors are synchronization errors.\n", nsyncerrors
);
P("%d Errors are discarded because they refer to sacrosinct files.\n", ndiscard
);
P("%d Errors are nulled because they refer to specific functions.\n", nnulled
);
P("%d Errors are not specific to any file.\n", nnonspec
);
P("%d Errors are specific to a given file, but not to a line.\n", nthisfile
);
P("%d Errors are true errors, and can be inserted into the files.\n", ntrue
);
filenames(nfiles
, files
);
if (touchfiles(nfiles
, files
, &ed_argc
, &ed_argv
) && edit_files
)
forkvi(ed_argc
, ed_argv
);
: "Do you still want to edit the files you touched? ")){
* ed_agument's first argument is
* a vi/ex compatabile search argument
* to find the first occurance of ###
try("ed", argc
-1, argv
+1);
fprintf(stdout
, "Can't find any editors.\n");
wordvprint(stdout
, argc
, argv
);
if (freopen(im_on
, "r", stdin
) == NULL
)
if (freopen(im_on
, "w", stdout
) == NULL
)
int errorsort(epp1
, epp2
)
* 1) synchronization, non specific, discarded errors first;
* 2) nulled and true errors last
* a) grouped by similar file names
* 1) grouped in ascending line number
ep1
= *epp1
; ep2
= *epp2
;
if (ep1
== 0 || ep2
== 0)
if ( (NOTSORTABLE(ep1
->error_e_class
)) ^ (NOTSORTABLE(ep2
->error_e_class
))){
return(NOTSORTABLE(ep1
->error_e_class
) ? -1 : 1);
if (NOTSORTABLE(ep1
->error_e_class
)) /* then both are */
return(ep1
->error_no
- ep2
->error_no
);
order
= strcmp(ep1
->error_text
[0], ep2
->error_text
[0]);
return(ep1
->error_line
- ep2
->error_line
);