home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / util / vim-2.0.lha / Vim-2.0 / src / digraph.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-15  |  7.7 KB  |  346 lines

  1. /* vi:ts=4:sw=4
  2.  *
  3.  * VIM - Vi IMproved
  4.  *
  5.  * Code Contributions By:    Bram Moolenaar            mool@oce.nl
  6.  *                            Tim Thompson            twitch!tjt
  7.  *                            Tony Andrews            onecom!wldrdg!tony 
  8.  *                            G. R. (Fred) Walter        watmath!watcgl!grwalter 
  9.  */
  10.  
  11. #ifdef DIGRAPHS
  12. /*
  13.  * digraph.c: code for digraphs
  14.  */
  15.  
  16. #include "vim.h"
  17. #include "globals.h"
  18. #include "proto.h"
  19. #include "param.h"
  20.  
  21. static void printdigraph __ARGS((u_char *));
  22.  
  23. u_char    (*digraphnew)[3];            /* pointer to added digraphs */
  24. int        digraphcount = 0;            /* number of added digraphs */
  25.  
  26. #ifdef MSDOS
  27. u_char    digraphdefault[][3] =         /* standard MSDOS digraphs */
  28.        {{'C', ',', 128},    /* € */
  29.         {'u', '"', 129},    /*  */
  30.         {'e', '\'', 130},    /* ‚ */
  31.         {'a', '^', 131},    /* ƒ */
  32.         {'a', '"', 132},    /* „ */
  33.         {'a', '`', 133},    /* … */
  34.         {'a', '@', 134},    /* † */
  35.         {'c', ',', 135},    /* ~G (SAS C can't handle the real char) */
  36.         {'e', '^', 136},    /* ~H (SAS C can't handle the real char) */
  37.         {'e', '"', 137},    /* ‰ */
  38.         {'e', '`', 138},    /* Š */
  39.         {'i', '"', 139},    /* ‹ */
  40.         {'i', '^', 140},    /* Œ */
  41.         {'i', '`', 141},    /*  */
  42.         {'A', '"', 142},    /* Ž */
  43.         {'A', '@', 143},    /*  */
  44.         {'E', '\'', 144},    /*  */
  45.         {'a', 'e', 145},    /* ‘ */
  46.         {'A', 'E', 146},    /* ’ */
  47.         {'o', '^', 147},    /* “ */
  48.         {'o', '"', 148},    /* ” */
  49.         {'o', '`', 149},    /* • */
  50.         {'u', '^', 150},    /* – */
  51.         {'u', '`', 151},    /* — */
  52.         {'y', '"', 152},    /* ˜ */
  53.         {'O', '"', 153},    /* ™ */
  54.         {'U', '"', 154},    /* š */
  55.         {'c', '|', 155},    /* › */
  56.         {'$', '$', 156},    /* œ */
  57.         {'Y', '-', 157},    /* ~] (SAS C can't handle the real char) */
  58.         {'P', 't', 158},    /* ž */
  59.         {'f', 'f', 159},    /* Ÿ */
  60.         {'a', '\'', 160},    /*   */
  61.         {'i', '\'', 161},    /* ¡ */
  62.         {'o', '\'', 162},    /* ¢ */
  63.         {'u', '\'', 163},    /* xx (SAS C can't handle the real char) */
  64.         {'n', '~', 164},    /* ¤ */
  65.         {'N', '~', 165},    /* ¥ */
  66.         {'a', 'a', 166},    /* ¦ */
  67.         {'o', 'o', 167},    /* § */
  68.         {'~', '?', 168},    /* ¨ */
  69.         {'-', 'a', 169},    /* © */
  70.         {'a', '-', 170},    /* ª */
  71.         {'1', '2', 171},    /* « */
  72.         {'1', '4', 172},    /* ¬ */
  73.         {'~', '!', 173},    /* ­ */
  74.         {'<', '<', 174},    /* ® */
  75.         {'>', '>', 175},    /* ¯ */
  76.  
  77.         {'s', 's', 225},    /* á */
  78.         {'j', 'u', 230},    /* æ */
  79.         {'o', '/', 237},    /* í */
  80.         {'+', '-', 241},    /* ñ */
  81.         {'>', '=', 242},    /* ò */
  82.         {'<', '=', 243},    /* ó */
  83.         {':', '-', 246},    /* ö */
  84.         {'~', '~', 247},    /* ÷ */
  85.         {'~', 'o', 248},    /* ø */
  86.         {'2', '2', 253},    /* ý */
  87.         {NUL, NUL, NUL}
  88.         };
  89.  
  90. #else    /* MSDOS */
  91.  
  92. u_char    digraphdefault[][3] =         /* standard ISO digraphs */
  93.        {{'~', '!', 161},    /* ¡ */
  94.         {'c', '|', 162},    /* ¢ */
  95.         {'$', '$', 163},    /* £ */
  96.         {'o', 'x', 164},    /* ¤ */
  97.         {'Y', '-', 165},    /* ¥ */
  98.         {'|', '|', 166},    /* ¦ */
  99.         {'p', 'a', 167},    /* § */
  100.         {'"', '"', 168},    /* ¨ */
  101.         {'c', 'O', 169},    /* © */
  102.         {'a', '-', 170},    /* ª */
  103.         {'<', '<', 171},    /* « */
  104.         {'-', ',', 172},    /* ¬ */
  105.         {'-', '-', 173},    /* ­ */
  106.         {'r', 'O', 174},    /* ® */
  107.         {'-', '=', 175},    /* ¯ */
  108.         {'~', 'o', 176},    /* ° */
  109.         {'+', '-', 177},    /* ± */
  110.         {'2', '2', 178},    /* ² */
  111.         {'3', '3', 179},    /* ³ */
  112.         {'\'', '\'', 180},    /* ´ */
  113.         {'j', 'u', 181},    /* µ */
  114.         {'p', 'p', 182},    /* ¶ */
  115.         {'~', '.', 183},    /* · */
  116.         {',', ',', 184},    /* ¸ */
  117.         {'1', '1', 185},    /* ¹ */
  118.         {'o', '-', 186},    /* º */
  119.         {'>', '>', 187},    /* » */
  120.         {'1', '4', 188},    /* ¼ */
  121.         {'1', '2', 189},    /* ½ */
  122.         {'3', '4', 190},    /* ¾ */
  123.         {'~', '?', 191},    /* ¿ */
  124.         {'A', '`', 192},    /* À */
  125.         {'A', '\'', 193},    /* Á */
  126.         {'A', '^', 194},    /* Â */
  127.         {'A', '~', 195},    /* Ã */
  128.         {'A', '"', 196},    /* Ä */
  129.         {'A', '@', 197},    /* Å */
  130.         {'A', 'E', 198},    /* Æ */
  131.         {'C', ',', 199},    /* Ç */
  132.         {'E', '`', 200},    /* È */
  133.         {'E', '\'', 201},    /* É */
  134.         {'E', '^', 202},    /* Ê */
  135.         {'E', '"', 203},    /* Ë */
  136.         {'I', '`', 204},    /* Ì */
  137.         {'I', '\'', 205},    /* Í */
  138.         {'I', '^', 206},    /* Î */
  139.         {'I', '"', 207},    /* Ï */
  140.         {'D', '-', 208},    /* Ð */
  141.         {'N', '~', 209},    /* Ñ */
  142.         {'O', '`', 210},    /* Ò */
  143.         {'O', '\'', 211},    /* Ó */
  144.         {'O', '^', 212},    /* Ô */
  145.         {'O', '~', 213},    /* Õ */
  146.         {'O', '"', 214},    /* Ö */
  147.         {'/', '\\', 215},    /* × */
  148.         {'O', '/', 216},    /* Ø */
  149.         {'U', '`', 217},    /* Ù */
  150.         {'U', '\'', 218},    /* Ú */
  151.         {'U', '^', 219},    /* Û */
  152.         {'U', '"', 220},    /* Ü */
  153.         {'Y', '\'', 221},    /* Ý */
  154.         {'I', 'p', 222},    /* Þ */
  155.         {'s', 's', 223},    /* ß */
  156.         {'a', '`', 224},    /* à */
  157.         {'a', '\'', 225},    /* á */
  158.         {'a', '^', 226},    /* â */
  159.         {'a', '~', 227},    /* ã */
  160.         {'a', '"', 228},    /* ä */
  161.         {'a', '@', 229},    /* å */
  162.         {'a', 'e', 230},    /* æ */
  163.         {'c', ',', 231},    /* ç */
  164.         {'e', '`', 232},    /* è */
  165.         {'e', '\'', 233},    /* é */
  166.         {'e', '^', 234},    /* ê */
  167.         {'e', '"', 235},    /* ë */
  168.         {'i', '`', 236},    /* ì */
  169.         {'i', '\'', 237},    /* í */
  170.         {'i', '^', 238},    /* î */
  171.         {'i', '"', 239},    /* ï */
  172.         {'d', '-', 240},    /* ð */
  173.         {'n', '~', 241},    /* ñ */
  174.         {'o', '`', 242},    /* ò */
  175.         {'o', '\'', 243},    /* ó */
  176.         {'o', '^', 244},    /* ô */
  177.         {'o', '~', 245},    /* õ */
  178.         {'o', '"', 246},    /* ö */
  179.         {':', '-', 247},    /* ÷ */
  180.         {'o', '/', 248},    /* ø */
  181.         {'u', '`', 249},    /* ù */
  182.         {'u', '\'', 250},    /* ú */
  183.         {'u', '^', 251},    /* û */
  184.         {'u', '"', 252},    /* ü */
  185.         {'y', '\'', 253},    /* ý */
  186.         {'i', 'p', 254},    /* þ */
  187.         {'y', '"', 255},    /* ÿ */
  188.         {NUL, NUL, NUL}
  189.         };
  190. #endif    /* MSDOS */
  191.  
  192. /*
  193.  * handle digraphs after typing a character
  194.  */
  195.     int
  196. dodigraph(c)
  197.     int        c;
  198. {
  199.     static int    backspaced;        /* character before BS */
  200.     static int    lastchar;        /* last typed character */
  201.  
  202.     if (c == -1)        /* init values */
  203.     {
  204.         backspaced = -1;
  205.     }
  206.     else if (p_dg)
  207.     {
  208.         if (backspaced >= 0)
  209.             c = getdigraph(backspaced, c);
  210.         backspaced = -1;
  211.         if (c == BS && lastchar >= 0)
  212.             backspaced = lastchar;
  213.     }
  214.     lastchar = c;
  215.     return c;
  216. }
  217.  
  218. /*
  219.  * lookup the pair char1, char2 in the digraph tables
  220.  * if no match, return char2
  221.  */
  222.     int
  223. getdigraph(char1, char2)
  224.     int    char1;
  225.     int    char2;
  226. {
  227.     int        i;
  228.     int        retval;
  229.  
  230.     retval = 0;
  231.     for (i = 0; ; ++i)            /* search added digraphs first */
  232.     {
  233.         if (i == digraphcount)    /* end of added table, search defaults */
  234.         {
  235.             for (i = 0; digraphdefault[i][0] != 0; ++i)
  236.                 if (digraphdefault[i][0] == char1 && digraphdefault[i][1] == char2)
  237.                 {
  238.                     retval = digraphdefault[i][2];
  239.                     break;
  240.                 }
  241.             break;
  242.         }
  243.         if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  244.         {
  245.             retval = digraphnew[i][2];
  246.             break;
  247.         }
  248.     }
  249.  
  250.     if (retval == 0)    /* digraph deleted or not found */
  251.         return char2;
  252.     return retval;
  253. }
  254.  
  255. /*
  256.  * put the digraphs in the argument string in the digraph table
  257.  * format: {c1}{c2} char {c1}{c2} char ...
  258.  */
  259.     void
  260. putdigraph(str)
  261.     char *str;
  262. {
  263.     int        char1, char2, n;
  264.     u_char    (*newtab)[3];
  265.     int        i;
  266.  
  267.     while (*str)
  268.     {
  269.         skipspace(&str);
  270.         char1 = *str++;
  271.         char2 = *str++;
  272.         if (char1 == 0 || char2 == 0)
  273.             return;
  274.         skipspace(&str);
  275.         if (!isdigit(*str))
  276.         {
  277.             emsg(e_number);
  278.             return;
  279.         }
  280.         n = getdigits(&str);
  281.         if (digraphnew)        /* search the table for existing entry */
  282.         {
  283.             for (i = 0; i < digraphcount; ++i)
  284.                 if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  285.                 {
  286.                     digraphnew[i][2] = n;
  287.                     break;
  288.                 }
  289.             if (i < digraphcount)
  290.                 continue;
  291.         }
  292.         newtab = (u_char (*)[3])alloc(digraphcount * 3 + 3);
  293.         if (newtab)
  294.         {
  295.             memmove((char *)newtab, (char *)digraphnew, (size_t)(digraphcount * 3));
  296.             free(digraphnew);
  297.             digraphnew = newtab;
  298.             digraphnew[digraphcount][0] = char1;
  299.             digraphnew[digraphcount][1] = char2;
  300.             digraphnew[digraphcount][2] = n;
  301.             ++digraphcount;
  302.         }
  303.     }
  304. }
  305.  
  306.     void
  307. listdigraphs()
  308. {
  309.     int        i;
  310.  
  311.     printdigraph(NULL);
  312.     for (i = 0; digraphdefault[i][0]; ++i)
  313.         if (getdigraph(digraphdefault[i][0], digraphdefault[i][1]) == digraphdefault[i][2])
  314.             printdigraph(digraphdefault[i]);
  315.     for (i = 0; i < digraphcount; ++i)
  316.         printdigraph(digraphnew[i]);
  317.     outchar('\n');
  318.     wait_return(TRUE);
  319. }
  320.  
  321.     static void
  322. printdigraph(p)
  323.     u_char *p;
  324. {
  325.     char        buf[9];
  326.     static int    len;
  327.  
  328.     if (p == NULL)
  329.         len = 0;
  330.     else if (p[2] != 0)
  331.     {
  332.         if (len > Columns - 11)
  333.         {
  334.             outchar('\n');
  335.             len = 0;
  336.         }
  337.         if (len)
  338.             outstrn("   ");
  339.         sprintf(buf, "%c%c %c %3d", p[0], p[1], p[2], p[2]);
  340.         outstrn(buf);
  341.         len += 11;
  342.     }
  343. }
  344.  
  345. #endif /* DIGRAPHS */
  346.