home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 208_01 / e7.c < prev    next >
Text File  |  1987-10-13  |  4KB  |  195 lines

  1. /*
  2. HEADER:        CUG208;
  3. TITLE:        'e' for CP/M68K
  4. VERSION:    1.48+
  5.  
  6. DESCRIPTION:    "a screen editor";
  7.  
  8. KEYWORDS:    editor;
  9. SYSTEM:        CP/M68K, V1.2;
  10. FILENAME:    e/e7.c
  11. WARNINGS:    "the default value is for systems with 128K bytes
  12.          of memory or more";
  13. SEE-ALSO:    cpm68k.c, e68k.doc, CUG VOL 133;
  14. AUTHORS:    G.N.Gilbert('e'), J.W.Haefner(for DeSmet C on MSDOS and UNIX)
  15. CODER:        Yoshimasa Tsuji
  16. COMPILERS:    DRI C(Alcyon C) for CP/M68K;
  17. */
  18. /*
  19.     FUNCTIONS: getkey,testkey,getlow,testlow,tranchar, tranlow,
  20.             getscankey,inchar,inkey,putret,dispch,putch,
  21.             checkkey,inword,uspr, dohelp
  22.     PURPOSE: low level terminal i/o functions
  23. */
  24.  
  25. #include "e.h"
  26.  
  27. getkey()    /*wait for a key to be pressed & return it, translating
  28.             to internal codes */
  29. {
  30.     return tranchar(inchar());
  31. }
  32.  
  33. testkey()    /*if a key has been pressed, return it, else 0, translating*/
  34. {
  35.     return tranchar(inkey());
  36. }
  37.  
  38.  
  39. getlow()    /*get a key, converting control and upper case characters
  40.         to lower case */
  41. {
  42.  
  43.     return tranlow(inchar());
  44. }
  45.  
  46. testlow()    /*if a key has been pressed, return it, converting control
  47.             and upper case characters to lower case, else 0 */
  48. {
  49.     return tranlow(inkey());
  50. }
  51.  
  52. tranchar(c)    /*translate c to internal codes */
  53. char c;
  54. {
  55.     register char *tranp;
  56.     register int i;
  57.  
  58.     if (c == 0) return 0;
  59.     if (c == *(tranp=tran)) {
  60.         while (!(c=inkey()));
  61.         c|=PARBIT;
  62.     }
  63.     for (i=1; i < NKEYS; i++)
  64.         if (c == *++tranp) return i;
  65.     return c;
  66. }
  67.  
  68. tranlow(c)        /*convert upper and control chars in c to lower case*/
  69. {
  70.     if (c == 0) return 0;
  71.     if (tran[ESCKEY] == c) return ESCKEY;
  72.     if (c <= CTRL) c=c+96;
  73.     return tolower(c);
  74. }
  75.  
  76. getscankey()    /*get a key, translation of ESCKEY, CR, LEFTKEY, DELLEFT,
  77.             RETRIEVE only */
  78. {
  79.     register int c;
  80.  
  81.     c=inchar();
  82.     if (tran[ESCKEY] == c) return ESCKEY;
  83.     if (tran[CR] == c) return CR;
  84.     if (tran[LEFTKEY] == c) return LEFTKEY;
  85.     if (tran[DELLEFT] == c) return DELLEFT;
  86.     if (tran[RETRIEVE] == c) return RETRIEVE;
  87.  
  88.     return c;
  89. }
  90.  
  91. inchar()        /*wait for and return a character */
  92. {
  93.     register int c;
  94.  
  95.     if (c=unbuf()) return c;
  96.     return _conin() & NOPARITY;
  97. }
  98.  
  99. inkey()        /*return last key press,or 0 if none; don't wait for
  100.                 a character*/
  101. {
  102.     register int c;
  103.  
  104.     if (c=unbuf()) return c;
  105.     if (_inkey()) return _conin() & NOPARITY;
  106.     return 0;
  107. }
  108.  
  109. unbuf()        /*return char from type-ahead buffer, or 0 if none*/
  110. {
  111.     register int c,i;
  112.  
  113.     if (inbufp == 0) return 0;
  114.  
  115.     c=inbuf[0] & NOPARITY;
  116.     inbufp--;
  117.     for (i=0; i < inbufp; i++) inbuf[i]=inbuf[i+1];
  118.     return c;
  119. }
  120.  
  121. putret()    /*type a CR/LF*/
  122. {
  123.     putch('\n');
  124. }
  125.  
  126. dispch(c)    /*type a character (in different intensity if non-printable*/
  127. {
  128.     if (c <= CTRL) {
  129.         makeother();
  130.         putch(c+64);
  131.         makeother();
  132.     }
  133.     else putch(c);
  134. }
  135.  
  136. putch(c)    /*type a character; test for keyboard input*/
  137. {
  138.     _conout(c & NOPARITY);
  139.     checkkey();
  140. }
  141.  
  142. checkkey()    /*check keyboard for input.  If found, store away in input
  143.           buffer*/
  144. {
  145.     if (_inkey() && inbufp < INBUFLEN) inbuf[inbufp++]= _conin();
  146. }
  147.  
  148. inword(c)    /*return true if c is part of a token */
  149. {
  150.     return  isalnum(c)|| c == '_' ;
  151. }
  152.  
  153. uspr(n)        /*print 'n' as a number; return number of chars typed*/
  154. {
  155.     int temp;
  156.  
  157.     if (n < 10) {
  158.         putch(n+'0');
  159.         return 1;
  160.     }
  161.     temp=uspr(n/10);
  162.     uspr(n%10);
  163.     return temp+1;
  164. }
  165.  
  166.  
  167. makeother()
  168. {
  169.     if (isdim) standend();
  170.     else standout();
  171. }
  172.  
  173.  
  174. dohelp()    /*display help menu */
  175. {
  176.     int y;
  177.  
  178.     pfirst=loc(pfirst,(HELPLINES-1));
  179.     topline=HELPLINES;
  180.     for (y=1; y < HELPLINES; y++) deleteline(0, y);
  181.     if (cline < pfirst || pfirst == lastl) {
  182.         puttext();
  183.         putpage();
  184.     }
  185.     gotoxy(0,1);
  186.     help();
  187. }
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.