home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume3 / nethack2.2 / part18 / pctty.c < prev    next >
C/C++ Source or Header  |  1987-12-05  |  6KB  |  292 lines

  1. /*    SCCS Id: @(#)pctty.c    2.1    87/11/09
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* tty.c - (PC) version */
  4.  
  5. /* With thanks to the people who sent code for SYSV - hpscdi!jon,
  6.  * arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others.
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include "hack.h"
  11. #include "func_tab.h"
  12.  
  13. static char erase_char, kill_char;
  14.  
  15. /*
  16.  * Get initial state of terminal, set ospeed (for termcap routines)
  17.  * and switch off tab expansion if necessary.
  18.  * Called by startup() in termcap.c and after returning from ! or ^Z
  19.  */
  20. gettty(){
  21.     erase_char = '\b';
  22.     kill_char = 21;        /* cntl-U */
  23.     flags.cbreak = TRUE;
  24. #ifdef DGK
  25.     disable_ctrlP();    /* turn off ^P processing */
  26. #endif
  27. }
  28.  
  29. /* reset terminal to original state */
  30. settty(s) char *s; {
  31.     end_screen();
  32.     if(s) printf(s);
  33.     (void) fflush(stdout);
  34. #ifdef DGK
  35.     enable_ctrlP();        /* turn on ^P processing */
  36. #endif
  37. }
  38.  
  39.  
  40. /* fatal error */
  41. /*VARARGS1*/
  42. error(s,x,y) char *s; {
  43.     end_screen();
  44.     putchar('\n');
  45.     printf(s,x,y);
  46.     putchar('\n');
  47.     exit(1);
  48. }
  49.  
  50. /*
  51.  * Read a line closed with '\n' into the array char bufp[BUFSZ].
  52.  * (The '\n' is not stored. The string is closed with a '\0'.)
  53.  * Reading can be interrupted by an escape ('\033') - now the
  54.  * resulting string is "\033".
  55.  */
  56. getlin(bufp)
  57. register char *bufp;
  58. {
  59.     register char *obufp = bufp;
  60.     register int c;
  61.  
  62.     flags.toplin = 2;        /* nonempty, no --More-- required */
  63.     for(;;) {
  64.         (void) fflush(stdout);
  65.         if((c = getchar()) == EOF) {
  66.             *bufp = 0;
  67.             return;
  68.         }
  69.         if(c == '\033') {
  70.             *obufp = c;
  71.             obufp[1] = 0;
  72.             return;
  73.         }
  74.         if(c == erase_char || c == '\b') {
  75.             if(bufp != obufp) {
  76.                 bufp--;
  77.                 putstr("\b \b"); /* putsym converts \b */
  78.             } else    bell();
  79.         } else if(c == '\n') {
  80.             *bufp = 0;
  81.             return;
  82.         } else if(' ' <= c && c < '\177') {
  83.                 /* avoid isprint() - some people don't have it
  84.                    ' ' is not always a printing char */
  85.             *bufp = c;
  86.             bufp[1] = 0;
  87.             putstr(bufp);
  88.             if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
  89.                 bufp++;
  90.         } else if(c == kill_char || c == '\177') { /* Robert Viduya */
  91.                 /* this test last - @ might be the kill_char */
  92.             while(bufp != obufp) {
  93.                 bufp--;
  94.                 putstr("\b \b");
  95.             }
  96.         } else
  97.             bell();
  98.     }
  99. }
  100.  
  101. getret() {
  102.     cgetret("");
  103. }
  104.  
  105. cgetret(s)
  106. register char *s;
  107. {
  108.     putsym('\n');
  109.     if(flags.standout)
  110.         standoutbeg();
  111.     putstr("Hit ");
  112.     putstr(flags.cbreak ? "space" : "return");
  113.     putstr(" to continue: ");
  114.     if(flags.standout)
  115.         standoutend();
  116.     xwaitforspace(s);
  117. }
  118.  
  119. char morc;    /* tell the outside world what char he used */
  120.  
  121. xwaitforspace(s)
  122. register char *s;    /* chars allowed besides space or return */
  123. {
  124. register int c;
  125.  
  126.     morc = 0;
  127.     while((c = readchar()) != '\n') {
  128.         if(flags.cbreak) {
  129.         if(c == ' ') break;
  130.         if(s && index(s,c)) {
  131.             morc = c;
  132.             break;
  133.         }
  134.         bell();
  135.         }
  136.     }
  137. }
  138.  
  139. static int last_multi;
  140.  
  141. char *
  142. parse()
  143. {
  144.     static char inline[COLNO];
  145.     register foo;
  146.  
  147.     flags.move = 1;
  148.     if(!Invisible) curs_on_u(); else home();
  149.     multi = 0;
  150. #ifdef DGK
  151.     while((foo = readchar()) >= '0' && foo <= '9') {
  152.         multi = 10*multi+foo-'0';
  153.         if (multi < 0 || multi > LARGEST_INT)
  154.             multi = LARGEST_INT;
  155.         if (multi > 9) {
  156.             remember_topl();
  157.             home();
  158.             cl_end();
  159.             printf("Count: %d", multi);
  160.         }
  161.         last_multi = multi;
  162.     }
  163. # ifdef REDO
  164.     if (foo == DOAGAIN || in_doagain)
  165.         multi = last_multi;
  166.     else {
  167.         savech(0);    /* reset input queue */
  168.         savech(foo);
  169.     }
  170. # endif
  171.  
  172. #else /* DGK */
  173.  
  174.     while((foo = readchar()) >= '0' && foo <= '9')
  175.         multi = 10*multi+foo-'0';
  176.  
  177. #endif /* DGK */
  178.  
  179.     if(multi) {
  180.         multi--;
  181.         save_cm = inline;
  182.     }
  183.     inline[0] = foo;
  184.     inline[1] = 0;
  185.     if(foo == 'g' || foo == 'G'){
  186.         inline[1] = getchar();
  187. #ifdef REDO
  188.         savech(inline[1]);
  189. #endif
  190.         inline[2] = 0;
  191.     }
  192.     if(foo == 'm' || foo == 'M'){
  193.         inline[1] = getchar();
  194. #ifdef REDO
  195.         savech(inline[1]);
  196. #endif
  197.         inline[2] = 0;
  198.     }
  199.     clrlin();
  200.     return(inline);
  201. }
  202.  
  203. char
  204. readchar() {
  205.     register int sym;
  206.  
  207.     (void) fflush(stdout);
  208.     sym = getchar();
  209.     if(flags.toplin == 1)
  210.         flags.toplin = 2;
  211.     return((char) sym);
  212. }
  213. #ifdef COM_COMPL
  214. /* Read in an extended command - doing command line completion for
  215.  * when enough character have been entered to make a unique command.
  216.  * This is just a modified getlin().   -jsb
  217.  */
  218. get_ext_cmd(bufp)
  219. register char *bufp;
  220. {
  221.     register char *obufp = bufp;
  222.     register int c;
  223.     int com_index, index;
  224.  
  225.     flags.toplin = 2;        /* nonempty, no --More-- required */
  226.  
  227.     for(;;) {
  228.         (void) fflush(stdout);
  229.         if((c = readchar()) == EOF) {
  230.             *bufp = 0;
  231.             return;
  232.         }
  233.         if(c == '\033') {
  234.             *obufp = c;
  235.             obufp[1] = 0;
  236.             return;
  237.         }
  238.         if(c == erase_char || c == '\b') {
  239.             if(bufp != obufp) {
  240.                 bufp--;
  241.                 putstr("\b \b"); /* putsym converts \b */
  242.             } else    bell();
  243.         } else if(c == '\n') {
  244.             *bufp = 0;
  245.             return;
  246.         } else if(' ' <= c && c < '\177') {
  247.                 /* avoid isprint() - some people don't have it
  248.                    ' ' is not always a printing char */
  249.             *bufp = c;
  250.             bufp[1] = 0;
  251.             index = 0;
  252.             com_index = -1;
  253.  
  254.             while(extcmdlist[index].ef_txt != (char *) 0){
  255.                 if(!strncmp(obufp, extcmdlist[index].ef_txt,
  256.                 strlen(obufp)))
  257.                     if(com_index == -1) /* No matches yet*/
  258.                         com_index = index;
  259.                     else /* More than 1 match */
  260.                         com_index = -2;
  261.                 index++;
  262.             }
  263.             if(com_index >= 0){
  264.                 strcpy(obufp,
  265.                 extcmdlist[com_index].ef_txt);
  266.                 /* finish print our string */
  267.                 putstr(bufp);
  268.                 bufp = obufp; /* reset it */
  269.                 if(strlen(obufp) < BUFSIZ-1 &&
  270.                  strlen(obufp) < COLNO)
  271.                     /* set bufp at the end of our
  272.                      * string
  273.                      */
  274.                     bufp += strlen(obufp);
  275.             } else {
  276.                 putstr(bufp);
  277.                 if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
  278.                     bufp++;
  279.             }
  280.         } else if(c == kill_char || c == '\177') { /* Robert Viduya */
  281.                 /* this test last - @ might be the kill_char */
  282.             while(bufp != obufp) {
  283.                 bufp--;
  284.                 putstr("\b \b");
  285.             }
  286.         } else
  287.             bell();
  288.     }
  289.  
  290. }
  291. #endif COM_COMPL
  292.