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

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