]> granicus.if.org Git - postgresql/commitdiff
Oops I forgot to add new files for multibyte support.
authorHiroshi Inoue <inoue@tpf.co.jp>
Fri, 16 Mar 2001 13:03:04 +0000 (13:03 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
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 <string.h>
+#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);