Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * LATINn and MULE_INTERNAL
4 : *
5 : * Portions Copyright (c) 1996-2025, 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/latin_and_mic/latin_and_mic.c
10 : *
11 : *-------------------------------------------------------------------------
12 : */
13 :
14 : #include "postgres.h"
15 : #include "fmgr.h"
16 : #include "mb/pg_wchar.h"
17 :
18 6 : PG_MODULE_MAGIC_EXT(
19 : .name = "latin_and_mic",
20 : .version = PG_VERSION
21 : );
22 :
23 6 : PG_FUNCTION_INFO_V1(latin1_to_mic);
24 6 : PG_FUNCTION_INFO_V1(mic_to_latin1);
25 6 : PG_FUNCTION_INFO_V1(latin3_to_mic);
26 6 : PG_FUNCTION_INFO_V1(mic_to_latin3);
27 6 : PG_FUNCTION_INFO_V1(latin4_to_mic);
28 6 : PG_FUNCTION_INFO_V1(mic_to_latin4);
29 :
30 : /* ----------
31 : * conv_proc(
32 : * INTEGER, -- source encoding id
33 : * INTEGER, -- destination encoding id
34 : * CSTRING, -- source string (null terminated C string)
35 : * CSTRING, -- destination string (null terminated C string)
36 : * INTEGER, -- source string length
37 : * BOOL -- if true, don't throw an error if conversion fails
38 : * ) returns INTEGER;
39 : *
40 : * Returns the number of bytes successfully converted.
41 : * ----------
42 : */
43 :
44 :
45 : Datum
46 6 : latin1_to_mic(PG_FUNCTION_ARGS)
47 : {
48 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
49 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
50 6 : int len = PG_GETARG_INT32(4);
51 6 : bool noError = PG_GETARG_BOOL(5);
52 : int converted;
53 :
54 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN1, PG_MULE_INTERNAL);
55 :
56 6 : converted = latin2mic(src, dest, len, LC_ISO8859_1, PG_LATIN1, noError);
57 :
58 6 : PG_RETURN_INT32(converted);
59 : }
60 :
61 : Datum
62 6 : mic_to_latin1(PG_FUNCTION_ARGS)
63 : {
64 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
65 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
66 6 : int len = PG_GETARG_INT32(4);
67 6 : bool noError = PG_GETARG_BOOL(5);
68 : int converted;
69 :
70 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN1);
71 :
72 6 : converted = mic2latin(src, dest, len, LC_ISO8859_1, PG_LATIN1, noError);
73 :
74 6 : PG_RETURN_INT32(converted);
75 : }
76 :
77 : Datum
78 6 : latin3_to_mic(PG_FUNCTION_ARGS)
79 : {
80 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
81 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
82 6 : int len = PG_GETARG_INT32(4);
83 6 : bool noError = PG_GETARG_BOOL(5);
84 : int converted;
85 :
86 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN3, PG_MULE_INTERNAL);
87 :
88 6 : converted = latin2mic(src, dest, len, LC_ISO8859_3, PG_LATIN3, noError);
89 :
90 6 : PG_RETURN_INT32(converted);
91 : }
92 :
93 : Datum
94 6 : mic_to_latin3(PG_FUNCTION_ARGS)
95 : {
96 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
97 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
98 6 : int len = PG_GETARG_INT32(4);
99 6 : bool noError = PG_GETARG_BOOL(5);
100 : int converted;
101 :
102 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN3);
103 :
104 6 : converted = mic2latin(src, dest, len, LC_ISO8859_3, PG_LATIN3, noError);
105 :
106 6 : PG_RETURN_INT32(converted);
107 : }
108 :
109 : Datum
110 6 : latin4_to_mic(PG_FUNCTION_ARGS)
111 : {
112 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
113 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
114 6 : int len = PG_GETARG_INT32(4);
115 6 : bool noError = PG_GETARG_BOOL(5);
116 : int converted;
117 :
118 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_LATIN4, PG_MULE_INTERNAL);
119 :
120 6 : converted = latin2mic(src, dest, len, LC_ISO8859_4, PG_LATIN4, noError);
121 :
122 6 : PG_RETURN_INT32(converted);
123 : }
124 :
125 : Datum
126 6 : mic_to_latin4(PG_FUNCTION_ARGS)
127 : {
128 6 : unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
129 6 : unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
130 6 : int len = PG_GETARG_INT32(4);
131 6 : bool noError = PG_GETARG_BOOL(5);
132 : int converted;
133 :
134 6 : CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_LATIN4);
135 :
136 6 : converted = mic2latin(src, dest, len, LC_ISO8859_4, PG_LATIN4, noError);
137 :
138 6 : PG_RETURN_INT32(converted);
139 : }
|