/*
 * Codepage tables
 *
 * Copyright 2000 Alexandre Julliard
 */

#include <stdlib.h>

#include "wine/unicode.h"

/* Everything below this line is generated automatically by cpmap.pl */
/* ### cpmap begin ### */
extern union cptable cptable_037;
extern union cptable cptable_042;
extern union cptable cptable_424;
extern union cptable cptable_437;
extern union cptable cptable_500;
extern union cptable cptable_737;
extern union cptable cptable_775;
extern union cptable cptable_850;
extern union cptable cptable_852;
extern union cptable cptable_855;
extern union cptable cptable_856;
extern union cptable cptable_857;
extern union cptable cptable_860;
extern union cptable cptable_861;
extern union cptable cptable_862;
extern union cptable cptable_863;
extern union cptable cptable_864;
extern union cptable cptable_865;
extern union cptable cptable_866;
extern union cptable cptable_869;
extern union cptable cptable_874;
extern union cptable cptable_875;
extern union cptable cptable_878;
extern union cptable cptable_932;
extern union cptable cptable_936;
extern union cptable cptable_949;
extern union cptable cptable_950;
extern union cptable cptable_1006;
extern union cptable cptable_1026;
extern union cptable cptable_1250;
extern union cptable cptable_1251;
extern union cptable cptable_1252;
extern union cptable cptable_1253;
extern union cptable cptable_1254;
extern union cptable cptable_1255;
extern union cptable cptable_1256;
extern union cptable cptable_1257;
extern union cptable cptable_1258;
extern union cptable cptable_10000;
extern union cptable cptable_10006;
extern union cptable cptable_10007;
extern union cptable cptable_10029;
extern union cptable cptable_10079;
extern union cptable cptable_10081;
extern union cptable cptable_20866;
extern union cptable cptable_28591;
extern union cptable cptable_28592;
extern union cptable cptable_28593;
extern union cptable cptable_28594;
extern union cptable cptable_28595;
extern union cptable cptable_28596;
extern union cptable cptable_28597;
extern union cptable cptable_28598;
extern union cptable cptable_28599;

static const union cptable * const cptables[54] =
{
    &cptable_037,
    &cptable_042,
    &cptable_424,
    &cptable_437,
    &cptable_500,
    &cptable_737,
    &cptable_775,
    &cptable_850,
    &cptable_852,
    &cptable_855,
    &cptable_856,
    &cptable_857,
    &cptable_860,
    &cptable_861,
    &cptable_862,
    &cptable_863,
    &cptable_864,
    &cptable_865,
    &cptable_866,
    &cptable_869,
    &cptable_874,
    &cptable_875,
    &cptable_878,
    &cptable_932,
    &cptable_936,
    &cptable_949,
    &cptable_950,
    &cptable_1006,
    &cptable_1026,
    &cptable_1250,
    &cptable_1251,
    &cptable_1252,
    &cptable_1253,
    &cptable_1254,
    &cptable_1255,
    &cptable_1256,
    &cptable_1257,
    &cptable_1258,
    &cptable_10000,
    &cptable_10006,
    &cptable_10007,
    &cptable_10029,
    &cptable_10079,
    &cptable_10081,
    &cptable_20866,
    &cptable_28591,
    &cptable_28592,
    &cptable_28593,
    &cptable_28594,
    &cptable_28595,
    &cptable_28596,
    &cptable_28597,
    &cptable_28598,
    &cptable_28599,
};
/* ### cpmap end ### */
/* Everything above this line is generated automatically by cpmap.pl */

#define NB_CODEPAGES  (sizeof(cptables)/sizeof(cptables[0]))


static int cmp_codepage( const void *codepage, const void *entry )
{
    return (unsigned int)codepage - (*(union cptable **)entry)->info.codepage;
}


/* get the table of a given code page */
const union cptable *cp_get_table( unsigned int codepage )
{
    const union cptable **res;

    if (!(res = bsearch( (void *)codepage, cptables, NB_CODEPAGES,
                         sizeof(cptables[0]), cmp_codepage ))) return NULL;
    return *res;
}


/* enum valid codepages */
const union cptable *cp_enum_table( unsigned int index )
{
    if (index >= NB_CODEPAGES) return NULL;
    return cptables[index];
}
