/* * Test file for the GNU regular expression package. * Edwin Hoogerbeets 18/07/89 * * This file may be copied and distributed under the GNU Public * Licence. See the comment at the top of regex.c for details. * * Adapted from Elib by Jim Mackraz, mklib by Edwin Hoogerbeets, and the * GNU regular expression package by the Free Software Foundation. */ #include "regex.h" #include #include #define BUFSIZ 8*1024 extern char *AllocMem(); extern char *OpenLibrary(); extern void searchfile(); void puts(str) char *str; { Write(Output(),str,strlen(str)); } char *inputbuffer; long inputcounter = -1, inputsize, eof; main (argc, argv) int argc; char **argv; { struct re_pattern_buffer buf; int index; long input; if ( argc < 2 || *argv[1] == '\0' ) { puts("Usage: "); puts(argv[0]); puts("regular_expression filename [...]\n"); exit(1); } if ( (RegexBase = (struct RegexBase *) OpenLibrary("regex.library",0L)) == NULL) { puts("Could not open regex.library"); exit(2); } inputbuffer = AllocMem(BUFSIZ,MEMF_PUBLIC|MEMF_CLEAR); re_initialize_buffer(&buf,__Upcase); re_compile_pattern(argv[1], strlen(argv[1]), &buf, RE_SYNTAX_GREP); if ( argc < 3 ) { input = Input(); searchfile(input,&buf,""); } else { register int printnames = (argc - 2) > 1 ? 1 : 0; char name[256]; index = 2; while ( index < argc ) { if ( !(input = Open(argv[index],MODE_OLDFILE)) ) { puts("Could not open "); puts(argv[index]); puts("\n"); } else { if ( printnames ) { strcpy(name,argv[index]); strcat(name,": "); } else { name[0] = '\0'; } inputcounter = -1; searchfile(input,&buf, name); Close(input); } ++index; } } FreeMem(inputbuffer,BUFSIZ); re_terminate_buffer(&buf); CloseLibrary(RegexBase); } long newbuffer(f) long f; { inputsize = Read(f,inputbuffer,BUFSIZ); inputcounter = 0; return( inputsize ); } char getc(f) long f; { char result = inputbuffer[inputcounter++]; if ( inputsize == 0 ) { return('\0'); } if ( inputcounter >= inputsize ) { newbuffer(f); } return(result); } char * fgets(buf,len,f) char *buf; long len, f; { long counter = 0; char c; if ( inputcounter < 0 ) { if ( !newbuffer(f) ) { return(NULL); } } while ( (c = getc(f)) != '\0' && counter < len ) { buf[counter++] = c; if ( c == '\n' ) { if ( counter < len ) { buf[counter] = '\0'; } return(buf); } } if ( c == '\0' ) { return(NULL); } if ( counter < len ) { buf[counter] = '\0'; } return(buf); } void searchfile(f,buf,name) long f; struct re_pattern_buffer *buf; char *name; { char buffer[256]; int result; /* struct re_registers foo; */ while ( fgets(buffer,256L,f) != NULL ) { if ( (result = re_search(buf, buffer, strlen(buffer), 0L, strlen(buffer)-2, NULL)) >= 0 ) { puts(name); puts(buffer); } } } _abort() { puts("DON'T TOUCH THAT KEY, SILLY!"); }