📄 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 * * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.69.2.1 2008/05/27 12:24:46 mha Exp $ */#include "postgres.h"#include "pg_wchar.h"static char * text_substring(const char * str, int32 start, int32 length, bool length_not_specified);/*可能只有这么一个函数有用。 same, with any encoding */intpg_encoding_mb2wchar_with_len(int encoding, const char *from, pg_wchar *to, int len){ return (*pg_wchar_table[encoding].mb2wchar_with_len) ((const unsigned char *) from, to, len);}intGetDatabaseEncoding(void){ return PG_UTF8;}/* 返回一个多字节字符的长度(包含的字节数) */intpg_mblen(const char *mbstr){ return ((*pg_wchar_table[GetDatabaseEncoding()].mblen) ((const unsigned char *) mbstr));}/* 返回一个多字节字符串的长度(wchar) */intpg_mbstrlen(const char *mbstr){ int len = 0; /* optimization for single byte encoding */ if (pg_database_encoding_max_length() == 1) return strlen(mbstr); while (*mbstr) { mbstr += pg_mblen(mbstr); len++; } return len;}char * mb_substr(const char * str, int32 start, int32 length){ return text_substring(str,start,length, false);}/* * text_substring - * 获取多字节字符串的子字符串。 * 参 数: * - string * - starting position (is one-based) * - string length * - 没有指定子字符长度,那么就取到最后。 * * 返回值:返回一个新分配的内存承载的字符串。调用程序必须自己释放。 * */static char * text_substring(const char * str, int32 start, int32 length, bool length_not_specified){ int32 eml = pg_database_encoding_max_length(); int32 S = start; /* start position */ int32 S1 = Max(S,1); /* 调整开始位置,保证至少从1开始 */ int32 L1 = 0; /* 调整后的子字符串的长度,按照wchar计算 */ int32 mbstr_len = pg_mbstrlen(str); /* 所给字符串按照wchar计算的总长度*/ const char * p_start = NULL; const char * p_end = NULL; char * ret = NULL; int i = 0; /*验证 并调整参数*/ if (length_not_specified) /* 如果没有指定长度 */ L1 = mbstr_len + 1 - S1; else { int E = S + length; /* end position */ /* 如果结尾比开始位置小,则按照 SQL99 所说的“报错”。 */ if ( length < 0) { fprintf(stderr,"negative substring length not allowed"); return NULL; } /* 如果结尾位置小于或等于0 ,则按 SQL99 所说的返回一个 zero-length字符串 */ if (E < 1) return (char *)calloc(1,sizeof(char)); /*确定长度*/ L1 = (E > (mbstr_len+1))? (mbstr_len + 1 - S1) : (E - S1); } /* 确定开始位置和终止位置。 */ if (eml == 1) /*如果是单字节的编码*/ { p_start = str + S1 - 1; p_end = p_start + L1; } else if (eml > 1)/*如果是非单字节编码*/ { /* 确定开始位置 */ p_start = str; for (i = 0; i < S1 - 1; i++) p_start += pg_mblen(p_start); p_end = p_start; /*确定终止位置,这个位置不算!*/ for (i = 0; i < L1; i++) p_end += pg_mblen(p_end); } else { fprintf(stderr,"invalid backend encoding: encoding max length < 1"); return NULL; } /*返回结果*/ ret = (char *) calloc((p_end - p_start + 1),sizeof(char)); if(ret == NULL) { fprintf(stderr,"alloc memory error!\n"); return NULL; } memcpy(ret, p_start , (p_end - p_start)); return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -