home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d166 / stevie.lha / Stevie / source / amiga.c < prev    next >
C/C++ Source or Header  |  1988-11-22  |  4KB  |  251 lines

  1. /*
  2.  * Amiga system-dependent routines. 
  3.  */
  4.  
  5. #include "stevie.h"
  6.  
  7. long            stdin_file_handle = 0;
  8.  
  9. int
  10. GetCharacter()
  11. {
  12.     char            c;
  13.  
  14.     Read(stdin_file_handle, &c, sizeof(c));
  15.     return ((int) c);
  16. }
  17.  
  18. /*
  19.  * getCSIsequence - get a CSI sequence
  20.  *                - either cursor keys, help, functionkeys, or some
  21.  *                  other sequence (if other, check window size)
  22.  */
  23. int
  24. getCSIsequence()
  25. {
  26.     int             c;
  27.     int             param1;
  28.     int             param2;
  29.  
  30.     c = GetCharacter();
  31.     if (isdigit(c)) {
  32.     param1 = 0;
  33.     while (isdigit(c)) {
  34.         param1 = param1 * 10 + c - '0';
  35.         c = GetCharacter();
  36.     }
  37.     if (c == '~')        /* function key */
  38.         return ((char) (K_F1 + param1));
  39.  
  40.     /* must be an event of some sort or a window bound report */
  41.     if (c == ';') {
  42.         param2 = 0;
  43.         c = GetCharacter();
  44.         while (isdigit(c)) {
  45.         param2 = param2 * 10 + c - '0';
  46.         c = GetCharacter();
  47.         }
  48.         if (c == ';') {
  49.         param1 = 0;
  50.         c = GetCharacter();
  51.         while (isdigit(c)) {
  52.             param1 = param1 * 10 + c - '0';
  53.             c = GetCharacter();
  54.         }
  55.         if (c == ';') {
  56.             param2 = 0;
  57.             c = GetCharacter();
  58.             while (isdigit(c)) {
  59.             param2 = param2 * 10 + c - '0';
  60.             c = GetCharacter();
  61.             }
  62.             if (c == ' ') {
  63.             c = GetCharacter();
  64.             if (c == 'r') {
  65.                 if (param1 < 2)
  66.                 param1 = 2;
  67.                 if (param2 < 5)
  68.                 param2 = 5;
  69.                 if (Columns != param2 || Rows != param1) {
  70.                 Columns = param2;
  71.                 Rows = param1;
  72.                 P(P_LI) = Rows;
  73.                 return (-1);
  74.                 } else
  75.                 return 0;
  76.             }
  77.             }
  78.         }
  79.         }
  80.     }
  81.     while ((c != '|') && (c != '~'))
  82.         c = GetCharacter();
  83.  
  84.     outstr("\033[0 q");
  85.     fflush(stdout); /* flush out the window size request */
  86.     return 0;
  87.     }
  88.     switch (c) {
  89.       case 'A':        /* cursor up */
  90.     return K_UARROW;
  91.       case 'B':        /* cursor down */
  92.     return K_DARROW;
  93.       case 'C':        /* cursor right */
  94.     return K_RARROW;
  95.       case 'D':        /* cursor left */
  96.     return K_LARROW;
  97.       case 'T':        /* shift cursor up */
  98.     return K_SUARROW;
  99.       case 'S':        /* shift cursor down */
  100.     return K_SDARROW;
  101.       case ' ':        /* shift cursor left or right */
  102.     c = GetCharacter();
  103.     if (c == 'A')        /* shift cursor left */
  104.         return K_SLARROW;
  105.     if (c == '@')        /* shift cursor right */
  106.         return K_SRARROW;
  107.     break;
  108.       case '?':        /* help */
  109.     c = GetCharacter();
  110.     if (c == '~')
  111.         return K_HELP;
  112.     break;
  113.     }
  114.     return 0;            /* some other control code */
  115. }
  116.  
  117. /*
  118.  * inchar() - get a character from the keyboard 
  119.  */
  120. char
  121. inchar()
  122. {
  123.     int             c;
  124.  
  125.     fflush(stdout); /* flush any pending output */
  126.  
  127.     for (;;) {
  128.     c = GetCharacter();
  129.     if (c != 0x9b)
  130.         break;
  131.     c = getCSIsequence();
  132.     if (c > 0)
  133.         break;
  134.     if (c == -1) {
  135.         screenalloc();
  136.         screenclear();
  137.         updateNextscreen();
  138.         updateRealscreen();
  139.         msg("");
  140.         cursupdate();
  141.         windgoto(Cursrow, Curscol);
  142.         fflush(stdout);
  143.     }
  144.     }
  145.     return (char) c;
  146. }
  147.  
  148. void
  149. outstr(s)
  150.     char           *s;
  151. {
  152.     while (*s)
  153.     outchar(*s++);
  154. }
  155.  
  156. void
  157. beep()
  158. {
  159.     if (RedrawingDisabled)
  160.     return;
  161.  
  162.     outchar('\007');
  163. }
  164.  
  165. void
  166. sleep(n)
  167.     int             n;
  168. {
  169.     void            Delay();
  170.  
  171.     if (n > 0)
  172.     Delay(50L * n);
  173. }
  174.  
  175. void
  176. delay()
  177. {
  178.     void            Delay();
  179.  
  180.     Delay(25L);
  181. }
  182.  
  183. void
  184. windinit()
  185. {
  186.     stdin_file_handle = Input();
  187.     if (!IsInteractive(stdin_file_handle)) {
  188.     fprintf(stderr, "stdin is not interactive ?!?!?!?");
  189.     exit(2);
  190.     }
  191.  
  192.     Columns = 80;
  193.     P(P_LI) = Rows = 24;
  194.     if (raw(stdin) != 0)
  195.     perror("raw");
  196.  
  197.     outstr("\033[12{");        /* window resize events activated */
  198.     outstr("\033[0 q");        /* get window size */
  199.     fflush(stdout);
  200.  
  201.     for (;;) {
  202.     if (GetCharacter() == 0x9b)
  203.         if (getCSIsequence() == -1)
  204.         break;
  205.     }
  206. }
  207.  
  208. void
  209. windexit(r)
  210.     int             r;
  211. {
  212.     outstr("\033[12}");        /* window resize events de-activated */
  213.     fflush(stdout);         /* flush any pending output */
  214.  
  215.  
  216.     if (cooked(stdin) != 0)
  217.     perror("cooked");
  218.     exit(r);
  219. }
  220.  
  221. void
  222. windgoto(r, c)
  223.     int             c;
  224.     int             r;
  225. {
  226.     r++;
  227.     c++;
  228.  
  229.     outstr("\033[");
  230.     if (r >= 10)
  231.     outchar((char) (r / 10 + '0'));
  232.     outchar((char) (r % 10 + '0'));
  233.     outchar(';');
  234.     if (c >= 10)
  235.     outchar((char) (c / 10 + '0'));
  236.     outchar((char) (c % 10 + '0'));
  237.     outchar('H');
  238. }
  239.  
  240. FILE           *
  241. fopenb(fname, mode)
  242.     char           *fname;
  243.     char           *mode;
  244. {
  245.     FILE           *fopen();
  246.     char            modestr[16];
  247.  
  248.     sprintf(modestr, "%sb", mode);
  249.     return fopen(fname, modestr);
  250. }
  251.