1 /*------------------------------------------------------------------------- 2 * 3 * BIG5 <--> UTF8 4 * 5 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group 6 * Portions Copyright (c) 1994, Regents of the University of California 7 * 8 * IDENTIFICATION 9 * src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c 10 * 11 *------------------------------------------------------------------------- 12 */ 13 14 #include "postgres.h" 15 #include "fmgr.h" 16 #include "mb/pg_wchar.h" 17 #include "../../Unicode/big5_to_utf8.map" 18 #include "../../Unicode/utf8_to_big5.map" 19 20 PG_MODULE_MAGIC; 21 22 PG_FUNCTION_INFO_V1(big5_to_utf8); 23 PG_FUNCTION_INFO_V1(utf8_to_big5); 24 25 /* ---------- 26 * conv_proc( 27 * INTEGER, -- source encoding id 28 * INTEGER, -- destination encoding id 29 * CSTRING, -- source string (null terminated C string) 30 * CSTRING, -- destination string (null terminated C string) 31 * INTEGER, -- source string length 32 * BOOL -- if true, don't throw an error if conversion fails 33 * ) returns INTEGER; 34 * 35 * Returns the number of bytes successfully converted. 36 * ---------- 37 */ 38 Datum 39 big5_to_utf8(PG_FUNCTION_ARGS) 40 { 41 unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2); 42 unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); 43 int len = PG_GETARG_INT32(4); 44 bool noError = PG_GETARG_BOOL(5); 45 int converted; 46 47 CHECK_ENCODING_CONVERSION_ARGS(PG_BIG5, PG_UTF8); 48 49 converted = LocalToUtf(src, len, dest, 50 &big5_to_unicode_tree, 51 NULL, 0, 52 NULL, 53 PG_BIG5, 54 noError); 55 56 PG_RETURN_INT32(converted); 57 } 58 59 Datum 60 utf8_to_big5(PG_FUNCTION_ARGS) 61 { 62 unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2); 63 unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3); 64 int len = PG_GETARG_INT32(4); 65 bool noError = PG_GETARG_BOOL(5); 66 int converted; 67 68 CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_BIG5); 69 70 converted = UtfToLocal(src, len, dest, 71 &big5_from_unicode_tree, 72 NULL, 0, 73 NULL, 74 PG_BIG5, 75 noError); 76 77 PG_RETURN_INT32(converted); 78 } 79