sources-request@mirror.UUCP (06/23/86)
Submitted by: genrad!decvax!cwruecmp!ncoast!allbery (Brandon S. Allbery) Mod.sources: Volume 6, Issue 17 Archive-name: context #!/bin/sh # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # Contents: README context.c echo x - README sed 's/^XX//' > "README" <<'@//E*O*F README//' XXThe following file is my context'' program for displaying the context of XXa message of the general form XX <garbage> filename <garbege> linenumber <garbage> XXSample usage: XXScript started on Fri Jun 6 18:29:09 1986 XX% grep range context.c XXint cxtrange = 3; XX if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25) XX cxtrange = 3; XX lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange); XX hilino = cxtln + cxtrange; XX% grep -n range /dev/null context.c | context # /dev/null forces filename XX************** XX* context.c:6:int cxtrange = 3; XX***** XX XX char curfile[512]; XX FILE *curfp = NULL; XX* int cxtrange = 3; XX XX char *gets(); XX XX************** XX* context.c:20: if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25) XX***** XX exit(1); XX } XX if (argc == 2) XX* if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25) XX cxtrange = 3; XX while (gets(context) != (char *) 0) { XX for (cp = context; *cp != '.' && *cp != '/' && *cp != '-' && *cp != '_' && !isalnum(*cp); cp++) XX************** XX* context.c:21: cxtrange = 3; XX***** XX } XX if (argc == 2) XX if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25) XX* cxtrange = 3; XX while (gets(context) != (char *) 0) { XX for (cp = context; *cp != '.' && *cp != '/' && *cp != '-' && *cp != '_' && !isalnum(*cp); cp++) XX if (*cp == '\0') XX************** XX* context.c:49: lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange); XX***** XX if (*fcp == '\0') XX continue; XX cxtln = atol(fcp); XX* lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange); XX hilino = cxtln + cxtrange; XX if (lolino < curln) { XX fseek(curfp, 0L, 0); XX************** XX* context.c:50: hilino = cxtln + cxtrange; XX***** XX continue; XX cxtln = atol(fcp); XX lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange); XX* hilino = cxtln + cxtrange; XX if (lolino < curln) { XX fseek(curfp, 0L, 0); XX curln = 0; XX% XXscript done on Fri Jun 6 18:29:55 1986 XXAlso useful for examining the causes of C errors (although I've received mixed XXreviews on that; seems that BSD4.2 has a smarter'' program callederrors''). XXSimply compile context.c -- there are no V7/S5/BSD dependencies that I know XXof. Then enjoy. XX --Brandon @//E*O*F README// chmod u=rw,g=rw,o=rw README echo x - context.c sed 's/^XX//' > "context.c" <<'@//E*O*F context.c//' XX#include <stdio.h> XX#include <ctype.h> XXchar curfile[512]; XXFILE *curfp = NULL; XXint cxtrange = 3; XXchar *gets(); XXmain(argc, argv) XXchar **argv; { XX char context[512], fline[512], *cp, *fcp; XX long cxtln, lolino, hilino, curln; XX if (argc > 2) { XX fprintf(stderr, "Usage: context [nlines] < listfile\n"); XX exit(1); XX } XX if (argc == 2) XX if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25) XX cxtrange = 3; XX while (gets(context) != (char *) 0) { XX for (cp = context; *cp != '.' && *cp != '/' && *cp != '-' && *cp != '_' && !isalnum(*cp); cp++) XX if (*cp == '\0') XX break; XX if (*cp == '\0') XX continue; XX strcpy(fline, cp); XX for (fcp = cp, cp = fline; *cp == '_' || *cp == '.' || *cp == '/' || *cp == '-' || isalnum(*cp); cp++, fcp++) XX ; XX if (*cp == '\0') XX continue; XX *cp = '\0'; XX if (curfp == (FILE *) 0 || strcmp(curfile, fline) != 0) { XX if (curfp != (FILE *) 0) XX fclose(curfp); XX if ((curfp = fopen(fline, "r")) == (FILE *) 0) { XX perror(fline); XX continue; XX } XX strcpy(curfile, fline); XX curln = 0; XX } XX for (; *fcp != '\0' && !isdigit(*fcp); fcp++) XX ; XX if (*fcp == '\0') XX continue; XX cxtln = atol(fcp); XX lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange); XX hilino = cxtln + cxtrange; XX if (lolino < curln) { XX fseek(curfp, 0L, 0); XX curln = 0; XX } XX if (cxtln == curln) { /* already shown */ XX printf("*****\n* %s\n*****\n\n", context); XX continue; XX } XX printf("**************\n* %s\n*****\n", context); XX while (fgets(fline, 512, curfp) != (char *) 0 && ++curln < lolino) XX ; XX if (curln < lolino) XX continue; XX out(fline, curln == cxtln); XX while (fgets(fline, 512, curfp) != (char *) 0 && ++curln <= hilino) XX out(fline, curln == cxtln); XX putchar('\n'); XX } XX} XXout(s, flg) XXchar *s; { XX printf("%c %s", (flg? '*': ' '), s); XX} @//E*O*F context.c// chmod u=rw,g=rw,o=rw context.c echo Inspecting for damage in transit... temp=/tmp/sharin$$; dtemp=/tmp/sharout$$ trap "rm -f $temp $dtemp; exit" 0 1 2 3 15 cat > $temp <<\!!! 81 362 2154 README 74 291 1772 context.c 155 653 3926 total !!! wc README context.c | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp if test -s $dtemp then echo "Ouch [diff of wc output]:" ; cat $dtemp else echo "No problems found." fi exit 0