home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume36 / formes / part02 / exstr.c < prev    next >
C/C++ Source or Header  |  1993-04-01  |  5KB  |  261 lines

  1.  
  2. /*
  3.  *  Copyright (C) 1992-1993 Jeffrey Chilton
  4.  *
  5.  *  Permission is granted to anyone to make or distribute copies of
  6.  *  this program, in any medium, provided that the copyright notice
  7.  *  and permission notice are preserved, and that the distributor
  8.  *  grants the recipient permission for further redistribution as
  9.  *  permitted by this notice.
  10.  *  
  11.  *  Author's E-mail address:  172-9221@mcimail.com
  12.  *  
  13.  */
  14.  
  15. static char *whatstring = "@(#)exstr.c    2.4 JWC";
  16.  
  17. #include <string.h>
  18. #include <malloc.h>
  19.  
  20. #include "class.h"
  21. #include "exstr.h"
  22.  
  23. /* Special character translation */
  24.  
  25. #define NLETTERS 10
  26. #define NMARKS 5
  27.  
  28. char Letters[NLETTERS + 1] = "ACEIOaceio";
  29. char Marks[NMARKS + 1] = "`'^,~";
  30.  
  31. #if DOS
  32.  
  33. /* IBM/PC (note idiotic display adapter lacks most accented capitals) */
  34.  
  35. unsigned char MarkedLetters[NLETTERS][NMARKS] =
  36. {
  37. /*           `     '     ^     ,     ~   */
  38. /*         ----  ----  ----  ----  ----  */
  39. /* A */     'A',  'A',  'A',    0,    0,
  40. /* C */      0,    0,    0,  0x80,    0,
  41. /* E */     'E', 0x90,  'E',    0,    0,
  42. /* I */     'I',  'I',  'I',    0,  'I',
  43. /* O */     'O',  'O',  'O',    0,    0,
  44. /* a */    0x85, 0xA0, 0x83,    0,    0,
  45. /* c */       0,    0,    0, 0x87,    0,
  46. /* e */    0x8A, 0x82, 0x88,    0,    0,
  47. /* i */    0x8D, 0xA1, 0x8C,    0, 0x8B,
  48. /* o */    0x95, 0xA2, 0x93,    0,    0
  49. };
  50.  
  51. #else
  52.  
  53. /* Sun/SPARC (ANSI standard extended characters) */
  54.  
  55. unsigned char MarkedLetters[NLETTERS][NMARKS] =
  56. {
  57. /*          `    '    ^    ,    ~   */
  58. /*         ---  ---  ---  ---  ---  */
  59. /* A */    192, 193, 194,   0,   0,
  60. /* C */      0,   0,   0, 199,   0,
  61. /* E */    200, 201, 202,   0,   0,
  62. /* I */    204, 205, 206,   0, 207,
  63. /* O */    210, 211, 212,   0,   0,
  64. /* a */    224, 225, 226,   0,   0,
  65. /* c */      0,   0,   0, 231,   0,
  66. /* e */    232, 233, 234,   0,   0,
  67. /* i */    236, 237, 238,   0, 239,
  68. /* o */    242, 243, 244,   0,   0
  69. };
  70.  
  71. #endif
  72.  
  73. /* ExtendString_newFromString - convert from external form */
  74.  
  75. ExtendString *
  76. ExtendString_newFromString(str)
  77. char *str;
  78. {
  79.     register int i, j;
  80.     ExtendString *result;
  81.     ExtendString *dest;
  82.     unsigned char c;
  83.     char *t, *u;
  84.  
  85.     if (str[0] == '\0')
  86.     {
  87.     result = (ExtendString *)"";
  88.     goto out;
  89.     }
  90.  
  91.     result = (ExtendString *)malloc(1 + strlen(str));
  92.  
  93.     dest = result;
  94.     while (*str)
  95.     {
  96.     t = strchr(Letters, *str);
  97.     if (t && *(str + 1))
  98.     {
  99.         u = strchr(Marks, *(str + 1));
  100.         if (u)
  101.         {
  102.         c = MarkedLetters[t - Letters][u - Marks];
  103.         if (c)
  104.         {
  105.             *dest++ = c;
  106.             str += 2;
  107.             continue;
  108.         }
  109.         }
  110.     }
  111.     *dest++ = *str++;
  112.     }
  113.     *dest = '\0';
  114.  
  115. out:
  116.  
  117.     return result;
  118.  
  119. }
  120.  
  121. /* ExtendString_externalFormat - convert to external form */
  122.  
  123. char *
  124. ExtendString_externalFormat(self)
  125. ExtendString *self;
  126. {
  127.     register int i, j;
  128.     int length, found;
  129.     ExtendString *t;
  130.     char *result;
  131.     char *out;
  132.  
  133.     length = 0;
  134.     t = self;
  135.     while (*t)
  136.     {
  137.     found = FALSE;
  138.     for (i = 0; i < NLETTERS; i++)
  139.     {
  140.         for (j = 0; j < NMARKS; j++)
  141.         {
  142.         if (MarkedLetters[i][j] == *t)
  143.         {
  144.             found = TRUE;
  145.             break;
  146.         }
  147.         }
  148.         if (found)
  149.         {
  150.         break;
  151.         }
  152.     }
  153.     length += found ? 2 : 1;
  154.     t++;
  155.     }
  156.  
  157.     result = (char *)malloc(1 + length);
  158.     out = result;
  159.  
  160.     t = self;
  161.     while (*t)
  162.     {
  163.     found = FALSE;
  164.     for (i = 0; i < NLETTERS; i++)
  165.     {
  166.         for (j = 0; j < NMARKS; j++)
  167.         {
  168.         if (MarkedLetters[i][j] == *t)
  169.         {
  170.             t++;
  171.             found = TRUE;
  172.             *out++ = Letters[i];
  173.             *out++ = Marks[j];
  174.             break;
  175.         }
  176.         }
  177.         if (found)
  178.         {
  179.         break;
  180.         }
  181.     }
  182.     if (found)
  183.     {
  184.         continue;
  185.     }
  186.     *out++ = *t++;
  187.     }
  188.     *out = '\0';
  189.  
  190.     return result;
  191.  
  192. }
  193.  
  194. /* ExtendString_compareSansAccent - is external form close enough */
  195.  
  196. int
  197. ExtendString_compareSansAccent(self, str)
  198. ExtendString *self;
  199. char *str;
  200. {
  201.     register int i;
  202.     register int r, c;
  203.     ExtendString *vert;
  204.     int length;
  205.     int found;
  206.     int rc;
  207.  
  208.     rc = strcmp((char *)self, str);
  209.     if (rc == 0)
  210.     {
  211.     goto out;
  212.     }
  213.  
  214.     vert = ExtendString_newFromString(str);
  215.     rc = strcmp((char *)self, (char *)vert);
  216.     ExtendString_destroy(vert);
  217.     if (rc == 0)
  218.     {
  219.     goto out;
  220.     }
  221.  
  222.     length = strlen((char *)self) + 1;
  223.  
  224.     for (i = 0; i < length; i++)
  225.     {
  226.     if (self[i] == str[i])
  227.     {
  228.         continue;
  229.     }
  230.     found = FALSE;
  231.     for (r = 0; r < NLETTERS; r++)
  232.     {
  233.         for (c = 0; c < NMARKS; c++)
  234.         {
  235.         if (MarkedLetters[r][c] == self[i])
  236.         {
  237.             found = TRUE;
  238.             break;
  239.         }
  240.         }
  241.         if (found)
  242.         {
  243.         break;
  244.         }
  245.     }
  246.     if (!found || str[i] != Letters[r])
  247.     {
  248.         rc = 1;
  249.         goto out;
  250.     }
  251.     }
  252.  
  253.     rc = 0;
  254.  
  255. out:
  256.  
  257.     return rc;
  258.  
  259. }
  260.  
  261.