/* * MIC ---> LATINn when the charset's local codes map directly to MIC * * mic points to the source string of length len * p is the output area (must be large enough!) * lc is the mule character set id for the local encoding * encoding is the PG identifier for the local encoding */ void mic2latin(const unsigned char *mic, unsigned char *p, int len, int lc, int encoding) { int c1; while (len > 0) { c1 = *mic; if (c1 == 0) report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic, len); if (!IS_HIGHBIT_SET(c1)) { /* easy for ASCII */ *p++ = c1; mic++; len--; } else { int l = pg_mic_mblen(mic); if (len < l) report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic, len); if (l != 2 || c1 != lc || !IS_HIGHBIT_SET(mic[1])) report_untranslatable_char(PG_MULE_INTERNAL, encoding, (const char *) mic, len); *p++ = mic[1]; mic += 2; len -= 2; } } *p = '\0'; }
/* * MIC ---> EUC_KR */ static void mic2euc_kr(unsigned char *mic, unsigned char *p, int len) { int c1; while (len >= 0 && (c1 = *mic)) { len -= pg_mic_mblen(mic++); if (c1 == LC_KS5601) { *p++ = *mic++; *p++ = *mic++; } else if (c1 > 0x7f) { /* cannot convert to EUC_KR! */ mic--; pg_print_bogus_char(&mic, &p); } else { /* should be ASCII */ *p++ = c1; } } *p = '\0'; }
/* * mic2latin_with_table: a generic single byte charset encoding * conversion from the mule internal code to a local charset. * * mic points to the source string of length len * p is the output area (must be large enough!) * lc is the mule character set id for the local encoding * encoding is the PG identifier for the local encoding * tab holds conversion entries for the mule internal code's * second byte, starting from 128 (0x80). each entry in the table * holds the corresponding code point for the local charset. */ void mic2latin_with_table(const unsigned char *mic, unsigned char *p, int len, int lc, int encoding, const unsigned char *tab) { unsigned char c1, c2; while (len > 0) { c1 = *mic; if (c1 == 0) report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic, len); if (!IS_HIGHBIT_SET(c1)) { /* easy for ASCII */ *p++ = c1; mic++; len--; } else { int l = pg_mic_mblen(mic); if (len < l) report_invalid_encoding(PG_MULE_INTERNAL, (const char *) mic, len); if (l != 2 || c1 != lc || !IS_HIGHBIT_SET(mic[1]) || (c2 = tab[mic[1] - HIGHBIT]) == 0) { report_untranslatable_char(PG_MULE_INTERNAL, encoding, (const char *) mic, len); break; /* keep compiler quiet */ } *p++ = c2; mic += 2; len -= 2; } } *p = '\0'; }