home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / CREF.SFX / cref2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-27  |  4.3 KB  |  234 lines

  1. /**************************************
  2. *
  3. *  ├╥┼╞2.├ (2 OF 3 SOURCE FILES)
  4. *
  5. *  ╬OTE: USE OF THE '╥┼├╒╥╙╔╓┼'
  6. *  ROUTINES CAUSES STACK OVER-RUN
  7. *  ON THE ├64
  8. **************************************/
  9.  
  10. #INCLUDE <STDIO.H>
  11. #INCLUDE <CREF.H>
  12.  
  13. /* LOOKUP - INSTALL NAME AT OR BELOW
  14.    ROOT */
  15. STRUCT NODE **LOOKUP(ROOT,N)
  16. STRUCT NODE **ROOT;
  17. CHAR *N;
  18.  INT COND;
  19.  
  20. #IFDEF ╥┼├╒╥╙╔╓┼
  21.  IF(*ROOT!=╬╒╠╠) █
  22.   IF((COND=LEXCMP(N,(*ROOT)->NAME)) != 0)
  23.    ROOT=LOOKUP((COND<0)?&(*ROOT)->LEFT:&(*ROOT)->RIGHT,N);
  24.  ▌
  25. #ELSE
  26.  WHILE(*ROOT != ╬╒╠╠ && (COND = LEXCMP(N,(*ROOT)->NAME)))
  27.    ROOT=(COND<0)?&(*ROOT)->LEFT:&(*ROOT)->RIGHT;
  28. #ENDIF
  29.  RETURN(ROOT);
  30.  
  31. /* ADD INSERT ENTRY FOR "NAME" IN
  32.    TREE AT "ROOT" */
  33. STRUCT NODE *ADD(N)
  34. CHAR *N;
  35.  CHAR *MALLOC();
  36.  STRUCT NODE *R;
  37.  
  38.  IF((R=(STRUCT NODE *)MALLOC(SIZEOF(STRUCT NODE))) == ╬╒╠╠) █
  39.   FPRINTF(STDOUT,"ABORTED:MEMORY ALLOCATION ERROR\N\N");
  40.   EXIT();
  41.  ▌
  42.  R->LEFT=R->RIGHT=╬╒╠╠;
  43.  R->P.LINES=╬╒╠╠;
  44.  R->NAME=N;
  45.  RETURN(R);
  46.  
  47. /* TREEWALK - CALL 'FTN' FOR EACH
  48.    NODE IN ORDER */
  49. UNSIGNED TREEWALK(ROOT,FTN)
  50. STRUCT NODE *ROOT;
  51. UNSIGNED(*FTN)();
  52. #IFDEF ╥┼├╒╥╙╔╓┼
  53.  IF(ROOT != ╬╒╠╠) █
  54.   TREEWALK(ROOT->LEFT,FTN);
  55.   (*FTN)(ROOT);
  56.   TREEWALK(ROOT->RIGHT,FTN);
  57.  ▌
  58. #ELSE
  59.  STRUCT NODE *STACK,*TMP;
  60.  
  61.  STACK=╬╒╠╠;  /* STACK INITIALLY EMPTY */
  62.  FOR(;;) █
  63.   IF(ROOT != ╬╒╠╠) █
  64.    TMP=ROOT;
  65.    ROOT=ROOT->LEFT;  /* MOVE TO LEFT */
  66.    TMP->LEFT=STACK;
  67.    STACK=TMP;  /* PUSH TMP */
  68.   ▌
  69.   ELSE IF(STACK != ╬╒╠╠) █ /* STACK NOT EMPTY */
  70.    ROOT=STACK;
  71.    STACK=STACK->LEFT;  /* POP */
  72.    (*FTN)(ROOT);  /* VISIT NODE */
  73.    ROOT=ROOT->RIGHT;  /* MOVE RIGHT */
  74.   ▌
  75.   ELSE BREAK;  /* STACK IS EMPTY */
  76.  ▌
  77. #ENDIF
  78.  
  79. /* INSERT - ADD 'LINEñNO' TO THE 
  80.    CIRCULAR LIST, 'ORIGIN' */
  81. STRUCT INSTANCE *INSERT(ORIGIN,LINEñNO)
  82. STRUCT INSTANCE *ORIGIN;
  83. INT LINEñNO;
  84.  CHAR *MALLOC();
  85.  STRUCT INSTANCE *T;
  86.  
  87.  IF(ORIGIN==╬╒╠╠ ▀▀ ORIGIN->LINE != LINEñNO) █
  88.   IF((T=(STRUCT INSTANCE *)MALLOC(SIZEOF(STRUCT INSTANCE))) == ╬╒╠╠) █
  89.    FPRINTF(STDOUT,"ABORTED:MEMORY ALLOCATION ERROR\N\N");
  90.    EXIT();
  91.   ▌
  92.   IF(ORIGIN==╬╒╠╠)
  93.    ORIGIN=T;
  94.   T->LINE=LINEñNO;
  95.   T->NEXT=ORIGIN->NEXT;
  96.   ORIGIN->NEXT=T;
  97.   ORIGIN=T;
  98.  ▌
  99.  RETURN(ORIGIN);
  100.  
  101. /* USE - LOG AN OCCURRENCE OF "NAME" 
  102.    IN "FILE" AT "LINE" */
  103. UNSIGNED USE(N,FILE,LNE)
  104. CHAR *N,*FILE;
  105. UNSIGNED LNE;
  106.  EXTERN STRUCT NODE *SYMñROOT,*FILñROOT;
  107.  CHAR *NEWCPY();
  108.  STRUCT NODE **FT,**NT;
  109.  
  110.  IF(*(NT=LOOKUP(&SYMñROOT,N))==╬╒╠╠)
  111.   *NT=ADD(NEWCPY(N));
  112.  IF(*(NT=LOOKUP(&((*NT)->P.FILES),FILE))==╬╒╠╠) █
  113.   IF(*(FT=LOOKUP(&FILñROOT,FILE))==╬╒╠╠)
  114.    *FT=ADD(NEWCPY(FILE));
  115.   *NT=ADD((*FT)->NAME);
  116.  ▌
  117.  (*NT)->P.LINES=INSERT((*NT)->P.LINES,LNE);
  118.  
  119. /* GETñNAME - EXTRACT FILE NAME
  120.    FROM LINE */
  121. UNSIGNED GETñNAME(LNE,FILE)
  122. CHAR *LNE,*FILE;
  123.  UNSIGNED CPYñUNTL();
  124.  CHAR *DELIM;
  125.  
  126.  WHILE(*LNE==' ')
  127.   ++LNE;
  128.  IF(*LNE!='\N') █  /* IF NONE,USE "FILE" AS IS */
  129.   IF(*LNE=='"') █
  130.    DELIM="\"\N";
  131.    ++LNE;
  132.   ▌
  133.   ELSE IF(*LNE=='<') █
  134.    DELIM=">\N";
  135.    ++LNE;
  136.   ▌
  137.   ELSE DELIM="\N";
  138.   CPYñUNTL(FILE,LNE,DELIM);
  139.  ▌
  140.  
  141. /* NEWñLINE - RETURN POINTER TO THE
  142.    NEXT LINE */
  143. CHAR *NEWñLINE()
  144.  EXTERN INT LINEñCNT;
  145.  STATIC CHAR LINE[═┴╪╠╔╬┼+1];
  146.  
  147.  ++LINEñCNT;
  148.  RETURN(FGETS(LINE,═┴╪╠╔╬┼,STDIN));
  149.  
  150. /* WHITSPAC - TESTS FOR BLANKS
  151.    AND COMMENTS */
  152. UNSIGNED WHITSPAC(S)
  153. CHAR **S;
  154.  WHILE(**S == ' ')  ++*S;
  155.  IF(**S=='/' && *((*S)+1)=='*') █ /* COMMENT */
  156.   WHILE(*(++(*S))!='/') █
  157.    WHILE(*(++(*S))!='*') █
  158.     IF(**S==┼╧╙) █
  159.      IF((*S=NEWñLINE())!=╬╒╠╠)
  160.       --(*S);  /* DUE TO PRE-INCREMENT IN INNER WHILE LOOP */
  161.      ELSE █
  162.       FPRINTF(STDOUT,"UNEXPECTED ┼╧╞\N");
  163.       RETURN(╞┴╠╙┼);
  164.      ▌
  165.     ▌
  166.    ▌
  167.   ▌
  168.   RETURN(╘╥╒┼);
  169.  ▌
  170.  RETURN(╞┴╠╙┼);
  171.  
  172. /* ISHEX - IS 'C' A HEXADECIMAL DIGIT? */
  173. UNSIGNED ISHEX(C)
  174. CHAR C;
  175.  RETURN(('0'<=C&&C<='9')▀▀('A'<=C&&C<='F'));
  176.  
  177. /* GETOKEN - STRIP LEADING TOKEN
  178.    FROM S */
  179. CHAR GETOKEN(S,T)
  180. CHAR **S,*T;
  181.  CHAR ESC();
  182.  CHAR CLASS;
  183.  
  184.  WHILE(WHITSPAC(S)) ++*S;
  185.  IF(ISALPHA(**S)▀▀**S=='ñ') █  /* IDENTIFIER */
  186.   CLASS=╔─;
  187.   DO █
  188.    *(T++)=*((*S)++);
  189.   ▌ WHILE(ISDIGIT(**S)▀▀ISALPHA(**S)▀▀**S=='ñ');
  190.  ▌
  191.  ELSE IF(**S=='\"'▀▀**S=='\'') █  /* STRING OR LITERAL */
  192.   CLASS=**S;
  193.   DO █
  194.    ESC(S);
  195.    ++(*S);
  196.    IF(**S==┼╧╙) █
  197.     IF((*S=NEWñLINE())==╬╒╠╠)
  198.      GOTO OUT;
  199.    ▌
  200.   ▌ WHILE(**S != CLASS);
  201.   ++(*S);
  202.  ▌
  203.  ELSE IF(ISDIGIT(**S)) █
  204.   DO █
  205.    CLASS=*(++(*S));
  206.    CLASS=LOWER(CLASS);  /* N.B. LOWER() MAY BE A MACRO */
  207.   ▌ WHILE(ISHEX(CLASS)▀▀CLASS=='X'▀▀CLASS=='L'▀▀CLASS=='.');
  208.   CLASS=╔╬╘┼╟┼╥;
  209.  ▌
  210.  ELSE CLASS=*(*S)++;
  211. OUT:
  212.  *T=┼╧╙;
  213.  RETURN(CLASS);
  214.