Oops I forgot to add new files for multibyte support.
authorHiroshi Inoue
Fri, 16 Mar 2001 13:03:04 +0000 (13:03 +0000)
committerHiroshi Inoue
Fri, 16 Mar 2001 13:03:04 +0000 (13:03 +0000)
Sorry Eiji.

src/interfaces/odbc/multibyte.c [new file with mode: 0644]
src/interfaces/odbc/multibyte.h [new file with mode: 0644]

diff --git a/src/interfaces/odbc/multibyte.c b/src/interfaces/odbc/multibyte.c
new file mode 100644 (file)
index 0000000..d365618
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Module :            multibyte.c
+ *
+ * Description:        Mlutibyte related additional function.
+ *
+ *                 Create 2001-03-03 Eiji Tokuya
+ *
+ */        
+#include 
+#include "multibyte.h"
+
+int multibyte_client_encoding ;    /* Multibyte Client Encoding. */
+int multibyte_status ;     /* Multibyte Odds and ends character. */
+
+unsigned char *multibyte_strchr(unsigned char *s,unsigned char c)
+{
+   int mb_st = 0 ,i = 0;
+   while (!(mb_st == 0 && s[i] == c || s[i] == 0))
+   {
+       if (s[i] == 0)
+           return (0);
+       switch ( multibyte_client_encoding )
+       {
+           case SJIS:
+           {
+               if (mb_st < 2 && s[i] > 0x80 && !(s[i] > 0x9f && s[i] < 0xe0))
+                   mb_st = 2;
+               else if (mb_st == 2)
+                       mb_st = 1;
+                   else
+                       mb_st = 0;
+           }
+           break;
+
+
+/* Chinese Big5 Support. */
+       case BIG5:
+           {
+               if ( mb_st < 2 && s[i] > 0xA0 )
+                       mb_st = 2;
+               else if ( mb_st == 2 )
+                       mb_st = 1;
+                   else
+                       mb_st = 0;
+           }
+           break;
+       default:
+           {
+               mb_st = 0;
+           }
+       }
+       i++;
+   }
+#ifdef _DEBUG
+   qlog("i = %d\n",i);
+#endif
+   return (s + i);
+}
+
+void multibyte_init(void)
+{
+   multibyte_status = 0;
+}
+
+unsigned char *check_client_encoding(unsigned char *str)
+{
+   if(strstr(str,"%27SJIS%27")||strstr(str,"'SJIS'")||strstr(str,"'sjis'"))
+   {
+       multibyte_client_encoding = SJIS;
+       return ("SJIS");
+   }
+   if(strstr(str,"%27BIG5%27")||strstr(str,"'BIG5'")||strstr(str,"'big5'"))
+   {
+       multibyte_client_encoding = BIG5;
+       return ("BIG5");
+   }
+   return ("OHTER");
+}
+
+/* 
+ * Multibyte Status Function.
+ * Input   char
+ * Output  0   : 1 Byte Character.
+ *         1   : MultibyteCharacter Last Byte.
+ *         N   : MultibyteCharacter Fast or Middle Byte.
+ */
+int multibyte_char_check(unsigned char s)
+{
+   switch ( multibyte_client_encoding )
+   {
+/* Japanese Shift-JIS(CP932) Support. */
+       case SJIS:
+       {
+           if ( multibyte_status < 2 && s > 0x80 && !(s > 0x9f && s < 0xE0))
+               multibyte_status = 2;
+           else if (multibyte_status == 2)
+               multibyte_status = 1;
+           else
+               multibyte_status = 0;
+       }
+       break;
+
+       
+/* Chinese Big5(CP950) Support. */
+   case BIG5:
+       {
+           if ( multibyte_status < 2 && s > 0xA0)
+               multibyte_status = 2;
+           else if (multibyte_status == 2)
+               multibyte_status = 1;
+           else
+               multibyte_status = 0;
+       }
+       break;
+   default:
+       {
+           multibyte_status = 0;
+       }
+   }
+#ifdef _DEBUG
+   qlog("multibyte_client_encoding = %d   s = 0x%02X   multibyte_stat = %d\n", multibyte_client_encoding, s, multibyte_status );
+#endif
+   return( multibyte_status );
+}
diff --git a/src/interfaces/odbc/multibyte.h b/src/interfaces/odbc/multibyte.h
new file mode 100644 (file)
index 0000000..7b35ba5
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ *
+ * Multibyte library header ( psqlODBC Only )
+ *
+ *
+ */
+
+/* PostgreSQL client encoding */
+#define SQL_ASCII      0   /* SQL/ASCII */
+#define EUC_JP         1   /* EUC for Japanese */
+#define EUC_CN         2   /* EUC for Chinese */
+#define EUC_KR         3   /* EUC for Korean */
+#define EUC_TW         4   /* EUC for Taiwan */
+#define UNICODE            5   /* Unicode UTF-8 */
+#define MULE_INTERNAL  6   /* Mule internal code */
+#define LATIN1         7   /* ISO-8859 Latin 1 */
+#define LATIN2         8   /* ISO-8859 Latin 2 */
+#define LATIN3         9   /* ISO-8859 Latin 3 */
+#define LATIN4         10  /* ISO-8859 Latin 4 */
+#define LATIN5         11  /* ISO-8859 Latin 5 */
+#define LATIN6         12  /* ISO-8859 Latin 6 */
+#define LATIN7         13  /* ISO-8859 Latin 7 */
+#define LATIN8         14  /* ISO-8859 Latin 8 */
+#define LATIN9         15  /* ISO-8859 Latin 9 */
+#define KOI8           16  /* KOI8-R */
+#define WIN                17  /* windows-1251 */
+#define ALT                18  /* Alternativny Variant (MS-DOS CP866) */
+#define SJIS           32  /* Shift JIS */
+#define BIG5           33  /* Big5 */
+#define WIN1250            34  /* windows-1250 */
+
+
+extern int multibyte_client_encoding ; /* Multibyte client encoding. */
+extern int multibyte_status ;          /* Multibyte charcter status. */
+
+void multibyte_init(void);
+unsigned char *check_client_encoding(unsigned char *str);
+int multibyte_char_check(unsigned char s);
+unsigned char *multibyte_strchr(unsigned char *s, unsigned char c);