do_ctype.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* Prints case-convert and sort-convert tabell on stdout. This is used to
  14.    make _ctype.c easyer */
  15. #ifdef DBUG_OFF
  16. #undef DBUG_OFF
  17. #endif
  18. #include <my_global.h>
  19. #include <ctype.h>
  20. #include <my_sys.h>
  21. #include "m_string.h"
  22. uchar NEAR to_upper[256];
  23. uchar NEAR to_lower[256],NEAR sort_order[256];
  24. static int ascii_output=1;
  25. static string tab_names[]={ "to_lower[]={","to_upper[]={","sort_order[]={" };
  26. static uchar* tabell[]= {to_lower,to_upper,sort_order};
  27. void get_options(),init_case_convert();
  28. main(argc,argv)
  29. int argc;
  30. char *argv[];
  31. {
  32.   int i,j,ch;
  33.   DBUG_ENTER ("main");
  34.   DBUG_PROCESS (argv[0]);
  35.   get_options(&argc,&argv);
  36.   init_case_convert();
  37.   puts("Tabells for caseconverts and sorttest of charactersn");
  38.   for (i=0 ; i < 3 ; i++)
  39.   {
  40.     printf("uchar NEAR %sn",tab_names[i]);
  41.     for (j=0 ; j <= 255 ; j++)
  42.     {
  43.       ch=(int) tabell[i][j];
  44.       if (ascii_output && isprint(ch) && ! (ch & 128))
  45.       {
  46. if (strchr("\'",(char) ch))
  47.   printf("'\%c',  ",ch);
  48. else
  49.   printf("'%c',   ",ch);
  50.       }
  51.       else
  52. printf("'\%03o',",ch);
  53.       if ((j+1 & 7) == 0)
  54. puts("");
  55.     }
  56.     puts("};n");
  57.   }
  58.   DBUG_RETURN(0);
  59. } /* main */
  60. /* Read options */
  61. void get_options(argc,argv)
  62. register int *argc;
  63. register char **argv[];
  64. {
  65.   int help,version;
  66.   char *pos,*progname;
  67.   progname= (*argv)[0];
  68.   help=0; ascii_output=1;
  69.   while (--*argc >0 && *(pos = *(++*argv)) == '-' )
  70.   {
  71.     while (*++pos)
  72.     {
  73.       version=0;
  74.       switch(*pos) {
  75.       case 'n': /* Numeric output */
  76. ascii_output=0;
  77. break;
  78.       case '#':
  79. DBUG_PUSH (++pos);
  80.       *(pos--) = ''; /* Skippa argument */
  81.       break;
  82.       case 'V':
  83. version=1;
  84.       case 'I':
  85.       case '?':
  86. printf("%s  Ver 1.0n",progname);
  87. if (version)
  88.   break;
  89. puts("Output tabells of to_lower[], to_upper[] and sortorder[]n");
  90. printf("Usage: %s [-n?I]n",progname);
  91. puts("Options: -? or -I "Info" -n "numeric output"");
  92. break;
  93.       default:
  94. fprintf(stderr,"illegal option: -%cn",*pos);
  95. break;
  96.       }
  97.     }
  98.   }
  99.   return;
  100. } /* get_options */
  101. /* set up max character for which isupper() and toupper() gives */
  102. /* right answer. Is usually 127 or 255 */
  103. #ifdef USE_INTERNAL_CTYPE
  104. #define MAX_CHAR_OK CHAR_MAX /* All chars is right */
  105. #else
  106. #define MAX_CHAR_OK 127 /* 7 Bit ascii */
  107. #endif
  108. /* Initiate arrays for case-conversation */
  109. void init_case_convert()
  110. {
  111.   reg1 int16 i;
  112.   reg2 uchar *higher_pos,*lower_pos;
  113.   DBUG_ENTER("init_case_convert");
  114.   for (i=0 ; i <= MAX_CHAR_OK ; i++)
  115.   {
  116.     to_upper[i]= sort_order[i]= (islower(i) ? toupper(i) : (char) i);
  117.     to_lower[i]=  (isupper(i) ? tolower(i) : (char) i);
  118.   }
  119. #if MAX_CHAR_OK != 255
  120.   for (i--; i++ < 255 ;)
  121.     to_upper[i]= sort_order[i]= to_lower[i]= (char) i;
  122. #endif
  123. #ifdef MSDOS
  124.   higher_pos= (uchar * ) "217216231232220"; /* Extra chars to konv. */
  125.   lower_pos=  (uchar * ) "206204224201202";
  126. #else
  127. #if defined(HPUX10) && ASCII_BITS_USED == 8
  128.   higher_pos= (uchar * ) "xd0xd8xdaxdbxdcxd3";
  129.   lower_pos=  (uchar * ) "xd4xccxcexdfxc9xd7";
  130. #else
  131. #ifdef USE_INTERNAL_CTYPE
  132.   higher_pos=lower_pos= (uchar* ) ""; /* System converts chars */
  133. #else
  134. #if defined(DEC_MULTINATIONAL_CHAR) || defined(HP_MULTINATIONAL_CHAR)
  135.   higher_pos= (uchar * ) "305304326311334";
  136.   lower_pos=  (uchar * ) "345344366351374";
  137. #else
  138.   higher_pos= (uchar * ) "[]\@^";
  139.   lower_pos=  (uchar * ) "{}|`~";
  140. #endif
  141. #endif /* USE_INTERNAL_CTYPE */
  142. #endif /* HPUX10 */
  143. #endif /* MSDOS */
  144.   while (*higher_pos)
  145.   {
  146.     to_upper[ *lower_pos ] = sort_order[ *lower_pos ] = (char) *higher_pos;
  147.     to_lower[ *higher_pos++ ] = (char) *lower_pos++;
  148.   }
  149. /* sets upp sortorder; higer_pos character (upper and lower) is */
  150. /* changed to lower_pos character */
  151. #ifdef MSDOS
  152.   higher_pos= (uchar *) "217216231232220";
  153.   lower_pos=  (uchar *) "216217231YE";
  154. #else
  155. #if defined(HPUX10) && ASCII_BITS_USED == 8
  156.   higher_pos= lower_pos= (uchar *) ""; /* Tecknen i r{tt ordning */
  157. #else
  158. #ifdef USE_ISO_8859_1 /* As in USG5 ICL-386 */
  159.   higher_pos= (uchar *) "305304326334311";
  160.   lower_pos=  (uchar *) "304305326YE";
  161. #else
  162.   higher_pos= (uchar *) "][\~`"; /* R{tt ordning p} tecknen */
  163.   lower_pos= (uchar *) "[\]YE"; /* Ordning enligt ascii */
  164. #endif /* USE_ISO_8859_1 */
  165. #endif /* HPUX10 */
  166. #endif /* MSDOS */
  167.   while (*higher_pos)
  168.   {
  169.     sort_order[ *higher_pos ] =
  170.       sort_order[(uchar)to_lower[*higher_pos]] = *lower_pos;
  171.     higher_pos++; lower_pos++;
  172.   }
  173.   DBUG_VOID_RETURN;
  174. } /* init_case_convert */