summaryrefslogtreecommitdiff
path: root/src/backend/utils/mb/mbutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/mb/mbutils.c')
-rw-r--r--src/backend/utils/mb/mbutils.c49
1 files changed, 36 insertions, 13 deletions
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index 922f1e2fc76..6ee3317b7a7 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -3,7 +3,7 @@
* client encoding and server internal encoding.
* (currently mule internal code (mic) is used)
* Tatsuo Ishii
- * $Id: mbutils.c,v 1.11 2000/08/27 10:40:48 ishii Exp $ */
+ * $Id: mbutils.c,v 1.12 2000/10/12 06:06:50 ishii Exp $ */
#include "postgres.h"
@@ -21,8 +21,8 @@ static void (*server_from_mic) (); /* MIC to something */
/*
* find encoding table entry by encoding
*/
-static pg_encoding_conv_tbl *
-get_enc_ent(int encoding)
+pg_encoding_conv_tbl *
+pg_get_enc_ent(int encoding)
{
pg_encoding_conv_tbl *p = pg_conv_tbl;
@@ -35,8 +35,8 @@ get_enc_ent(int encoding)
}
/*
- * set the client encoding. if client/server encoding is
- * not supported, returns -1
+ * set the client encoding. if encoding conversion between
+ * client/server encoding is not supported, returns -1
*/
int
pg_set_client_encoding(int encoding)
@@ -52,8 +52,8 @@ pg_set_client_encoding(int encoding)
}
else if (current_server_encoding == MULE_INTERNAL)
{ /* server == MULE_INETRNAL? */
- client_to_mic = get_enc_ent(encoding)->to_mic;
- client_from_mic = get_enc_ent(encoding)->from_mic;
+ client_to_mic = pg_get_enc_ent(encoding)->to_mic;
+ client_from_mic = pg_get_enc_ent(encoding)->from_mic;
server_to_mic = server_from_mic = 0;
if (client_to_mic == 0 || client_from_mic == 0)
return (-1);
@@ -61,17 +61,33 @@ pg_set_client_encoding(int encoding)
else if (encoding == MULE_INTERNAL)
{ /* client == MULE_INETRNAL? */
client_to_mic = client_from_mic = 0;
- server_to_mic = get_enc_ent(current_server_encoding)->to_mic;
- server_from_mic = get_enc_ent(current_server_encoding)->from_mic;
+ server_to_mic = pg_get_enc_ent(current_server_encoding)->to_mic;
+ server_from_mic = pg_get_enc_ent(current_server_encoding)->from_mic;
+ if (server_to_mic == 0 || server_from_mic == 0)
+ return (-1);
+ }
+ else if (current_server_encoding == UNICODE)
+ { /* server == UNICODE? */
+ client_to_mic = pg_get_enc_ent(encoding)->to_unicode;
+ client_from_mic = pg_get_enc_ent(encoding)->from_unicode;
+ server_to_mic = server_from_mic = 0;
+ if (client_to_mic == 0 || client_from_mic == 0)
+ return (-1);
+ }
+ else if (encoding == UNICODE)
+ { /* client == UNICODE? */
+ client_to_mic = client_from_mic = 0;
+ server_to_mic = pg_get_enc_ent(current_server_encoding)->to_unicode;
+ server_from_mic = pg_get_enc_ent(current_server_encoding)->from_unicode;
if (server_to_mic == 0 || server_from_mic == 0)
return (-1);
}
else
{
- client_to_mic = get_enc_ent(encoding)->to_mic;
- client_from_mic = get_enc_ent(encoding)->from_mic;
- server_to_mic = get_enc_ent(current_server_encoding)->to_mic;
- server_from_mic = get_enc_ent(current_server_encoding)->from_mic;
+ client_to_mic = pg_get_enc_ent(encoding)->to_mic;
+ client_from_mic = pg_get_enc_ent(encoding)->from_mic;
+ server_to_mic = pg_get_enc_ent(current_server_encoding)->to_mic;
+ server_from_mic = pg_get_enc_ent(current_server_encoding)->from_mic;
if (client_to_mic == 0 || client_from_mic == 0)
return (-1);
if (server_to_mic == 0 || server_from_mic == 0)
@@ -193,6 +209,13 @@ pg_mblen(const unsigned char *mbstr)
return ((*pg_wchar_table[GetDatabaseEncoding()].mblen) (mbstr));
}
+/* returns the byte length of a multi-byte word with specified enciding */
+int
+pg_mblen_with_encoding(const unsigned char *mbstr, int encoding)
+{
+ return ((*pg_wchar_table[encoding].mblen) (mbstr));
+}
+
/* returns the length (counted as a wchar) of a multi-byte string */
int
pg_mbstrlen(const unsigned char *mbstr)