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

  1. /* -*-c,save-*- */
  2. /* COMM1.C    This is part one of the mince command set
  3.  
  4. The seller of this software hereby disclaim any and all
  5. guarantees and warranties, both express and implied.  No
  6. liability of any form shall be assumed by the seller, nor shall
  7. direct, consequential, or other damages be assumed by the seller.
  8. Any user of this software uses it at his or her own risk.
  9.  
  10. Due to the ill-defined nature of "fitness for purpose" or similar
  11. types of guarantees for this type of product, no fitness for any
  12. purpose whatsoever is claimed or implied.
  13.  
  14. The physical medium upon which the software is supplied is
  15. guaranteed for one year against any physical defect.  If it
  16. should fail, return it to the seller, and a new physical medium
  17. with a copy of the purchased software shall be sent.
  18.  
  19. The seller reserve the right to make changes, additions, and
  20. improvements to the software at any time; no guarantee is made
  21. that future versions of the software will be compatible with any
  22. other version.
  23.  
  24. The parts of this disclaimer are severable and fault found in any
  25. one part does not invalidate any other parts.
  26.  
  27.     Copyright (c) 1981 by Mark of the Unicorn
  28.     Created for version two  8/27/80  JTL
  29.     Updated to version three  1/7/81  JTL
  30.  
  31.     This file contains the control character command execution
  32. routines for the mince editor. There are also a small number of
  33. subordinate routines. */
  34.  
  35. #include "mince.gbl"
  36.  
  37. MSetMrk()                /* set the user mark to the point */
  38. {
  39.     BMrkToPnt(mark);
  40.     Echo("Mark Set");
  41.     }
  42.  
  43. MBegLin()                /* move to the beginning of the current line */
  44. {
  45.     ToBegLine();
  46.     }
  47.  
  48. MPrevChar()            /* move back a character */
  49. {
  50.     BMove(-arg);
  51.     arg=0;
  52.     }
  53.  
  54. MDelChar()            /* delete the current character */
  55. {
  56.     BDelete(arg);
  57.     arg=0;
  58.     }
  59.  
  60. MEndLin()                /* move to the end of the current line */
  61. {
  62.     ToEndLine();
  63.     }
  64.  
  65. MNextChar()            /* move the point to the next character */
  66. {
  67.     BMove(arg);
  68.     arg=0;
  69.     }
  70.  
  71. MAbort()                /* abort the current operation */
  72. {
  73.     TBell();
  74.     arg=0;
  75.     }
  76.  
  77. MIndent()                /* Indent next line same as current */
  78. {
  79.     int IsWhite();
  80.  
  81.     BInsert(NL);
  82.     BMove(-1);
  83.     ToBegLine();
  84.     MovePast(IsWhite,FORWARD);
  85.     cnt=BGetCol();
  86.     NLSrch();
  87.     TIndent(cnt);
  88.     }
  89.  
  90. MDelLin()                /* delete the current line */
  91. {
  92.     tmark=BCreMrk();
  93.     if (arg>0) {
  94.         if (!BIsEnd() && (Buff()&255)==NL) BMove(1);
  95.         else ToEndLine();
  96.         }
  97.     else ToBegLine();
  98.     KillToMrk(tmark,(arg>0));
  99.     BKillMrk(tmark);
  100.     }
  101.  
  102. MNewLin()                /* insert a newline */
  103. {
  104.     BInsert(NL);
  105.     }
  106.  
  107. MNextLin()            /* move down one line */
  108. {
  109.     if (!VMovCmnd(lfunct)) lcol=BGetCol();
  110.     while(arg-- > 0) NLSrch();
  111.     BMakeCol(lcol);
  112.     }
  113.  
  114. MOpenLin()            /* insert a newline after the current position */
  115. {
  116.     BInsert(NL);
  117.     BMove(-1);
  118.     }
  119.  
  120. MPrevLin()            /* move to the previous line */
  121. {
  122.     if (!VMovCmnd(lfunct)) lcol=BGetCol();
  123.     while (arg-- > 0) RNLSrch();
  124.     BMakeCol(lcol);
  125.     }
  126.  
  127. MQuote()                /* quote next character */
  128. {
  129.     tmp=DelayPrompt("Quote:");
  130.     KbWait();
  131.     cnt=TGetKb();
  132.     while (arg-- > 0) {
  133.         BInsert(cnt);
  134.         TKbChk();
  135.         }
  136.     if (tmp) ClrEcho();
  137.     arg=0;
  138.     }
  139.  
  140. MRSearch()            /* reverse string search */
  141. {
  142.     if (!GetArg("Reverse Search <ESC>: ",ESC,strarg,STRMAX)) {
  143.         arg=0;
  144.         return;
  145.         }
  146.     tmark=BCreMrk();
  147.     while (arg-- > 0) if (!StrSrch(strarg,BACKWARD)) {
  148.         BPntToMrk(tmark);
  149.         Error("Not Found");
  150.         break;
  151.         }
  152.     BKillMrk(tmark);
  153.     arg=0;
  154.     ClrEcho();
  155.     }
  156.  
  157. MSearch()                /* forward string search */
  158. {
  159.     if (!GetArg("Forward Search <ESC>: ",ESC,strarg,STRMAX)) {
  160.         arg=0;
  161.         return;
  162.         }
  163.     tmark=BCreMrk();
  164.     while (arg-- > 0) if (!StrSrch(strarg,FORWARD)) {
  165.         BPntToMrk(tmark);
  166.         Error("Not Found");
  167.         break;
  168.         }
  169.     BKillMrk(tmark);
  170.     arg=0;
  171.     ClrEcho();
  172.     }
  173.  
  174. MSwapChar()            /* swap two characters */
  175. {
  176.     if (BIsEnd() || (Buff()&255)==NL) BMove(-1);
  177.     if (!BIsStart()) BMove(-1);
  178.     tmp=Buff();
  179.     BDelete(1);
  180.     BMove(1);
  181.     BInsert(tmp);
  182.     }
  183.  
  184. MArg()                /* set up arguments */
  185. {
  186.     int tchar, eflag, cflag;
  187.  
  188.     tmp=0;
  189.     cflag=FALSE;
  190.     arg *= 4;
  191.     eflag=ArgEcho(arg);
  192.     while ((tchar=TGetKb())>='0' && tchar<='9')  {
  193.         tmp=tmp*10+tchar-'0';
  194.         cflag=TRUE;
  195.         eflag |= ArgEcho(tmp);
  196.         }
  197.     if (cflag) arg=tmp;
  198.     if (eflag) ClrEcho();
  199.     cmnd=tchar;
  200.     argp=TRUE;
  201.     (*functs[cmnd])();
  202.     }
  203.  
  204. MNextPage()            /* move down a page */
  205. {
  206.     BPntToMrk(sstart);
  207.     for (cnt=WHeight()+PrefLine()-2; cnt>0; --cnt) NLSrch();
  208.     ScrnRange();
  209.     }
  210.  
  211. MDelRgn()                /* delete from the point to the mark */
  212. {
  213.     KillToMrk(mark,BIsBeforeMrk(mark));
  214.     }
  215.  
  216. MCtrlX()                /* process cntrl-x commands */
  217. {
  218.     tmp=DelayPrompt("Control-X:");
  219.     KbWait();
  220.     cmnd=(TGetKb() & ~128)+256;
  221.     if (tmp) ClrEcho();
  222.     (*functs[cmnd])();
  223.     }
  224.  
  225. MYank()                /* Insert the delete buffer at the point */
  226. {
  227.     BMrkToPnt(mark);
  228.     BSwitchTo(del_buff);
  229.     BToEnd();
  230.     tmark=BCreMrk();
  231.     BToStart();
  232.     BCopyRgn(tmark,buffs[cbuff].bbuff);
  233.     BKillMrk(tmark);
  234.     BSwitchTo(buffs[cbuff].bbuff);
  235.     }
  236.  
  237. MMeta()                /* Process Meta commands */
  238. {
  239.     tmp=DelayPrompt("Meta:");
  240.     KbWait();
  241.     cmnd=TGetKb()|128;
  242.     if (tmp) ClrEcho();
  243.     (*functs[cmnd])();
  244.     }
  245.  
  246. MDelIndent()            /* delete the indentation from this line */
  247. {
  248.     tmark=BCreMrk();
  249.     ToBegLine();
  250.     MDelWhite();
  251.     BPntToMrk(tmark);
  252.     BKillMrk(tmark);
  253.     arg=0;
  254.     }
  255.  
  256. MInsert()                /* self inserting commands */
  257. {
  258. #ifdef ELECTRIC
  259.     if (!isalpha(cmnd & 0x7F)) EDoAbrev(cmnd);
  260.     else BInsert(cmnd & 0x7F);
  261. #else
  262.     BInsert(cmnd & 0x7F);
  263. #endif
  264.     }
  265.  
  266. MRDelChar()            /* delete the previous character */
  267. {
  268.     tmark=BCreMrk();
  269.     BMove(-arg);
  270.     BDelToMrk(tmark);
  271.     BKillMrk(tmark);
  272.     arg=0;
  273.     }
  274.  
  275.     /* Page mode commands */
  276. MOverwrite()            /* overwrite instead of inserting */
  277. {
  278.     if (!BIsEnd() && !IsNL()) {
  279.         MPFChar();
  280.         BMove(-1);
  281.         BDelete(1);
  282.         }
  283.     BInsert(cmnd);
  284.     }
  285.  
  286. MPBegLine()            /* move to the first non-white character */
  287. {
  288.     int IsWhite();
  289.  
  290.     ToBegLine();
  291.     MovePast(IsWhite,FORWARD);
  292.     if (IsNL()) MDelWhite();
  293.     }
  294.  
  295. MPBChar()                /* move to the left one character */
  296. {
  297.     ForceCol(BGetCol()-1,BACKWARD);
  298.     }
  299.  
  300. MPFChar()                /* move to the right one character */
  301. {
  302.     ForceCol(BGetCol()+1,FORWARD);
  303.     }
  304.  
  305. MPEndLine()            /* go to end of line less white space */
  306. {
  307.     ToEndLine();
  308.     MDelWhite();
  309.     }
  310.  
  311. MPBackSpace()            /* rub out previous character */
  312. {
  313.     if (BGetCol()==0) return;
  314.     MPBChar();
  315.     if (!BIsEnd() && !IsNL()) {
  316.         MPFChar();
  317.         BMove(-1);
  318.         BDelete(1);
  319.         }
  320.     BInsert(' ');
  321.     BMove(-1);
  322.     }
  323.     
  324. MPTab()                /* move over a tab stop */
  325. {
  326.     ForceCol(BGetCol()+TWidth(BGetCol(),TAB),FORWARD);
  327.     }
  328.  
  329. MPNextLine()            /* move to the next line in exact same column */
  330. {
  331.     MNextLin();
  332.     ForceCol(lcol,FORWARD);
  333.     }
  334.  
  335. MPPrevLine()            /* move to previous column in same column */
  336. {
  337.     MPrevLin();
  338.     ForceCol(lcol,FORWARD);
  339.     }
  340.  
  341. #ifdef LARGE
  342.     /* C Mode commands */
  343. MCIndent()            /* Indent for C code */
  344. {
  345.     int IsWhite(), wid;
  346.  
  347.     tmark=BCreMrk();
  348.     ToBegLine();
  349.     MovePast(IsWhite,FORWARD);
  350.     if (BIsAfter(tmark)) BPntToMrk();
  351.     wid=BGetCol();
  352.     while (BIsBefore(tmark)) {
  353.         if (Buff()=='{') wid += indentcol;
  354.         else if (Buff()=='}') wid -= indentcol;
  355.         BMove(1);
  356.         TKbChk();
  357.         }
  358.     BPntToMrk(tmark);
  359.     BKillMrk(tmark);
  360.     BInsert(NL);
  361.     TIndent(wid);
  362.     }
  363.  
  364.     /* Auto save mode */
  365. MSInsert()            /* Auto save self insert */
  366. {
  367.     static unsigned in_cnt;
  368.  
  369. #ifdef ELECTRIC
  370.     if (!isalpha(cmnd & 0x7F)) EDoAbrev(cmnd);
  371.     else BInsert(cmnd & 0x7F);
  372. #else
  373.     BInsert(cmnd & 0x7F);
  374. #endif
  375.     if (++in_cnt>256) {
  376.         MFileSave();
  377.         in_cnt=0;
  378.         }
  379.     }
  380. #endif
  381.  
  382. /* END OF COMM1.C -Mince command routines */
  383. ;
  384. #endif
  385.     if (++in_cnt>256) {
  386.         MFileSave();
  387.         in_cnt=0;
  388.         }
  389.     }
  390. #endif
  391.  
  392. /