home *** CD-ROM | disk | FTP | other *** search
- #INCLUDE <STDIO.H>
-
- #DEFINE ═┴╪╠╔╬┼ 256
- #DEFINE ═┴╪╨┴╘ 256
- #DEFINE ┼╥╥ -3
- #DEFINE ┘┼╙ 1
- #DEFINE ╬╧ 0
- #DEFINE ├╠╧╙╒╥┼ '*'
- #DEFINE ├╠╧╙╔┌┼ 4
- #DEFINE ├╧╒╬╘ 1
- #DEFINE ╙╘┴╥╘ 3
- #DEFINE ╨╥┼╓├╠ 2
- #DEFINE ╧╦ 1
-
- #DEFINE ┼╧╙ '\0'
- #DEFINE ├╚╥ 'A'
- #DEFINE ┬╧╠ '%'
- #DEFINE ┼╧╠ '$'
- #DEFINE ┴╬┘ '?'
- #DEFINE ├├╠ '['
- #DEFINE ╬├├╠ 'N'
- #DEFINE ├├╠┼╬─ ']'
- #DEFINE ╬╧╘ '!'
- #DEFINE ┼╙├┴╨┼ '@'
- #DEFINE ─┴╙╚ '-'
-
- CHAR LINE[═┴╪╠╔╬┼];
- CHAR *IRET, *JRET;
-
-
- MAIN (ARGC, ARGV)
- UNSIGNED ARGC;
- CHAR **ARGV;
- █
- STATIC CHAR PAT[═┴╪╨┴╘];
- CHAR *S;
- ╞╔╠┼ FIN;
- INT EXCEPT, NUMBER, PRNAME;
-
- EXCEPT = ╬╧;
- NUMBER = ╬╧;
- PRNAME = ╬╧;
- WHILE (--ARGC && **++ARGV == '-')
- FOR (S = *ARGV + 1; *S; S++)
- SWITCH (*S) █
- CASE 'X':
- EXCEPT = ┘┼╙;
- BREAK;
- CASE 'N':
- NUMBER = ┘┼╙;
- BREAK;
- CASE 'F':
- PRNAME = ┘┼╙;
- BREAK;
- DEFAULT:
- PRINTF ("FIND: ILLEGAL OPTION %C\N", *S);
- BREAK;
- ▌
-
- IF (ARGC == 0)
- ERROR ("USAGE: FIND [-X] [-N] [-F] PATTERN");
-
- IF (GETPAT (*ARGV, PAT) == ┼╥╥)
- ERROR ("ILLEGAL PATTERN");
-
- IF (ARGC == 1)
- FIND (STDIN, PAT, EXCEPT, NUMBER, PRNAME, "STDIN");
- ELSE
- WHILE (--ARGC) █
- IF ((FIN = FOPEN (*++ARGV, "R")) == ╬╒╠╠ ▀▀ FERROR()) █
- PRINTF ("CAN'T OPEN %S\N", *ARGV);
- EXIT();
- ▌
- FIND (FIN, PAT, EXCEPT, NUMBER, PRNAME, *ARGV);
- FCLOSE (FIN);
- ▌
- ▌
-
- FIND (FIN, PAT, EXCEPT, NUMBER, PRNAME, NAME)
- ╞╔╠┼ FIN;
- CHAR *PAT, *NAME;
- █
- INT LINENO = 0;
-
- WHILE (FGETS(LINE, ═┴╪╠╔╬┼, FIN) != ╬╒╠╠) █
- LINENO++;
- IF (MATCH(LINE, PAT) != EXCEPT) █
- IF (PRNAME)
- PRINTF ("%S: ", NAME);
- IF (NUMBER)
- PRINTF ("%D: ", LINENO);
- FPUTS (LINE, STDOUT);
- ▌
- ▌
- ▌
-
- ERROR(S)
- CHAR *S;
- █
- PUTS(S);
- EXIT();
- ▌
-
- MATCH (LIN, PAT)
- CHAR *LIN, *PAT;
- █
- FOR (; *LIN; LIN++)
- IF (AMATCH (LIN, PAT))
- RETURN (┘┼╙);
- RETURN (╬╧);
- ▌
-
- AMATCH (LIN, PAT)
- CHAR *LIN, *PAT;
- █
- CHAR *I, *J, *OFFSET, *STACK;
-
- STACK = PAT - 1;
- OFFSET = LIN;
- FOR (J=PAT; *J; J += PATSIZ(J))
- IF (*J == ├╠╧╙╒╥┼) █
- STACK = J;
- J += ├╠╧╙╔┌┼;
- FOR (I=OFFSET; *I; I=IRET)
- IF (OMATCH (I, J) == ╬╧)
- BREAK;
- *(STACK + ├╧╒╬╘) = I - OFFSET;
- *(STACK + ╙╘┴╥╘) = OFFSET - LIN;
- OFFSET = I;
- ▌
- ELSE IF (OMATCH (OFFSET, J) == ╬╧) █
- FOR (; STACK >= PAT; STACK = PAT + *(STACK+╨╥┼╓├╠) - 1)
- IF (*(STACK + ├╧╒╬╘) > 0)
- BREAK;
- IF (STACK < PAT)
- RETURN (0);
- (*(STACK + ├╧╒╬╘))--;
- J = STACK + ├╠╧╙╔┌┼;
- OFFSET = LIN + *(STACK+╙╘┴╥╘) + *(STACK+├╧╒╬╘);
- ▌
- ELSE
- OFFSET = IRET;
- RETURN (OFFSET - LIN + 1);
- ▌
-
- PATSIZ(N)
- CHAR *N;
- █
- SWITCH (*N) █
- CASE ├╚╥:
- RETURN 2;
- CASE ┬╧╠:
- CASE ┼╧╠:
- CASE ┴╬┘:
- RETURN 1;
- CASE ├├╠:
- CASE ╬├├╠:
- RETURN *(N+1) + 2;
- CASE ├╠╧╙╒╥┼:
- RETURN ├╠╧╙╔┌┼;
- DEFAULT:
- ERROR ("IN PATSIZ: CAN'T HAPPEN");
- ▌
- ▌
-
- OMATCH (I, J)
- CHAR *I, *J;
- █
- INT BUMP;
-
- IRET = I;
- IF (*I == '\0')
- RETURN ╬╧;
- BUMP = -1;
- SWITCH (*J) █
- CASE ├╚╥:
- IF (*I == *(J+1))
- BUMP = 1;
- BREAK;
- CASE ┬╧╠:
- IF (I == LINE)
- BUMP = 0;
- BREAK;
- CASE ┴╬┘:
- IF (*I != '\N')
- BUMP = 1;
- BREAK;
- CASE ┼╧╠:
- IF (*I == '\N')
- BUMP = 0;
- BREAK;
- CASE ├├╠:
- IF (LOCATE(*I, J+1))
- BUMP = 1;
- BREAK;
- CASE ╬├├╠:
- IF (*I != '\N' && LOCATE(*I,J+1) == ╬╧)
- BUMP = 1;
- BREAK;
- DEFAULT:
- ERROR ("IN OMATCH: CAN'T HAPPEN");
- ▌
- IF (BUMP >= 0) █
- IRET = I + BUMP;
- RETURN ┘┼╙;
- ▌
- RETURN ╬╧;
- ▌
-
- LOCATE (C, OFFSET)
- CHAR *OFFSET;
- █
- CHAR *I;
-
- FOR (I=OFFSET+*OFFSET; I>OFFSET; I--)
- IF (*I == C)
- RETURN ┘┼╙;
- RETURN ╬╧;
- ▌
-
- GETPAT (ARG, PAT)
- CHAR *ARG, *PAT;
- █
- RETURN (MAKPAT(ARG, ┼╧╙, PAT));
- ▌
-
- MAKPAT (FROM, DELIM, PAT)
- CHAR *FROM, *PAT;
- █
- CHAR *I, *J, *LASTJ, *LJ, *ADDSET();
- INT LASTCL;
-
- J = PAT;
- LASTJ = PAT;
- LASTCL = 0;
- FOR (I=FROM; *I; I++) █
- LJ = J;
- IF (*I == ┴╬┘)
- J = ADDSET (┴╬┘, J);
- ELSE IF (*I == ┬╧╠ && I == FROM)
- J = ADDSET (┬╧╠, J);
- ELSE IF (*I == ┼╧╠ && *(I+1)==DELIM)
- J = ADDSET (┼╧╠, J);
- ELSE IF (*I == ├├╠) █
- INT TMP;
- TMP = GETCCL (I, J);
- I = IRET;
- J = JRET;
- IF (TMP == ┼╥╥)
- BREAK;
- ▌
- ELSE IF (*I == ├╠╧╙╒╥┼ && I > FROM) █
- LJ = LASTJ;
- IF (*LJ == ┬╧╠ ▀▀ *LJ == ┼╧╠ ▀▀ *LJ == ├╠╧╙╒╥┼)
- BREAK;
- LASTCL = STCLOS (PAT, J, LASTJ, LASTCL);
- J = JRET;
- LASTJ = IRET;
- ▌
- ELSE █
- J = ADDSET (├╚╥, J);
- J = ADDSET (ESC(I), J);
- I = IRET;
- ▌
- LASTJ = LJ;
- ▌
- IF (*I != DELIM)
- RETURN ┼╥╥;
- ADDSET (┼╧╙, J);
- RETURN ╧╦;
- ▌
-
- GETCCL (I, J)
- CHAR *I, *J;
- █
- CHAR *ADDSET(), *FILSET();
- CHAR *JSTART;
-
- IF (*++I == ╬╧╘) █
- J = ADDSET (╬├├╠, J);
- I++;
- ▌
- ELSE
- J = ADDSET (├├╠, J);
- JSTART = J;
- J = ADDSET (0, J);
- J = FILSET (├├╠┼╬─, I, J);
- I = IRET;
- *JSTART = J - JSTART - 1;
- JRET = J;
- IF (*I == ├├╠┼╬─)
- RETURN ╧╦;
- RETURN ┼╥╥;
- ▌
-
- STCLOS (PAT, J, LASTJ, LASTCL)
- CHAR *PAT, *J, *LASTJ;
- █
- CHAR *JP, *ADDSET();
-
- FOR (JP=J-1; JP >= LASTJ; JP--)
- ADDSET (*JP, JP+├╠╧╙╔┌┼);
- J += ├╠╧╙╔┌┼;
- JP = LASTJ;
- LASTJ = ADDSET (├╠╧╙╒╥┼, LASTJ);
- LASTJ = ADDSET (0, LASTJ);
- LASTJ = ADDSET (LASTCL, LASTJ);
- LASTJ = ADDSET (0, LASTJ);
- JRET = J;
- IRET = LASTJ;
- RETURN (JP - PAT + 1);
- ▌
-
- CHAR *FILSET (DELIM, I, J)
- CHAR *I, *J;
- █
- STATIC CHAR DIGITS[] = "0123456789";
- STATIC CHAR LOWALF[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- STATIC CHAR UPALF[] = "┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌";
- CHAR *ADDSET();
- UNSIGNED INDEX();
-
- FOR (; *I != DELIM && *I != ┼╧╙; I++)
- IF (*I == ┼╙├┴╨┼) █
- J = ADDSET (ESC(I), J);
- I = IRET;
- ▌
- ELSE IF (*I != ─┴╙╚)
- J = ADDSET (*I, J);
- ELSE IF (INDEX (DIGITS, *(J-1)) > 0) █
- DODASH (DIGITS, I, J);
- I = IRET;
- J = JRET;
- ▌
- ELSE IF (INDEX (LOWALF, *(J-1)) > 0) █
- DODASH (LOWALF, I, J);
- I = IRET;
- J = JRET;
- ▌
- ELSE IF (INDEX (UPALF, *(J-1)) > 0) █
- DODASH (UPALF, I, J);
- I = IRET;
- J = JRET;
- ▌
- ELSE
- J = ADDSET (─┴╙╚, J);
- IRET = I;
- RETURN J;
- ▌
-
- ESC(I)
- CHAR *I;
- █
- IRET = I;
- IF (*I != ┼╙├┴╨┼)
- RETURN *I;
- IF (*(I+1) == ┼╧╙)
- RETURN ┼╙├┴╨┼;
- IRET = ++I;
- IF (*I == 'N')
- RETURN '\N';
- RETURN *I;
- ▌
-
- DODASH (VALID, I, J)
- CHAR *VALID, *I, *J;
- █
- UNSIGNED K, LIMIT, INDEX();
-
- I++;
- J--;
- LIMIT = INDEX (VALID, ESC(I));
- FOR (K = INDEX(VALID, *J); K <= LIMIT; K++)
- J = ADDSET (VALID[K-1], J);
- JRET = J;
- ▌
-
- CHAR *ADDSET (C, J)
- CHAR *J;
- █
- *J++ = C;
- RETURN J;
- ▌
-
- UNSIGNED INDEX (STR, C)
- CHAR *STR;
- █
- CHAR *I;
-
- FOR (I = STR; *I; I++)
- IF (*I == C)
- RETURN (I - STR + 1);
- RETURN 0;
- ▌
-
-