home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol076 / ed2.c < prev    next >
C/C++ Source or Header  |  1985-02-18  |  8KB  |  469 lines

  1. /* ED2.C */
  2.  
  3. #include ed0.c
  4. #include ed1.ccc
  5. #define SIGNON "E.K. Ream/Dr Dobb's Editor - H89/H19 enhancement: July 20, 1982"
  6. #define CMNDMODE    1
  7. #define INSMODE     2
  8. #define EDITMODE    3
  9. #define EXITMODE    4
  10. main()
  11. {
  12. int mode;
  13.     syscout(ESC1); /*alternate keyboard mode*/
  14.     syscout('=');
  15.     fmtassn(NO);
  16.     fmtset(8);
  17.     outclr();
  18.     outxy(0,SCRNL1);
  19.     message(SIGNON);
  20.     outxy(0,1);
  21.     fileclear();    /* make sure no read or write files indicated */
  22.     bufnew();
  23.     mode=CMNDMODE;
  24.     edgetln();
  25.     while(1){
  26.         if (mode ==EXITMODE) {
  27.             break;
  28.         }
  29.         else if (mode==CMNDMODE) {
  30.             mode=command();
  31.         }
  32.         else if (mode==EDITMODE) {
  33.             mode=edit();
  34.         }
  35.         else if (mode==INSMODE) {
  36.             mode=insert();
  37.         }
  38.         else {
  39.             syserr("main: no mode");
  40.             mode=EDITMODE;
  41.         }
  42.     }
  43. }
  44. edit()
  45. {
  46. char sbuffer[SCRNW1];
  47. int v;
  48. int x,y;
  49. char c;
  50.     pmtedit();
  51.     while(1){
  52.         c=syscin();    /* tolower eliminated */
  53.         if (c==ESC1) {        /* enter command mode */
  54.             return(CMNDMODE);
  55.         }
  56.         else if (c==INS1) {    /* enter insert mode */
  57.             return(INSMODE);
  58.         }
  59.         else if (special(c)==YES) {
  60.             if (c==UP1){    /* DOWN1 now treated separately */
  61.                 return(INSMODE);
  62.             }
  63.             else {
  64.                 continue;
  65.             }
  66.         }
  67.         else if (c==DOWN1) {    /* DOWN1 now does not     */
  68.             eddn();     /* enter insert mode but */
  69.             pmtline();    /* just advances to next line */
  70.             edbegin();
  71.             pmtcol();
  72.         }
  73.         else if (c==RIGHT1) {    /* go to end of line */
  74.             edright();
  75.             pmtcol();
  76.         }
  77.         else if (c==ERASE) {    /* erase to end of line */
  78.             ederase();
  79.             pmtcol();
  80.         }
  81.         else if (c==HOME) {    /* move cursor alternatingly to */
  82.             edhome();    /* top and bottom of screen */
  83.             pmtline();
  84.         }
  85.         else if (c==LSTRT) {    /* move to beginning of line */
  86.             edbegin();
  87.             pmtcol();
  88.         }
  89.         else if (c==DSCROL) {    /* scroll down */
  90.             pmtmode("edit: scroll");
  91.             while (bufnrbot()==NO) {
  92.                 if (chkkey()==YES) {
  93.                     break;
  94.                 }
  95.                 if (eddn()==ERR) {
  96.                     break;
  97.                 }
  98.             }
  99.             pmtedit();
  100.         }
  101.         else if (c==LEND){    /* move to end of line */
  102.             edend();
  103.             pmtcol();
  104.         }
  105.         else if (c==GOTO){    /* go to line entered */
  106.             x=outxget();
  107.             y=outyget();
  108.             pmtcmnd("edit: goto: ",sbuffer);
  109.             if(number(sbuffer,&v)) {
  110.                 edgo(v,0);
  111.             }
  112.             else {
  113.                 outxy(x,y);
  114.             }
  115.             pmtedit();
  116.         }
  117.         else if (c==DTOCH){    /* kill to character entered */
  118.             pmtmode("edit:    kill");
  119.             c=syscin();
  120.             if ((special(c)==NO) &
  121.                 (control(c)==NO)) {
  122.                 edkill(c);
  123.             }
  124.             pmtedit();
  125.         }
  126.         else if (c==GTOCH){    /* search to character entered */
  127.             pmtmode("edit: search");
  128.             c=syscin();
  129.             if ((special(c)==NO) &
  130.                 (control(c)==NO)) {
  131.                 edsrch(c);
  132.             }
  133.             pmtedit();
  134.         }
  135.         else if (c==USCROL) {    /* scroll up */
  136.             pmtmode("edit: scroll");
  137.             while (bufattop()==NO) {
  138.                 if (chkkey()==YES) {
  139.                     break;
  140.                 }
  141.                 if (edup()==ERR) {
  142.                     break;
  143.                 }
  144.             }
  145.             pmtedit();
  146.         }
  147.         else {        /* editor now exchanges any other character */
  148.             if ((special(c)==NO) &    /* with cursor */
  149.                 (control(c)==NO)) {
  150.                 edchng(c);
  151.             }
  152.             pmtedit();
  153.         }
  154.     }
  155. }
  156. insert()
  157. {
  158. char c;
  159.     pmtmode("insert");
  160.     while(1) {
  161.         c=syscin();
  162.         if (c==ESC1) {
  163.             return(CMNDMODE);
  164.         }
  165.         else if (c==EDIT1) {
  166.             return(EDITMODE);
  167.         }
  168.         else if (c==INS1) {
  169.             ;
  170.         }
  171.         else if (c==DOWN1) {    /* in insert mode DOWN1 treated  */
  172.             ednewdn();    /* differently from edit mode     */
  173.             pmtline();    /* inserts new line */
  174.             continue;
  175.         }
  176.         else if (special(c)==YES) {
  177.             if ((c==UP2)|(c==DOWN2)) {
  178.                 return(EDITMODE);
  179.             }
  180.             else {
  181.                 continue;
  182.             }
  183.         }
  184.         else if (control(c)==YES) {
  185.             continue;
  186.         }
  187.         else {
  188.             edins(c);
  189.             pmtcol();
  190.         }
  191.     }
  192. }
  193. control(c) char c;
  194. {
  195.     if (c==TAB) {
  196.         return(NO);
  197.     }
  198.     else if (c>=127) {
  199.         return(YES);
  200.     }
  201.     else if (c<32) {
  202.         return(YES);
  203.     }
  204.     else {
  205.         return(NO);
  206.     }
  207. }
  208. special(c) char c;
  209. {
  210. int k;
  211.     if (c==JOIN1) {
  212.         edjoin();
  213.         pmtline();
  214.         return(YES);
  215.     }
  216.     if (c==SPLT1) {
  217.         edsplit();
  218.         pmtline();
  219.         return(YES);
  220.     }
  221.     if (c==ABT1) {
  222.         edabt();
  223.         pmtcol();
  224.         return(YES);
  225.     }
  226.     else if (c==LFTDEL) {        /* delete to left of cursor */
  227.         edldel();
  228.         pmtcol();
  229.         return(YES);
  230.     }
  231.     else if (c==DEL1) {        /* delete at cursor */
  232.         edcdel();
  233.         pmtcol();
  234.         return(YES);
  235.     }
  236.     else if (c==ZAP1) {
  237.         edzap();
  238.         pmtline();
  239.         return(YES);
  240.     }
  241.     else if (c==UP2) {
  242.         edup();
  243.         pmtline();
  244.         return(YES);
  245.     }
  246.     else if (c==UP1) {
  247.         ednewup();
  248.         pmtline();
  249.         return(YES);
  250.     }
  251.  
  252. /* DOWN1 (CR) is no longer a special character */
  253.  
  254.     else if (c==DOWN2) {
  255.         eddn();
  256.         pmtline();
  257.         return(YES);
  258.     }
  259.     else if (c==LEFT1) {
  260.         edleft();
  261.         pmtcol();
  262.         return(YES);
  263.     }
  264.     else if (c==RIGHT1) {
  265.         edright();
  266.         pmtcol();
  267.         return(YES);
  268.     }
  269.     else  {
  270.         return(NO);
  271.     }
  272. }
  273. command()
  274. {
  275. int v;
  276. char c;
  277. char args[SCRNW1];
  278. char *argp;
  279. int topline;
  280. int ypos;
  281. int oldline;
  282. int k;
  283.     edrepl();
  284.     oldline=bufln();
  285.     ypos=outyget();
  286.     topline=oldline-ypos+1;
  287.     while(1) {
  288.         outxy(0,SCRNL1);
  289.         fmtcrlf();
  290.         pmtmode("command:");
  291.         getcmnd(args,0);
  292.         fmtcrlf();
  293.         pmtline();
  294.         c=args[0];
  295.         if ((c==EDIT1)|(c==INS1)) {
  296.             if (oldline==bufln()) {
  297.                 edgetln();
  298.                 bufout(topline,1,SCRNL1);
  299.                 outxy(0,ypos);
  300.             }
  301.             else {
  302.                 edgo(bufln(),0);
  303.             }
  304.             if (c==EDIT1) {
  305.                 return(EDITMODE);
  306.             }
  307.             else {
  308.                 return(INSMODE);
  309.             }
  310.         }
  311.         else if (tolower(args[0])=='g'){
  312.             argp=skipbl(args+1);
  313.             if (argp[0]==EOS) {
  314.                 edgo(oldline,0);
  315.                 return(EDITMODE);
  316.             }
  317.             else if (number(argp,&v)==YES) {
  318.                 edgo(v,0);
  319.                 return(EDITMODE);
  320.             }
  321.             else {
  322.                 message("bad line number");
  323.             }
  324.         }
  325.         else if (lookup(args,"append")) {
  326.             append(args);
  327.         }
  328.         else if (lookup(args,"change")) {
  329.             change(args);
  330.         }
  331.         else if (lookup(args,"clear")) {
  332.             clear();
  333.         }
  334.         else if (lookup(args,"delete")) {
  335.             delete(args);
  336.         }
  337.         else if (lookup(args,"dos")) {
  338.             if (chkbuf()==YES) {
  339.                 closewrite();    /* write file closed on exit */
  340.                 syscout(ESC1); /*exit alternate keyboard mode*/
  341.                 syscout('>');
  342.                 syscout(ESC1); /*clear display*/
  343.                 syscout('E');
  344.                 return(EXITMODE);
  345.             }
  346.         }
  347.         else if (lookup(args,"find")) {
  348.             if ((k=find()) >= 0) {
  349.                 edgo(bufln(),k);
  350.                 return(EDITMODE);
  351.             }
  352.             else {
  353.                 bufgo(oldline);
  354.                 edgetln();
  355.                 message("pattern not found");
  356.             }
  357.         }
  358.         else if (lookup(args,"list")) {
  359.             list(args);
  360.         }
  361.         else if (lookup(args,"open")) {     /* new */
  362.             open(args);
  363.         }
  364.         else if (lookup(args,"load")) {     /* changed */
  365.             open(args);
  366.             rest(args);
  367.         }
  368.         else if (lookup(args,"name")) {
  369.             name(args);
  370.         }
  371.         else if (lookup(args,"write")) {    /* new */
  372.             writel(args);
  373.         }
  374.         else if (lookup(args,"rename")) {    /* new */
  375.             rename(args);
  376.         }
  377.         else if (lookup(args,"delname")) {    /* new */
  378.             delname(args);
  379.         }
  380.         else if (lookup(args,"closewrite")) {    /* new */
  381.             closewrite(args);
  382.         }
  383.         else if (lookup(args,"closeread")) {    /* new */
  384.             closeread(args);
  385.         }
  386.         else if (lookup(args,"save")) {
  387.             save(args);
  388.         }
  389.         else if (lookup(args,"read")) {      /* new */
  390.             getit(args);
  391.         }
  392.         else if (lookup(args,"move")) {     /* new */
  393.             moveit(args);
  394.         }
  395.         else if (lookup(args,"copy")) {     /* new */
  396.             copyit(args);
  397.         }
  398.         else if (lookup(args,"search")) {
  399.             search(args);
  400.         }
  401.         else if (lookup(args,"tabs")) {
  402.             tabs(args);
  403.         }
  404.         else if (lookup(args,"rest")) {     /* new */
  405.             rest(args);
  406.         }
  407.         else if (lookup(args,"extract")) {    /* new */
  408.             extract(args);
  409.         }
  410.         else {
  411.             message("command not found");
  412.         }
  413.     }
  414. }
  415. lookup(line,command) char *line, *command;
  416. {
  417.     while(*command) {
  418.         if (tolower(*line++)!=*command++) {
  419.             return(NO);
  420.         }
  421.     }
  422.     if((*line==EOS)|(*line==' ')|(*line==TAB)) {
  423.         return(YES);
  424.     }
  425.     else {
  426.         return(NO);
  427.     }
  428. }
  429. getcmnd(args,offset) char *args; int offset;
  430. {
  431. int j,k;
  432. char c;
  433.     outxy(offset,outyget());
  434.     outdeol();
  435.     k=0;
  436.     while ((c=syscin())!=CR) {
  437.         if ((c==EDIT1)|(c==INS1)) {
  438.             args[0]=c;
  439.             return;
  440.         }
  441.         if ((c==DEL1)|(c==LEFT1)) {
  442.             if (k>0) {
  443.                 outxy(offset,outyget());
  444.                 outdeol();
  445.                 k--;
  446.                 j=0;
  447.                 while (j<k) {
  448.                     outchar(args[j++]);
  449.                 }
  450.             }
  451.         }
  452.         else if (c==ABT1) {
  453.             outxy(offset,outyget());
  454.             outdeol();
  455.             k=0;
  456.         }
  457.         else if ((c!=TAB)&((c<32)|(c==127))) {
  458.             continue;
  459.         }
  460.         else {
  461.             if ((k+offset)<SCRNW1) {
  462.                 args[k++]=c;
  463.                 outchar(c);
  464.             }
  465.         }
  466.     }
  467.     args[k]=EOS;
  468. }
  469.