home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ctcoll95.zip / AEHNLICH / MAIN.C < prev    next >
C/C++ Source or Header  |  1995-04-06  |  4KB  |  115 lines

  1. /* main.c: Testtreiber fuer approximatives Matching
  2.  *         durchsucht eine Datei, oder die Standardeingabe,
  3.  *         nach dem angegebenen Muster
  4.  * Aufruf: afind [-Fehler] [-i] [-b] [-e] Muster [Datei]
  5.  * Optionen: -Fehler: maximal <Fehler> erlaubt
  6.  *           -i : ignoriert Gross- und Kleinschreibung
  7.  *           -b : sucht den besten Match in einer Zeile
  8.  *           -e : gibt auch die Fehlerzahl aus
  9.  *
  10.  * (c) Guido Gronek, Lion Ges. f. Systementwicklung m.b.H. & c't 5/95
  11.  */
  12.  
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <ctype.h>
  16. #include <limits.h>
  17. #include <string.h>
  18. #include "parser.h"
  19. #include "afind.h"
  20.  
  21. #define USAGE "Aufruf: afind [-Fehler] [-i] [-b] [-e] Muster [Datei]"
  22. #define ERR(msg) {fprintf(stderr,msg); fprintf(stderr,"\n"); exit(1);}
  23.  
  24. char  *optarg;  /* Zeiger auf Argument */
  25. int optind = 0; /* argv Index der Option */
  26.  
  27. /* getopt: holt naechste Option
  28.  * Eingabe:  argc, argv : Agumentvektor und -zaehler
  29.  *           optstring  : String mit allen Optionszeichen
  30.  *                        "c:" ist Option "c" mit Argument
  31.  * Ergebnis: das Optionszeichen oder '?' bei illegaler Option
  32.  *           die glob. Variablen optind und optarg liefern den
  33.  *           argv-Index und ggf. das Argument der Option
  34.  */
  35. int getopt(int argc, char *argv[], char *optstring)
  36. { static char *scan;                      /* laeuft ueber argv */
  37.   char c, *p;                      /* p laeuft ueber optstring */
  38.  
  39.   optarg = NULL;
  40.   if ( optind == 0 ) {                        /* erster Aufruf */
  41.     scan = NULL;
  42.     optind++;
  43.   }
  44.   if ( scan == NULL || *scan == 0 ) {       /* naechste Option */
  45.     if ( optind >= argc || argv[optind][0] != '-' )
  46.       return EOF;          /* Ende der Optionen oder Argumente */
  47.     scan = argv[optind]+1;
  48.     optind++;
  49.   }
  50.   c = *scan++;                                   /* die Option */
  51.   for ( p = optstring; *p != 0 && *p != c; ++p ); /* .. suchen */
  52.   if ( *p == 0 ) return '?';                 /* nicht gefunden */
  53.   if ( *++p == ':' ) {          /* Option besitzt ein Argument */
  54.     if ( *scan != 0 ) {
  55.       optarg = scan;                  /* Argument folgt direkt */
  56.       scan = NULL;
  57.     }
  58.     else if ( optind >= argc )         /* war letztes Argument */
  59.       return '?';
  60.     else {              /* Argument ist naechstes argv Element */
  61.       optarg = argv[optind];
  62.       optind++;
  63.     }
  64.   }
  65.   return c & 0xff;
  66. }
  67.  
  68. int main( argc, argv )
  69. int  argc;
  70. char *argv[];
  71. { int c;
  72.   int ignore = 0, perrors = 0, bestmatch = 0;         /* flags */
  73.   int errors = 0;
  74.   FILE *stream;
  75.   char *p, *t;
  76.   static char buffer[256];       /* Max. 256 Zeichen pro Zeile */
  77.                                  /* im Text!                   */
  78.   while ( (c = getopt(argc,argv,"012345678ibe")) != EOF ) {
  79.     switch(c) {
  80.       case 'b': bestmatch = 1; break;
  81.       case 'i': ignore = 1; break;
  82.       case '0': case '1': case '2': case '3':
  83.       case '4': case '5': case '6': case '7':
  84.       case '8': errors = c-'0'; break;
  85.       case 'e': perrors = 1; break;
  86.       case '?': ERR(USAGE);
  87.     }
  88.   }
  89.   argc -= optind;               /* noch verbleibende Argumente */
  90.   argv += optind;                      /* .. und Zeiger darauf */
  91.   if ( argc ==0 ) ERR(USAGE);
  92.   p = *argv++;                                   /* das Muster */
  93.   if ( init_afind(&p,ignore) != 0 )          /* ..vorbereiten */
  94.     ERR("Fehler im Muster!");
  95.   if ( --argc == 0 )            /* falls keine Datei angegeben */
  96.     stream = stdin;                    /* dann von stdin lesen */
  97.   else if ( (stream = fopen(*argv,"r")) ==NULL )
  98.     ERR("Kann Textdatei nicht oeffnen!");
  99.   do {         /* Textzeilen lesen und nach Muster durchsuchen */
  100.     t = buffer;
  101.     while ( (c = getc(stream)) != EOF )
  102.       if ( c != '\n' ) *t++ = c;
  103.         else break;
  104.     *t = 0;
  105.     if ( afind(buffer,errors,bestmatch) ) {       /* gefunden! */
  106.       if ( stream != stdin ) printf("%s: ",*argv);
  107.       if (perrors && amatcherr)
  108.         printf("(%d): ", amatcherr);
  109.       printf("%s\n",buffer);
  110.     }
  111.   } while ( c != EOF );
  112.   if ( stream != stdin ) fclose(stream);
  113.   return 0;
  114. }
  115.