#include "postgres.h"#include "fmgr.h"#include "mb/pg_wchar.h"
Go to the source code of this file.
Functions | |
| PG_FUNCTION_INFO_V1 (euc_jis_2004_to_shift_jis_2004) | |
| PG_FUNCTION_INFO_V1 (shift_jis_2004_to_euc_jis_2004) | |
| Datum | euc_jis_2004_to_shift_jis_2004 (PG_FUNCTION_ARGS) |
| Datum | shift_jis_2004_to_euc_jis_2004 (PG_FUNCTION_ARGS) |
| static void | euc_jis_20042shift_jis_2004 (const unsigned char *euc, unsigned char *p, int len) |
| static void | shift_jis_20042euc_jis_2004 (const unsigned char *sjis, unsigned char *p, int len) |
| static int | get_ten (int b, int *ku) |
Variables | |
| PG_MODULE_MAGIC | |
| static void euc_jis_20042shift_jis_2004 | ( | const unsigned char * | euc, | |
| unsigned char * | p, | |||
| int | len | |||
| ) | [static] |
Definition at line 71 of file euc2004_sjis2004.c.
References IS_HIGHBIT_SET, pg_encoding_verifymb(), PG_EUC_JIS_2004, report_invalid_encoding(), SS2, and SS3.
Referenced by euc_jis_2004_to_shift_jis_2004().
{
int c1,
ku,
ten;
int l;
while (len > 0)
{
c1 = *euc;
if (!IS_HIGHBIT_SET(c1))
{
/* ASCII */
if (c1 == 0)
report_invalid_encoding(PG_EUC_JIS_2004,
(const char *) euc, len);
*p++ = c1;
euc++;
len--;
continue;
}
l = pg_encoding_verifymb(PG_EUC_JIS_2004, (const char *) euc, len);
if (l < 0)
report_invalid_encoding(PG_EUC_JIS_2004,
(const char *) euc, len);
if (c1 == SS2 && l == 2) /* JIS X 0201 kana? */
{
*p++ = euc[1];
}
else if (c1 == SS3 && l == 3) /* JIS X 0213 plane 2? */
{
ku = euc[1] - 0xa0;
ten = euc[2] - 0xa0;
switch (ku)
{
case 1:
case 3:
case 4:
case 5:
case 8:
case 12:
case 13:
case 14:
case 15:
*p++ = ((ku + 0x1df) >> 1) - (ku >> 3) * 3;
break;
default:
if (ku >= 78 && ku <= 94)
{
*p++ = (ku + 0x19b) >> 1;
}
else
report_invalid_encoding(PG_EUC_JIS_2004,
(const char *) euc, len);
}
if (ku % 2)
{
if (ten >= 1 && ten <= 63)
*p++ = ten + 0x3f;
else if (ten >= 64 && ten <= 94)
*p++ = ten + 0x40;
else
report_invalid_encoding(PG_EUC_JIS_2004,
(const char *) euc, len);
}
else
*p++ = ten + 0x9e;
}
else if (l == 2) /* JIS X 0213 plane 1? */
{
ku = c1 - 0xa0;
ten = euc[1] - 0xa0;
if (ku >= 1 && ku <= 62)
*p++ = (ku + 0x101) >> 1;
else if (ku >= 63 && ku <= 94)
*p++ = (ku + 0x181) >> 1;
else
report_invalid_encoding(PG_EUC_JIS_2004,
(const char *) euc, len);
if (ku % 2)
{
if (ten >= 1 && ten <= 63)
*p++ = ten + 0x3f;
else if (ten >= 64 && ten <= 94)
*p++ = ten + 0x40;
else
report_invalid_encoding(PG_EUC_JIS_2004,
(const char *) euc, len);
}
else
*p++ = ten + 0x9e;
}
else
report_invalid_encoding(PG_EUC_JIS_2004,
(const char *) euc, len);
euc += l;
len -= l;
}
*p = '\0';
}
| Datum euc_jis_2004_to_shift_jis_2004 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 40 of file euc2004_sjis2004.c.
References CHECK_ENCODING_CONVERSION_ARGS, euc_jis_20042shift_jis_2004(), PG_EUC_JIS_2004, PG_GETARG_CSTRING, PG_GETARG_INT32, PG_RETURN_VOID, and PG_SHIFT_JIS_2004.
{
unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
int len = PG_GETARG_INT32(4);
CHECK_ENCODING_CONVERSION_ARGS(PG_EUC_JIS_2004, PG_SHIFT_JIS_2004);
euc_jis_20042shift_jis_2004(src, dest, len);
PG_RETURN_VOID();
}
| static int get_ten | ( | int | b, | |
| int * | ku | |||
| ) | [static] |
Definition at line 187 of file euc2004_sjis2004.c.
Referenced by shift_jis_20042euc_jis_2004().
{
int ten;
if (b >= 0x40 && b <= 0x7e)
{
ten = b - 0x3f;
*ku = 1;
}
else if (b >= 0x80 && b <= 0x9e)
{
ten = b - 0x40;
*ku = 1;
}
else if (b >= 0x9f && b <= 0xfc)
{
ten = b - 0x9e;
*ku = 0;
}
else
{
ten = -1; /* error */
*ku = 0; /* keep compiler quiet */
}
return ten;
}
| PG_FUNCTION_INFO_V1 | ( | shift_jis_2004_to_euc_jis_2004 | ) |
| PG_FUNCTION_INFO_V1 | ( | euc_jis_2004_to_shift_jis_2004 | ) |
| static void shift_jis_20042euc_jis_2004 | ( | const unsigned char * | sjis, | |
| unsigned char * | p, | |||
| int | len | |||
| ) | [static] |
Definition at line 219 of file euc2004_sjis2004.c.
References get_ten(), IS_HIGHBIT_SET, pg_encoding_verifymb(), PG_SHIFT_JIS_2004, and report_invalid_encoding().
Referenced by shift_jis_2004_to_euc_jis_2004().
{
int c1;
int ku,
ten,
kubun;
int plane;
int l;
while (len > 0)
{
c1 = *sjis;
if (!IS_HIGHBIT_SET(c1))
{
/* ASCII */
if (c1 == 0)
report_invalid_encoding(PG_SHIFT_JIS_2004,
(const char *) sjis, len);
*p++ = c1;
sjis++;
len--;
continue;
}
l = pg_encoding_verifymb(PG_SHIFT_JIS_2004, (const char *) sjis, len);
if (l < 0 || l > len)
report_invalid_encoding(PG_SHIFT_JIS_2004,
(const char *) sjis, len);
if (c1 >= 0xa1 && c1 <= 0xdf && l == 1)
{
/* JIS X0201 (1 byte kana) */
*p++ = SS2;
*p++ = c1;
}
else if (l == 2)
{
int c2 = sjis[1];
plane = 1;
ku = 1;
ten = 1;
/*
* JIS X 0213
*/
if (c1 >= 0x81 && c1 <= 0x9f) /* plane 1 1ku-62ku */
{
ku = (c1 << 1) - 0x100;
ten = get_ten(c2, &kubun);
if (ten < 0)
report_invalid_encoding(PG_SHIFT_JIS_2004,
(const char *) sjis, len);
ku -= kubun;
}
else if (c1 >= 0xe0 && c1 <= 0xef) /* plane 1 62ku-94ku */
{
ku = (c1 << 1) - 0x180;
ten = get_ten(c2, &kubun);
if (ten < 0)
report_invalid_encoding(PG_SHIFT_JIS_2004,
(const char *) sjis, len);
ku -= kubun;
}
else if (c1 >= 0xf0 && c1 <= 0xf3) /* plane 2
* 1,3,4,5,8,12,13,14,15 ku */
{
plane = 2;
ten = get_ten(c2, &kubun);
if (ten < 0)
report_invalid_encoding(PG_SHIFT_JIS_2004,
(const char *) sjis, len);
switch (c1)
{
case 0xf0:
ku = kubun == 0 ? 8 : 1;
break;
case 0xf1:
ku = kubun == 0 ? 4 : 3;
break;
case 0xf2:
ku = kubun == 0 ? 12 : 5;
break;
default:
ku = kubun == 0 ? 14 : 13;
break;
}
}
else if (c1 >= 0xf4 && c1 <= 0xfc) /* plane 2 78-94ku */
{
plane = 2;
ten = get_ten(c2, &kubun);
if (ten < 0)
report_invalid_encoding(PG_SHIFT_JIS_2004,
(const char *) sjis, len);
if (c1 == 0xf4 && kubun == 1)
ku = 15;
else
ku = (c1 << 1) - 0x19a - kubun;
}
else
report_invalid_encoding(PG_SHIFT_JIS_2004,
(const char *) sjis, len);
if (plane == 2)
*p++ = SS3;
*p++ = ku + 0xa0;
*p++ = ten + 0xa0;
}
sjis += l;
len -= l;
}
*p = '\0';
}
| Datum shift_jis_2004_to_euc_jis_2004 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 54 of file euc2004_sjis2004.c.
References CHECK_ENCODING_CONVERSION_ARGS, PG_EUC_JIS_2004, PG_GETARG_CSTRING, PG_GETARG_INT32, PG_RETURN_VOID, PG_SHIFT_JIS_2004, and shift_jis_20042euc_jis_2004().
{
unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
int len = PG_GETARG_INT32(4);
CHECK_ENCODING_CONVERSION_ARGS(PG_SHIFT_JIS_2004, PG_EUC_JIS_2004);
shift_jis_20042euc_jis_2004(src, dest, len);
PG_RETURN_VOID();
}
Definition at line 17 of file euc2004_sjis2004.c.
1.7.1