home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / cpm68k / kmince.lbr / FLASHER.CQ / FLASHER.C
Text File  |  1986-08-29  |  4KB  |  212 lines

  1. /* -*-c,save-*- */
  2. /*
  3.  * FLASHER.C - code for paren flashing, etc.
  4.  * Robert Heller
  5.  * Last Mod. Mon Sep 23, 1985 21:49:30.31
  6.  */
  7. #include "mince.gbl"
  8. #include <ctype.h>
  9.  
  10. /* #define DEBUG 1        /* debugging hackery */
  11.  
  12.  
  13. SynInit()
  14. {
  15.     register int i;
  16.     register SyntaxEntry *s1,*s2
  17. #ifdef LISPMODE
  18.              ,*s3
  19. #endif
  20.     ;
  21.  
  22.     s1 = NormSyn;
  23.     s2 = CSyn;
  24. #ifdef LISPMODE
  25.     s3 = LispSyn;
  26. #endif
  27.     for (i = 0; i< MAXCHARS; i++) {
  28. #ifdef LISPMODE
  29.     s3->s_kind = 
  30. #endif
  31.     s2->s_kind =
  32.     s1->s_kind = (isalnum(i))?WORD:DULL;
  33.     s1++; s2++;
  34. #ifdef LISPMODE
  35.     s3++;
  36. #endif
  37.     }
  38.     CSyn['{'].s_kind = BEGP;
  39.     CSyn['{'].s_MP = '}';
  40.     CSyn['}'].s_kind = ENDP;
  41.     CSyn['}'].s_MP = '{';
  42.     CSyn['('].s_kind = BEGP;
  43.     CSyn['('].s_MP = ')';
  44.     CSyn[')'].s_kind = ENDP;
  45.     CSyn[')'].s_MP = '(';
  46.     CSyn['"'].s_kind = PAIRQ;
  47.     CSyn['\''].s_kind = PAIRQ;
  48.     CSyn['\\'].s_kind = PREQ;
  49. #ifdef ELECTRIC
  50.     CSyn['['].s_kind = BEGP;
  51.     CSyn['['].s_MP = ']';
  52.     CSyn[']'].s_kind = ENDP;
  53.     CSyn[']'].s_MP = '[';
  54. #endif
  55. #ifdef LISPMODE
  56.     LispSyn['('].s_kind = BEGP;
  57.     LispSyn['('].s_MP = ')';
  58.     LispSyn[')'].s_kind = ENDP;
  59.     LispSyn[')'].s_MP = '(';
  60.     LispSyn['"'].s_kind = PAIRQ;
  61.     LispSyn['\\'].s_kind = PREQ;
  62. #endif
  63.     }
  64.  
  65. SynCopy(to,from,count)
  66. register SyntaxEntry *to,*from;
  67. register int count;
  68. {
  69.     while(count-- > 0) {
  70.     to->s_kind = from->s_kind;
  71.     to->s_MP = from->s_MP;
  72.     to++; from++;
  73.     }
  74.     }
  75.  
  76. ParScan(StpAtNL,forward,ParLevel)
  77. register int StpAtNL,forward,ParLevel;
  78. {
  79.     register char c,pc;
  80.     char parstack[200];
  81.     int InString = 0;
  82.     char MatchQuote = 0;
  83.     register char k;
  84.     register int on_on = 1;
  85.     UWORD BLocation();
  86.  
  87.     {
  88.     register int i;
  89.     for (i = 0; i <= ParLevel; i++) parstack[i] = 0;
  90.     }
  91.     if (StpAtNL) {
  92.     if (forward) {
  93.         while((!BIsEnd()) &&
  94.           ((c = Buff()) == ' ' || c == '\t' || c == NL)) {
  95. #ifdef DEBUG
  96.         Debug("*** in ParScan(): scanning over whitespace ",c);
  97. #endif
  98.         BMove(1);
  99.         }
  100.         }
  101.     else {
  102.         while((!BIsStart()) &&
  103.           ((c = Buff()) == ' ' || c == '\t' || c == NL))
  104.         BMove(-1);
  105.         }
  106.     }
  107.     while (on_on) {
  108.     if (forward) {
  109.         if (BIsEnd()) return(0);
  110.         BMove(1);
  111.         }
  112.     if (BLocation() > 1) {
  113.         BMove(-2);
  114.         pc = Buff();
  115.         BMove(2);
  116.         }
  117.     else {
  118.         pc = 0;
  119.         if (BLocation() < 1) return(0);
  120.         }
  121.     BMove(-1); c = Buff(); BMove(1);
  122.     k = CurSyn[toascii(c)].s_kind;
  123.     if (CurSyn[toascii(pc)].s_kind == PREQ) k = WORD;
  124. #ifdef DEBUG
  125.     Debug("In ParScan loop. char is ",k);
  126. #endif
  127.     if ((!InString || c == MatchQuote) && k == PAIRQ) {
  128.         InString = !InString;
  129.         MatchQuote = c;
  130.         }
  131.     if (StpAtNL && c == NL && ParLevel == 0) return(0);
  132.     if (!InString && (k == ENDP || k == BEGP)) {
  133.         if ((forward == 0) == (k == ENDP)) {
  134.         ParLevel++;
  135.         parstack[ParLevel] = CurSyn[toascii(c)].s_MP;
  136. #ifdef DEBUG
  137.     Debug("Stacking a paren. stacked char is ",parstack[ParLevel]);
  138. #endif
  139.         }
  140.         else {
  141. #ifdef DEBUG
  142.     Debug("Unstacking a paren. stacked char is ",parstack[ParLevel]);
  143. #endif
  144.         if (ParLevel > 0 && parstack[ParLevel] && 
  145.                     parstack[ParLevel] != c) {
  146. /*            Error("Parenthesis mismatch.");*/
  147.             return(0);
  148.             }
  149.         ParLevel--;
  150.         }
  151.         if (ParLevel < 0 || (ParLevel == 0 && !StpAtNL)) on_on = 0;
  152.         }
  153.     if (!forward) BMove(-1);
  154.     }
  155.     return(1);
  156.     }
  157. MFlash()
  158. {
  159.     register int hmark,scan,dc,dly;
  160.     
  161.     BInsert(toascii(cmnd));
  162.     hmark = BCreMrk();
  163. /*    BMove(-1);*/
  164.     scan = ParScan(0,0,0);
  165. /*    Debug("ParScan returns. Scan is ",scan);*/
  166.     if (!scan) {
  167.     BPntToMrk(hmark);
  168.     IncrDsp();
  169.     Error("No Match");
  170.     BKillMrk(hmark);
  171.     }
  172.     else {
  173.     IncrDsp();
  174.     for (dc=terminal.delaycnt*terminal.mhz*10; dc; --dc)
  175.         if (TKbRdy()) break;
  176.     BPntToMrk(hmark);
  177.     BKillMrk(hmark);
  178.     IncrDsp();
  179.     }    
  180.     }
  181. #ifdef LISPMODE
  182. MForPar()
  183. {
  184.     int lev;
  185.  
  186.     if (!getnum("Paren Level: ",&lev)) return;
  187.     ParScan(0,1,lev);
  188.     }
  189. MBckPar()
  190. {
  191.     ParScan(0,0,0);
  192.     }
  193. MBckPNL()
  194. {
  195.     return(ParScan(1,0,0));
  196.     }
  197. static getnum(pmt,result)
  198. char *pmt;
  199. int *result;
  200. {
  201.     char nbuff[20];
  202.  
  203.     if (!GetArg(pmt,CR,&nbuff[0],20)) return(FALSE);
  204.     *result = atoi(nbuff);
  205.     return(TRUE);
  206.     }
  207.  
  208. #endif
  209. [20];
  210.  
  211.     if (!GetArg(pmt,CR,&nbuff[0],20)) return(FALSE);
  212.