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

  1. /* -*-c,save-*- */
  2. /*
  3.  * LISPMODE.C - LISP-mode code for Mince
  4.  * Robert Heller Created Tue Sep 24, 1985 19:48:46.06
  5.  * Last Mod: Wed May 21, 1986 18:59:27.12
  6.  */
  7. #include "mince.gbl"
  8.  
  9. static int LspCommC = 49,    /* default comment column */
  10.        LspDefInd = 2;    /* default indent ammount */
  11.  
  12. /* #define DEBUG 1        /* debugging hackery */
  13.  
  14. MLspSCC()
  15. {
  16.     LspCommC = arg;
  17.     arg = 0;
  18.     }
  19. MLspSDI()
  20. {
  21.     LspDefInd = arg;
  22.     arg = 0;
  23.     }
  24. _LspSCC(col)
  25. int col;
  26. {
  27.     LspCommC = col;
  28.     }
  29. _LspSDI(ind)
  30. int ind;
  31. {
  32.     LspDefInd = ind;
  33.     }
  34. MLspCmn()
  35. {
  36.     int IsSemi(),IsWhite();
  37.  
  38.     ToBegLine();
  39.     while (!BIsEnd() && Buff() != ';' && Buff() != NL) ;
  40.     if (!BIsEnd() && Buff() == ';') {
  41.     MovePast(IsSemi,FORWARD);
  42.     MovePast(IsWhite,FORWARD);
  43.     }
  44.     else {
  45.     ToEndLine();
  46.     ForceCol(LspCommC,FORWARD);
  47.     BInsert(';');
  48.     BInsert(' ');
  49.     }
  50.     }
  51. static int IsSemi()
  52. {
  53.     return(Buff() == ';');
  54.     }
  55. MDelLInd()
  56. {
  57.     int ch1,ch2;
  58.  
  59.     ToBegLine();
  60.     BMove(-1);
  61.     BDelete(1);
  62.     MDelWhite();
  63.     ch1 = Buff(); BMove(-1); ch2 = Buff(); BMove(1);
  64.     if (!(ch1 == '(' || ch1 == ')' || ch2 == '(' || ch2 == ')')) BInsert(' ');
  65.     }
  66. MRDelCTab()
  67. {
  68.     int col;
  69.  
  70.     col = BGetCol() - 1;
  71.     BMove(-1);
  72.     BDelete(1);
  73.     if (col>0) SIndent(col-BGetCol());
  74.     }
  75. MLspNLIn()
  76. {
  77.     MNewLin();
  78.     MLspIndent();
  79.     }
  80. MLspIndent()
  81. {
  82.     int col,tmpmark;
  83.  
  84.     tmpmark = BCreMrk();
  85.     ToBegLine();
  86.     if (BIsStart()) col = 0;
  87.     else {
  88.     BMove(-1);
  89.     col = LspIndCol();
  90.     }
  91. #ifdef DEBUG
  92.     Debug("*** in LspIndent(): col = ",col);
  93. #endif
  94.     BPntToMrk(tmpmark);
  95.     ToBegLine();
  96.     if (IsSemi()) BMove(1);
  97.     MDelWhite();
  98.     TIndent(col);
  99.     BPntToMrk(tmpmark);
  100.     BKillMrk(tmpmark);
  101.     while (BGetCol() < col) BMove(1);
  102.     }
  103. LspIndCol()
  104. {
  105.     int tmpmark,col;
  106.  
  107.     tmpmark = BCreMrk();
  108.     col = LspInd1();
  109.     BPntToMrk(tmpmark);
  110.     BKillMrk(tmpmark);
  111.     return(col);
  112.     }
  113. LspInd1()
  114. {
  115.     register int l,col;
  116.  
  117.     l = ParScan(1,0,1);
  118.     col = 0;
  119. #ifdef DEBUG
  120.     Debug("***in LspInd1(): ParScan(1,0,0) = ",l);
  121. #endif
  122.     if (l == 0) {
  123.     if (!blinep()) {
  124.         if (istwocmm()) {
  125.         BDelete(1);
  126.         BInsert(' ');
  127.         col = getind();
  128.         BMove(-1);
  129.         BDelete(1);
  130.         BInsert(';');
  131.         }
  132.         else col = getind();
  133.         }
  134.     else {
  135.         ToBegLine();
  136.         if (!BIsStart()) {
  137.         BMove(-1);
  138.         col = LspIndCol();
  139.         }
  140.         }
  141.     }
  142.     else col = LspIArg();
  143.     return(col);
  144.     }
  145. static LspIArg()
  146. {
  147.     int tmpmark,c;
  148.     register int col;
  149.  
  150.     col = BGetCol() + LspDefInd;
  151. #ifdef DEBUG
  152.     Debug("***in LspIArg(): col (initial value) = ",col);
  153. #endif
  154.     tmpmark = BCreMrk();
  155.     BMove(1);
  156.     while (! ((BIsEnd()) || ((c = Buff()) == ' ') || (c == '\t') ||
  157.           (c == ';') || (c == 40) || (c == NL))) BMove(1);
  158.     c = Buff();
  159.     if (c == 40) col = BGetCol();
  160.     else ToNotWhite(FORWARD);
  161. #ifdef DEBUG
  162.     Debug("***in LspIArg(): c = ",c);
  163. #endif
  164.     c = Buff();
  165.     if (!BIsEnd() && c != NL && c != ';') col = BGetCol();
  166. #ifdef DEBUG
  167.     Debug("***in LspIArg(): col (final value) = ",col);
  168. #endif
  169.     BPntToMrk(tmpmark);
  170.     BKillMrk(tmpmark);
  171.     return(col);
  172.     }
  173. static istwocmm()
  174. {
  175.     int tmpmark,IsNL();
  176.  
  177.     tmpmark = BCreMrk();
  178.     BMove(-1);
  179.     if (BIsStart() || IsNL()) {
  180.     if (!BIsStart()) BMove(1);
  181.     if (BIsEnd()) {
  182.         BPntToMrk(tmpmark);
  183.         BKillMrk(tmpmark);
  184.         return(FALSE);
  185.         }
  186.     if (Buff() == ';') {
  187.         ToEndLine();
  188.         BMove(1);
  189.         if (BIsEnd()) {
  190.         BPntToMrk(tmpmark);
  191.         BKillMrk(tmpmark);
  192.         return(FALSE);
  193.         }
  194.         else if (Buff() == ';') {
  195.         BPntToMrk(tmpmark);
  196.         BKillMrk(tmpmark);
  197.         return(TRUE);
  198.         }
  199.         else {
  200.         BPntToMrk(tmpmark);
  201.         BKillMrk(tmpmark);
  202.         return(FALSE);
  203.         }
  204.        }
  205.     else {
  206.         BPntToMrk(tmpmark);
  207.         BKillMrk(tmpmark);
  208.         return(FALSE);
  209.         }
  210.     }
  211.     else {
  212.     BPntToMrk(tmpmark);
  213.     BKillMrk(tmpmark);
  214.     return(FALSE);
  215.     }
  216.     }
  217. static blinep()
  218. {
  219.     int tmpmark,IsNL(),IsWhite();
  220.  
  221.     tmpmark = BCreMrk();
  222.     ToBegLine();
  223.     if (!BIsEnd()) MovePast(IsWhite,FORWARD);
  224.     if ((!BIsEnd()) && (Buff() == NL)) {
  225.     BPntToMrk(tmpmark);
  226.     BKillMrk(tmpmark);
  227.     return(TRUE);
  228.     }
  229.     else {
  230.     BPntToMrk(tmpmark);
  231.     BKillMrk(tmpmark);
  232.     return(FALSE);
  233.     }
  234.     }
  235. static getind()
  236. {
  237.     int tmpmark,col,IsWhite();
  238.  
  239.     tmpmark = BCreMrk();
  240.     ToBegLine();
  241.     MovePast(IsWhite,FORWARD);
  242.     col = BGetCol();
  243.     BPntToMrk(tmpmark);
  244.     BKillMrk(tmpmark);
  245. #ifdef DEBUG
  246.     Debug("***in getind(): col = ",col);
  247. #endif
  248.     return(col);
  249.     }
  250. rk(tmpmark);
  251.     BKillMrk(tmpmark);
  252. #ifdef DEBUG
  253.     Debug("***in getind(): col = ",col);
  254. #endif
  255.     return(col);
  256.