euc_kr_and_mic.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 125 行

C
125
字号
/*------------------------------------------------------------------------- * *	  EUC_KR and MULE_INTERNAL * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION *	  $Header: /cvsroot/pgsql/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c,v 1.6 2003/08/04 02:40:07 momjian Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include "fmgr.h"#include "mb/pg_wchar.h"PG_FUNCTION_INFO_V1(euc_kr_to_mic);PG_FUNCTION_INFO_V1(mic_to_euc_kr);extern Datum euc_kr_to_mic(PG_FUNCTION_ARGS);extern Datum mic_to_euc_kr(PG_FUNCTION_ARGS);/* ---------- * conv_proc( *		INTEGER,	-- source encoding id *		INTEGER,	-- destination encoding id *		CSTRING,	-- source string (null terminated C string) *		CSTRING,	-- destination string (null terminated C string) *		INTEGER		-- source string length * ) returns VOID; * ---------- */static void euc_kr2mic(unsigned char *euc, unsigned char *p, int len);static void mic2euc_kr(unsigned char *mic, unsigned char *p, int len);Datumeuc_kr_to_mic(PG_FUNCTION_ARGS){	unsigned char *src = PG_GETARG_CSTRING(2);	unsigned char *dest = PG_GETARG_CSTRING(3);	int			len = PG_GETARG_INT32(4);	Assert(PG_GETARG_INT32(0) == PG_EUC_KR);	Assert(PG_GETARG_INT32(1) == PG_MULE_INTERNAL);	Assert(len >= 0);	euc_kr2mic(src, dest, len);	PG_RETURN_VOID();}Datummic_to_euc_kr(PG_FUNCTION_ARGS){	unsigned char *src = PG_GETARG_CSTRING(2);	unsigned char *dest = PG_GETARG_CSTRING(3);	int			len = PG_GETARG_INT32(4);	Assert(PG_GETARG_INT32(0) == PG_MULE_INTERNAL);	Assert(PG_GETARG_INT32(1) == PG_EUC_KR);	Assert(len >= 0);	mic2euc_kr(src, dest, len);	PG_RETURN_VOID();}/* * EUC_KR ---> MIC */static voideuc_kr2mic(unsigned char *euc, unsigned char *p, int len){	int			c1;	while (len >= 0 && (c1 = *euc++))	{		if (c1 & 0x80)		{			len -= 2;			*p++ = LC_KS5601;			*p++ = c1;			*p++ = *euc++;		}		else		{						/* should be ASCII */			len--;			*p++ = c1;		}	}	*p = '\0';}/* * MIC ---> EUC_KR */static voidmic2euc_kr(unsigned char *mic, unsigned char *p, int len){	int			c1;	while (len >= 0 && (c1 = *mic))	{		len -= pg_mic_mblen(mic++);		if (c1 == LC_KS5601)		{			*p++ = *mic++;			*p++ = *mic++;		}		else if (c1 > 0x7f)		{						/* cannot convert to EUC_KR! */			mic--;			pg_print_bogus_char(&mic, &p);		}		else		{						/* should be ASCII */			*p++ = c1;		}	}	*p = '\0';}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?