kolibrios/programs/fs/unzip60/os2/zgrepapi.cmd

99 lines
2.5 KiB
Batchfile
Raw Normal View History

/*---------------------------------------------------------------------------
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