1/*-------------------------------------------------------------------------
2 *
3 * ASCII <--> UTF8
4 *
5 * Portions Copyright (c) 1996-2019, 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_ascii/utf8_and_ascii.c
10 *
11 *-------------------------------------------------------------------------
12 */
13
14#include "postgres.h"
15#include "fmgr.h"
16#include "mb/pg_wchar.h"
17
18PG_MODULE_MAGIC;
19
20PG_FUNCTION_INFO_V1(ascii_to_utf8);
21PG_FUNCTION_INFO_V1(utf8_to_ascii);
22
23/* ----------
24 * conv_proc(
25 * INTEGER, -- source encoding id
26 * INTEGER, -- destination encoding id
27 * CSTRING, -- source string (null terminated C string)
28 * CSTRING, -- destination string (null terminated C string)
29 * INTEGER -- source string length
30 * ) returns VOID;
31 * ----------
32 */
33
34Datum
35ascii_to_utf8(PG_FUNCTION_ARGS)
36{
37 unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
38 unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
39 int len = PG_GETARG_INT32(4);
40
41 CHECK_ENCODING_CONVERSION_ARGS(PG_SQL_ASCII, PG_UTF8);
42
43 /* this looks wrong, but basically we're just rejecting high-bit-set */
44 pg_ascii2mic(src, dest, len);
45
46 PG_RETURN_VOID();
47}
48
49Datum
50utf8_to_ascii(PG_FUNCTION_ARGS)
51{
52 unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
53 unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
54 int len = PG_GETARG_INT32(4);
55
56 CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, PG_SQL_ASCII);
57
58 /* this looks wrong, but basically we're just rejecting high-bit-set */
59 pg_mic2ascii(src, dest, len);
60
61 PG_RETURN_VOID();
62}
63