home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume6 / context / context.c next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  1.7 KB  |  75 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. char curfile[512];
  5. FILE *curfp = NULL;
  6. int cxtrange = 3;
  7.  
  8. char *gets();
  9.  
  10. main(argc, argv)
  11. char **argv; {
  12.     char context[512], fline[512], *cp, *fcp;
  13.     long cxtln, lolino, hilino, curln;
  14.  
  15.     if (argc > 2) {
  16.         fprintf(stderr, "Usage: context [nlines] < listfile\n");
  17.         exit(1);
  18.     }
  19.     if (argc == 2)
  20.         if ((cxtrange = atol(argv[1])) < 1 || cxtrange > 25)
  21.             cxtrange = 3;
  22.     while (gets(context) != (char *) 0) {
  23.         for (cp = context; *cp != '.' && *cp != '/' && *cp != '-' && *cp != '_' && !isalnum(*cp); cp++)
  24.             if (*cp == '\0')
  25.                 break;
  26.         if (*cp == '\0')
  27.             continue;
  28.         strcpy(fline, cp);
  29.         for (fcp = cp, cp = fline; *cp == '_' || *cp == '.' || *cp == '/' || *cp == '-' || isalnum(*cp); cp++, fcp++)
  30.             ;
  31.         if (*cp == '\0')
  32.             continue;
  33.         *cp = '\0';
  34.         if (curfp == (FILE *) 0 || strcmp(curfile, fline) != 0) {
  35.             if (curfp != (FILE *) 0)
  36.                 fclose(curfp);
  37.             if ((curfp = fopen(fline, "r")) == (FILE *) 0) {
  38.                 perror(fline);
  39.                 continue;
  40.             }
  41.             strcpy(curfile, fline);
  42.             curln = 0;
  43.         }
  44.         for (; *fcp != '\0' && !isdigit(*fcp); fcp++)
  45.             ;
  46.         if (*fcp == '\0')
  47.             continue;
  48.         cxtln = atol(fcp);
  49.         lolino = (cxtln < cxtrange - 1? 1: cxtln - cxtrange);
  50.         hilino = cxtln + cxtrange;
  51.         if (lolino < curln) {
  52.             fseek(curfp, 0L, 0);
  53.             curln = 0;
  54.         }
  55.         if (cxtln == curln) {        /* already shown */
  56.             printf("*****\n* %s\n*****\n\n", context);
  57.             continue;
  58.         }
  59.         printf("**************\n* %s\n*****\n", context);
  60.         while (fgets(fline, 512, curfp) != (char *) 0 && ++curln < lolino)
  61.             ;
  62.         if (curln < lolino)
  63.             continue;
  64.         out(fline, curln == cxtln);
  65.         while (fgets(fline, 512, curfp) != (char *) 0 && ++curln <= hilino)
  66.             out(fline, curln == cxtln);
  67.         putchar('\n');
  68.     }
  69. }
  70.  
  71. out(s, flg)
  72. char *s; {
  73.     printf("%c %s", (flg? '*': ' '), s);
  74. }
  75.