ctype-tis620.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:31k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* 
  2.    Copyright (C) 1998, 1999 by Pruet Boonma <pruet@eng.cmu.ac.th>
  3.    Copyright (C) 1998  by Theppitak Karoonboonyanan <thep@links.nectec.or.th>
  4.    Copyright (C) 1989, 1991 by Samphan Raruenrom <samphan@thai.com>
  5.    Permission to use, copy, modify, distribute and sell this software
  6.    and its documentation for any purpose is hereby granted without fee,
  7.    provided that the above copyright notice appear in all copies.
  8.    Smaphan Raruenrom , Theppitak Karoonboonyanan and Pruet Boonma makes
  9.    no representations about the suitability of this software for any 
  10.    purpose.  It is provided  "as is" without express or implied warranty.
  11. */
  12. /*
  13.    This file is basicly tis620 character sets with some extra functions
  14.    for tis-620 handling
  15. */
  16. /*
  17.  * This comment is parsed by configure to create ctype.c,
  18.  * so don't change it unless you know what you are doing.
  19.  *
  20.  * .configure. strxfrm_multiply_tis620=4
  21.  */
  22. #include <global.h>
  23. #include <my_sys.h>
  24. #include "m_string.h"
  25. #include "m_ctype.h"
  26. #include "t_ctype.h"
  27. static uchar* thai2sortable(const uchar *tstr,uint len);
  28. #define BUFFER_MULTIPLY 4
  29. #define buffsize(s) (BUFFER_MULTIPLY * (strlen(s) + 1))
  30. #define M  L_MIDDLE
  31. #define U  L_UPPER
  32. #define L  L_LOWER
  33. #define UU L_UPRUPR
  34. #define X  L_MIDDLE
  35. int t_ctype[][TOT_LEVELS] = {
  36.     /*0x00*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  37.     /*0x01*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  38.     /*0x02*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  39.     /*0x03*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  40.     /*0x04*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  41.     /*0x05*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  42.     /*0x06*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  43.     /*0x07*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  44.     /*0x08*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  45.     /*0x09*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  46.     /*0x0A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  47.     /*0x0B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  48.     /*0x0C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  49.     /*0x0D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  50.     /*0x0E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  51.     /*0x0F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  52.     /*0x10*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  53.     /*0x11*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  54.     /*0x12*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  55.     /*0x13*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  56.     /*0x14*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  57.     /*0x15*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  58.     /*0x16*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  59.     /*0x17*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  60.     /*0x18*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  61.     /*0x19*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  62.     /*0x1A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  63.     /*0x1B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  64.     /*0x1C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  65.     /*0x1D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  66.     /*0x1E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  67.     /*0x1F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  68.     /*0x20*/ { IGNORE, IGNORE, L3_SPACE, IGNORE, M},  
  69.     /*0x21*/ { IGNORE, IGNORE, L3_EXCLAMATION, IGNORE, M    }, 
  70.     /*0x22*/ { IGNORE, IGNORE, L3_QUOTATION, IGNORE, M      }, 
  71.     /*0x23*/ { IGNORE, IGNORE, L3_NUMBER, IGNORE, M         }, 
  72.     /*0x24*/ { IGNORE, IGNORE, L3_DOLLAR, IGNORE, M         }, 
  73.     /*0x25*/ { IGNORE, IGNORE, L3_PERCENT, IGNORE, M        },
  74.     /*0x26*/ { IGNORE, IGNORE, L3_AMPERSAND, IGNORE, M      },
  75.     /*0x27*/ { IGNORE, IGNORE, L3_APOSTROPHE, IGNORE, M     },
  76.     /*0x28*/ { IGNORE, IGNORE, L3_L_PARANTHESIS, IGNORE, M  },
  77.     /*0x29*/ { IGNORE, IGNORE, L3_R_PARENTHESIS, IGNORE, M  },
  78.     /*0x2A*/ { IGNORE, IGNORE, L3_ASTERISK, IGNORE, M       },
  79.     /*0x2B*/ { IGNORE, IGNORE, L3_PLUS, IGNORE, M           },
  80.     /*0x2C*/ { IGNORE, IGNORE, L3_COMMA, IGNORE, M          },
  81.     /*0x2D*/ { IGNORE, IGNORE, L3_HYPHEN, IGNORE, M         },
  82.     /*0x2E*/ { IGNORE, IGNORE, L3_FULL_STOP, IGNORE, M      },
  83.     /*0x2F*/ { IGNORE, IGNORE, L3_SOLIDUS, IGNORE, M        },
  84.     /*0x30*/ { L1_08, L2_BLANK, L3_BLANK, L4_BLANK, M  },
  85.     /*0x31*/ { L1_18, L2_BLANK, L3_BLANK, L4_BLANK, M  },
  86.     /*0x32*/ { L1_28, L2_BLANK, L3_BLANK, L4_BLANK, M  },
  87.     /*0x33*/ { L1_38, L2_BLANK, L3_BLANK, L4_BLANK, M  }, 
  88.     /*0x34*/ { L1_48, L2_BLANK, L3_BLANK, L4_BLANK, M  },
  89.     /*0x35*/ { L1_58, L2_BLANK, L3_BLANK, L4_BLANK, M  }, 
  90.     /*0x36*/ { L1_68, L2_BLANK, L3_BLANK, L4_BLANK, M  }, 
  91.     /*0x37*/ { L1_78, L2_BLANK, L3_BLANK, L4_BLANK, M  },
  92.     /*0x38*/ { L1_88, L2_BLANK, L3_BLANK, L4_BLANK, M  },
  93.     /*0x39*/ { L1_98, L2_BLANK, L3_BLANK, L4_BLANK, M  },
  94.     /*0x3A*/ { IGNORE, IGNORE, L3_COLON, IGNORE, M          }, 
  95.     /*0x3B*/ { IGNORE, IGNORE, L3_SEMICOLON, IGNORE, M      },
  96.     /*0x3C*/ { IGNORE, IGNORE, L3_LESS_THAN, IGNORE, M      },
  97.     /*0x3D*/ { IGNORE, IGNORE, L3_EQUAL, IGNORE, M          },
  98.     /*0x3E*/ { IGNORE, IGNORE, L3_GREATER_THAN, IGNORE, M   },
  99.     /*0x3F*/ { IGNORE, IGNORE, L3_QUESTION, IGNORE, M       },
  100.     /*0x40*/ { IGNORE, IGNORE, L3_AT, IGNORE, M             },
  101.     /*0x41*/ { L1_A8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  102.     /*0x42*/ { L1_B8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  103.     /*0x43*/ { L1_C8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  104.     /*0x44*/ { L1_D8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  105.     /*0x45*/ { L1_E8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  106.     /*0x46*/ { L1_F8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  107.     /*0x47*/ { L1_G8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  108.     /*0x48*/ { L1_H8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  109.     /*0x49*/ { L1_I8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  110.     /*0x4A*/ { L1_J8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  111.     /*0x4B*/ { L1_K8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  112.     /*0x4C*/ { L1_L8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  113.     /*0x4D*/ { L1_M8, L2_BLANK, L3_BLANK, L4_CAP, M  }, 
  114.     /*0x4E*/ { L1_N8, L2_BLANK, L3_BLANK, L4_CAP, M  }, 
  115.     /*0x4F*/ { L1_O8, L2_BLANK, L3_BLANK, L4_CAP, M  }, 
  116.     /*0x50*/ { L1_P8, L2_BLANK, L3_BLANK, L4_CAP, M  }, 
  117.     /*0x51*/ { L1_Q8, L2_BLANK, L3_BLANK, L4_CAP, M  }, 
  118.     /*0x52*/ { L1_R8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  119.     /*0x53*/ { L1_S8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  120.     /*0x54*/ { L1_T8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  121.     /*0x55*/ { L1_U8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  122.     /*0x56*/ { L1_V8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  123.     /*0x57*/ { L1_W8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  124.     /*0x58*/ { L1_X8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  125.     /*0x59*/ { L1_Y8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  126.     /*0x5A*/ { L1_Z8, L2_BLANK, L3_BLANK, L4_CAP, M  },
  127.     /*0x5B*/ { IGNORE, IGNORE, L3_L_BRACKET, IGNORE, M      },
  128.     /*0x5C*/ { IGNORE, IGNORE, L3_BK_SOLIDUS, IGNORE, M     },
  129.     /*0x5D*/ { IGNORE, IGNORE, L3_R_BRACKET, IGNORE, M      },
  130.     /*0x5E*/ { IGNORE, IGNORE, L3_CIRCUMFLEX, IGNORE, M     },
  131.     /*0x5F*/ { IGNORE, IGNORE, L3_LOW_LINE, IGNORE, M       },
  132.     /*0x60*/ { IGNORE, IGNORE, L3_GRAVE, IGNORE, M          },
  133.     /*0x61*/ { L1_A8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  134.     /*0x62*/ { L1_B8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  135.     /*0x63*/ { L1_C8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  136.     /*0x64*/ { L1_D8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  137.     /*0x65*/ { L1_E8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  138.     /*0x66*/ { L1_F8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  139.     /*0x67*/ { L1_G8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  140.     /*0x68*/ { L1_H8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  141.     /*0x69*/ { L1_I8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  142.     /*0x6A*/ { L1_J8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  143.     /*0x6B*/ { L1_K8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  144.     /*0x6C*/ { L1_L8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  145.     /*0x6D*/ { L1_M8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  146.     /*0x6E*/ { L1_N8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  147.     /*0x6F*/ { L1_O8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  148.     /*0x70*/ { L1_P8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  149.     /*0x71*/ { L1_Q8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  150.     /*0x72*/ { L1_R8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  151.     /*0x73*/ { L1_S8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  152.     /*0x74*/ { L1_T8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  153.     /*0x75*/ { L1_U8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  154.     /*0x76*/ { L1_V8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  155.     /*0x77*/ { L1_W8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  156.     /*0x78*/ { L1_X8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  157.     /*0x79*/ { L1_Y8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  158.     /*0x7A*/ { L1_Z8, L2_BLANK, L3_BLANK, L4_MIN, M  },
  159.     /*0x7B*/ { IGNORE, IGNORE, L3_L_BRACE, IGNORE, M        },
  160.     /*0x7C*/ { IGNORE, IGNORE, L3_V_LINE, IGNORE, M         },
  161.     /*0x7D*/ { IGNORE, IGNORE, L3_R_BRACE, IGNORE, M        },
  162.     /*0x7E*/ { IGNORE, IGNORE, L3_TILDE, IGNORE, M          },
  163.     /*0x7F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  164.     /*0x80*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  165.     /*0x81*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  166.     /*0x82*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  167.     /*0x83*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  168.     /*0x84*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  169.     /*0x85*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  170.     /*0x86*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  171.     /*0x87*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  172.     /*0x88*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  173.     /*0x89*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  174.     /*0x8A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  175.     /*0x8B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  176.     /*0x8C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  177.     /*0x8D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  178.     /*0x8E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  179.     /*0x8F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  180.     /*0x90*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  181.     /*0x91*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  182.     /*0x92*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  183.     /*0x93*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  184.     /*0x94*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  185.     /*0x95*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  186.     /*0x96*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  187.     /*0x97*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  188.     /*0x98*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  189.     /*0x99*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  190.     /*0x9A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  191.     /*0x9B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  192.     /*0x9C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  193.     /*0x9D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  194.     /*0x9E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  195.     /*0x9F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  196.     /*0xA0*/ { IGNORE, IGNORE, L3_NB_SACE, IGNORE, X        },
  197.     /*0xA1*/ { L1_KO_KAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  198.     /*0xA2*/ { L1_KHO_KHAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  199.     /*0xA3*/ { L1_KHO_KHUAT, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  200.     /*0xA4*/ { L1_KHO_KHWAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  201.     /*0xA5*/ { L1_KHO_KHON, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  202.     /*0xA6*/ { L1_KHO_RAKHANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  203.     /*0xA7*/ { L1_NGO_NGU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  204.     /*0xA8*/ { L1_CHO_CHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  205.     /*0xA9*/ { L1_CHO_CHING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  206.     /*0xAA*/ { L1_CHO_CHANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  207.     /*0xAB*/ { L1_SO_SO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  208.     /*0xAC*/ { L1_CHO_CHOE, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  209.     /*0xAD*/ { L1_YO_YING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  210.     /*0xAE*/ { L1_DO_CHADA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  211.     /*0xAF*/ { L1_TO_PATAK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  212.     /*0xB0*/ { L1_THO_THAN, L2_BLANK,L3_BLANK, L4_BLANK, M | _consnt}, 
  213.     /*0xB1*/ { L1_THO_NANGMONTHO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  214.     /*0xB2*/ { L1_THO_PHUTHAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  215.     /*0xB3*/ { L1_NO_NEN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  216.     /*0xB4*/ { L1_DO_DEK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  217.     /*0xB5*/ { L1_TO_TAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  218.     /*0xB6*/ { L1_THO_THUNG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  219.     /*0xB7*/ { L1_THO_THAHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  220.     /*0xB8*/ { L1_THO_THONG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  221.     /*0xB9*/ { L1_NO_NU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  222.     /*0xBA*/ { L1_BO_BAIMAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  223.     /*0xBB*/ { L1_PO_PLA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  224.     /*0xBC*/ { L1_PHO_PHUNG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  225.     /*0xBD*/ { L1_FO_FA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  226.     /*0xBE*/ { L1_PHO_PHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  227.     /*0xBF*/ { L1_FO_FAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  228.     /*0xC0*/ { L1_PHO_SAMPHAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  229.     /*0xC1*/ { L1_MO_MA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  230.     /*0xC2*/ { L1_YO_YAK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  231.     /*0xC3*/ { L1_RO_RUA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  232.     /*0xC4*/ { L1_RU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  233.     /*0xC5*/ { L1_LO_LING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  234.     /*0xC6*/ { L1_LU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  235.     /*0xC7*/ { L1_WO_WAEN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  236.     /*0xC8*/ { L1_SO_SALA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  237.     /*0xC9*/ { L1_SO_RUSI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  238.     /*0xCA*/ { L1_SO_SUA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  239.     /*0xCB*/ { L1_HO_HIP, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  240.     /*0xCC*/ { L1_LO_CHULA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  241.     /*0xCD*/ { L1_O_ANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
  242.     /*0xCE*/ { L1_HO_NOKHUK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt}, 
  243.     /*0xCF*/ { IGNORE, IGNORE, L3_PAIYAN_NOI, IGNORE, M}, 
  244.     /*0xD0*/ { L1_SARA_A, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel}, 
  245.     /*0xD1*/ { L1_MAI_HAN_AKAT, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, 
  246.     /*0xD2*/ { L1_SARA_AA, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel}, 
  247.     /*0xD3*/ { L1_SARA_AM, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel},
  248.     /*0xD4*/ { L1_SARA_I, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel},
  249.     /*0xD5*/ { L1_SARA_II, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, 
  250.     /*0xD6*/ { L1_SARA_UE, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel}, 
  251.     /*0xD7*/ { L1_SARA_UEE, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel},
  252.     /*0xD8*/ { L1_SARA_U, L2_BLANK, L3_BLANK, L4_BLANK, L | _lwrvowel}, 
  253.     /*0xD9*/ { L1_SARA_UU, L2_BLANK, L3_BLANK, L4_BLANK, L | _lwrvowel},
  254.     /*0xDA*/ { IGNORE, L2_PINTHU, L3_BLANK, L4_BLANK, L  },
  255.     /*0xDB*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  256.     /*0xDC*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  257.     /*0xDD*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  258.     /*0xDE*/ { IGNORE, IGNORE, IGNORE, IGNORE, X }, 
  259.     /*0xDF*/ { IGNORE, IGNORE, L3_BAHT, IGNORE, M},
  260.     /*0xE0*/ { L1_SARA_E, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
  261.     /*0xE1*/ { L1_SARA_AE, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
  262.     /*0xE2*/ { L1_SARA_O, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel  },
  263.     /*0xE3*/ { L1_SARA_AI_MAIMUAN,  L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel }, 
  264.     /*0xE4*/ { L1_SARA_AI_MAIMALAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
  265.     /*0xE5*/ { L1_SARA_AA, L2_BLANK, L3_BLANK, L4_EXT, M  | _fllwvowel }, 
  266.     /*0xE6*/ { IGNORE, IGNORE, L3_MAI_YAMOK, IGNORE, M | _stone },
  267.     /*0xE7*/ { IGNORE, L2_TYKHU, L3_BLANK, L4_BLANK, U | _diacrt1 | _stone  },
  268.     /*0xE8*/ { IGNORE, L2_TONE1, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone  },
  269.     /*0xE9*/ { IGNORE, L2_TONE2, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone  },
  270.     /*0xEA*/ { IGNORE, L2_TONE3, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone  },
  271.     /*0xEB*/ { IGNORE, L2_TONE4, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone },
  272.     /*0xEC*/ { IGNORE, L2_GARAN, L3_BLANK, L4_BLANK, UU | _diacrt2 | _combine | _stone },
  273.     /*0xED*/ { L1_NKHIT, L2_BLANK, L3_BLANK, L4_BLANK, U | _diacrt1  },
  274.     /*0xEE*/ { IGNORE, L2_YAMAK, L3_BLANK, L4_BLANK, U | _diacrt1 },
  275.     /*0xEF*/ { IGNORE, IGNORE, L3_FONGMAN, IGNORE, M  }, 
  276.     /*0xF0*/ { L1_08, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig }, 
  277.     /*0xF1*/ { L1_18, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  278.     /*0xF2*/ { L1_28, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  279.     /*0xF3*/ { L1_38, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  280.     /*0xF4*/ { L1_48, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  281.     /*0xF5*/ { L1_58, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  282.     /*0xF6*/ { L1_68, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  283.     /*0xF7*/ { L1_78, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  284.     /*0xF8*/ { L1_88, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  285.     /*0xF9*/ { L1_98, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
  286.     /*0xFA*/ { IGNORE, IGNORE, L3_ANGKHANKHU, IGNORE, X },
  287.     /*0xFB*/ { IGNORE, IGNORE, L3_KHOMUT, IGNORE, X },
  288.     /*0xFC*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  289.     /*0xFD*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  290.     /*0xFE*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  291.     /*0xFF*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
  292. };
  293. uchar NEAR ctype_tis620[257] =
  294. {
  295.   0, /* For standard library */
  296.   32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32,
  297.   32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
  298.   72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
  299.   132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16,
  300.   16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1,
  301.   1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16,
  302.   16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2,
  303.   2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32,
  304.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  305.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  306.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  307.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  308.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  309.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  310.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  311.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  312. };
  313. uchar NEAR to_lower_tis620[]=
  314. {
  315.   '00','01','02','03','04','05','06','07',
  316.   '10','11','12','13','14','15','16','17',
  317.   '20','21','22','23','24','25','26','27',
  318.   '30','31','32','33','34','35','36','37',
  319.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  320.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  321.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  322.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  323.   '@',  'a', 'b',   'c',   'd',   'e',   'f',   'g',
  324.   'h',  'i', 'j',   'k',   'l',   'm',   'n',   'o',
  325.   'p',  'q', 'r',   's',   't',   'u',   'v',   'w',
  326.   'x',  'y', 'z',   '[',   '\',  ']',   '^',   '_',
  327.   '`',  'a', 'b',   'c',   'd',   'e',   'f',   'g',
  328.   'h',  'i', 'j',   'k',   'l',   'm',   'n',   'o',
  329.   'p',  'q', 'r',   's',   't',   'u',   'v',   'w',
  330.   'x',  'y', 'z',   '{',   '|',   '}',   '~',   '177',
  331.   (uchar) '200',(uchar) '201',(uchar) '202',(uchar) '203',(uchar) '204',(uchar) '205',(uchar) '206',(uchar) '207',
  332.   (uchar) '210',(uchar) '211',(uchar) '212',(uchar) '213',(uchar) '214',(uchar) '215',(uchar) '216',(uchar) '217',
  333.   (uchar) '220',(uchar) '221',(uchar) '222',(uchar) '223',(uchar) '224',(uchar) '225',(uchar) '226',(uchar) '227',
  334.   (uchar) '230',(uchar) '231',(uchar) '232',(uchar) '233',(uchar) '234',(uchar) '235',(uchar) '236',(uchar) '237',
  335.   (uchar) '240',(uchar) '241',(uchar) '242',(uchar) '243',(uchar) '244',(uchar) '245',(uchar) '246',(uchar) '247',
  336.   (uchar) '250',(uchar) '251',(uchar) '252',(uchar) '253',(uchar) '254',(uchar) '255',(uchar) '256',(uchar) '257',
  337.   (uchar) '260',(uchar) '261',(uchar) '262',(uchar) '263',(uchar) '264',(uchar) '265',(uchar) '266',(uchar) '267',
  338.   (uchar) '270',(uchar) '271',(uchar) '272',(uchar) '273',(uchar) '274',(uchar) '275',(uchar) '276',(uchar) '277',
  339.   (uchar) '300',(uchar) '301',(uchar) '302',(uchar) '303',(uchar) '304',(uchar) '305',(uchar) '306',(uchar) '307',
  340.   (uchar) '310',(uchar) '311',(uchar) '312',(uchar) '313',(uchar) '314',(uchar) '315',(uchar) '316',(uchar) '317',
  341.   (uchar) '320',(uchar) '321',(uchar) '322',(uchar) '323',(uchar) '324',(uchar) '325',(uchar) '326',(uchar) '327',
  342.   (uchar) '330',(uchar) '331',(uchar) '332',(uchar) '333',(uchar) '334',(uchar) '335',(uchar) '336',(uchar) '337',
  343.   (uchar) '340',(uchar) '341',(uchar) '342',(uchar) '343',(uchar) '344',(uchar) '345',(uchar) '346',(uchar) '347',
  344.   (uchar) '350',(uchar) '351',(uchar) '352',(uchar) '353',(uchar) '354',(uchar) '355',(uchar) '356',(uchar) '357',
  345.   (uchar) '360',(uchar) '361',(uchar) '362',(uchar) '363',(uchar) '364',(uchar) '365',(uchar) '366',(uchar) '367',
  346.   (uchar) '370',(uchar) '371',(uchar) '372',(uchar) '373',(uchar) '374',(uchar) '375',(uchar) '376',(uchar) '377',
  347. };
  348. uchar NEAR to_upper_tis620[]=
  349. {
  350.   '00','01','02','03','04','05','06','07',
  351.   '10','11','12','13','14','15','16','17',
  352.   '20','21','22','23','24','25','26','27',
  353.   '30','31','32','33','34','35','36','37',
  354.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  355.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  356.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  357.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  358.   '@',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  359.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  360.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  361.   'X',  'Y', 'Z',   '[',   '\',  ']',   '^',   '_',
  362.   '`',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  363.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  364.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  365.   'X',  'Y', 'Z',   '{',   '|',   '}',   '~',   '177',
  366.   (uchar) '200',(uchar) '201',(uchar) '202',(uchar) '203',(uchar) '204',(uchar) '205',(uchar) '206',(uchar) '207',
  367.   (uchar) '210',(uchar) '211',(uchar) '212',(uchar) '213',(uchar) '214',(uchar) '215',(uchar) '216',(uchar) '217',
  368.   (uchar) '220',(uchar) '221',(uchar) '222',(uchar) '223',(uchar) '224',(uchar) '225',(uchar) '226',(uchar) '227',
  369.   (uchar) '230',(uchar) '231',(uchar) '232',(uchar) '233',(uchar) '234',(uchar) '235',(uchar) '236',(uchar) '237',
  370.   (uchar) '240',(uchar) '241',(uchar) '242',(uchar) '243',(uchar) '244',(uchar) '245',(uchar) '246',(uchar) '247',
  371.   (uchar) '250',(uchar) '251',(uchar) '252',(uchar) '253',(uchar) '254',(uchar) '255',(uchar) '256',(uchar) '257',
  372.   (uchar) '260',(uchar) '261',(uchar) '262',(uchar) '263',(uchar) '264',(uchar) '265',(uchar) '266',(uchar) '267',
  373.   (uchar) '270',(uchar) '271',(uchar) '272',(uchar) '273',(uchar) '274',(uchar) '275',(uchar) '276',(uchar) '277',
  374.   (uchar) '300',(uchar) '301',(uchar) '302',(uchar) '303',(uchar) '304',(uchar) '305',(uchar) '306',(uchar) '307',
  375.   (uchar) '310',(uchar) '311',(uchar) '312',(uchar) '313',(uchar) '314',(uchar) '315',(uchar) '316',(uchar) '317',
  376.   (uchar) '320',(uchar) '321',(uchar) '322',(uchar) '323',(uchar) '324',(uchar) '325',(uchar) '326',(uchar) '327',
  377.   (uchar) '330',(uchar) '331',(uchar) '332',(uchar) '333',(uchar) '334',(uchar) '335',(uchar) '336',(uchar) '337',
  378.   (uchar) '340',(uchar) '341',(uchar) '342',(uchar) '343',(uchar) '344',(uchar) '345',(uchar) '346',(uchar) '347',
  379.   (uchar) '350',(uchar) '351',(uchar) '352',(uchar) '353',(uchar) '354',(uchar) '355',(uchar) '356',(uchar) '357',
  380.   (uchar) '360',(uchar) '361',(uchar) '362',(uchar) '363',(uchar) '364',(uchar) '365',(uchar) '366',(uchar) '367',
  381.   (uchar) '370',(uchar) '371',(uchar) '372',(uchar) '373',(uchar) '374',(uchar) '375',(uchar) '376',(uchar) '377',
  382. };
  383. uchar NEAR sort_order_tis620[]=
  384. {
  385.   '00','01','02','03','04','05','06','07',
  386.   '10','11','12','13','14','15','16','17',
  387.   '20','21','22','23','24','25','26','27',
  388.   '30','31','32','33','34','35','36','37',
  389.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  390.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  391.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  392.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  393.   '@',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  394.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  395.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  396.   'X',  'Y', 'Z',   '\',  ']',   '[',   '^',   '_',
  397.   'E',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  398.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  399.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  400.   'X',  'Y', 'Z',   '{',   '|',   '}',   'Y',   '177',
  401.   (uchar) '200',(uchar) '201',(uchar) '202',(uchar) '203',(uchar) '204',(uchar) '205',(uchar) '206',(uchar) '207',
  402.   (uchar) '210',(uchar) '211',(uchar) '212',(uchar) '213',(uchar) '214',(uchar) '215',(uchar) '216',(uchar) '217',
  403.   (uchar) '220',(uchar) '221',(uchar) '222',(uchar) '223',(uchar) '224',(uchar) '225',(uchar) '226',(uchar) '227',
  404.   (uchar) '230',(uchar) '231',(uchar) '232',(uchar) '233',(uchar) '234',(uchar) '235',(uchar) '236',(uchar) '237',
  405.   (uchar) '240',(uchar) '241',(uchar) '242',(uchar) '243',(uchar) '244',(uchar) '245',(uchar) '246',(uchar) '247',
  406.   (uchar) '250',(uchar) '251',(uchar) '252',(uchar) '253',(uchar) '254',(uchar) '255',(uchar) '256',(uchar) '257',
  407.   (uchar) '260',(uchar) '261',(uchar) '262',(uchar) '263',(uchar) '264',(uchar) '265',(uchar) '266',(uchar) '267',
  408.   (uchar) '270',(uchar) '271',(uchar) '272',(uchar) '273',(uchar) '274',(uchar) '275',(uchar) '276',(uchar) '277',
  409.   (uchar) '300',(uchar) '301',(uchar) '302',(uchar) '303',(uchar) '304',(uchar) '305',(uchar) '306',(uchar) '307',
  410.   (uchar) '310',(uchar) '311',(uchar) '312',(uchar) '313',(uchar) '314',(uchar) '315',(uchar) '316',(uchar) '317',
  411.   (uchar) '320',(uchar) '321',(uchar) '322',(uchar) '323',(uchar) '324',(uchar) '325',(uchar) '326',(uchar) '327',
  412.   (uchar) '330',(uchar) '331',(uchar) '332',(uchar) '333',(uchar) '334',(uchar) '335',(uchar) '336',(uchar) '337',
  413.   (uchar) '340',(uchar) '341',(uchar) '342',(uchar) '343',(uchar) '344',(uchar) '345',(uchar) '346',(uchar) '347',
  414.   (uchar) '350',(uchar) '351',(uchar) '352',(uchar) '353',(uchar) '354',(uchar) '355',(uchar) '356',(uchar) '357',
  415.   (uchar) '360',(uchar) '361',(uchar) '362',(uchar) '363',(uchar) '364',(uchar) '365',(uchar) '366',(uchar) '367',
  416.   (uchar) '370',(uchar) '371',(uchar) '372',(uchar) '373',(uchar) '374',(uchar) '375',(uchar) '376',(uchar) '377',
  417. };
  418. /* Convert thai string to "Standard C String Function" sortable string 
  419.    Arg: const source string and length of converted string
  420.    Ret: Sortable string
  421. */
  422. static uchar* thai2sortable(const uchar * tstr,uint len) 
  423. {
  424.   const uchar* p = tstr;
  425.   uchar  *outBuf;
  426.   uchar  *pRight1, *pRight2, *pRight3, *pRight4;
  427.   uchar  *pLeft1, *pLeft2, *pLeft3, *pLeft4;
  428.   uint bufSize;
  429.   len = (uint) strnlen((char*) tstr,len);
  430.   bufSize = (uint) buffsize((char*) tstr);
  431.   if(!(pRight1 = (uchar *)malloc(sizeof(uchar) * bufSize))) {
  432.     return( (uchar*) tstr);
  433.   }
  434.   pLeft1 = pRight1;
  435.   outBuf = pRight1;
  436.   if(!(pRight2 = (uchar *)malloc(sizeof(uchar) * (len + 1)))) {
  437.     free(pRight1);
  438.     return((uchar*) tstr);
  439.   }
  440.   pLeft2 = pRight2;
  441.   if(!(pRight3 = (uchar *)malloc(sizeof(uchar) * (len + 1)))) {
  442.     free(pRight1);
  443.     free(pRight2);
  444.     return((uchar*) tstr);
  445.   }
  446.   pLeft3 = pRight3;
  447.   if(!(pRight4 = (uchar *)malloc(sizeof(uchar) * (len + 1)))) {
  448.     free(pRight1);
  449.     free(pRight2);
  450.     free(pRight3);
  451.     return((uchar*) tstr);
  452.   }
  453.   pLeft4 = pRight4;
  454.   while(len--) {
  455.     if(isldvowel(*p) && isconsnt(p[1])) {
  456.       *pRight1++ = t_ctype[p[1]][0];
  457.       *pRight2++ = t_ctype[p[1]][1];
  458.       *pRight3++ = t_ctype[p[1]][2];
  459.       *pRight4++ = t_ctype[p[1]][3];
  460.       *pRight1++ = t_ctype[*p][0];
  461.       *pRight2++ = t_ctype[*p][1];
  462.       *pRight3++ = t_ctype[*p][2];
  463.       *pRight4++ = t_ctype[*p][3];
  464.       len--;
  465.       p += 2;
  466.     } else {
  467.       *pRight1 = t_ctype[*p][0];
  468.       if(*pRight1 != IGNORE) pRight1++;
  469.       *pRight2 = t_ctype[*p][1];
  470.       if(*pRight2 != IGNORE) pRight2++;
  471.       *pRight3 = t_ctype[*p][2];
  472.       if(*pRight3 != IGNORE) pRight3++;
  473.       *pRight4 = t_ctype[*p][3];
  474.       if(*pRight4 != IGNORE) pRight4++;
  475.       p++;
  476.     }
  477.   }
  478.   *pRight1++ = L2_BLANK;
  479.   *pRight2++ = L3_BLANK;
  480.   *pRight3++ = L4_BLANK;
  481.   *pRight4++ = '';
  482.   memcpy(pRight1, pLeft2, pRight2 - pLeft2);
  483.   pRight1 += pRight2 - pLeft2;
  484.   memcpy(pRight1, pLeft3, pRight3 - pLeft3);
  485.   pRight1 += pRight3 - pLeft3;
  486.   memcpy(pRight1, pLeft4, pRight4 - pLeft4);
  487.   free(pLeft2);
  488.   free(pLeft3);
  489.   free(pLeft4);
  490.   return(outBuf);
  491. }
  492. /* strncoll() replacement, compare 2 string, both are conveted to sortable string
  493.    Arg: 2 Strings and it compare length
  494.    Ret: strcmp result
  495. */
  496. int my_strnncoll_tis620(const uchar * s1, int len1, const uchar * s2, int len2) 
  497. {
  498.   uchar *tc1, *tc2;
  499.   int i;
  500.   tc1 = thai2sortable(s1, len1);
  501.   tc2 = thai2sortable(s2, len2);
  502.   i = strcmp((char*)tc1, (char*)tc2);
  503.   free(tc1);
  504.   free(tc2);
  505.   return(i);
  506. }
  507. /* strnxfrm replacment, convert Thai string to sortable string
  508.    Arg: Destination buffer, source string, dest length and source length
  509.    Ret: Conveted string size
  510. */
  511. int my_strnxfrm_tis620(uchar * dest, uchar * src, int len, int srclen) 
  512. {
  513.   uint bufSize;
  514.   uchar *tmp;
  515.   bufSize = (uint) buffsize((char*)src);
  516.   tmp = thai2sortable(src,srclen);
  517.   set_if_smaller(bufSize,(uint) len);
  518.   memcpy((uchar *)dest, tmp, bufSize);
  519.   free(tmp);
  520.   return (int) bufSize;
  521. }
  522. /* strcoll replacment, compare 2 strings
  523.    Arg: 2 strings
  524.    Ret: strcmp result
  525. */
  526. int my_strcoll_tis620(const uchar * s1, const uchar * s2) 
  527. {
  528.   uchar *tc1, *tc2;
  529.   int i;
  530.   tc1 = thai2sortable(s1, (uint) strlen((char*)s1));
  531.   tc2 = thai2sortable(s2, (uint) strlen((char*)s2));
  532.   i = strcmp((char*)tc1, (char*)tc2);
  533.   free(tc1);
  534.   free(tc2);
  535.   return(i);
  536. }
  537. /* strxfrm replacment, convert Thai string to sortable string
  538.    Arg: Destination buffer, String and  dest buffer size
  539.    Ret: Converting string size
  540. */
  541. int my_strxfrm_tis620(uchar * dest, uchar * src, int len)
  542. {
  543.   uint bufSize;
  544.   uchar *tmp;
  545.   bufSize = (uint) buffsize((char*) src);
  546.   tmp = thai2sortable(src, len);
  547.   memcpy((uchar *) dest, tmp, bufSize);
  548.   free(tmp);
  549.   return bufSize;
  550. }
  551. /* Convert SQL like string to C string
  552.    Arg: String, its length, escape character, resource length, minimal string and maximum string
  553.    Ret: Alway 0
  554. */
  555. my_bool my_like_range_tis620(const char *ptr, uint ptr_length, pchar escape,
  556.              uint res_length, char *min_str, char *max_str,
  557.              uint *min_length,uint *max_length)
  558. {
  559.   char *end;
  560.   char *min_org= min_str;
  561.   char *min_end = min_str + res_length;
  562.   char *tbuff;
  563.   uchar *tc;
  564.   uint tbuff_length;
  565.   tbuff = (char*) (tc=thai2sortable((uchar*) ptr, ptr_length));
  566.   tbuff_length = (uint) buffsize(ptr);
  567.   end = tbuff + tbuff_length;
  568.   for(;tbuff != end && min_str != min_end; tbuff++)
  569.   {
  570.     if(*tbuff == escape && tbuff + 1 != end)
  571.     {
  572.       tbuff++;
  573.       *min_str++ = *max_str++ = *tbuff;
  574.       continue;
  575.     }
  576.     if(*tbuff == '_')
  577.     {
  578.       *min_str++ = '';
  579.       *max_str++ = '255';
  580.       continue;
  581.     }
  582.     if(*tbuff == '%')
  583.     {
  584.       *min_length= (uint) (min_str - min_org);
  585.       *max_length= res_length;
  586.       do
  587.       {
  588. *min_str++ = ' ';
  589. *max_str++ = '255';
  590.       } while(min_str != min_end);
  591.       free(tc);
  592.       return(0);
  593.     }
  594.     *min_str++ = *max_str++ = *tbuff;
  595.   }
  596.   *min_length= *max_length = (uint) (min_str - min_org);
  597.   while(min_str != min_end)
  598.   {
  599.     *min_str++ = *max_str++ = ' ';
  600.   }
  601.   free(tc);
  602.   return(0);
  603. }
  604. /* Thai normalization for input sub system
  605.    Arg: Buffer, 's length, String, 'length
  606.    Ret: Void
  607. */
  608. void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length)
  609. {
  610.   const uchar* fr = from;
  611.   uchar* p = ptr;
  612.   if(length > field_length) {
  613.     length = field_length;
  614.   }
  615.   while (length--)
  616.   {
  617.     if((istone(*fr) || isdiacrt1(*fr)) &&
  618.        (islwrvowel(fr[1]) || isuprvowel(fr[1])))
  619.     {
  620.       *p = fr[1];
  621.       p[1] = *fr;
  622.       fr += 2;
  623.       p += 2;
  624.       length--;
  625.     }
  626.     else
  627.     {
  628.       *p++ = *fr++;
  629.     }
  630.   }
  631. }