home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / me34src.zip / me3 / util / char.c < prev    next >
C/C++ Source or Header  |  1995-01-14  |  9KB  |  174 lines

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