⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbutils.c

📁 从一个开源软件中摘取的正则表达式模块
💻 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 + -