home *** CD-ROM | disk | FTP | other *** search
/ Photo CD Demo 1 / Demo.bin / gle / gle / unixinke.c < prev    next >
C/C++ Source or Header  |  1992-11-29  |  4KB  |  247 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #ifdef ultrix
  6. #include <cursesX.h>
  7. #else
  8. #include <curses.h>
  9. #endif
  10. #include "edt.h"
  11. #define true (!false)
  12. #define false 0
  13.  
  14. #ifdef NOKEYPAD
  15. #include "nofnkeys.h"
  16. #endif
  17.  
  18. int fner(char *s);
  19. int scr_refresh(void);
  20. int scr_getch(void);
  21. char *function_bar()
  22. {
  23.   static int ab;
  24.   if (ab==0) ab=1;
  25.   ab = 3-ab;
  26.   if (ab==1) {
  27.     return "F11-Help F12-Save F13-Load F14-Saveas F9-Graphmenu F10-Drawit ^x=Exit";
  28.       } else {
  29.     return "^F 1 =Help, ^F 2 = Save, ^F 3 = Load,      ^F 9 Graphmenu ^F 0 Drawit";
  30.       }
  31. }
  32.  
  33. struct escape_struct {char *str; int val;};
  34.  
  35. struct escape_struct gold[] = {
  36.         "v",     epaste,
  37.         "R",    esearch,
  38.         "S",    eundeleol,
  39.         NULL,    };
  40.  
  41. struct escape_struct eseq[] = {
  42.         "4~",     eselect,
  43.         "1~",    esearch,
  44.         "2~",    epaste,
  45.         "3~",    ecut,
  46.         "4~",    eselect,
  47.         "5~",    epageup,
  48.         "6~",    epagedown,
  49.         "A",    eup,
  50.         "B",    edown,
  51.         "C",    eright,
  52.         "D",    eleft,
  53.         "20~",    egraphmenu,
  54.         "21~",    edrawit,
  55.         "23~",    ehelp,
  56.         "24~",    esave,
  57.         "25~",    eload,
  58.         "26~",    esaveas,
  59.         "P",    egold,
  60.         "Q",    ehelp,
  61.         "R",    efindnext,
  62.         "S",    edeleol,
  63.         "n",    eselect,
  64.         "v",    ecut,
  65.         "l",    edelright,
  66.         NULL,    };
  67.  
  68. int gold_fn[] = {
  69.     edrawit,ehelp,esave,eload,esaveas,eshowerror,0,0,0,egraphmenu,edrawit
  70. };
  71. struct keymatch {int m; int val;};
  72. /* Normal key and ^ commands  commands */
  73. struct keymatch kmatch2[] = {
  74.     13, ereturn,
  75.     3, equit,
  76.     4, eword,
  77.     5, eedt,
  78.     6, efast,
  79.     7, edrawit,
  80.     8, edelete,
  81.     18, eshowerror,
  82.     8, ehelp,
  83.     20, etrace,
  84.     12, efindnext,
  85.     21, eundelline,
  86.     24, eescape,
  87.     25, edelline,
  88.     26, eescape,
  89.     27, eescape,
  90.     127, edelete,
  91.     0,0
  92. };
  93. struct keymatch kmatchx[] = {
  94.     KEY_DOWN, edown,
  95.     KEY_UP, eup,
  96.     KEY_F0+4, edeleol,
  97.     KEY_LEFT, eleft,
  98.     KEY_RIGHT, eright,
  99.     KEY_NPAGE, epagedown,
  100.     KEY_PPAGE, epageup,
  101.     0,0
  102. };
  103. /* Control K commands */
  104. struct keymatch kmatch3[] = {
  105.     'b', eselect,
  106.     'v', emove,
  107.     'k', emark,
  108.     'c', ecopy,
  109.     'y', ecut,
  110.     'u', epaste,
  111.     'p', epaste,
  112.     'r', eblockread,
  113.     'w', eblockwrite,
  114.     'm', egraphmenu,
  115.     'l', eload,
  116.     'd', edrawit,
  117.     's', esave,
  118.     'x', equit,
  119.     0,0
  120. };
  121. /* Control Q commands */
  122. struct keymatch kmatch4[] = {
  123.     'f', esearch,
  124.     'c', eendoffile,
  125.     'r', etopoffile,
  126.     0,0
  127. };
  128. extern int noscreenio;
  129. tt_inkey()
  130. {
  131.     int i;
  132.     if (noscreenio) return getc(stdin);
  133.     else {
  134.         i = getch();
  135.             /* printw("{%d} ",i); */
  136.         return i;
  137.     }
  138. }
  139. text_inkey()
  140. {
  141.     int cc,i,c1,c2;
  142.  
  143.     scr_refresh();
  144.  
  145. loop1:    cc = tt_inkey();
  146.     c2 = cc;
  147.     if (c2==6) return do_fnkey();
  148.     if (c2==KEY_F(1)) return do_gold();
  149.     if (cc>KEY_BREAK) {
  150.         for (i=0;kmatchx[i].m!=0;i++)
  151.         if (kmatchx[i].m==c2) return kmatchx[i].val;
  152.     }
  153.     switch(c2) {
  154.       default:
  155.         for (i=0;kmatch2[i].m!=0;i++)
  156.         if (kmatch2[i].m==c2) return kmatch2[i].val;
  157.         break;
  158.       case 27:
  159.         c2 = tt_inkey(); /* throw away next char (unless escape) */
  160.         if (c2==27) return eescape;
  161.       case -101:
  162.       case -113:
  163.         c2 = escape_seq();
  164.         if (c2==egold)     return do_gold();
  165.         return c2;
  166.         break;
  167.       case 17:
  168.         fner("^Q  F=Find string,  R=Top of file");
  169.         cc = tt_inkey();
  170.         c2 = (cc & 0xff);
  171.         if (c2<32) c2 = c2 + 'a' - 1;
  172.         c2 = tolower(c2);
  173.         for (i=0;kmatch4[i].m!=0;i++)
  174.         if (kmatch4[i].m==c2) return kmatch4[i].val;
  175.         fner("Unrecognized Quick movement command");
  176.         goto loop1;
  177.       case 11:
  178.         fner("^K  B=begin block,  P=Paste,  (use KP6 for Cut),  K=End block");
  179.         cc = tt_inkey();
  180.         c2 = (cc & 0xff);
  181.         if (c2<32) c2 = c2 + 'a' - 1;
  182.         c2 = tolower(c2);
  183.         for (i=0;kmatch3[i].m!=0;i++)
  184.         if (kmatch3[i].m==c2) return kmatch3[i].val;
  185.         fner("Unrecognized block command");
  186.         goto loop1;
  187.     }
  188.     return c2;
  189. }
  190. escape_seq()
  191. {
  192.     int cc,i;
  193.     unsigned char esq[10];
  194.     char *s;
  195.  
  196.     s = &esq[0];
  197.     *s++ = cc = tt_inkey();
  198.     while (cc<65) *s++ = cc = tt_inkey();
  199.     *s++ = 0;
  200.     for (i=0;eseq[i].str!=NULL;i++)
  201.         if (strcmp(eseq[i].str,esq)==0) break;
  202.     if (eseq[i].str!=NULL)
  203.         return eseq[i].val;
  204.     else
  205.         return 0;
  206.  
  207. }
  208. escape_seq_gold()
  209. {
  210.     int cc,i;
  211.     unsigned char esq[10];
  212.     char *s;
  213.  
  214.     s = &esq[0];
  215.     *s++ = cc = tt_inkey();
  216.     while (cc<65) *s++ = cc = tt_inkey();
  217.     *s++ = 0;
  218.     for (i=0;gold[i].str!=NULL;i++)
  219.         if (strcmp(gold[i].str,esq)==0) break;
  220.     if (gold[i].str!=NULL)
  221.         return gold[i].val;
  222.     else
  223.         return 0;
  224.  
  225. }
  226. do_fnkey()
  227. {
  228.   int c2;
  229.   fner("1=Help 2=Save 3=Load 4=Saveas 9=Graph_menu     0=Drawit");
  230.   c2 = tt_inkey();
  231.   if  (isdigit(c2)) {
  232.            return gold_fn[c2-'0'];
  233.   }
  234. }
  235. do_gold()
  236. {
  237.     int c2;
  238.     c2 = tt_inkey();
  239.     if (c2==KEY_F(4)) return eundeleol;
  240.     if (c2==27) {
  241.         tt_inkey();
  242.         return escape_seq_gold();
  243.     } else if (isdigit(c2)) {
  244.         return gold_fn[c2-'0'];
  245.     }
  246. }
  247.