home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 133_01 / e7 < prev    next >
Text File  |  1985-03-10  |  4KB  |  220 lines

  1. /*
  2.     e screen editor
  3.  
  4.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  5.  
  6.     August-December 1981
  7.  
  8.     FILE: e7
  9.  
  10.     FUNCTIONS: getkey,testkey,getlow,testlow,tranchar, tranlow,
  11.             getscankey,inchar,inkey,putret,dispch,putch,
  12.             checkkey,inword,uspr,makedim,makebright,putclr,
  13.             dohelp
  14.  
  15.     PURPOSE: low level terminal i/o functions
  16.  
  17. */
  18.  
  19. #include "e.h"
  20.  
  21. char getkey()    /*wait for a key to be pressed & return it, translating
  22.             to internal codes */
  23. {
  24.     char tranchar(), inchar();
  25.  
  26.     return tranchar(inchar());
  27. }
  28.  
  29. char testkey()    /*if a key has been pressed, return it, else 0, translating*/
  30. {
  31.     char tranchar(), inkey();
  32.  
  33.     return tranchar(inkey());
  34. }
  35.  
  36. char getlow()    /*get a key, converting control and upper case characters
  37.         to lower case */
  38. {
  39.     char tranlow(), inchar();
  40.  
  41.     return tranlow(inchar());
  42. }
  43.  
  44. char testlow()    /*if a key has been pressed, return it, converting control
  45.             and upper case characters to lower case, else 0 */
  46. {
  47.  
  48.     char tranlow(), inkey();
  49.  
  50.     return tranlow(inkey());
  51. }
  52.  
  53. char tranchar(c)    /*translate c to internal codes */
  54. char c;
  55. {
  56.     char *tranp;
  57.     int i;
  58.  
  59.     if (c == 0) return 0;
  60.     if (c == *(tranp=tran)) {
  61.         while (!(c=inkey()));
  62.         c|=PARBIT;
  63.         }
  64.     for (i=1,tranp++; i < NKEYS; i++, tranp++)
  65.         if (c == *tranp) return i;
  66.     return c;
  67. }
  68.  
  69. char tranlow(c)        /*convert upper and control chars in c to lower case*/
  70. {
  71.     if (c == 0) return 0;
  72.     if (tran[ESCKEY] == c) return ESCKEY;
  73.     if (c <= CTRL) c=c+96;
  74.     return tolower(c);
  75. }
  76.  
  77. getscankey()    /*get a key, translation of ESCKEY, CR, LEFTKEY, DELLEFT,
  78.             RETRIEVE only */
  79. {
  80.     char c, inchar();
  81.  
  82.     c=inchar();
  83.     if (tran[ESCKEY] == c) return ESCKEY;
  84.     if (tran[CR] == c) return CR;
  85.     if (tran[LEFTKEY] == c) return LEFTKEY;
  86.     if (tran[DELLEFT] == c) return DELLEFT;
  87.     if (tran[RETRIEVE] == c) return RETRIEVE;
  88.  
  89.     return c;
  90. }
  91.  
  92. char inchar()        /*wait for and return a character */
  93. {
  94.     char c;
  95.  
  96.     if ((c=unbuf())) return c;
  97.     return bios(3) & NOPARITY;
  98. }
  99.  
  100. char inkey()        /*return last key press,or 0 if none; don't wait for
  101.                 a character*/
  102. {
  103.     char c;
  104.  
  105.     if ((c=unbuf())) return c;
  106.     if (bios(2)) return bios(3) & NOPARITY;
  107.     return 0;
  108. }
  109.  
  110. char unbuf()        /*return char from type-ahead buffer, or 0 if none*/
  111. {
  112.     char c;
  113.     sint i;
  114.  
  115.     if (inbufp == 0) return 0;
  116.  
  117.     c=inbuf[0] & NOPARITY;
  118.     inbufp--;
  119.     for (i=0; i < inbufp; i++) inbuf[i]=inbuf[i+1];
  120.     return c;
  121. }
  122.  
  123. putret()    /*type a CR/LF*/
  124. {
  125.     putch('\r');
  126.     putch('\n');
  127. }
  128.  
  129. dispch(c)    /*type a character (in different intensity if non-printable*/
  130. char c;
  131. {
  132.     if (c <= CTRL) {
  133.         makeother();
  134.         putch(c+64);
  135.         makeother();
  136.         }
  137.     else putch(c);
  138. }
  139.  
  140. putch(c)    /*type a character; test for keyboard input*/
  141. char c;
  142. {
  143. #if DEBUGSCR
  144.     if (c <=CTRL) uspr(c+64);
  145.     else
  146. #endif
  147.     bios(4,c & NOPARITY);
  148.     checkkey();
  149. }
  150.  
  151. checkkey()    /*check keyboard for input.  If found, store away in input
  152.           buffer*/
  153. {
  154.     if (bios(2) && inbufp < INBUFLEN) inbuf[inbufp++]= bios(3);
  155. }
  156.  
  157. inword(c)    /*return true if c is letter or digit*/
  158. char c;
  159. {
  160.     return  isalpha(c) || isdigit(c);
  161. }
  162.  
  163. uspr(n)        /*print 'n' as a number; return number of chars typed*/
  164. unsigned n;
  165. {
  166.     int temp;
  167.  
  168.     if (n < 10) {
  169.         putch(n+'0');
  170.         return 1;
  171.         }
  172.     temp=uspr(n/10);
  173.     uspr(n%10);
  174.     return temp+1;
  175. }
  176.  
  177. makedim()
  178. {
  179.     if (!isdim) {
  180.         begdim();
  181.         isdim=YES;
  182.         }
  183. }
  184.  
  185. makebright()
  186. {
  187.     if (isdim) {
  188.         enddim();
  189.         isdim=NO;
  190.         }
  191. }
  192.  
  193. makeother()
  194. {
  195.     if (isdim) makebright();
  196.     else makedim();
  197. }
  198.  
  199. putclr()    /*clear the screen */
  200. {
  201.     delpage(0);
  202. }
  203.  
  204. dohelp()    /*display help menu */
  205. {
  206.     int y;
  207.  
  208.     pfirst=loc(pfirst,(HELPLINES-1));
  209.     topline=HELPLINES;
  210.     for (y=1; y < HELPLINES; y++) deleteline(y);
  211.     if (cline < pfirst || pfirst == lastl) {
  212.         puttext(); 
  213.         putpage(); 
  214.         }
  215.     gotoxy(0,1);
  216.     displayhelp();
  217. }
  218. 
  219.     if (tran[DELLEFT] == c) return DELLEFT;
  220.     if (tran[RETRIEVE] =