*
* WIN <--> UTF8
*
- * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
PG_FUNCTION_INFO_V1(win_to_utf8);
PG_FUNCTION_INFO_V1(utf8_to_win);
-extern Datum win_to_utf8(PG_FUNCTION_ARGS);
-extern Datum utf8_to_win(PG_FUNCTION_ARGS);
-
/* ----------
* conv_proc(
* INTEGER, -- source encoding id
typedef struct
{
pg_enc encoding;
- pg_local_to_utf *map1; /* to UTF8 map name */
- pg_utf_to_local *map2; /* from UTF8 map name */
- int size1; /* size of map1 */
- int size2; /* size of map2 */
+ const pg_mb_radix_tree *map1; /* to UTF8 map name */
+ const pg_mb_radix_tree *map2; /* from UTF8 map name */
} pg_conv_map;
-static pg_conv_map maps[] = {
- {PG_WIN866, LUmapWIN866, ULmapWIN866,
- sizeof(LUmapWIN866) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN866) / sizeof(pg_utf_to_local)},
- {PG_WIN874, LUmapWIN874, ULmapWIN874,
- sizeof(LUmapWIN874) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN874) / sizeof(pg_utf_to_local)},
- {PG_WIN1250, LUmapWIN1250, ULmapWIN1250,
- sizeof(LUmapWIN1250) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1250) / sizeof(pg_utf_to_local)},
- {PG_WIN1251, LUmapWIN1251, ULmapWIN1251,
- sizeof(LUmapWIN1251) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1251) / sizeof(pg_utf_to_local)},
- {PG_WIN1252, LUmapWIN1252, ULmapWIN1252,
- sizeof(LUmapWIN1252) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1252) / sizeof(pg_utf_to_local)},
- {PG_WIN1253, LUmapWIN1253, ULmapWIN1253,
- sizeof(LUmapWIN1253) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1253) / sizeof(pg_utf_to_local)},
- {PG_WIN1254, LUmapWIN1254, ULmapWIN1254,
- sizeof(LUmapWIN1254) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1254) / sizeof(pg_utf_to_local)},
- {PG_WIN1255, LUmapWIN1255, ULmapWIN1255,
- sizeof(LUmapWIN1255) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1255) / sizeof(pg_utf_to_local)},
- {PG_WIN1256, LUmapWIN1256, ULmapWIN1256,
- sizeof(LUmapWIN1256) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1256) / sizeof(pg_utf_to_local)},
- {PG_WIN1257, LUmapWIN1257, ULmapWIN1257,
- sizeof(LUmapWIN1257) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1257) / sizeof(pg_utf_to_local)},
- {PG_WIN1258, LUmapWIN1258, ULmapWIN1258,
- sizeof(LUmapWIN1258) / sizeof(pg_local_to_utf),
- sizeof(ULmapWIN1258) / sizeof(pg_utf_to_local)},
+static const pg_conv_map maps[] = {
+ {PG_WIN866, &win866_to_unicode_tree, &win866_from_unicode_tree},
+ {PG_WIN874, &win874_to_unicode_tree, &win874_from_unicode_tree},
+ {PG_WIN1250, &win1250_to_unicode_tree, &win1250_from_unicode_tree},
+ {PG_WIN1251, &win1251_to_unicode_tree, &win1251_from_unicode_tree},
+ {PG_WIN1252, &win1252_to_unicode_tree, &win1252_from_unicode_tree},
+ {PG_WIN1253, &win1253_to_unicode_tree, &win1253_from_unicode_tree},
+ {PG_WIN1254, &win1254_to_unicode_tree, &win1254_from_unicode_tree},
+ {PG_WIN1255, &win1255_to_unicode_tree, &win1255_from_unicode_tree},
+ {PG_WIN1256, &win1256_to_unicode_tree, &win1256_from_unicode_tree},
+ {PG_WIN1257, &win1257_to_unicode_tree, &win1257_from_unicode_tree},
+ {PG_WIN1258, &win1258_to_unicode_tree, &win1258_from_unicode_tree},
};
Datum
CHECK_ENCODING_CONVERSION_ARGS(-1, PG_UTF8);
- for (i = 0; i < sizeof(maps) / sizeof(pg_conv_map); i++)
+ for (i = 0; i < lengthof(maps); i++)
{
if (encoding == maps[i].encoding)
{
- LocalToUtf(src, dest, maps[i].map1, NULL, maps[i].size1, 0, encoding, len);
+ LocalToUtf(src, len, dest,
+ maps[i].map1,
+ NULL, 0,
+ NULL,
+ encoding);
PG_RETURN_VOID();
}
}
ereport(ERROR,
(errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("unexpected encoding ID %d for WIN character sets", encoding)));
+ errmsg("unexpected encoding ID %d for WIN character sets",
+ encoding)));
PG_RETURN_VOID();
}
CHECK_ENCODING_CONVERSION_ARGS(PG_UTF8, -1);
- for (i = 0; i < sizeof(maps) / sizeof(pg_conv_map); i++)
+ for (i = 0; i < lengthof(maps); i++)
{
if (encoding == maps[i].encoding)
{
- UtfToLocal(src, dest, maps[i].map2, NULL, maps[i].size2, 0, encoding, len);
+ UtfToLocal(src, len, dest,
+ maps[i].map2,
+ NULL, 0,
+ NULL,
+ encoding);
PG_RETURN_VOID();
}
}
ereport(ERROR,
(errcode(ERRCODE_INTERNAL_ERROR),
- errmsg("unexpected encoding ID %d for WIN character sets", encoding)));
+ errmsg("unexpected encoding ID %d for WIN character sets",
+ encoding)));
PG_RETURN_VOID();
}