aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/multibyte.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/odbc/multibyte.c')
-rw-r--r--src/interfaces/odbc/multibyte.c454
1 files changed, 0 insertions, 454 deletions
diff --git a/src/interfaces/odbc/multibyte.c b/src/interfaces/odbc/multibyte.c
deleted file mode 100644
index a31f2e9b4bd..00000000000
--- a/src/interfaces/odbc/multibyte.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/*--------
- * Module : multibyte.c
- *
- * Description: New Mlutibyte related additional function.
- *
- * Create 2001-03-03 Eiji Tokuya
- * New Create 2001-09-16 Eiji Tokuya
- *--------
- */
-
-#include "multibyte.h"
-#include "connection.h"
-#include "pgapifunc.h"
-#include <string.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-pg_CS CS_Table[] =
-{
- { "SQL_ASCII", SQL_ASCII },
- { "EUC_JP", EUC_JP },
- { "EUC_CN", EUC_CN },
- { "EUC_KR", EUC_KR },
- { "EUC_TW", EUC_TW },
- { "JOHAB", JOHAB },
- { "UNICODE", UTF8 },
- { "MULE_INTERNAL",MULE_INTERNAL },
- { "LATIN1", LATIN1 },
- { "LATIN2", LATIN2 },
- { "LATIN3", LATIN3 },
- { "LATIN4", LATIN4 },
- { "LATIN5", LATIN5 },
- { "LATIN6", LATIN6 },
- { "LATIN7", LATIN7 },
- { "LATIN8", LATIN8 },
- { "LATIN9", LATIN9 },
- { "LATIN10", LATIN10 },
- { "WIN1256", WIN1256 },
- { "TCVN", TCVN },
- { "WIN874", WIN874 },
- { "KOI8", KOI8R },
- { "WIN", WIN1251 },
- { "ALT", ALT },
- { "ISO_8859_5", ISO_8859_5 },
- { "ISO_8859_6", ISO_8859_6 },
- { "ISO_8859_7", ISO_8859_7 },
- { "ISO_8859_8", ISO_8859_8 },
-
-
- { "SJIS", SJIS },
- { "BIG5", BIG5 },
- { "GBK", GBK },
- { "UHC", UHC },
- { "WIN1250", WIN1250 },
- { "GB18030", GB18030 },
- { "OTHER", OTHER }
-};
-
-#ifdef NOT_USED
-static int
-pg_ismb(int characterset_code)
-{
- int i=0,MB_CHARACTERSET[]={EUC_JP,EUC_CN,EUC_KR,EUC_TW,UTF8,MULE_INTERNAL,SJIS,BIG5,GBK,UHC,JOHAB};
-
- while (MB_CHARACTERSET[i] != characterset_code || OTHER != MB_CHARACTERSET[i] )
- {
- i++;
- }
- return (MB_CHARACTERSET[i]);
-}
-#endif
-
-int
-pg_CS_code(const unsigned char *characterset_string)
-{
- int i = 0, c = -1;
- unsigned len = 0;
- for(i = 0; CS_Table[i].code != OTHER; i++)
- {
- if (strstr(characterset_string,CS_Table[i].name))
- {
- if(strlen(CS_Table[i].name) >= len)
- {
- len = strlen(CS_Table[i].name);
- c = CS_Table[i].code;
- }
-
- }
- }
- if (c < 0)
- c = i;
- return (c);
-}
-
-unsigned char *
-pg_CS_name(int characterset_code)
-{
- int i;
- for (i = 0; CS_Table[i].code != OTHER; i++)
- {
- if (CS_Table[i].code == characterset_code)
- return CS_Table[i].name;
- }
- return ("OTHER");
-}
-
-int
-pg_CS_stat(int stat,unsigned int character,int characterset_code)
-{
- if (character == 0)
- stat = 0;
- switch (characterset_code)
- {
- case UTF8:
- {
- if (stat < 2 &&
- character >= 0x80)
- {
- if (character >= 0xfc)
- stat = 6;
- else if (character >= 0xf8)
- stat = 5;
- else if (character >= 0xf0)
- stat = 4;
- else if (character >= 0xe0)
- stat = 3;
- else if (character >= 0xc0)
- stat = 2;
- }
- else if (stat > 2 &&
- character > 0x7f)
- stat--;
- else
- stat=0;
- }
- break;
-/* Shift-JIS Support. */
- case SJIS:
- {
- if (stat < 2 &&
- character > 0x80 &&
- !(character > 0x9f &&
- character < 0xe0))
- stat = 2;
- else if (stat == 2)
- stat = 1;
- else
- stat = 0;
- }
- break;
-/* Chinese Big5 Support. */
- case BIG5:
- {
- if (stat < 2 &&
- character > 0xA0)
- stat = 2;
- else if (stat == 2)
- stat = 1;
- else
- stat = 0;
- }
- break;
-/* Chinese GBK Support. */
- case GBK:
- {
- if (stat < 2 &&
- character > 0x7F)
- stat = 2;
- else if (stat == 2)
- stat = 1;
- else
- stat = 0;
- }
- break;
-
-/* Korian UHC Support. */
- case UHC:
- {
- if (stat < 2 &&
- character > 0x7F)
- stat = 2;
- else if (stat == 2)
- stat = 1;
- else
- stat = 0;
- }
- break;
-
-/* EUC_JP Support */
- case EUC_JP:
- {
- if (stat < 3 &&
- character == 0x8f) /* JIS X 0212 */
- stat = 3;
- else
- if (stat != 2 &&
- (character == 0x8e ||
- character > 0xa0)) /* Half Katakana HighByte & Kanji HighByte */
- stat = 2;
- else if (stat == 2)
- stat = 1;
- else
- stat = 0;
- }
- break;
-
-/* EUC_CN, EUC_KR, JOHAB Support */
- case EUC_CN:
- case EUC_KR:
- case JOHAB:
- {
- if (stat < 2 &&
- character > 0xa0)
- stat = 2;
- else if (stat == 2)
- stat = 1;
- else
- stat = 0;
- }
- break;
- case EUC_TW:
- {
- if (stat < 4 &&
- character == 0x8e)
- stat = 4;
- else if (stat == 4 &&
- character > 0xa0)
- stat = 3;
- else if ((stat == 3 ||
- stat < 2) &&
- character > 0xa0)
- stat = 2;
- else if (stat == 2)
- stat = 1;
- else
- stat = 0;
- }
- break;
- /*Chinese GB18030 support.Added by Bill Huang <bhuang@redhat.com> <bill_huanghb@ybb.ne.jp>*/
- case GB18030:
- {
- if (stat < 2 && character > 0x80)
- stat = 2;
- else if (stat = 2)
- if (character >= 0x30 && character <= 0x39)
- stat = 3;
- else
- stat = 1;
- else if (stat = 3)
- if (character >= 0x30 && character <= 0x39)
- stat = 1;
- else
- stat = 3;
- else
- stat = 0;
- }
- break;
- default:
- {
- stat = 0;
- }
- break;
- }
- return stat;
-}
-
-
-unsigned char *
-pg_mbschr(int csc, const unsigned char *string, unsigned int character)
-{
- int mb_st = 0;
- const unsigned char *s, *rs = NULL;
-
- for(s = string; *s ; s++)
- {
- mb_st = pg_CS_stat(mb_st, (unsigned char) *s, csc);
- if (mb_st == 0 && (*s == character))
- {
- rs = s;
- break;
- }
- }
- return (rs);
-}
-
-int
-pg_mbslen(int csc, const unsigned char *string)
-{
- unsigned char *s;
- int len, cs_stat;
- for (len = 0, cs_stat = 0, s = (unsigned char *) string; *s != 0; s++)
- {
- cs_stat = pg_CS_stat(cs_stat,(unsigned int) *s, csc);
- if (cs_stat < 2)
- len++;
- }
- return len;
-}
-
-unsigned char *
-pg_mbsinc(int csc, const unsigned char *current )
-{
- int mb_stat = 0;
- if (*current != 0)
- {
- mb_stat = (int) pg_CS_stat(mb_stat, *current, csc);
- if (mb_stat == 0)
- mb_stat = 1;
- return ((unsigned char *) current + mb_stat);
- }
- else
- return NULL;
-}
-
-static char *
-CC_lookup_cs_new(ConnectionClass *self)
-{
- char *encstr = NULL;
- QResultClass *res;
-
- res = CC_send_query(self, "select pg_client_encoding()", NULL, CLEAR_RESULT_ON_ABORT);
- if (res)
- {
- char *enc = QR_get_value_backend_row(res, 0, 0);
-
- if (enc)
- encstr = strdup(enc);
- QR_Destructor(res);
- }
- return encstr;
-}
-static char *
-CC_lookup_cs_old(ConnectionClass *self)
-{
- char *encstr = NULL;
- HSTMT hstmt;
- RETCODE result;
-
- result = PGAPI_AllocStmt(self, &hstmt);
- if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
- return encstr;
-
- result = PGAPI_ExecDirect(hstmt, "Show Client_Encoding", SQL_NTS);
- if (result == SQL_SUCCESS_WITH_INFO)
- {
- char sqlState[8], errormsg[128], enc[32];
-
- if (PGAPI_Error(NULL, NULL, hstmt, sqlState, NULL, errormsg,
- sizeof(errormsg), NULL) == SQL_SUCCESS &&
- sscanf(errormsg, "%*s %*s %*s %*s %*s %s", enc) > 0)
- encstr = strdup(enc);
- }
- PGAPI_FreeStmt(hstmt, SQL_DROP);
- return encstr;
-}
-
-void
-CC_lookup_characterset(ConnectionClass *self)
-{
- char *encstr;
- static char *func = "CC_lookup_characterset";
-
- mylog("%s: entering...\n", func);
- if (PG_VERSION_LT(self, 7.2))
- encstr = CC_lookup_cs_old(self);
- else
- encstr = CC_lookup_cs_new(self);
- if (self->client_encoding)
- free(self->client_encoding);
-#ifndef UNICODE_SUPPORT
-#ifdef WIN32
- else
- {
- const char *wenc = NULL;
- switch (GetACP())
- {
- case 932:
- wenc = "SJIS";
- break;
- case 936:
- wenc = "GBK";
- break;
- case 949:
- wenc = "UHC";
- break;
- case 950:
- wenc = "BIG5";
- break;
- }
- if (wenc && stricmp(encstr, wenc))
- {
- QResultClass *res;
- char query[64];
-
- sprintf(query, "set client_encoding to '%s'", wenc);
- res = CC_send_query(self, query, NULL, CLEAR_RESULT_ON_ABORT);
- if (res)
- {
- self->client_encoding = strdup(wenc);
- self->ccsc = pg_CS_code(self->client_encoding);
- QR_Destructor(res);
- free(encstr);
- return;
- }
- }
- }
-#endif /* WIN32 */
-#endif /* UNICODE_SUPPORT */
- if (encstr)
- {
- self->client_encoding = encstr;
- self->ccsc = pg_CS_code(encstr);
- qlog(" [ Client encoding = '%s' (code = %d) ]\n", self->client_encoding, self->ccsc);
- if (stricmp(pg_CS_name(self->ccsc), encstr))
- {
- qlog(" Client encoding = '%s' and %s\n", self->client_encoding, pg_CS_name(self->ccsc));
- self->errornumber = CONN_VALUE_OUT_OF_RANGE;
- self->errormsg = "client encoding mismatch";
- }
- }
- else
- {
- self->ccsc = SQL_ASCII;
- self->client_encoding = NULL;
- }
-}
-
-void encoded_str_constr(encoded_str *encstr, int ccsc, const char *str)
-{
- encstr->ccsc = ccsc;
- encstr->encstr = str;
- encstr->pos = -1;
- encstr->ccst = 0;
-}
-int encoded_nextchar(encoded_str *encstr)
-{
- int chr;
-
- chr = encstr->encstr[++encstr->pos];
- encstr->ccst = pg_CS_stat(encstr->ccst, (unsigned int) chr, encstr->ccsc);
- return chr;
-}
-int encoded_byte_check(encoded_str *encstr, int abspos)
-{
- int chr;
-
- chr = encstr->encstr[encstr->pos = abspos];
- encstr->ccst = pg_CS_stat(encstr->ccst, (unsigned int) chr, encstr->ccsc);
- return chr;
-}