home *** CD-ROM | disk | FTP | other *** search
- {$A-}
- PROGRAM CHAPTER5;
- {$I TOOLU.PAS}
- {$I FPRIMS.PAS}
-
-
- PROCEDURE FIND;
-
- VAR
- ARG,LIN,PAT:XSTRING;
-
- FUNCTION GETPAT(VAR ARG,PAT:XSTRING):BOOLEAN;
- BEGIN
- GETPAT:=(MAKEPAT(ARG,1,ENDSTR,PAT)>0)
- END;
-
-
- BEGIN
- IF(NOT GETARG(2,ARG,MAXSTR))THEN
- ERROR('Usage: find pattern');
- IF (NOT GETPAT(ARG,PAT)) THEN
- ERROR('FIND: illegal pattern');
- WHILE(GETLINE(LIN,STDIN,MAXSTR))DO
- IF (MATCH(LIN,PAT))THEN
- PUTSTR(LIN,STDOUT)
- END;
-
- PROCEDURE CHANGE;
- CONST
- DITTO=255;
- VAR
- LIN,PAT,SUB,ARG:XSTRING;
-
- FUNCTION GETPAT(VAR ARG,PAT:XSTRING):BOOLEAN;
- BEGIN
- GETPAT:=(MAKEPAT(ARG,1,ENDSTR,PAT)>0)
- END;
-
- FUNCTION GETSUB(VAR ARG,SUB:XSTRING):BOOLEAN;
-
- FUNCTION MAKESUB(VAR ARG:XSTRING; FROM:INTEGER;
- DELIM:CHARACTER; VAR SUB:XSTRING):INTEGER;
- VAR I,J:INTEGER;
- JUNK:BOOLEAN;
- BEGIN
- J:=1;
- I:=FROM;
- WHILE (ARG[I]<>DELIM) AND (ARG[I]<>ENDSTR) DO BEGIN
- IF(ARG[I]=ORD('&')) THEN
- JUNK:=ADDSTR(DITTO,SUB,J,MAXPAT)
- ELSE
- JUNK:=ADDSTR(ESC(ARG,I),SUB,J,MAXPAT);
- I:=I+1
- END;
- IF (ARG[I]<>DELIM) THEN
- MAKESUB:=0
- ELSE IF (NOT ADDSTR(ENDSTR,SUB,J,MAXPAT)) THEN
- MAKESUB:=0
- ELSE
- MAKESUB:=I
- END;
-
- BEGIN
- GETSUB:=(MAKESUB(ARG,1,ENDSTR,SUB)>0)
- END;
-
- PROCEDURE SUBLINE(VAR LIN,PAT,SUB:XSTRING);
- VAR
- I, LASTM, M:INTEGER;
- JUNK:BOOLEAN;
-
-
- PROCEDURE PUTSUB(VAR LIN:XSTRING; S1,S2:INTEGER;
- VAR SUB:XSTRING);
- VAR
- I,J:INTEGER;
- JUNK:BOOLEAN;
- BEGIN
- I:=1;
- WHILE (SUB[I]<>ENDSTR) DO BEGIN
- IF(SUB[I]=DITTO) THEN
- FOR J:=S1 TO S2-1 DO
- PUTC(LIN[J])
- ELSE
- PUTC(SUB[I]);
- I:=I+1
- END
- END;
-
- BEGIN
- LASTM:=0;
- I:=1;
- WHILE(LIN[I]<>ENDSTR) DO BEGIN
- M:=AMATCH(LIN,I,PAT,1);
- IF (M>0) AND (LASTM<>M) THEN BEGIN
- PUTSUB(LIN,I,M,SUB);
- LASTM:=M
- END;
- IF (M=0) OR (M=I) THEN BEGIN
- PUTC(LIN[I]);
- I:=I+1
- END
- ELSE
- I:=M
- END
- END;
-
- BEGIN
- IF(NOT GETARG(2,ARG,MAXSTR)) THEN
- ERROR('Usage: change from [to]');
- IF (NOT GETPAT(ARG,PAT)) THEN
- ERROR('CHANGE: illegal "from" pattern');
- IF (NOT GETARG(3,ARG,MAXSTR)) THEN
- ARG[1]:=ENDSTR;
- IF(NOT GETSUB(ARG,SUB)) THEN
- ERROR('CHANGE: illegal "to" string');
- WHILE (GETLINE(LIN,STDIN,MAXSTR)) DO
- SUBLINE(LIN,PAT,SUB)
- END;
-
- PROCEDURE COMMAND;
- BEGIN
- IF (GlobalArg1='change')THEN CHANGE
- ELSE IF (GlobalArg1='find')THEN FIND
- ELSE ERROR('Chap 5: can''t happen');
- END;
-
- BEGIN
- COMMAND;
- ENDCMD;
- END.
-