LCOV - code coverage report
Current view: top level - src/backend/utils/mb/conversion_procs/cyrillic_and_mic - cyrillic_and_mic.c (source / functions) Hit Total Coverage
Test: PostgreSQL 14devel Lines: 181 181 100.0 %
Date: 2021-05-13 08:06:46 Functions: 41 41 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*-------------------------------------------------------------------------
       2             :  *
       3             :  *    Cyrillic and MULE_INTERNAL
       4             :  *
       5             :  * Portions Copyright (c) 1996-2021, 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/cyrillic_and_mic/cyrillic_and_mic.c
      10             :  *
      11             :  *-------------------------------------------------------------------------
      12             :  */
      13             : 
      14             : #include "postgres.h"
      15             : #include "fmgr.h"
      16             : #include "mb/pg_wchar.h"
      17             : 
      18           8 : PG_MODULE_MAGIC;
      19             : 
      20           4 : PG_FUNCTION_INFO_V1(koi8r_to_mic);
      21           8 : PG_FUNCTION_INFO_V1(mic_to_koi8r);
      22           8 : PG_FUNCTION_INFO_V1(iso_to_mic);
      23           8 : PG_FUNCTION_INFO_V1(mic_to_iso);
      24           4 : PG_FUNCTION_INFO_V1(win1251_to_mic);
      25           4 : PG_FUNCTION_INFO_V1(mic_to_win1251);
      26           4 : PG_FUNCTION_INFO_V1(win866_to_mic);
      27           4 : PG_FUNCTION_INFO_V1(mic_to_win866);
      28           4 : PG_FUNCTION_INFO_V1(koi8r_to_win1251);
      29           4 : PG_FUNCTION_INFO_V1(win1251_to_koi8r);
      30           4 : PG_FUNCTION_INFO_V1(koi8r_to_win866);
      31           4 : PG_FUNCTION_INFO_V1(win866_to_koi8r);
      32           4 : PG_FUNCTION_INFO_V1(win866_to_win1251);
      33           4 : PG_FUNCTION_INFO_V1(win1251_to_win866);
      34           8 : PG_FUNCTION_INFO_V1(iso_to_koi8r);
      35           4 : PG_FUNCTION_INFO_V1(koi8r_to_iso);
      36           4 : PG_FUNCTION_INFO_V1(iso_to_win1251);
      37           4 : PG_FUNCTION_INFO_V1(win1251_to_iso);
      38           4 : PG_FUNCTION_INFO_V1(iso_to_win866);
      39           4 : PG_FUNCTION_INFO_V1(win866_to_iso);
      40             : 
      41             : /* ----------
      42             :  * conv_proc(
      43             :  *      INTEGER,    -- source encoding id
      44             :  *      INTEGER,    -- destination encoding id
      45             :  *      CSTRING,    -- source string (null terminated C string)
      46             :  *      CSTRING,    -- destination string (null terminated C string)
      47             :  *      INTEGER,    -- source string length
      48             :  *      BOOL        -- if true, don't throw an error if conversion fails
      49             :  * ) returns INTEGER;
      50             :  *
      51             :  * Returns the number of bytes successfully converted.
      52             :  * ----------
      53             :  */
      54             : 
      55             : /*
      56             :  * Cyrillic support
      57             :  * currently supported Cyrillic encodings:
      58             :  *
      59             :  * KOI8-R (this is also the charset for the mule internal code for Cyrillic)
      60             :  * ISO-8859-5
      61             :  * Microsoft's CP1251 (windows-1251)
      62             :  * Alternativny Variant (MS-DOS CP866)
      63             :  */
      64             : 
      65             : /* ISO-8859-5 to KOI8-R */
      66             : static const unsigned char iso2koi[] = {
      67             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      68             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      69             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      70             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      71             :     0x00, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      72             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      73             :     0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
      74             :     0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
      75             :     0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
      76             :     0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
      77             :     0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
      78             :     0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
      79             :     0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
      80             :     0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1,
      81             :     0x00, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      82             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
      83             : };
      84             : 
      85             : /* KOI8-R to ISO-8859-5 */
      86             : static const unsigned char koi2iso[] = {
      87             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      88             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      89             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      90             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      91             :     0x00, 0x00, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00,
      92             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      93             :     0x00, 0x00, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00,
      94             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      95             :     0xEE, 0xD0, 0xD1, 0xE6, 0xD4, 0xD5, 0xE4, 0xD3,
      96             :     0xE5, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE,
      97             :     0xDF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xD6, 0xD2,
      98             :     0xEC, 0xEB, 0xD7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA,
      99             :     0xCE, 0xB0, 0xB1, 0xC6, 0xB4, 0xB5, 0xC4, 0xB3,
     100             :     0xC5, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE,
     101             :     0xBF, 0xCF, 0xC0, 0xC1, 0xC2, 0xC3, 0xB6, 0xB2,
     102             :     0xCC, 0xCB, 0xB7, 0xC8, 0xCD, 0xC9, 0xC7, 0xCA
     103             : };
     104             : 
     105             : /* WIN1251 to KOI8-R */
     106             : static const unsigned char win12512koi[] = {
     107             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     108             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     109             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     110             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     111             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
     112             :     0xB3, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x00, 0xB7,
     113             :     0x00, 0x00, 0xB6, 0xA6, 0xAD, 0x00, 0x00, 0x00,
     114             :     0xA3, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, 0xA7,
     115             :     0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
     116             :     0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
     117             :     0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
     118             :     0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
     119             :     0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
     120             :     0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
     121             :     0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
     122             :     0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1
     123             : };
     124             : 
     125             : /* KOI8-R to WIN1251 */
     126             : static const unsigned char koi2win1251[] = {
     127             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     128             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     129             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     130             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     131             :     0x00, 0x00, 0x00, 0xB8, 0xBA, 0x00, 0xB3, 0xBF,
     132             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00,
     133             :     0x00, 0x00, 0x00, 0xA8, 0xAA, 0x00, 0xB2, 0xAF,
     134             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x00, 0x00,
     135             :     0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
     136             :     0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
     137             :     0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
     138             :     0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
     139             :     0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
     140             :     0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
     141             :     0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
     142             :     0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA
     143             : };
     144             : 
     145             : /* WIN866 to KOI8-R */
     146             : static const unsigned char win8662koi[] = {
     147             :     0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
     148             :     0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
     149             :     0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
     150             :     0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
     151             :     0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
     152             :     0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
     153             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     154             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
     155             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     156             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     157             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     158             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     159             :     0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
     160             :     0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1,
     161             :     0xB3, 0xA3, 0xB4, 0xA4, 0xB7, 0xA7, 0x00, 0x00,
     162             :     0xB6, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     163             : };
     164             : 
     165             : /* KOI8-R to WIN866 */
     166             : static const unsigned char koi2win866[] = {
     167             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     168             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     169             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     170             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     171             :     0x00, 0x00, 0x00, 0xF1, 0xF3, 0x00, 0xF9, 0xF5,
     172             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x00, 0x00,
     173             :     0x00, 0x00, 0x00, 0xF0, 0xF2, 0x00, 0xF8, 0xF4,
     174             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
     175             :     0xEE, 0xA0, 0xA1, 0xE6, 0xA4, 0xA5, 0xE4, 0xA3,
     176             :     0xE5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE,
     177             :     0xAF, 0xEF, 0xE0, 0xE1, 0xE2, 0xE3, 0xA6, 0xA2,
     178             :     0xEC, 0xEB, 0xA7, 0xE8, 0xED, 0xE9, 0xE7, 0xEA,
     179             :     0x9E, 0x80, 0x81, 0x96, 0x84, 0x85, 0x94, 0x83,
     180             :     0x95, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
     181             :     0x8F, 0x9F, 0x90, 0x91, 0x92, 0x93, 0x86, 0x82,
     182             :     0x9C, 0x9B, 0x87, 0x98, 0x9D, 0x99, 0x97, 0x9A
     183             : };
     184             : 
     185             : /* WIN866 to WIN1251 */
     186             : static const unsigned char win8662win1251[] = {
     187             :     0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
     188             :     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
     189             :     0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
     190             :     0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
     191             :     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
     192             :     0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
     193             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     194             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x00, 0x00,
     195             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     196             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     197             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     198             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     199             :     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
     200             :     0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
     201             :     0xA8, 0xB8, 0xAA, 0xBA, 0xAF, 0xBF, 0x00, 0x00,
     202             :     0xB2, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     203             : };
     204             : 
     205             : /* WIN1251 to WIN866 */
     206             : static const unsigned char win12512win866[] = {
     207             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     208             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     209             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     210             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     211             :     0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0x00, 0x00,
     212             :     0xF0, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00, 0xF4,
     213             :     0x00, 0x00, 0xF8, 0xF9, 0xAD, 0x00, 0x00, 0x00,
     214             :     0xF1, 0x00, 0xF3, 0x00, 0x00, 0x00, 0x00, 0xF5,
     215             :     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
     216             :     0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
     217             :     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
     218             :     0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
     219             :     0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
     220             :     0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
     221             :     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
     222             :     0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF
     223             : };
     224             : 
     225             : /* ISO-8859-5 to WIN1251 */
     226             : static const unsigned char iso2win1251[] = {
     227             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     228             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     229             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     230             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     231             :     0x00, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     232             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     233             :     0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
     234             :     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
     235             :     0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
     236             :     0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
     237             :     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
     238             :     0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
     239             :     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
     240             :     0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
     241             :     0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     242             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     243             : };
     244             : 
     245             : /* WIN1251 to ISO-8859-5 */
     246             : static const unsigned char win12512iso[] = {
     247             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     248             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     249             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     250             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     251             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     252             :     0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     253             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     254             :     0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     255             :     0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
     256             :     0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
     257             :     0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
     258             :     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
     259             :     0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
     260             :     0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
     261             :     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
     262             :     0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF
     263             : };
     264             : 
     265             : /* ISO-8859-5 to WIN866 */
     266             : static const unsigned char iso2win866[] = {
     267             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     268             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     269             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     270             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     271             :     0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     272             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     273             :     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
     274             :     0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
     275             :     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
     276             :     0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
     277             :     0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
     278             :     0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
     279             :     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
     280             :     0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
     281             :     0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     282             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     283             : };
     284             : 
     285             : /* WIN866 to ISO-8859-5 */
     286             : static const unsigned char win8662iso[] = {
     287             :     0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
     288             :     0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
     289             :     0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
     290             :     0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
     291             :     0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
     292             :     0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
     293             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     294             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     295             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     296             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     297             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     298             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     299             :     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
     300             :     0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
     301             :     0xA1, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     302             :     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
     303             : };
     304             : 
     305             : 
     306             : Datum
     307           4 : koi8r_to_mic(PG_FUNCTION_ARGS)
     308             : {
     309           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     310           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     311           4 :     int         len = PG_GETARG_INT32(4);
     312           4 :     bool        noError = PG_GETARG_BOOL(5);
     313             :     int         converted;
     314             : 
     315           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_MULE_INTERNAL);
     316             : 
     317           4 :     converted = latin2mic(src, dest, len, LC_KOI8_R, PG_KOI8R, noError);
     318             : 
     319           4 :     PG_RETURN_INT32(converted);
     320             : }
     321             : 
     322             : Datum
     323         220 : mic_to_koi8r(PG_FUNCTION_ARGS)
     324             : {
     325         220 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     326         220 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     327         220 :     int         len = PG_GETARG_INT32(4);
     328         220 :     bool        noError = PG_GETARG_BOOL(5);
     329             :     int         converted;
     330             : 
     331         220 :     CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_KOI8R);
     332             : 
     333         220 :     converted = mic2latin(src, dest, len, LC_KOI8_R, PG_KOI8R, noError);
     334             : 
     335         124 :     PG_RETURN_INT32(converted);
     336             : }
     337             : 
     338             : Datum
     339         100 : iso_to_mic(PG_FUNCTION_ARGS)
     340             : {
     341         100 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     342         100 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     343         100 :     int         len = PG_GETARG_INT32(4);
     344         100 :     bool        noError = PG_GETARG_BOOL(5);
     345             :     int         converted;
     346             : 
     347         100 :     CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_MULE_INTERNAL);
     348             : 
     349         100 :     converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_ISO_8859_5, iso2koi, noError);
     350             : 
     351          64 :     PG_RETURN_INT32(converted);
     352             : }
     353             : 
     354             : Datum
     355         220 : mic_to_iso(PG_FUNCTION_ARGS)
     356             : {
     357         220 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     358         220 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     359         220 :     int         len = PG_GETARG_INT32(4);
     360         220 :     bool        noError = PG_GETARG_BOOL(5);
     361             :     int         converted;
     362             : 
     363         220 :     CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_ISO_8859_5);
     364             : 
     365         220 :     converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_ISO_8859_5, koi2iso, noError);
     366             : 
     367         124 :     PG_RETURN_INT32(converted);
     368             : }
     369             : 
     370             : Datum
     371           4 : win1251_to_mic(PG_FUNCTION_ARGS)
     372             : {
     373           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     374           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     375           4 :     int         len = PG_GETARG_INT32(4);
     376           4 :     bool        noError = PG_GETARG_BOOL(5);
     377             :     int         converted;
     378             : 
     379           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_MULE_INTERNAL);
     380             : 
     381           4 :     converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_WIN1251, win12512koi, noError);
     382             : 
     383           4 :     PG_RETURN_INT32(converted);
     384             : }
     385             : 
     386             : Datum
     387           4 : mic_to_win1251(PG_FUNCTION_ARGS)
     388             : {
     389           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     390           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     391           4 :     int         len = PG_GETARG_INT32(4);
     392           4 :     bool        noError = PG_GETARG_BOOL(5);
     393             :     int         converted;
     394             : 
     395           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN1251);
     396             : 
     397           4 :     converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_WIN1251, koi2win1251, noError);
     398             : 
     399           4 :     PG_RETURN_INT32(converted);
     400             : }
     401             : 
     402             : Datum
     403           4 : win866_to_mic(PG_FUNCTION_ARGS)
     404             : {
     405           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     406           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     407           4 :     int         len = PG_GETARG_INT32(4);
     408           4 :     bool        noError = PG_GETARG_BOOL(5);
     409             :     int         converted;
     410             : 
     411           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_MULE_INTERNAL);
     412             : 
     413           4 :     converted = latin2mic_with_table(src, dest, len, LC_KOI8_R, PG_WIN866, win8662koi, noError);
     414             : 
     415           4 :     PG_RETURN_INT32(converted);
     416             : }
     417             : 
     418             : Datum
     419           4 : mic_to_win866(PG_FUNCTION_ARGS)
     420             : {
     421           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     422           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     423           4 :     int         len = PG_GETARG_INT32(4);
     424           4 :     bool        noError = PG_GETARG_BOOL(5);
     425             :     int         converted;
     426             : 
     427           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_MULE_INTERNAL, PG_WIN866);
     428             : 
     429           4 :     converted = mic2latin_with_table(src, dest, len, LC_KOI8_R, PG_WIN866, koi2win866, noError);
     430             : 
     431           4 :     PG_RETURN_INT32(converted);
     432             : }
     433             : 
     434             : Datum
     435           4 : koi8r_to_win1251(PG_FUNCTION_ARGS)
     436             : {
     437           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     438           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     439           4 :     int         len = PG_GETARG_INT32(4);
     440           4 :     bool        noError = PG_GETARG_BOOL(5);
     441             :     int         converted;
     442             : 
     443           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN1251);
     444             : 
     445           4 :     converted = local2local(src, dest, len, PG_KOI8R, PG_WIN1251, koi2win1251, noError);
     446             : 
     447           4 :     PG_RETURN_INT32(converted);
     448             : }
     449             : 
     450             : Datum
     451           4 : win1251_to_koi8r(PG_FUNCTION_ARGS)
     452             : {
     453           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     454           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     455           4 :     int         len = PG_GETARG_INT32(4);
     456           4 :     bool        noError = PG_GETARG_BOOL(5);
     457             :     int         converted;
     458             : 
     459           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_KOI8R);
     460             : 
     461           4 :     converted = local2local(src, dest, len, PG_WIN1251, PG_KOI8R, win12512koi, noError);
     462             : 
     463           4 :     PG_RETURN_INT32(converted);
     464             : }
     465             : 
     466             : Datum
     467           4 : koi8r_to_win866(PG_FUNCTION_ARGS)
     468             : {
     469           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     470           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     471           4 :     int         len = PG_GETARG_INT32(4);
     472           4 :     bool        noError = PG_GETARG_BOOL(5);
     473             :     int         converted;
     474             : 
     475           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_WIN866);
     476             : 
     477           4 :     converted = local2local(src, dest, len, PG_KOI8R, PG_WIN866, koi2win866, noError);
     478             : 
     479           4 :     PG_RETURN_INT32(converted);
     480             : }
     481             : 
     482             : Datum
     483           4 : win866_to_koi8r(PG_FUNCTION_ARGS)
     484             : {
     485           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     486           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     487           4 :     int         len = PG_GETARG_INT32(4);
     488           4 :     bool        noError = PG_GETARG_BOOL(5);
     489             :     int         converted;
     490             : 
     491           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_KOI8R);
     492             : 
     493           4 :     converted = local2local(src, dest, len, PG_WIN866, PG_KOI8R, win8662koi, noError);
     494             : 
     495           4 :     PG_RETURN_INT32(converted);
     496             : }
     497             : 
     498             : Datum
     499           4 : win866_to_win1251(PG_FUNCTION_ARGS)
     500             : {
     501           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     502           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     503           4 :     int         len = PG_GETARG_INT32(4);
     504           4 :     bool        noError = PG_GETARG_BOOL(5);
     505             :     int         converted;
     506             : 
     507           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_WIN1251);
     508             : 
     509           4 :     converted = local2local(src, dest, len, PG_WIN866, PG_WIN1251, win8662win1251, noError);
     510             : 
     511           4 :     PG_RETURN_INT32(converted);
     512             : }
     513             : 
     514             : Datum
     515           4 : win1251_to_win866(PG_FUNCTION_ARGS)
     516             : {
     517           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     518           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     519           4 :     int         len = PG_GETARG_INT32(4);
     520           4 :     bool        noError = PG_GETARG_BOOL(5);
     521             :     int         converted;
     522             : 
     523           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_WIN866);
     524             : 
     525           4 :     converted = local2local(src, dest, len, PG_WIN1251, PG_WIN866, win12512win866, noError);
     526             : 
     527           4 :     PG_RETURN_INT32(converted);
     528             : }
     529             : 
     530             : Datum
     531         100 : iso_to_koi8r(PG_FUNCTION_ARGS)
     532             : {
     533         100 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     534         100 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     535         100 :     int         len = PG_GETARG_INT32(4);
     536         100 :     bool        noError = PG_GETARG_BOOL(5);
     537             :     int         converted;
     538             : 
     539         100 :     CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_KOI8R);
     540             : 
     541         100 :     converted = local2local(src, dest, len, PG_ISO_8859_5, PG_KOI8R, iso2koi, noError);
     542             : 
     543          64 :     PG_RETURN_INT32(converted);
     544             : }
     545             : 
     546             : Datum
     547           4 : koi8r_to_iso(PG_FUNCTION_ARGS)
     548             : {
     549           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     550           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     551           4 :     int         len = PG_GETARG_INT32(4);
     552           4 :     bool        noError = PG_GETARG_BOOL(5);
     553             :     int         converted;
     554             : 
     555           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_KOI8R, PG_ISO_8859_5);
     556             : 
     557           4 :     converted = local2local(src, dest, len, PG_KOI8R, PG_ISO_8859_5, koi2iso, noError);
     558             : 
     559           4 :     PG_RETURN_INT32(converted);
     560             : }
     561             : 
     562             : Datum
     563           4 : iso_to_win1251(PG_FUNCTION_ARGS)
     564             : {
     565           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     566           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     567           4 :     int         len = PG_GETARG_INT32(4);
     568           4 :     bool        noError = PG_GETARG_BOOL(5);
     569             :     int         converted;
     570             : 
     571           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN1251);
     572             : 
     573           4 :     converted = local2local(src, dest, len, PG_ISO_8859_5, PG_WIN1251, iso2win1251, noError);
     574             : 
     575           4 :     PG_RETURN_INT32(converted);
     576             : }
     577             : 
     578             : Datum
     579           4 : win1251_to_iso(PG_FUNCTION_ARGS)
     580             : {
     581           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     582           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     583           4 :     int         len = PG_GETARG_INT32(4);
     584           4 :     bool        noError = PG_GETARG_BOOL(5);
     585             :     int         converted;
     586             : 
     587           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN1251, PG_ISO_8859_5);
     588             : 
     589           4 :     converted = local2local(src, dest, len, PG_WIN1251, PG_ISO_8859_5, win12512iso, noError);
     590             : 
     591           4 :     PG_RETURN_INT32(converted);
     592             : }
     593             : 
     594             : Datum
     595           4 : iso_to_win866(PG_FUNCTION_ARGS)
     596             : {
     597           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     598           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     599           4 :     int         len = PG_GETARG_INT32(4);
     600           4 :     bool        noError = PG_GETARG_BOOL(5);
     601             :     int         converted;
     602             : 
     603           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_ISO_8859_5, PG_WIN866);
     604             : 
     605           4 :     converted = local2local(src, dest, len, PG_ISO_8859_5, PG_WIN866, iso2win866, noError);
     606             : 
     607           4 :     PG_RETURN_INT32(converted);
     608             : }
     609             : 
     610             : Datum
     611           4 : win866_to_iso(PG_FUNCTION_ARGS)
     612             : {
     613           4 :     unsigned char *src = (unsigned char *) PG_GETARG_CSTRING(2);
     614           4 :     unsigned char *dest = (unsigned char *) PG_GETARG_CSTRING(3);
     615           4 :     int         len = PG_GETARG_INT32(4);
     616           4 :     bool        noError = PG_GETARG_BOOL(5);
     617             :     int         converted;
     618             : 
     619           4 :     CHECK_ENCODING_CONVERSION_ARGS(PG_WIN866, PG_ISO_8859_5);
     620             : 
     621           4 :     converted = local2local(src, dest, len, PG_WIN866, PG_ISO_8859_5, win8662iso, noError);
     622             : 
     623           4 :     PG_RETURN_INT32(converted);
     624             : }

Generated by: LCOV version 1.13