home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / canada-remote-systems / cpower / cref.arc / CREF1.C < prev    next >
Text File  |  2019-04-13  |  4KB  |  189 lines

  1. /* ├╥┼╞1.├ - ├ CROSS-REFERENCE UTILITY
  2. **           (1 OF 3 SOURCE FILES)
  3. ** ┴UTHOR:╩EFF ╘AYLOR, ╘HE ╘OOLSMITH
  4. ** (C) COPYRIGHT 1982, 1985.
  5. ** ┼NVIRONMENT: ├;╒╬╔╪ 4.2 ┬╙─.
  6. ** ┴LGORITHMS:
  7. **   ═ODIFIED ALGORITHM ╘ FROM
  8. **   "╘HE ┴RT OF ├OMPUTER ╨ROGRAMMING,"
  9. **   ╓OL.1,P.317,BY ─.┼.╦NUTH USED IN
  10. **   TREEWALK().
  11. ** ╚ISTORY:
  12. **   22 ╬OVEMBER 1982 - REMOVE RECURSION
  13. **   FROM LOOKUP().
  14. **   16 ─ECEMBER 1982 - REMOVE RECURSION
  15. **   FROM TREEWALK().
  16. **   26 ═ARCH 1985 - PORT TO ─┼├╒╙ ├.
  17. **   27 ═ARCH 1985 - LINE # LIST MADE A
  18. **   CIRCULAR QUEUE: INSERT(),LISTñFIL().
  19. **   RESERVED WORD SEARCH CHANGED TO
  20. **   BINARY SEARCH: KEYWORD().
  21. **   28 ═ARCH 1985 - PORT TO ╒╬╔╪ 4.2 ┬╙─.
  22. **
  23. **   01 ╩ULY 1989 - PORT TO ├ ╨OWER ├,
  24. **   ├64/├128, ┬EN ╨EDERSEN.
  25. **   ├-╨OWER ┬┬╙ 416-538-7720
  26. */
  27.  
  28. #INCLUDE <STDIO.H>
  29. #INCLUDE <CREF.H>
  30.  
  31. STATIC CHAR *RESERVED[]=
  32.  █"AUTO","BREAK","CASE","CHAR","CONTINUE",
  33.   "DEFAULT","DO","DOUBLE","ELSE","EXTERN",
  34.   "FLOAT","FOR","GOTO","IF","INT","LONG",
  35.   "REGISTER","RETURN","SHORT","SIZEOF",
  36.   "STATIC","STRUCT","SWITCH","TYPEDEF",
  37.   "UNION","UNSIGNED","WHILE","VOID"▌;
  38.  
  39. INT LINEñCNT;
  40. STRUCT NODE *SYMñROOT = ╬╒╠╠;
  41. STRUCT NODE *FILñROOT = ╬╒╠╠;
  42.  
  43. MAIN(ARGC,ARGV)
  44. UNSIGNED ARGC;
  45. CHAR **ARGV;
  46.  UNSIGNED PRNTXREF();
  47.  ╞╔╠┼ FREOPEN();
  48.  
  49.  IF(ARGC<2) USEAGE();
  50.  
  51.  WHILE(--ARGC>0) █
  52.   IF(FREOPEN(*(++ARGV),"R",STDIN)==╬╒╠╠ ▀▀ FERROR())
  53.    FPRINTF(STDOUT,"UNABLE TO OPEN %S\N",*ARGV);
  54.   ELSE XREF(*ARGV);
  55.  ▌
  56.  
  57.  FCLOSE(STDIN);
  58.  TREEWALK(SYMñROOT,PRNTXREF);
  59.  
  60.  /* QUICK-'N-DIRTY WAY TO DE-ALLOCATE MEMORY */
  61.  HIGHMEM(0XD000); 
  62.  
  63. USEAGE()
  64.  PRINTF("\NUSEAGE: CREF FNAME1 <FNAME2... >\N\N");
  65.  EXIT();
  66.  
  67. /* KEYWORD - IS "S" A RESERVED KEYWORD
  68.    IN ├ */
  69. UNSIGNED KEYWORD(S)
  70. CHAR *S;
  71.  INT COND;  /* CONDITION CODE OF LEXCMP() */
  72.  INT MID;
  73.  INT HI,LO;
  74.  
  75.  /* BINARY SEARCH;RESERVED[] MUST BE IN
  76.     ALPHABETICAL ORDER */
  77.  LO=0;
  78.  HI=SIZEOF(RESERVED)/SIZEOF(CHAR*)-1;
  79.  WHILE(LO<=HI) █
  80.   MID=(HI+LO)/2;
  81.   IF((COND=LEXCMP(S,RESERVED[MID]))==0)
  82.    RETURN(╘╥╒┼);
  83.   IF(COND<0) HI=MID-1;
  84.   ELSE LO=MID+1;
  85.  ▌
  86.  RETURN(╞┴╠╙┼);
  87.  
  88. /* XREF - CROSS REFERENCE */
  89. UNSIGNED XREF(FILE)
  90. CHAR *FILE;
  91.  INT ATOI();
  92.  CHAR CLASS;
  93.  STATIC CHAR *S;
  94.  STATIC CHAR TOKEN[═┴╪╠╔╬┼+1];
  95.  
  96.  LINEñCNT=0;
  97.  WHILE((S=NEWñLINE())!=╬╒╠╠) █
  98.   IF((CLASS=GETOKEN(&S,TOKEN))!='#') █
  99.    WHILE(CLASS!='\N') █
  100.     IF(CLASS==╔─ && KEYWORD(TOKEN)==╞┴╠╙┼)
  101.      USE(TOKEN,FILE,LINEñCNT);
  102.     CLASS=GETOKEN(&S,TOKEN);
  103.    ▌
  104.   ▌
  105.   ELSE IF(GETOKEN(&S,TOKEN)==╔─) █
  106.    IF(STREQ(TOKEN,"INCLUDE")) █
  107.     GETñNAME(S,TOKEN);
  108.     USE(TOKEN,FILE,LINEñCNT);
  109.    ▌
  110.    ELSE IF(STREQ(TOKEN,"DEFINE")) █
  111.     GETOKEN(&S,TOKEN);
  112.     USE(TOKEN,FILE,LINEñCNT);
  113.    ▌
  114.    ELSE IF(STREQ(TOKEN,"IFDEF")▀▀STREQ(TOKEN,"IFNDEF")) █
  115.     GETOKEN(&S,TOKEN);
  116.     USE(TOKEN,FILE,LINEñCNT);
  117.    ▌
  118.    ELSE IF(STREQ(TOKEN,"LINE")) █
  119.     IF(GETOKEN(&S,TOKEN)==╔╬╘┼╟┼╥)
  120.      LINEñCNT=ATOI(TOKEN);
  121.     ELSE
  122.      FPRINTF(STDOUT,"#LINE %S\N",TOKEN);
  123.    ▌
  124.    ELSE
  125.     ;  /* IGNORE #ELSE,#ENDIF,ETC. */
  126.   ▌
  127.  ▌
  128.  
  129. /* PUTP - OUTPUT A PARTIAL LINE
  130.    TO STDOUT */
  131. UNSIGNED PUTP(S)
  132. CHAR *S;
  133.  UNSIGNED N;
  134.  
  135.  FOR(N=0;*S != ┼╧╙;++N)
  136.   FPUTC(*(S++),STDOUT);
  137.  RETURN(N);
  138.  
  139. /* LISTñFIL - PRINT LINES WITHIN
  140.    A FILE */
  141. UNSIGNED LISTñFIL(FT)
  142. STRUCT NODE *FT;
  143.  CHAR *ITOA();
  144.  UNSIGNED LINLEN,NAMLEN;
  145.  STRUCT INSTANCE *IT;
  146.  CHAR BUF[5];
  147.  
  148.  LINLEN=PUTP(" ");
  149.  LINLEN+=PUTP(FT->NAME);
  150.  /* PRINT LINE NUMBERS */
  151.  IT=FT->P.LINES=FT->P.LINES->NEXT; /* MOVE 'LINES' TO START */
  152.  FOR(;;) █
  153.   LINLEN+=PUTP(" ");
  154.   ITOA(IT->LINE,BUF);
  155.   LINLEN+=PUTP(BUF);
  156.   IF((IT=IT->NEXT)==FT->P.LINES) BREAK;
  157.   IF(LINLEN>╫╔─╘╚-5) █  /* LEAVE A MARGIN ON RIGHT */
  158.    PUTP("\N");
  159.    NAMLEN = STRLEN(FT->NAME);
  160.    LINLEN = ++NAMLEN;
  161.    WHILE(NAMLEN--) PUTP(" ");
  162.   ▌
  163.  ▌
  164.  IF(LINLEN) PUTP("\N");
  165.  
  166. /* PRNTXREF - DUMP CROSS REFERENCE
  167.    TABLE TO STDOUT */
  168. UNSIGNED PRNTXREF(NT)
  169. STRUCT NODE *NT;
  170.  UNSIGNED LISTñFIL();
  171.  
  172.  PUTP(NT->NAME);
  173.  PUTP("\N");
  174.  TREEWALK(NT->P.FILES,LISTñFIL);
  175.