#include #include #include "yeats.h" char *prog; char *poem; Usage() { fprintf(stderr,"Usage: %s [-f 'first line'] [-t 'title'] [-p 'pattern']\n", prog); exit(1); } main(argc,argv) int argc; char **argv; { int c; extern int opterr; extern int optind; extern char *optarg; prog = *argv; opterr = 0; if(argc < 2) Usage(); while((c = getopt(argc,argv,"f:t:p:")) != -1) switch(c) { case 'f': dofirst(optarg); break; case 't': dotitle(optarg); break; case 'p': dopattern(optarg); default: Usage(); } if(optind != argc) Usage(); exit(0); } dofirst(first) char *first; { poem = getyeatsbyfirst(first); if(poem == NULL) fprintf(stderr,"first: '%s' not found\n",first); else fputs(poem,stdout); } dotitle(title) char *title; { poem = getyeatsbytitle(title); if(poem == NULL) fprintf(stderr,"title: '%s' not found\n",title); else fputs(poem,stdout); } #define INIT register char *pp = instring; #define GETC() (*pp++) #define PEEKC() (*pp) #define UNGETC() (--pp) #define RETURN(v) return(v); #define ERROR(v) return(NULL); #define lower(c) (isupper(c) ? tolower(c) : (c)) #include dopattern(pat) char *pat; { char cbuf[BUFSIZ]; char *pp; lowercase(pat); if(compile(pat,cbuf,&cbuf[BUFSIZ]) == NULL) { fprintf(stderr,"%s: error compiling pattern '%s'\n",prog,pat); exit(1); } setyeatsent(); while((poem = getyeatsent()) != NULL) { if((pp = (char *)malloc(strlen(poem)+1)) == NULL) { fprintf(stderr,"%s: out of memory\n",prog); exit(1); } strcpy(pp,poem); lowercase(pp); if(step(pp,cbuf)) fputs(poem,stdout); free(pp); free(poem); } } lowercase(sp) register char *sp; { while(*sp) *sp++ = lower(*sp); }