LCOV - code coverage report
Current view: top level - src/backend/utils/mb/conversion_procs/cyrillic - cyrillic.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 100.0 % 109 109
Test Date: 2026-04-18 16:16:37 Functions: 100.0 % 25 25
Legend: Lines:     hit not hit

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

Generated by: LCOV version 2.0-1