The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*---------------------------------------------------------------------------

   zapigrep.cmd  (ye olde REXX procedure for OS/2)

   Script to search members of a zipfile for a string and print the names of
   any such members (and, optionally, the matching text).

   This is the zipgrep.cmd program completely rewritten to take advantage
   of the REXX API.  Among the improvements are:
        egrep no longer needed.  All work done by API and this script.
	Added option switches.

   Be aware, however, that this script does not support regular expressions
   as zipgrep does.

  ---------------------------------------------------------------------------*/

PARSE ARG args

nocase = 0
word = 0
text = 0

DO WHILE Left(args,1) == '-' | Left(args,1) == '/'
   PARSE VAR args option args
   option = Translate(SubStr(option,2))
   DO WHILE option \= ''
      oneopt = Left(option,1)
      option = SubStr(option,2)
      SELECT
       WHEN oneopt == 'W' THEN
	  word = 1
       WHEN oneopt == 'I' THEN
	  nocase = 1
       WHEN oneopt == 'T' THEN
	  text = 1
       OTHERWISE NOP
      END
   END
END

PARSE VAR args string zipfile members

IF (string == '') THEN DO
   SAY 'usage:  zipgrep [-i][-t][-w] search_string zipfile [members...]'
   SAY '   Displays the names of zipfile members containing a given string.'
   SAY '   By default it displays filenames only of members containing an'
   SAY '   exact match of the string.  Options are:'"0a"x
   SAY '	-i  Ignore case'
   SAY '	-t  Display matching lines'
   SAY '	-w  Match words only'
   EXIT 1
END
string = Strip(string,'b','"')
IF nocase THEN string = Translate(string)

CALL RxFuncAdd 'UZLoadFuncs', 'UNZIP32', 'UZLoadFuncs'
CALL UZLoadFuncs

CALL UZUnZipToStem zipfile, 'file.', members

DO i = 1 TO file.0
   ptr = file.i
   file = file.ptr
   IF nocase THEN file = Translate(file)
   IF word THEN DO
      wp = WordPos(string,file)
      IF wp>0 THEN
	 scan = WordIndex(file,wp)
      ELSE
         scan = 0
   END
   ELSE
      scan = Pos(string,file)
   IF scan \= 0 THEN DO
      SAY file.i':'
      IF text THEN DO
	 DO WHILE scan > 0
	    from = LastPos('0a'x,file,scan)+1
	    to = Pos('0a'x,file,scan)
	    IF to = 0 THEN to = Length(file.ptr)
	    oneline = Strip(SubStr(file.ptr,from,to-from),'T','0a'x)
	    SAY Strip(oneline,'T','0d'x)
	    IF word THEN DO
	       wp = WordPos(string,file,wp+1)
	       IF wp>0 THEN
		  scan = WordIndex(file,wp)
	       ELSE
		  scan = 0
	    END
	    ELSE
	       scan = Pos(string,file,scan+1)
	 END
      END
   END
END

EXIT 0