home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / c / csh4.zip / FGREP.C < prev    next >
C/C++ Source or Header  |  1985-09-04  |  2KB  |  130 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3.  
  4. #include <signal.h>
  5. #include <setjmp.h>
  6.  
  7. void (*signal())();
  8. void (*fgrepsig)();
  9. jmp_buf fgrep_env;
  10.  
  11. void fgrep_intr()
  12. {
  13.     signal(SIGINT,fgrepsig);
  14.     longjmp(fgrep_env,-1);
  15. }
  16.  
  17. FILE *fopen(),*fdopen();
  18.  
  19. char *fgets();
  20.  
  21. fgrep( argc, argv )
  22. int    argc;
  23. char * argv[];
  24.     {
  25.     FILE *  fd;
  26.     int    rc;
  27.     char * pattern;
  28.     /* handle interrupts */
  29.     if (-1 == setjmp(fgrep_env))
  30.     {
  31.         static char *intmsg = "Interrupted\r\n";
  32.         write(2,intmsg,strlen(intmsg));
  33.         fclose(fd);
  34.         return -1;
  35.     }
  36.     /* set signal catcher */
  37.     fgrepsig= signal(SIGINT,fgrep_intr);
  38.     while( --argc )
  39.         {
  40.         if( (*++argv)[0] == '-' )
  41.             switch( (*argv)[1] )
  42.                 {
  43.                 default:
  44.                     fprintf( stderr, "invalid argument %s\n", *argv );
  45.                     return(1);
  46.                 }
  47.         else
  48.             break;
  49.         }
  50.  
  51.     if( argc == 0 )
  52.         {
  53.         fprintf( stderr, "usage: fgrep pattern [file ...]\n" );
  54.         return(1);
  55.         }
  56.  
  57.     pattern = *argv++;
  58.     argc--;
  59.  
  60.     rc = 0;
  61.     if( argc == 0 )
  62.         {
  63.         fd = fdopen(0,"r");
  64.         rc = _fgrep( NULL, pattern, fd);
  65.         fclose(fd);
  66.         return( 0 );
  67.         }
  68.     else
  69.     while( argc-- )
  70.         {
  71.  
  72.         if( (fd = fopen( *argv, "r" )) == NULL )
  73.             fprintf( stderr, "couldn't open %s\n", *argv );
  74.         else
  75.             {
  76.             rc |= _fgrep( *argv, pattern, fd );
  77.             fclose( fd );
  78.             }
  79.         argv++;
  80.  
  81.         }
  82.  
  83.     return( !rc );
  84.     signal(SIGINT,fgrepsig);
  85.     }
  86.  
  87.  
  88. _fgrep( file, pattern, fd )
  89. char    * file;
  90. char    * pattern;
  91. FILE *    fd;
  92.     {
  93.     char    line[BUFSIZ];
  94.     int        rc;
  95.     int        linenumber = 1;
  96.     rc = 0;
  97.     while( fgets( line, sizeof(line), fd ) != NULL )
  98.     {
  99.         if( rc = match( pattern, line ) )
  100.             printf( "%s %d: %s", (file) ? file : "stdin", linenumber, line );
  101.         linenumber++;
  102.     }
  103.     return( rc );
  104.  
  105.     }
  106.  
  107. match( pattern, line )
  108. register char    * pattern;
  109. char    * line;
  110.     {
  111.     /*  not a great algorithm  */
  112.     register char * ptr;
  113.     char    * end;
  114.     int    plen = strlen(pattern);
  115.     int llen = strlen(line);
  116.  
  117.     if( plen > llen )
  118.         return( 0 );
  119.  
  120.     end = line+(llen-plen);
  121.  
  122.     for( ptr=line; ptr < end; ptr++ )
  123.         {
  124.         if( strncmp( pattern, ptr, plen ) == 0 )
  125.             return( 1 );
  126.         }
  127.  
  128.     return( 0 );
  129.     }
  130.