1
/*-------------------------------------------------------------------------
3
* ISO 8859 2-16 <--> UTF8
5
* Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
6
* Portions Copyright (c) 1994, Regents of the University of California
9
* src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c
11
*-------------------------------------------------------------------------
16
#include "mb/pg_wchar.h"
17
#include "../../Unicode/iso8859_10_to_utf8.map"
18
#include "../../Unicode/iso8859_13_to_utf8.map"
19
#include "../../Unicode/iso8859_14_to_utf8.map"
20
#include "../../Unicode/iso8859_15_to_utf8.map"
21
#include "../../Unicode/iso8859_2_to_utf8.map"
22
#include "../../Unicode/iso8859_3_to_utf8.map"
23
#include "../../Unicode/iso8859_4_to_utf8.map"
24
#include "../../Unicode/iso8859_5_to_utf8.map"
25
#include "../../Unicode/iso8859_6_to_utf8.map"
26
#include "../../Unicode/iso8859_7_to_utf8.map"
27
#include "../../Unicode/iso8859_8_to_utf8.map"
28
#include "../../Unicode/iso8859_9_to_utf8.map"
29
#include "../../Unicode/utf8_to_iso8859_10.map"
30
#include "../../Unicode/utf8_to_iso8859_13.map"
31
#include "../../Unicode/utf8_to_iso8859_14.map"
32
#include "../../Unicode/utf8_to_iso8859_15.map"
33
#include "../../Unicode/utf8_to_iso8859_16.map"
34
#include "../../Unicode/utf8_to_iso8859_2.map"
35
#include "../../Unicode/utf8_to_iso8859_3.map"
36
#include "../../Unicode/utf8_to_iso8859_4.map"
37
#include "../../Unicode/utf8_to_iso8859_5.map"
38
#include "../../Unicode/utf8_to_iso8859_6.map"
39
#include "../../Unicode/utf8_to_iso8859_7.map"
40
#include "../../Unicode/utf8_to_iso8859_8.map"
41
#include "../../Unicode/utf8_to_iso8859_9.map"
42
#include "../../Unicode/iso8859_16_to_utf8.map"
46
PG_FUNCTION_INFO_V1(iso8859_to_utf8);
47
PG_FUNCTION_INFO_V1(utf8_to_iso8859);
49
extern Datum iso8859_to_utf8(PG_FUNCTION_ARGS);
50
extern Datum utf8_to_iso8859(PG_FUNCTION_ARGS);
54
* INTEGER, -- source encoding id
55
* INTEGER, -- destination encoding id
56
* CSTRING, -- source string (null terminated C string)
57
* CSTRING, -- destination string (null terminated C string)
58
* INTEGER -- source string length
66
pg_local_to_utf *map1; /* to UTF8 map name */
67
pg_utf_to_local *map2; /* from UTF8 map name */
68
int size1; /* size of map1 */
69
int size2; /* size of map2 */
72
static pg_conv_map maps[] = {
73
{PG_LATIN2, LUmapISO8859_2, ULmapISO8859_2,
74
sizeof(LUmapISO8859_2) / sizeof(pg_local_to_utf),
75
sizeof(ULmapISO8859_2) / sizeof(pg_utf_to_local)}, /* ISO-8859-2 Latin 2 */
76
{PG_LATIN3, LUmapISO8859_3, ULmapISO8859_3,
77
sizeof(LUmapISO8859_3) / sizeof(pg_local_to_utf),
78
sizeof(ULmapISO8859_3) / sizeof(pg_utf_to_local)}, /* ISO-8859-3 Latin 3 */
79
{PG_LATIN4, LUmapISO8859_4, ULmapISO8859_4,
80
sizeof(LUmapISO8859_4) / sizeof(pg_local_to_utf),
81
sizeof(ULmapISO8859_4) / sizeof(pg_utf_to_local)}, /* ISO-8859-4 Latin 4 */
82
{PG_LATIN5, LUmapISO8859_9, ULmapISO8859_9,
83
sizeof(LUmapISO8859_9) / sizeof(pg_local_to_utf),
84
sizeof(ULmapISO8859_9) / sizeof(pg_utf_to_local)}, /* ISO-8859-9 Latin 5 */
85
{PG_LATIN6, LUmapISO8859_10, ULmapISO8859_10,
86
sizeof(LUmapISO8859_10) / sizeof(pg_local_to_utf),
87
sizeof(ULmapISO8859_10) / sizeof(pg_utf_to_local)}, /* ISO-8859-10 Latin 6 */
88
{PG_LATIN7, LUmapISO8859_13, ULmapISO8859_13,
89
sizeof(LUmapISO8859_13) / sizeof(pg_local_to_utf),
90
sizeof(ULmapISO8859_13) / sizeof(pg_utf_to_local)}, /* ISO-8859-13 Latin 7 */
91
{PG_LATIN8, LUmapISO8859_14, ULmapISO8859_14,
92
sizeof(LUmapISO8859_14) / sizeof(pg_local_to_utf),
93
sizeof(ULmapISO8859_14) / sizeof(pg_utf_to_local)}, /* ISO-8859-14 Latin 8 */
94
{PG_LATIN9, LUmapISO8859_15, ULmapISO8859_15,
95
sizeof(LUmapISO8859_15) / sizeof(pg_local_to_utf),
96
sizeof(ULmapISO8859_15) / sizeof(pg_utf_to_local)}, /* ISO-8859-15 Latin 9 */
97
{PG_LATIN10, LUmapISO8859_16, ULmapISO8859_16,
98
sizeof(LUmapISO8859_16) / sizeof(pg_local_to_utf),
99
sizeof(ULmapISO8859_16) / sizeof(pg_utf_to_local)}, /* ISO-8859-16 Latin 10 */
100
{PG_ISO_8859_5, LUmapISO8859_5, ULmapISO8859_5,
101
sizeof(LUmapISO8859_5) / sizeof(pg_local_to_utf),
102
sizeof(ULmapISO8859_5) / sizeof(pg_utf_to_local)}, /* ISO-8859-5 */
103
{PG_ISO_8859_6, LUmapISO8859_6, ULmapISO8859_6,
104
sizeof(LUmapISO8859_6) / sizeof(pg_local_to_utf),
105
sizeof(ULmapISO8859_6) / sizeof(pg_utf_to_local)}, /* ISO-8859-6 */
106
{PG_ISO_8859_7, LUmapISO8859_7, ULmapISO8859_7,
107
sizeof(LUmapISO8859_7) / sizeof(pg_local_to_utf),
108
sizeof(ULmapISO8859_7) / sizeof(pg_utf_to_local)}, /* ISO-8859-7 */
109
{PG_ISO_8859_8, LUmapISO8859_8, ULmapISO8859_8,
110
sizeof(LUmapISO8859_8) / sizeof(pg_local_to_utf),
111
sizeof(ULmapISO8859_8) / sizeof(pg_utf_to_local)}, /* ISO-8859-8 */
115
iso8859_to_utf8(PG_FUNCTION_ARGS)
117
int encoding = PG_GETARG_INT32(0);
118
unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
119
unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
120
int len = PG_GETARG_INT32(4);
123
CHECK_ENCODING_CONVERSION_ARGS(-1, PG_UTF8);
125
for (i = 0; i < sizeof(maps) / sizeof(pg_conv_map); i++)
127
if (encoding == maps[i].encoding)
129
LocalToUtf(src, dest, maps[i].map1, NULL, maps[i].size1, 0, encoding, len);
135
(errcode(ERRCODE_INTERNAL_ERROR),
136
errmsg("unexpected encoding ID %d for ISO 8859 character sets", encoding)));
142
utf8_to_iso8859(PG_FUNCTION_ARGS)
144
int encoding = PG_GETARG_INT32(1);
145
unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
146
unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
147
int len = PG_GETARG_INT32(4);
150
CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, -1);
152
for (i = 0; i < sizeof(maps) / sizeof(pg_conv_map); i++)
154
if (encoding == maps[i].encoding)
156
UtfToLocal(src, dest, maps[i].map2, NULL, maps[i].size2, 0, encoding, len);
162
(errcode(ERRCODE_INTERNAL_ERROR),
163
errmsg("unexpected encoding ID %d for ISO 8859 character sets", encoding)));