📄 mbutils.c
字号:
/* * This file contains public functions for conversion between * client encoding and server internal encoding. * (currently mule internal code (mic) is used) * Tatsuo Ishii * $Id: mbutils.c,v 1.6.2.1 1999/08/02 05:25:12 scrappy Exp $ */#include "postgres.h"#include "miscadmin.h"#include "mb/pg_wchar.h"static int client_encoding = -1;static void (*client_to_mic) ();/* something to MIC */static void (*client_from_mic) (); /* MIC to something */static void (*server_to_mic) ();/* something to MIC */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 *p = pg_conv_tbl; for (; p->encoding >= 0; p++) { if (p->encoding == encoding) return (p); } return (0);}/* * set the client encoding. if client/server encoding is * not supported, returns -1 */intpg_set_client_encoding(int encoding){ int current_server_encoding = GetDatabaseEncoding(); client_encoding = encoding; if (client_encoding == current_server_encoding) { /* server == client? */ client_to_mic = client_from_mic = 0; server_to_mic = server_from_mic = 0; } 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; server_to_mic = server_from_mic = 0; if (client_to_mic == 0 || client_from_mic == 0) return (-1); } 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; 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; if (client_to_mic == 0 || client_from_mic == 0) return (-1); if (server_to_mic == 0 || server_from_mic == 0) return (-1); } return (0);}/* * returns the current client encoding */intpg_get_client_encoding(){ if (client_encoding == -1) { /* this is the first time */ client_encoding = GetDatabaseEncoding(); } return (client_encoding);}/* * convert client encoding to server encoding. if server_encoding == * client_encoding or no conversion function exists, * returns s. So be careful. */unsigned char *pg_client_to_server(unsigned char *s, int len){ static unsigned char b1[MAX_PARSE_BUFFER * 4]; /* is this enough? */ static unsigned char b2[MAX_PARSE_BUFFER * 4]; /* is this enough? */ unsigned char *p = s; if (client_encoding == GetDatabaseEncoding()) return (p); if (client_to_mic) { (*client_to_mic) (s, b1, len); len = strlen(b1); p = b1; } if (server_from_mic) { (*server_from_mic) (p, b2, len); p = b2; } return (p);}/* * convert server encoding to client encoding. if server_encoding == * client_encoding or no conversion function exists, * returns s. So be careful. */unsigned char *pg_server_to_client(unsigned char *s, int len){ static unsigned char b1[MAX_PARSE_BUFFER * 4]; /* is this enough? */ static unsigned char b2[MAX_PARSE_BUFFER * 4]; /* is this enough? */ unsigned char *p = s; if (client_encoding == GetDatabaseEncoding()) return (p); if (server_to_mic) { (*server_to_mic) (s, b1, len); len = strlen(b1); p = b1; } if (client_from_mic) { (*client_from_mic) (p, b2, len); p = b2; } return (p);}/* convert a multi-byte string to a wchar */voidpg_mb2wchar(const unsigned char *from, pg_wchar * to){ (*pg_wchar_table[GetDatabaseEncoding()].mb2wchar_with_len) (from, to, strlen(from));}/* convert a multi-byte string to a wchar with a limited length */voidpg_mb2wchar_with_len(const unsigned char *from, pg_wchar * to, int len){ (*pg_wchar_table[GetDatabaseEncoding()].mb2wchar_with_len) (from, to, len);}/* returns the byte length of a multi-byte word */intpg_mblen(const unsigned char *mbstr){ return ((*pg_wchar_table[GetDatabaseEncoding()].mblen) (mbstr));}/* returns the length (counted as a wchar) of a multi-byte string */intpg_mbstrlen(const unsigned char *mbstr){ int len = 0; while (*mbstr) { mbstr += pg_mblen(mbstr); len++; } return (len);}/* returns the length (counted as a wchar) of a multi-byte string (not necessarily NULL terminated) */intpg_mbstrlen_with_len(const unsigned char *mbstr, int limit){ int len = 0; int l; while (*mbstr && limit > 0) { l = pg_mblen(mbstr); limit -= l; mbstr += l; len++; } return (len);}/* * returns the length of a multi-byte string * (not necessarily NULL terminated) * that is not longer than limit. * this function does not break multi-byte word boundary. */intpg_mbcliplen(const unsigned char *mbstr, int len, int limit){ int clen = 0; int l; while (*mbstr && len > 0) { l = pg_mblen(mbstr); if ((clen + l) > limit) break; clen += l; if (clen == limit) break; len -= l; mbstr += l; } return (clen);}/* * fuctions for utils/init */static int DatabaseEncoding = MULTIBYTE;voidSetDatabaseEncoding(int encoding){ DatabaseEncoding = encoding;}intGetDatabaseEncoding(){ return (DatabaseEncoding);}/* for builtin-function */const char *getdatabaseencoding(){ return (pg_encoding_to_char(DatabaseEncoding));}/* set and get template1 database encoding */static int templateEncoding;voidSetTemplateEncoding(int encoding){ templateEncoding = encoding;}intGetTemplateEncoding(){ return (templateEncoding);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -