home *** CD-ROM | disk | FTP | other *** search
- /**************************************
- *
- * ├╥┼╞2.├ (2 OF 3 SOURCE FILES)
- *
- * ╬OTE: USE OF THE '╥┼├╒╥╙╔╓┼'
- * ROUTINES CAUSES STACK OVER-RUN
- * ON THE ├64
- **************************************/
-
- #INCLUDE <STDIO.H>
- #INCLUDE <CREF.H>
-
- /* LOOKUP - INSTALL NAME AT OR BELOW
- ROOT */
- STRUCT NODE **LOOKUP(ROOT,N)
- STRUCT NODE **ROOT;
- CHAR *N;
- █
- INT COND;
-
- #IFDEF ╥┼├╒╥╙╔╓┼
- IF(*ROOT!=╬╒╠╠) █
- IF((COND=LEXCMP(N,(*ROOT)->NAME)) != 0)
- ROOT=LOOKUP((COND<0)?&(*ROOT)->LEFT:&(*ROOT)->RIGHT,N);
- ▌
- #ELSE
- WHILE(*ROOT != ╬╒╠╠ && (COND = LEXCMP(N,(*ROOT)->NAME)))
- ROOT=(COND<0)?&(*ROOT)->LEFT:&(*ROOT)->RIGHT;
- #ENDIF
- RETURN(ROOT);
- ▌
-
- /* ADD INSERT ENTRY FOR "NAME" IN
- TREE AT "ROOT" */
- STRUCT NODE *ADD(N)
- CHAR *N;
- █
- CHAR *MALLOC();
- STRUCT NODE *R;
-
- IF((R=(STRUCT NODE *)MALLOC(SIZEOF(STRUCT NODE))) == ╬╒╠╠) █
- FPRINTF(STDOUT,"ABORTED:MEMORY ALLOCATION ERROR\N\N");
- EXIT();
- ▌
- R->LEFT=R->RIGHT=╬╒╠╠;
- R->P.LINES=╬╒╠╠;
- R->NAME=N;
- RETURN(R);
- ▌
-
- /* TREEWALK - CALL 'FTN' FOR EACH
- NODE IN ORDER */
- UNSIGNED TREEWALK(ROOT,FTN)
- STRUCT NODE *ROOT;
- UNSIGNED(*FTN)();
- █
- #IFDEF ╥┼├╒╥╙╔╓┼
- IF(ROOT != ╬╒╠╠) █
- TREEWALK(ROOT->LEFT,FTN);
- (*FTN)(ROOT);
- TREEWALK(ROOT->RIGHT,FTN);
- ▌
- #ELSE
- STRUCT NODE *STACK,*TMP;
-
- STACK=╬╒╠╠; /* STACK INITIALLY EMPTY */
- FOR(;;) █
- IF(ROOT != ╬╒╠╠) █
- TMP=ROOT;
- ROOT=ROOT->LEFT; /* MOVE TO LEFT */
- TMP->LEFT=STACK;
- STACK=TMP; /* PUSH TMP */
- ▌
- ELSE IF(STACK != ╬╒╠╠) █ /* STACK NOT EMPTY */
- ROOT=STACK;
- STACK=STACK->LEFT; /* POP */
- (*FTN)(ROOT); /* VISIT NODE */
- ROOT=ROOT->RIGHT; /* MOVE RIGHT */
- ▌
- ELSE BREAK; /* STACK IS EMPTY */
- ▌
- #ENDIF
- ▌
-
- /* INSERT - ADD 'LINEñNO' TO THE
- CIRCULAR LIST, 'ORIGIN' */
- STRUCT INSTANCE *INSERT(ORIGIN,LINEñNO)
- STRUCT INSTANCE *ORIGIN;
- INT LINEñNO;
- █
- CHAR *MALLOC();
- STRUCT INSTANCE *T;
-
- IF(ORIGIN==╬╒╠╠ ▀▀ ORIGIN->LINE != LINEñNO) █
- IF((T=(STRUCT INSTANCE *)MALLOC(SIZEOF(STRUCT INSTANCE))) == ╬╒╠╠) █
- FPRINTF(STDOUT,"ABORTED:MEMORY ALLOCATION ERROR\N\N");
- EXIT();
- ▌
- IF(ORIGIN==╬╒╠╠)
- ORIGIN=T;
- T->LINE=LINEñNO;
- T->NEXT=ORIGIN->NEXT;
- ORIGIN->NEXT=T;
- ORIGIN=T;
- ▌
- RETURN(ORIGIN);
- ▌
-
- /* USE - LOG AN OCCURRENCE OF "NAME"
- IN "FILE" AT "LINE" */
- UNSIGNED USE(N,FILE,LNE)
- CHAR *N,*FILE;
- UNSIGNED LNE;
- █
- EXTERN STRUCT NODE *SYMñROOT,*FILñROOT;
- CHAR *NEWCPY();
- STRUCT NODE **FT,**NT;
-
- IF(*(NT=LOOKUP(&SYMñROOT,N))==╬╒╠╠)
- *NT=ADD(NEWCPY(N));
- IF(*(NT=LOOKUP(&((*NT)->P.FILES),FILE))==╬╒╠╠) █
- IF(*(FT=LOOKUP(&FILñROOT,FILE))==╬╒╠╠)
- *FT=ADD(NEWCPY(FILE));
- *NT=ADD((*FT)->NAME);
- ▌
- (*NT)->P.LINES=INSERT((*NT)->P.LINES,LNE);
- ▌
-
- /* GETñNAME - EXTRACT FILE NAME
- FROM LINE */
- UNSIGNED GETñNAME(LNE,FILE)
- CHAR *LNE,*FILE;
- █
- UNSIGNED CPYñUNTL();
- CHAR *DELIM;
-
- WHILE(*LNE==' ')
- ++LNE;
- IF(*LNE!='\N') █ /* IF NONE,USE "FILE" AS IS */
- IF(*LNE=='"') █
- DELIM="\"\N";
- ++LNE;
- ▌
- ELSE IF(*LNE=='<') █
- DELIM=">\N";
- ++LNE;
- ▌
- ELSE DELIM="\N";
- CPYñUNTL(FILE,LNE,DELIM);
- ▌
- ▌
-
- /* NEWñLINE - RETURN POINTER TO THE
- NEXT LINE */
- CHAR *NEWñLINE()
- █
- EXTERN INT LINEñCNT;
- STATIC CHAR LINE[═┴╪╠╔╬┼+1];
-
- ++LINEñCNT;
- RETURN(FGETS(LINE,═┴╪╠╔╬┼,STDIN));
- ▌
-
- /* WHITSPAC - TESTS FOR BLANKS
- AND COMMENTS */
- UNSIGNED WHITSPAC(S)
- CHAR **S;
- █
- WHILE(**S == ' ') ++*S;
- IF(**S=='/' && *((*S)+1)=='*') █ /* COMMENT */
- WHILE(*(++(*S))!='/') █
- WHILE(*(++(*S))!='*') █
- IF(**S==┼╧╙) █
- IF((*S=NEWñLINE())!=╬╒╠╠)
- --(*S); /* DUE TO PRE-INCREMENT IN INNER WHILE LOOP */
- ELSE █
- FPRINTF(STDOUT,"UNEXPECTED ┼╧╞\N");
- RETURN(╞┴╠╙┼);
- ▌
- ▌
- ▌
- ▌
- RETURN(╘╥╒┼);
- ▌
- RETURN(╞┴╠╙┼);
- ▌
-
- /* ISHEX - IS 'C' A HEXADECIMAL DIGIT? */
- UNSIGNED ISHEX(C)
- CHAR C;
- █
- RETURN(('0'<=C&&C<='9')▀▀('A'<=C&&C<='F'));
- ▌
-
- /* GETOKEN - STRIP LEADING TOKEN
- FROM S */
- CHAR GETOKEN(S,T)
- CHAR **S,*T;
- █
- CHAR ESC();
- CHAR CLASS;
-
- WHILE(WHITSPAC(S)) ++*S;
- IF(ISALPHA(**S)▀▀**S=='ñ') █ /* IDENTIFIER */
- CLASS=╔─;
- DO █
- *(T++)=*((*S)++);
- ▌ WHILE(ISDIGIT(**S)▀▀ISALPHA(**S)▀▀**S=='ñ');
- ▌
- ELSE IF(**S=='\"'▀▀**S=='\'') █ /* STRING OR LITERAL */
- CLASS=**S;
- DO █
- ESC(S);
- ++(*S);
- IF(**S==┼╧╙) █
- IF((*S=NEWñLINE())==╬╒╠╠)
- GOTO OUT;
- ▌
- ▌ WHILE(**S != CLASS);
- ++(*S);
- ▌
- ELSE IF(ISDIGIT(**S)) █
- DO █
- CLASS=*(++(*S));
- CLASS=LOWER(CLASS); /* N.B. LOWER() MAY BE A MACRO */
- ▌ WHILE(ISHEX(CLASS)▀▀CLASS=='X'▀▀CLASS=='L'▀▀CLASS=='.');
- CLASS=╔╬╘┼╟┼╥;
- ▌
- ELSE CLASS=*(*S)++;
- OUT:
- *T=┼╧╙;
- RETURN(CLASS);
- ▌
-