home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / mint / mint095s / console.c < prev    next >
C/C++ Source or Header  |  1993-08-03  |  4KB  |  264 lines

  1. /*
  2. Copyright 1990,1991 Eric R. Smith. All rights reserved.
  3. */
  4.  
  5. /* MiNT routines for doing console I/O */
  6.  
  7. #include "mint.h"
  8.  
  9. /*
  10.  * These routines are what Cconout, Cauxout, etc. ultimately call.
  11.  * They take an integer argument which is the user's file handle,
  12.  * and do the translation to a file ptr (and return an appropriate error
  13.  * message if necessary.
  14.  * "mode" may be RAW, COOKED, ECHO, or COOKED|ECHO.
  15.  * note that the user may call them directly via Finstat(), Foutstat(),
  16.  * Fgetchar(), and Fputchar()
  17.  */
  18.  
  19. long
  20. file_instat(h)
  21.     int h;
  22. {
  23.     FILEPTR *f;
  24.     long r;
  25.     PROC *proc;
  26.     int fh = h;
  27.  
  28. #if O_GLOBAL
  29.     if (fh >= 100) {
  30.         proc = rootproc;
  31.         fh -= 100;
  32.     } else
  33. #endif
  34.         proc = curproc;
  35.  
  36.     if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
  37.         DEBUG("Finstat: bad handle %d", h);
  38.         return EIHNDL;
  39.     }
  40.     r = 1;        /* default is to assume input waiting (e.g. TOS files)*/
  41.     (void)(*f->dev->ioctl)(f, FIONREAD, &r);
  42.  
  43.     return r;
  44. }
  45.  
  46. long
  47. file_outstat(h)
  48.     int h;
  49. {
  50.     FILEPTR *f;
  51.     long r;
  52.     int fh = h;
  53.     PROC *proc;
  54. #if O_GLOBAL
  55.     if (fh >= 100) {
  56.         fh -= 100;
  57.         proc = rootproc;
  58.     } else
  59. #endif
  60.         proc = curproc;
  61.  
  62.     if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
  63.         DEBUG("Foutstat: bad handle %d", h);
  64.         return EIHNDL;
  65.     }
  66.     r = 1;        /* default is to assume output OK (e.g. TOS files) */
  67.     (void)(*f->dev->ioctl)(f, FIONWRITE, &r);
  68.     return r;
  69. }
  70.  
  71. long
  72. file_getchar(h, mode)
  73.     int h, mode;
  74. {
  75.     FILEPTR *f;
  76.     char c;
  77.     long r;
  78.     int fh = h;
  79.     PROC *proc;
  80.  
  81. #if O_GLOBAL
  82.     if (fh >= 100) {
  83.         fh -= 100;
  84.         proc = rootproc;
  85.     } else
  86. #endif
  87.         proc = curproc;
  88.     if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
  89.         DEBUG("Fgetchar: bad handle %d", h);
  90.         return EIHNDL;
  91.     }
  92.     if (is_terminal(f)) {
  93.         return tty_getchar(f, mode);
  94.     }
  95.     r = (*f->dev->read)(f, &c, 1L);
  96.     if (r != 1)
  97.         return MiNTEOF;
  98.     else
  99.         return ((long)c) & 0xff;
  100. }
  101.  
  102. long
  103. file_putchar(h, c, mode)
  104.     int h;
  105.     long c;
  106.     int mode;
  107. {
  108.     FILEPTR *f;
  109.     char ch;
  110.     int fh = h;
  111.     PROC *proc;
  112.  
  113. #if O_GLOBAL
  114.     if (fh >= 100) {
  115.         fh -= 100;
  116.         proc = rootproc;
  117.     } else
  118. #endif
  119.         proc = curproc;
  120.  
  121.     if (fh < MIN_HANDLE || fh >=MAX_OPEN || !(f = proc->handle[fh])) {
  122.         DEBUG("Fputchar: bad handle %d", h);
  123.         return EIHNDL;
  124.     }
  125.     if (is_terminal(f)) {
  126.         return tty_putchar(f, c & 0x7fffffffL, mode);
  127.     }
  128.     ch = c & 0x00ff;
  129.     return (*f->dev->write)(f, &ch, 1L);
  130. }
  131.  
  132. /*
  133.  * OK, here are the GEMDOS console I/O routines
  134.  */
  135.  
  136. long
  137. c_conin()
  138. {
  139.     return file_getchar(0, COOKED|ECHO);
  140. }
  141.  
  142. long
  143. c_conout(c)
  144.     int c;
  145. {
  146.     return file_putchar(1, (long)c, COOKED);
  147. }
  148.  
  149. long
  150. c_auxin()
  151. {
  152.     return file_getchar(2, RAW);
  153. }
  154.  
  155. long
  156. c_auxout(c)
  157.     int c;
  158. {
  159.     return file_putchar(2, (long)c, RAW);
  160. }
  161.  
  162. long
  163. c_prnout(c)
  164.     int c;
  165. {
  166.     return file_putchar(3, (long)c, RAW);
  167. }
  168.  
  169. long
  170. c_rawio(c)
  171.     int c;
  172. {
  173.     long r;
  174.  
  175.     if (c == 0x00ff) {
  176.         if (!file_instat(0))
  177.             return 0;
  178.         r = file_getchar(0, RAW);
  179.         if (r <= 0)
  180.             return 0;
  181.         return r;
  182.     }
  183.     else
  184.         return file_putchar(1, (long)c, RAW);
  185. }
  186.  
  187. long
  188. c_rawcin()
  189. {
  190.     return file_getchar(0, RAW);
  191. }
  192.  
  193. long
  194. c_necin()
  195. {
  196.     return file_getchar(0,COOKED|NOECHO);
  197. }
  198.  
  199. long
  200. c_conws(str)
  201.     const char *str;
  202. {
  203.     const char *p = str;
  204.     long cnt = 0;
  205.  
  206.     while (*p++) cnt++;
  207.     return f_write(1, cnt, str);
  208. }
  209.  
  210. long
  211. c_conrs(buf)
  212.     char *buf;
  213. {
  214.     long size, r;
  215.     char *s;
  216.  
  217.     size = ((long)*buf) & 0xff;
  218.     r = f_read(0, size, buf+2);
  219.     if (r < 0) {
  220.         buf[1] = 0;
  221.         return r;
  222.     }
  223. /* if reading from a file, stop at first CR or LF encountered */
  224.     s = buf+2;
  225.     size = 0;
  226.     while(r-- > 0) {
  227.         if (*s == '\r' || *s == '\n')
  228.             break;
  229.         s++; size++;
  230.     }
  231.     buf[1] = (char)size;
  232.     return 0;
  233. }
  234.  
  235. long
  236. c_conis()
  237. {
  238.     return -(!!file_instat(0));
  239. }
  240.  
  241. long
  242. c_conos()
  243. {
  244.     return -(!!file_outstat(1));
  245. }
  246.  
  247. long
  248. c_prnos()
  249. {
  250.     return -(!!file_outstat(3));
  251. }
  252.  
  253. long
  254. c_auxis()
  255. {
  256.     return -(!!file_instat(2));
  257. }
  258.  
  259. long
  260. c_auxos()
  261. {
  262.     return -(!!file_outstat(2));
  263. }
  264.