home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 331_01 / se.c < prev    next >
Text File  |  1990-06-12  |  21KB  |  806 lines

  1. /*
  2. HEADER:         CUG000.00;
  3. TITLE:          SE (nee E) stack editor -- main();
  4. DATE:           05/19/87;
  5.  
  6. DESCRIPTION:   "A full screen editor descended from Gilbert's 'e'(1981)
  7.                 through Haefner's qed and Tearle's ged.  Similar to
  8.                 Wordstar, with text stack, undo/redo, and other enhancements.
  9.                 Utilizes large RAM if available, virtual memory text storage
  10.                 in small systems.";
  11.  
  12. KEYWORDS:       Word processing, e, editor, qed, ged, full screen editor,
  13.                 text editor, program editor;
  14.  
  15. SYSTEM:         MS-DOS;
  16. FILENAME:       SE.C;
  17. SEE-ALSO:       CUG133, CUG133, CUG199;
  18. AUTHORS:        G. Nigel Gilbert, James W. Haefner, Mel Tearle, G. Osborn;
  19. COMPILERS:      Microsoft 4.00;
  20. */
  21.  
  22. /*   e/qed/ged screen editor
  23.  
  24.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  25.            licensed for private non-profitmaking use 1983
  26.            August-December 1981
  27.  
  28.     Modified:   Aug-Dec   1984:  BDS-C 'e'(vers 4.6a) to 'qe' (J.W. Haefner)
  29.                 March     1985:  BDS-C 'qe' to DeSmet-C 'qed' (J.W. Haefner)
  30.                 May       1986:  converted to ged - Mel Tearle
  31.  
  32.     FUNCTIONS:  main, initialise, edit, finish, dispose, xit,
  33.                 askforfile, seldisk
  34.  
  35.     PURPOSE:    initialise; process commands;
  36. */
  37.  
  38. #include <stdio.h>
  39. #include <ctype.h>
  40. #include <setjmp.h>
  41. #include "ged.h"
  42.  
  43. int cbreak;
  44. int linel;
  45. int pagingdisk;
  46.  
  47. main(argc,argv)
  48. int argc;
  49. char **argv;
  50. {
  51.     int argn;
  52.     int i;
  53.     char *dig;
  54.  
  55. /* --------------------- Default option settings ---------------------*/
  56.  
  57.     initjmp =    1;     /* jmp to line 1*/
  58.     autoin  =  YES;     /* auto indent  [YES/NO]*/
  59.     backup  =  YES;     /* make ".BAK" file [YES/NO]*/
  60.     ctrl = NO;          /* Control characters stripped from input file */
  61.     trail   =   NO;     /* leave trailing blanks [YES/NO]*/
  62.     charmask =  0xFF;   /* allow input ASCII 0x80 to 0xFF */
  63.     tabwidth    =   8;  /* tab stops every n cols [number]*/
  64.     fullmem =  (long) RAMSLOTS*PAGESIZE/1024;
  65.     displaypos  = YES;  /* display line:column at top of screen*/
  66.     blockscroll = YES;  /* horizontal scroll whole page, not just current line*/
  67.     eofchar = YES;      /* write ^Z end of file */
  68.     pagingdisk  =   0;  /* create buffer file on this disk -
  69.     set to either 0 (for currently logged-in disk)
  70.     or to desired disk letter  (eg 'B') */
  71.  
  72.     defext[0] = '\0';   /* default extension (.c and .doc temporarilly hard coded*/
  73.  
  74. /* ------------------ End of default option settings -------------------- */
  75.  
  76.     inbufp = 0;
  77.     rax = 0x30 << 8;
  78. /* syscall is not a library function */
  79.     syscall();
  80.  
  81.     if ( ( rax & 0x00ff ) < 2 )  {
  82.         error1( "Must use MSDOS vers > 2.0" );
  83.         exit(0);
  84.     }
  85.  
  86.     filename[0] = name[0] = '\0';
  87.  
  88.     argn = 0;
  89.     while ( ++argn < argc )
  90.         if ( *argv[argn] == '-' )  {
  91.             dig = argv[argn]+1;
  92.             switch( toupper(*dig) )  {
  93.             case 'A' :
  94.                 autoin=!autoin;
  95.                 break;
  96.             case 'B' :
  97.                 backup=!backup;
  98.                 break;
  99.             case 'C' :
  100.                 ctrl = !ctrl;
  101.                 break;
  102.             case 'D' :
  103.                 pagingdisk = toupper(*(dig+1));
  104.                 if ( pagingdisk < 'A' || pagingdisk > 'Z' )
  105.                     goto argerr;
  106.                 break;
  107.             case 'H' :
  108.                 blockscroll=!blockscroll;
  109.                 break;
  110.  
  111. /* limit amount of RAM that will be allocated. number is in kb */
  112.             case 'M' :
  113.                 i = 0;
  114.                 while (*++dig)
  115.                     i = i*10 + *dig - '0';
  116.                 i = max(i, PAGESIZE * 3/1024);
  117.                 fullmem = min(fullmem, i);
  118.                 break;
  119.  
  120.             case 'P':
  121.                 charmask = 0x7F;   /* import Wordstar document mode */
  122.                 break;
  123.             case 'T' :
  124.                 tabwidth=0;
  125.                 while (*++dig) tabwidth=tabwidth*10+*dig-'0';
  126.                 if (tabwidth < 1)
  127.                     tabwidth = 1;
  128.                 break;
  129.             case 'S' :
  130.                 trail=!trail;
  131.                 break;
  132.             case 'Z' :
  133.                 eofchar = !eofchar;
  134.                 break;
  135.             default  :
  136.                 if ( isdigit(*dig) )  {
  137.                     initjmp = atoi((argv[argn]+1));
  138.                     break;
  139.                 }
  140. argerr:
  141.                 putstr("Illegal option: ");
  142.                 putstr(argv[argn]);
  143.                 exit(0);
  144.             }
  145.         }
  146.         else {
  147.             strcpy( filename[0] ? name : filename, argv[argn] );
  148.         }
  149.     ans[0] = patt[0] = opts[0] = '\0';
  150.  
  151. /* --------- start here ----------- */
  152.  
  153. /* remember state of ^C abort setting, then turn it off so that ^C can
  154.  * be used for cursor control.
  155.  */
  156.     rax = 0x3300;
  157.     syscall();
  158.     cbreak = rdx & 0x00ff;
  159.     rax = 0x3301;
  160.     rdx = 0;
  161.     syscall();
  162.  
  163.     keytranslate();
  164.     do {
  165.         initialise();
  166.         edit();
  167.     }
  168.     while (YES);
  169. }
  170.  
  171. /* ---------- end main ------------ */
  172.  
  173.  
  174. initialise()
  175. {
  176.     int i, warn;
  177.  
  178.     lastl = cursorx = charn = offset = lastoff = 0;
  179.     histptr = histcnt = ncommand = 0;
  180.  
  181.     cursory  = topline  = findir = jmpto = 1;
  182.     blocking = isdim = repeat = NO;
  183.     replace  = warn  = NO;
  184.     blankedmess = YES;
  185.     goteof  = YES;
  186.  
  187.     fbuf = &fbuf1;
  188.     textbuf = &tbuf1;
  189.  
  190.     rax = 0x19 << 8;
  191.     syscall();       /* get current disc */
  192.     curdsk  = rax & 0xff;
  193.     pagingfile[0] = (pagingdisk) ? pagingdisk : ( curdsk+'A' ) ;
  194.     strcpy( pagingfile+1, ":e$$$.@@@" );
  195.  
  196.     initvm();
  197.  
  198.     text[0] = '\0';
  199.     cline   = 1;
  200.     inject(0,text);  /* create null line 1 */
  201.  
  202.     terminit();
  203.     setstatusname();
  204.  
  205.     if ( filename[0] )  {
  206.         curson(NO);
  207.         cleareop(0);
  208.         gotoxy(8,9);
  209.         putstr("qed screen editor  version ");
  210.         putstr(VERSION);
  211.         putstr("  MICROLOGY 1983 and JWH 1985");
  212.         gotoxy(17,10);
  213.         putstr("ged 1.05 for Compaq, etc. - Mel Tearle 1986 ");
  214.         gotoxy(17,11);
  215.         putstr("Stack Editor version 1.00 G. Osborn 6-12-90");
  216.         gotoxy(18,13);
  217.         putstr("C Users' Group     Public Domain Software");
  218.         gotoxy(0,21);
  219.         putstr("F1 = help");
  220.  
  221. /* open a file, if it fails then try again to
  222.  * open it using filename plus default extension
  223.  * file handle is in textbuf structure.
  224.  */
  225.         while ( opentext(filename) == FAIL )  {
  226.             askforfile();
  227.             if ( !filename[0] )  goto  newfile;
  228.         }
  229.         lastl = 0;
  230.         goteof = NO;
  231.  
  232.         if ( name[0] )  {
  233.             strcpy(filename,name);
  234.             name[0] = '\0';
  235.         }
  236.     }       /* end - if filename */
  237.  
  238. newfile:
  239.     format( filename );
  240.  
  241.     for ( i = lastl; !(goteof); i += 1 )
  242.         readtext(i);
  243.     fclose(textbuf);
  244.     setstatusname();
  245.     gettext(1, charn);
  246.     if ( initjmp> 2)  {              /* (2-1) is a bad jump from line 1 */
  247.         jumpline(initjmp-cline);    /* not possible to do init jump to 2*/
  248.         initjmp = 0;
  249.     }
  250.     linel = lastl;
  251. }       /* end - initialise()  */
  252.  
  253.  
  254. /* command processor */
  255. edit()
  256. {
  257.     unsigned char inkey();
  258.     unsigned char getkey();
  259.     unsigned char  c;
  260.     unsigned char  oldcrx, inc;
  261.     int   i, j, k, to;
  262.     jmp_buf env;   /* define data storage for setjmp (Microsoft) */
  263.  
  264.     setjmp(env);
  265.  
  266.     putstatusline(linel);  /* show the flie size until editing starts */
  267.     displine = cline;
  268.     blankedmess =  NO;
  269.     calp();  /* initialization call */
  270.     i = displaypos;
  271.     displaypos = NO;
  272.     putpage();
  273.     displaypos = i;
  274.     curson(YES);
  275.     linem1 = 0;
  276.     linem2 = 0;
  277.     linem3 = 0;
  278.     lastc = 0;
  279.  
  280. /* command processing loop */
  281. nextchar:;
  282.     goodline = cline;     /* restore environment */
  283.     c = getkey();
  284.     ncommand++;
  285.     storehist = YES;
  286.  
  287.     switch(c)  {
  288.     case UPPAGE :
  289.     case DOWNPAGE :
  290.         if (c == UPPAGE)
  291.             movepage(-1);
  292.         else
  293.             movepage(0);
  294. /* don't let input buffer overflow if auto repeat used */
  295.         if (chkbuf() > 1)
  296.             inbufp = 1;
  297.         break;
  298.     case DOWNKEY :  /* down one line */
  299.         if (cline == lastl) {
  300.             inject(cline,"");
  301.             calp();  /* lastl has increased */
  302.         }
  303. /* a rewrite can be necessary if the cursor is moved into a marker.
  304.  * Specify a preferred y cursor in that case */
  305.         cursory += 1;
  306.         moveline(1);
  307.         break;
  308.     case UPKEY :
  309.         cursory -= 1;   /* preferred y cursor position */
  310.         moveline(-1);
  311.         break;
  312.     case WINDDOWN :  /* window down one line */
  313.  
  314.         curson(NO);
  315.         if (cursory == topline) {
  316.             moveline(1);
  317.         }
  318.         if (pfirst != lastl) {
  319.             cursory -= 1;
  320.             scrollup(topline);
  321.             i = plast;
  322.             calp();
  323.             if (i != lastl)
  324.                 putline(plast, SHEIGHT, NULL);
  325.             resetpcursor();
  326.         }
  327.         curson(YES);
  328.         break;
  329.  
  330.     case WINDUP : /* window up one line */
  331.  
  332.         curson(NO);
  333.         if (cursory == SHEIGHT || pfirst == 1) {
  334.             moveline(-1);
  335.         }
  336.         if (pfirst != 1) {
  337.             cursory += 1;
  338.             calp();
  339.             scrolldown(topline);
  340.             putline(pfirst, topline, NULL);
  341.             resetpcursor();
  342.         }
  343.         curson(YES);
  344.         break;
  345.  
  346.     case DELLNKEY :       /* delete from cursor to right margin */
  347.         puttext();
  348. /* add an undo step if the deleted line has been altered */
  349.         ncommand++;
  350.         text[charn] = '\0';
  351.         if (charn == 0) {
  352.             linedelete();
  353.         }
  354.         else {
  355.             rewrite(charn);
  356.             altered = YES;
  357.         }
  358.         break;
  359.  
  360.     case BLOCKKEY :
  361.         switch ( to = blockops() )  {
  362.         case YES :
  363.             return;
  364.             break;
  365.         case 'x' :
  366.         case 'q' :
  367.             if ( finish(to) == YES )
  368.                 return;
  369.             break;
  370.         case 'r' :
  371.             putmess(" |F|ile to read? ");
  372.             if ( ( scans( name, FILELEN )) == ESCKEY )  break;
  373.             if ( *(name) )  {
  374.                 readfile( name );
  375.                 putpage();
  376.             }
  377.             break;
  378.         }
  379.         break;
  380.     case QWIKKEY :    /* all 'Q' functions */
  381.         info();
  382.         break;
  383.     case BOLKEY :
  384.         j = offset + (offset>0); /* leftmost visible character */
  385.         if (j == charn)
  386.             sync(j-SWIDTH+1);
  387.         else
  388.             sync(j);
  389.         resetcursor();
  390.         break;
  391.  
  392.     case EOLKEY :
  393.         i = trim(text);          /* line end */
  394.         k = offset + SWIDTH;     /* rightmost visible character */
  395.         if (i > k+1)
  396.             k--;         /* allow for field marker */
  397.  
  398.         j = k;
  399.         if (j == charn || j-1 == charn) {
  400.             j += SWIDTH-1;   /* overflow handled by sync() */
  401.             if (i >= k && i < j && i != charn)
  402.                 j = i;
  403.             sync(j);
  404.         }
  405.         else {
  406.             if ( i < k && charn < i)
  407.                 sync(i);
  408.             else
  409.                 sync(k);
  410.         }
  411.         resetcursor();
  412.         break;
  413.     case HOMEKEY :    /* last line of file */
  414. /* jumpline is prefered to moveline here */
  415.         cursory = SHEIGHT - (SHEIGHT - topline)/4;
  416.         jumpline(lastl-cline);
  417.         break;
  418.     case BOFKEY :     /* first line of file */
  419. /* no choice in cursory */
  420.         jumpline(1-cline);
  421.         break;
  422.     case LEFTKEY :
  423.         movechar(-1);
  424.         break;
  425.     case RIGHTKEY :
  426.         movechar(1);
  427.         break;
  428.     case LEFTWKEY :
  429.         moveword(-1);
  430.         break;
  431.     case RIGHTWKEY :
  432.         moveword(1);
  433.         break;
  434.     case DELLEFT :
  435.         deletechar(-1);
  436.         break;
  437.     case DELRIGHT :
  438.         deletechar(0);
  439.         break;
  440.     case DELWDKEY :
  441.         deleteword();
  442.         break;
  443.     case JUMPKEY :
  444.         dojump();
  445.         break;
  446.     case TOPSCRKEY :
  447.         moveline( (topline-cursory) ); /* no current key assignment */
  448.         break;
  449.     case BOTSCRKEY :
  450.         moveline( (SHEIGHT-cursory) );
  451.         break;
  452.     case REPKEY :
  453.         repeat = YES;
  454.         if (replace)
  455.             dofindrep(MAXINT,findir);
  456.         else
  457.             dofindrep(1,findir);
  458.         repeat = NO;
  459.         break;
  460.     case HELPKEY :
  461.         if ( topline > 1 )  {
  462.             topline = 1;
  463.             unmess();
  464.         }
  465.         else  {
  466.             dohelp();
  467.         }
  468.         break;
  469.     case CR :
  470.         crinsert(0);
  471.         break;
  472.     case CRSTILL :        /* line break */
  473.         crinsert(1);
  474.         break;
  475.     case OOPSKEY :
  476.         undo();
  477.         break;
  478.     case POP :
  479.         pop(0);
  480.         break;
  481.     case CPOP :
  482.         pop(1);
  483.         break;
  484.     case TAB :
  485. /* tab is a cursor positioning command in this version */
  486.         i = tabwidth - (cursorx % tabwidth);   /* 1 <= i <= tabwidth */
  487.         charn += i;
  488.         sync(charn);
  489.         resetcursor();
  490.         break;
  491.  
  492.     case INSKEY :
  493.         charep = 1 - charep;   /* toggle */
  494.         putlineno(cline);   /* show the new header */
  495.         break;
  496.  
  497.     case ESCKEY :
  498.         if ( topline > 1 )
  499.             unmess();
  500.         blankedmess = YES;
  501.         break;
  502.  
  503.     case F1KEY :                     /* help menu */
  504.         if ( topline > 1 )
  505.             unmess();
  506.         else
  507.             dohelp();
  508.         break;
  509.  
  510.     case F6KEY:
  511. /* center window on cursor.  will not move window right if right end of
  512.    all lines already visible */
  513.         cent();
  514.         break;
  515.  
  516.     case F3KEY :
  517.         if (replace)
  518.             dofindrep(-1,-1);
  519.         else
  520.             dofindrep(1,-1);   /* backward ^L.  repeat string search or s & r*/
  521.         break;
  522.  
  523.     case F4KEY :
  524.         if (replace)
  525.             dofindrep(-1,1);
  526.         else
  527.             dofindrep(1,1);    /* forward ^L */
  528.         break;
  529.  
  530.     case F5KEY :
  531.         break;
  532.  
  533.     case F2KEY :
  534.         findorrep(0);   /* start string search.  */
  535.         break;
  536.  
  537.     case F7KEY :   /* options */
  538.         envir();
  539.         break;
  540.  
  541.  
  542.     case F8KEY :    /* disc directory */
  543.         cleareol( 0, 0 );
  544.         putmess( "Enter wildcard filespec, <ret> for all) ");
  545.         c = dirmsk();
  546.         if ( c != ESCKEY  &&  c != YES )  {
  547.             gotoxy( 58, SHEIGHT );
  548.             getkey();
  549.         }
  550.         cleareop(0);
  551.         topline = 1;  /* help off if on */
  552.         putpage();
  553.         putstatusline( cline );
  554.         break;
  555.  
  556.     case F9KEY :   /* exit without saving if no changes */
  557.         puttext();
  558.         finish('q');
  559.         break;
  560.  
  561.     case F10KEY :       /* save and exit. change x to F10KEY for save & */
  562.         puttext();
  563.         finish('x');       /* stay.  that is ok for floppies but not fixed disc */
  564.         break;
  565.  
  566.     default :
  567.         if (charep)
  568.             replchar(c);
  569.         else
  570.             insertchar(c);
  571.         break;
  572.     }
  573.  
  574. /* ensure that all modules maintain the correct vertical window boundary */
  575.     i = pfirst;
  576.     j = plast;
  577.     calp();
  578.     if (i != pfirst || j != plast )
  579.         cerr(1);
  580. /* insure that the status line is current */
  581.     if ( displine != cline || dispcol != cursorx+1 )
  582.         cerr(2);
  583.  
  584. /* End of command character processing.  Tidy up for next input.
  585.  * Don't put up new status line if a command is waiting because it will
  586.  * immediately be replaced.  ^K and ^Q cause excessive flashing in that case.
  587.  */
  588.     if ( blankedmess && (chkbuf() == 0) )
  589.         putstatusline(cline);
  590.     goto nextchar;
  591. }
  592.  
  593.  
  594. /* No to return to current file or don't return,
  595.  * but exit if finished altogther
  596.  * return Yes to edit another file
  597.  */
  598. finish(o)
  599. int o;
  600. {
  601.     int abandon;
  602.     char c, tempname[FILELEN], namebak[FILELEN], *strcpy();
  603.  
  604.     if (altered)
  605.         cerr(3);    /* disc file not updated from RAM */
  606.     c = '\0';
  607.  
  608.     if ( o == F10KEY && !filename[0] )  return  NO;
  609.  
  610.     if ( o != 'x' && o != F10KEY )  {
  611.         if ( o != 'q' || lastc) {
  612.             putmess( "|W|rite edited text to file, |A|bandon all edits, or |<esc>|? " );
  613.             while ( (c = getlow() ) != 'w' && c != 'a' &&  c != ESCKEY);
  614.             if ( c != ESCKEY)
  615.                 putch(c);
  616.             else
  617.                 return  NO;
  618.         }
  619.         abandon = c == 'a';
  620.     }
  621.  
  622.     if ( (c == 'w') || (o == 'x') || (o == F10KEY) )  {
  623.         if ( (!filename[0]) && (o != F10KEY) )  {
  624.             putmess("|F|ile to write to? ");
  625.             if ( ( scans( filename, FILELEN )) == ESCKEY )  return NO;
  626.             format(filename);
  627.             if ( filename[0] <= ' '  ||  (!backup && !exists(filename)) )  {
  628.                 filename[0] == '\0';
  629.                 return  NO;
  630.             }
  631.         }
  632.         if ( backup )  {   /* delete old bak file */
  633.             retag(strcpy(namebak,filename),"BAK");
  634.             if ( checkexists(namebak) )
  635.                 if ( funlink(namebak) == FAIL )  return  NO;
  636.         }
  637. /* keep old name in 'filename' */
  638.         strcpy( tempname, filename );
  639. /* new file called 'filename.@@@ ' - or whatever you like  */
  640.         retag( tempname, "@@@" );
  641.         if ( writefile(1,lastl,tempname,filename ) == FAIL )
  642.             return  NO;
  643. /* check original file still exists -
  644.  * may have been deleted or renamed by user
  645.  */
  646.         if ( checkexists( filename ) )  {
  647.             if ( backup )  {
  648. /* orig. file becomes '.bak' */
  649.                 if ( frename( filename, namebak ) == FAIL )  goto failed;
  650.             }
  651.             else {
  652. /* delete orig file */
  653.                 if ( funlink(filename) == FAIL )  {
  654. failed:             /* if can't delete/rename old file, change
  655.                     * new name to '.@@@'
  656.                     */
  657.                     strcpy( filename, tempname );
  658.                     goto nowrite;
  659.                 }
  660.             }
  661.         }
  662. /* new file goes from '@@@' to orig name */
  663.         frename(tempname,filename);
  664.         lastc = 0;     /* file now not changed */
  665.     }
  666.     if ( o == 'x' || o == F10KEY)  {
  667.         if ( pagefd != NOFILE )  {
  668.             close(pagefd);
  669.             funlink(pagingfile);
  670.         }
  671.         xit();
  672.     };
  673.  
  674. nowrite:
  675.     if ( o == F10KEY )  goto qksave;
  676.     if ( o != 'q' || lastc) {
  677.         putmess("|E|xit to DOS, edit |A|nother file, or |<esc>|? ");
  678.         while ( (c=getlow() ) != 'e' && c != ESCKEY && c != 'a' )
  679.             ;
  680.         if ( c != ESCKEY)
  681.             putch(c);
  682.     }
  683.     else
  684.         c = 'e';
  685.     switch(c) {
  686.     case 'e' :
  687.         if ( lastc )
  688.             if ( !dispose() )  return  NO;
  689. /*      fclose(textbuf);  */
  690.         if ( pagefd != NOFILE ) {
  691.             close(pagefd);
  692.             funlink(pagingfile);
  693.         }
  694.         xit();
  695.     case 'a' :
  696.         if ( lastc )
  697.             if ( !dispose() )  return  NO;
  698. /*      fclose(textbuf);  */
  699.         if ( pagefd != NOFILE )  {
  700.             close(pagefd);
  701.             funlink(pagingfile);
  702.         }
  703.         askforfile();
  704.         return  YES;
  705. qksave:
  706.     case ESCKEY :
  707.         if ( !abandon )  {
  708.             gotoxy( WAITPOS, 0 );
  709.             opentext( filename );
  710.             lastl    = 1;
  711.             goteof   = NO;
  712.             initvm();
  713.             cleareol( 0, 0 );
  714.             gettext( cline, charn);
  715.             putstatusline( cline );
  716.         }
  717.         return  NO;
  718.     }
  719. }
  720.  
  721.  
  722. /* check to dispose of modified file */
  723. dispose()
  724. {
  725.     putmess( "|A|bandon modified file?| (y/n) ");
  726.     if ( getlow() == 'y' )
  727.         return  YES;
  728.     else
  729.         return  NO;
  730. }
  731.  
  732.  
  733. /* quit editor */
  734. xit()
  735. {
  736.     cleareol( 0, 24 );
  737.     gotoxy( 0, 23 );
  738.     curson(YES);
  739.     rax = 0x3301;
  740.     rdx = cbreak;  /* restore ^C to its original state */
  741.     syscall();
  742.     exit( 0 );
  743. }
  744.  
  745.  
  746. /* get another file to edit into 'filename' */
  747. askforfile()
  748. {
  749.     int drive;
  750.  
  751.     cleareop(1);
  752. dirdone:;
  753.     gotoxy(0,1);  /* line 0 may contain an error message here */
  754.     putstr("|<return>| to create a new file\n" );   /* line 2 */
  755.     putstr("|>|        to view directory|\n");      /* line 3 */
  756.     putstr("|d:|       to change default disk\n");  /* line 4 */
  757.     putstr("|<esc>|    to exit\n");                 /* line 5 */
  758.  
  759.     cleareol(0, 6);                                 /* line 6 */
  760.     curson(YES);
  761.     putstr("|File to edit:  " );
  762.  
  763.     if ( scans(filename,FILELEN) == ESCKEY )
  764.         xit();
  765.  
  766.     cleareol(EMPOS,0);
  767.     if ( filename[0] == '>' )  {
  768.         filename[0] = '\0';
  769.         cleareol(0,6);
  770.         putstr( "Enter wildcard filespec, |<ret>| for all " );
  771.         dirmsk();
  772.         goto  dirdone;
  773.     }
  774.  
  775.     if ( strlen(filename) == 2 &&  filename[1] == ':' )  {
  776.         if ( ( drive = toupper( filename[0]) - 'A' ) >= 0 && drive < 26 )  {
  777.             seldisk ( drive );
  778.             curdsk = drive;
  779.             goto dirdone;
  780.         }
  781.     }
  782.     else  {
  783.         name[0] = '\0';
  784.         return  YES;
  785.     }
  786. }
  787.  
  788.  
  789.  
  790. seldisk(drive)
  791. int drive;
  792. {
  793.     rax = 0x0E << 8;
  794.     rdx = drive;
  795.     syscall();  /* no error status returned */
  796.     return 0;
  797. }
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806.