home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / editors / mutt / me2s_pl7.zoo / mu_edit2 / util / char.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-05  |  8.9 KB  |  182 lines

  1. static char rcsid[] = "$Id: char.c,v 1.1 1992/09/06 19:31:32 mike Exp $";
  2.  
  3. /* $Log: char.c,v $
  4.  * Revision 1.1  1992/09/06  19:31:32  mike
  5.  * Initial revision
  6.  *
  7.  */
  8.  
  9. /*
  10.  * Array used by char.h plus some character routines
  11.  * C Durland    Public Domain
  12.  */
  13.  
  14. #include "char.h"
  15.  
  16. toupper(c) register unsigned char c; { return (int)TOUPPER(c); }
  17. tolower(c) register unsigned char c; { return (int)TOLOWER(c); }
  18.  
  19. unsigned char _cinfo[256] =    /* info about a character */
  20. {
  21. /* 0        1        2        3        4        5        6        7 */
  22. /* 8        9        A        B        C        D        E        F */
  23.   _C,      _C,      _C,      _C,      _C,      _C,      _C,      _C,    /* 0*/
  24.   _C,      _C|_S,   _C|_S,   _C|_S,   _C|_S,   _C|_S,   _C,      _C,    /* 8*/
  25.   _C,      _C,      _C,      _C,      _C,      _C,      _C,      _C,    /*10*/
  26.   _C,      _C,      _C,      _C,      _C,      _C,      _C,      _C,    /*18*/
  27.   _S,      _P,      _P,      _P,      _P|_W,   _P,      _P,      _P|_W, /*20*/
  28.   _P,      _P,      _P,      _P,      _P,      _P,      _P,      _P,    /*28*/
  29.   _N|_W,   _N|_W,   _N|_W,   _N|_W,   _N|_W,   _N|_W,   _N|_W,   _N|_W, /*30*/
  30.   _N|_W,   _N|_W,   _P,      _P,      _P,      _P,      _P,      _P,    /*38*/
  31.   _P,      _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W, /*40*/
  32.   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W, /*48*/
  33.   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W,   _U|_W, /*50*/
  34.   _U|_W,   _U|_W,   _U|_W,   _P,      _P,      _P,      _P,      _P|_W,    /*58*/
  35.   _P,      _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W, /*60*/
  36.   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W, /*68*/
  37.   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W,   _L|_W, /*70*/
  38.   _L|_W,   _L|_W,   _L|_W,   _P,      _P,      _P,      _P,      _C,    /*78*/
  39.  
  40.     /* 80 and above is user responsiblity */
  41. };
  42.  
  43. #ifdef CHAR_MAPS
  44.  
  45. unsigned char _cmap[256];    /* character map */
  46.  
  47. void fix_cmap(case_fold)
  48. {
  49.   register int c;
  50.  
  51.   for (c = 255; c--; ) _cmap[c] = case_fold ? toupper(c) : c;
  52. }
  53.  
  54. unsigned char _lcmap[256] =    /* convert character to lower case map */
  55. {
  56. /* 0        1        2        3        4        5        6        7 */
  57. /* 8        9        A        B        C        D        E        F */
  58.   0x00,    0x01,    0x02,    0x03,   0x04,    0x05,    0x06,     0x07,    /* 0*/
  59.   0x08,    0x09,    0x0A,    0x0B,   0x0C,    0x0D,    0x0E,     0x0F,    /* 8*/
  60.   0x10,    0x11,    0x12,    0x13,   0x14,    0x15,    0x16,     0x17,  /*10*/
  61.   0x18,    0x19,    0x1A,    0x1B,   0x1C,    0x1D,    0x1E,     0x1F,  /*18*/
  62.   ' ',     0x21,    0x22,    0x23,   0x24,    0x25,    0x26,     0x27,  /*20*/
  63.   0x28,    0x29,    0x2A,    0x2B,   0x2C,    0x2D,    0x2E,     0x2F,  /*28*/
  64.   '0',     '1',     '2',     '3',    '4',     '5',     '6',      '7',    /*30*/
  65.   '8',     '9',     0x3A,    0x3B,   0x3C,    0x3D,    0x3E,     0x3F,    /*38*/
  66.   0x40,    'a',     'b',     'c',    'd',     'e',     'f',      'g',   /*40*/
  67.   'h',     'i',     'j',     'k',    'l',     'm',     'n',      'o',   /*48*/
  68.   'p',     'q',     'r',     's',    't',     'u',     'v',      'w',   /*50*/
  69.   'x',     'y',     'z',     0x5B,   0x5C,    0x5D,    0x5E,     0x5F,    /*58*/
  70.   0x60,    'a',     'b',     'c',    'd',     'e',     'f',      'g',   /*60*/
  71.   'h',     'i',     'j',     'k',    'l',     'm',     'n',      'o',   /*68*/
  72.   'p',     'q',     'r',     's',    't',     'u',     'v',      'w',   /*70*/
  73.   'x',     'y',     'z',     0x7B,   0x7C,    0x7D,    0x7E,     0x7F,  /*78*/
  74.   0x80,    0x81,    0x82,    0x83,   0x84,    0x85,    0x86,     0x87,  /*80*/
  75.   0x88,    0x89,    0x8A,    0x8B,   0x8C,    0x8D,    0x8E,     0x8F,  /*88*/
  76.   0x90,    0x91,    0x92,    0x93,   0x94,    0x95,    0x96,     0x97,  /*90*/
  77.   0x98,    0x99,    0x9A,    0x9B,   0x9C,    0x9D,    0x9E,     0x9F,  /*98*/
  78.   0xA0,    0xA1,    0xA2,    0xA3,   0xA4,    0xA5,    0xA6,     0xA7,  /*A0*/
  79.   0xA8,    0xA9,    0xAA,    0xAB,   0xAC,    0xAD,    0xAE,     0xAF,  /*A8*/
  80.   0xB0,    0xB1,    0xB2,    0xB3,   0xB4,    0xB5,    0xB6,     0xB7,  /*B0*/
  81.   0xB8,    0xB9,    0xBA,    0xBB,   0xBC,    0xBD,    0xBE,     0xBF,  /*B8*/
  82.   0xC0,    0xC1,    0xC2,    0xC3,   0xC4,    0xC5,    0xC6,     0xC7,  /*C0*/
  83.   0xC8,    0xC9,    0xCA,    0xCB,   0xCC,    0xCD,    0xCE,     0xCF,  /*C8*/
  84.   0xD0,    0xD1,    0xD2,    0xD3,   0xD4,    0xD5,    0xD6,     0xD7,  /*D0*/
  85.   0xD8,    0xD9,    0xDA,    0xDB,   0xDC,    0xDD,    0xDE,     0xDF,  /*D8*/
  86.   0xE0,    0xE1,    0xE2,    0xE3,   0xE4,    0xE5,    0xE6,     0xE7,  /*E0*/
  87.   0xE8,    0xE9,    0xEA,    0xEB,   0xEC,    0xED,    0xEE,     0xEF,  /*E8*/
  88.   0xF0,    0xF1,    0xF2,    0xF3,   0xF4,    0xF5,    0xF6,     0xF7,  /*F0*/
  89.   0xF8,    0xF9,    0xFA,    0xFB,   0xFC,    0xFD,    0xFE,     0xFF,  /*F8*/
  90. };
  91.  
  92. unsigned char _ucmap[256] =    /* convert character to upper case map */
  93. {
  94. /* 0        1        2        3        4        5        6        7 */
  95. /* 8        9        A        B        C        D        E        F */
  96.   0x00,    0x01,    0x02,    0x03,   0x04,    0x05,    0x06,     0x07,    /* 0*/
  97.   0x08,    0x09,    0x0A,    0x0B,   0x0C,    0x0D,    0x0E,     0x0F,    /* 8*/
  98.   0x10,    0x11,    0x12,    0x13,   0x14,    0x15,    0x16,     0x17,  /*10*/
  99.   0x18,    0x19,    0x1A,    0x1B,   0x1C,    0x1D,    0x1E,     0x1F,  /*18*/
  100.   ' ',     0x21,    0x22,    0x23,   0x24,    0x25,    0x26,     0x27,  /*20*/
  101.   0x28,    0x29,    0x2A,    0x2B,   0x2C,    0x2D,    0x2E,     0x2F,  /*28*/
  102.   '0',     '1',     '2',     '3',    '4',     '5',     '6',      '7',    /*30*/
  103.   '8',     '9',     0x3A,    0x3B,   0x3C,    0x3D,    0x3E,     0x3F,    /*38*/
  104.   0x40,    'A',     'B',     'C',    'D',     'E',     'F',      'G',   /*40*/
  105.   'H',     'I',     'J',     'K',    'L',     'M',     'N',      'O',   /*48*/
  106.   'P',     'Q',     'R',     'S',    'T',     'U',     'V',      'W',   /*50*/
  107.   'X',     'Y',     'Z',     0x5B,   0x5C,    0x5D,    0x5E,     0x5F,    /*58*/
  108.   0x60,    'A',     'B',     'C',    'D',     'E',     'F',      'G',   /*60*/
  109.   'H',     'I',     'J',     'K',    'L',     'M',     'N',      'O',   /*68*/
  110.   'P',     'Q',     'R',     'S',    'T',     'U',     'V',      'W',   /*70*/
  111.   'X',     'Y',     'Z',     0x7B,   0x7C,    0x7D,    0x7E,     0x7F,  /*78*/
  112.   0x80,    0x81,    0x82,    0x83,   0x84,    0x85,    0x86,     0x87,  /*80*/
  113.   0x88,    0x89,    0x8A,    0x8B,   0x8C,    0x8D,    0x8E,     0x8F,  /*88*/
  114.   0x90,    0x91,    0x92,    0x93,   0x94,    0x95,    0x96,     0x97,  /*90*/
  115.   0x98,    0x99,    0x9A,    0x9B,   0x9C,    0x9D,    0x9E,     0x9F,  /*98*/
  116.   0xA0,    0xA1,    0xA2,    0xA3,   0xA4,    0xA5,    0xA6,     0xA7,  /*A0*/
  117.   0xA8,    0xA9,    0xAA,    0xAB,   0xAC,    0xAD,    0xAE,     0xAF,  /*A8*/
  118.   0xB0,    0xB1,    0xB2,    0xB3,   0xB4,    0xB5,    0xB6,     0xB7,  /*B0*/
  119.   0xB8,    0xB9,    0xBA,    0xBB,   0xBC,    0xBD,    0xBE,     0xBF,  /*B8*/
  120.   0xC0,    0xC1,    0xC2,    0xC3,   0xC4,    0xC5,    0xC6,     0xC7,  /*C0*/
  121.   0xC8,    0xC9,    0xCA,    0xCB,   0xCC,    0xCD,    0xCE,     0xCF,  /*C8*/
  122.   0xD0,    0xD1,    0xD2,    0xD3,   0xD4,    0xD5,    0xD6,     0xD7,  /*D0*/
  123.   0xD8,    0xD9,    0xDA,    0xDB,   0xDC,    0xDD,    0xDE,     0xDF,  /*D8*/
  124.   0xE0,    0xE1,    0xE2,    0xE3,   0xE4,    0xE5,    0xE6,     0xE7,  /*E0*/
  125.   0xE8,    0xE9,    0xEA,    0xEB,   0xEC,    0xED,    0xEE,     0xEF,  /*E8*/
  126.   0xF0,    0xF1,    0xF2,    0xF3,   0xF4,    0xF5,    0xF6,     0xF7,  /*F0*/
  127.   0xF8,    0xF9,    0xFA,    0xFB,   0xFC,    0xFD,    0xFE,     0xFF,  /*F8*/
  128. };
  129.  
  130. unsigned char _lcmap[256], _lcmap[256];        /* case folding maps */
  131.  
  132. void init_cmaps(case_fold)
  133. {
  134.   register int c, C;
  135.  
  136.   for (c = 255; c--; ) _lcmap[c] = _ucmap[c] = c;
  137. mod_cmaps("FaAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ");
  138. for (C = 'A'; C<='Z'; C++)
  139. { c = C | ' '; set_toupper(c,C); set_tolower(C,c); }
  140.   fix_cmap(case_fold);
  141. }
  142.  
  143.     /* modify the info and case folding maps
  144.      * format:
  145.      *   W<letters> : letters are NOT part of words.
  146.      *   w<letters> : letters are part of words.
  147.      *   l<aAbB...> : lowercasing A returns a.
  148.      *   u<aAbB...> : uppercasing a returns A.
  149.      *   f<aAbB...> : same as u<aAbB...> l<aAbB...>.
  150.      */
  151. mod_cmaps(ptr) register unsigned char *ptr;
  152. {
  153.   register int n = strlen(ptr) -1, x, c, C, z;
  154.  
  155.   switch(*ptr++)
  156.   {
  157.     case 'W': x = _W; z = 0; break;
  158.     case 'w': x = _W; z = 1; break;
  159.     case 'u': x = _U; z = 2; break;
  160.     case 'l': x = _L; z = 2; break;
  161.     case 'f': x = _U | _L; z = 2; break;
  162.     default: return FALSE;
  163.   }
  164.   switch (z)
  165.   {
  166.     case 0: while (n--) remove_cinfo(*ptr++,x); break;
  167.     case 1: while (n--)    add_cinfo(*ptr++,x); break;
  168.     case 2:
  169.       n /= 2;
  170.       while (n--)
  171.       {
  172.     c = *ptr++; C = *ptr++;
  173.     if (x&_U) { set_toupper(c,C); add_cinfo(c,_L); }
  174.     if (x&_L) { set_tolower(c,C); add_cinfo(C,_U); }
  175.       }
  176.       break;
  177.   }
  178.   return TRUE;
  179. }
  180.  
  181. #endif
  182.