cml@sppy00.UUCP (Christopher Lott) (12/04/86)
I am new to UNIX and c, and was used to receiving output from
compiler(s) that consisted of the source code with lines that
it didn't like flagged and/or the error beneath the line.
When I first met the UNIX environment, I was disappointed that
this option was not available for the c compiler. So, I wrote
a small file processor with a controlling script that combines
the stderr output from cc with the cprogam and shows it to you.
Try it, certainly customize it, and _Please_ let me know what you think!!
No guarantees on portability, but I think it's simple enough
that it shouldn't give anyone fits.
'inline' is the controlling script; you will need to extract
this archive and then compile combine.c into a file called
combine, for now. Customize the inline script as needed.
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# inline combine.c
# This archive created: Thu Dec 4 14:29:41 EST 1986
PATH=/bin:$PATH; export PATH
echo "shar: extracting 'inline' (524 characters)"
if [ -f inline ]
then
echo "shar: will not over-write existing file 'inline'"
else
sed 's/^X//' << \SHAR_EOF > inline
X
X#! /bin/sh
X# First distribution of inline and combine.c - 861204
X#
X# written by Christopher Lott
X# ...osu-eddie!sppy00!cml
X# sh controller for combiner program
X
Xif [ $# -lt 1 ]
X then echo "Usage: $0 prog.c"
X exit 1
Xfi
X
Xcc $1 2> stderr.tmp
X
Xif [ -s stderr.tmp ]
X then
X# editing out >"prog.c", line <
X editstring1='"'$1'", line '
X editstring2=$1": "
X sed -e "s/$editstring1//" -e "s/$editstring2//" stderr.tmp > stderr
X rm stderr.tmp
X combine $1 stderr | more
X else
X echo "clean compile. executable in a.out."
Xfi
SHAR_EOF
fi
# set inline so it will run!
chmod 755 inline
echo "shar: extracting 'combine.c' (1910 characters)"
if [ -f combine.c ]
then
echo "shar: will not over-write existing file 'combine.c'"
else
sed 's/^X//' << \END-OF-CPROG > combine.c
X/* written by Christopher Lott */
X/* Online Computer Library Center */
X/* ...osu-eddie!sppy00!cml */
X/* combines cprogram with error output */
X/* to produce a listing of program */
X/* with error msgs following the line. */
X
X#include <stdio.h>
X
X#define MAXLINE 255
X
XFILE *fopen();
X
Xmain (argc, argv)
X int argc;
X char *argv[];
X
X {
X FILE *openfile(), *pgmfile, *errfile;
X
X /* must have 'command prog.c stderr'; anything else is ingnored */
X if (argc == 3)
X {
X pgmfile = openfile (++argv); /* open the program file */
X
X errfile = openfile (++argv); /* open cc stderr output */
X
X processfiles (pgmfile, errfile); /* do the work */
X }
X else
X printf ("usage: %s prog.c stderr\n", *argv);
X }
X
XFILE *openfile (name)
Xchar *name[];
X {
X FILE *fp;
X
X if ((fp = fopen(*name, "r")) == NULL)
X {
X printf ("can't open %s\n", *name);
X exit (1);
X }
X else
X {
X return (fp);
X }
X }
X
Xprocessfiles (cfile, efile)
XFILE *cfile, *efile;
X {
X
X long clineno, elineno;
X char cline[MAXLINE], eline[MAXLINE];
X
X clineno = 0;
X /* get first error line */
X fgets (eline, MAXLINE, efile);
X sscanf (eline, "%d:", &elineno);
X
X while ( (fgets (cline, MAXLINE, cfile) ) != NULL)
X {
X clineno++;
X printf ("%s", cline);
X
X if (clineno == elineno)
X {
X printf ("line %s", eline);
X
X while ( (fgets (eline, MAXLINE, efile) ) != NULL)
X {
X /* may have several errors for same line */
X sscanf (eline, "%d:", &elineno);
X if (clineno == elineno)
X printf ("line %s", eline);
X else
X break;
X } /* end while retrieving elines */
X
X } /* end if have a error line match */
X
X } /* end while retrieving clines */
X
X /* may have one left over */
X if (elineno >= clineno)
X printf ("line %s", eline);
X
X return;
X
X } /* end processfiles */
END-OF-CPROG
fi
--
Christopher Lott (cml@sppy00)woods@hao.UUCP (Greg Woods) (12/09/86)
I won't be the only one to tell you this, but a compiler output processor
that does what you want is already available, at least under 4.2BSD: error(1).
If you do "cc blotto.c |& error" (csh) or "cc blotto.c 2>1 | error" (Bourne)
it will actually modify the C source code and stick in the error messages as
comments.
--Greg
{ucbvax!hplabs | decvax!noao | mcvax!seismo | ihnp4!seismo}
!hao!woods
CSNET: woods@ncar.csnet ARPA: woods%ncar@CSNET-RELAY.ARPA