/*
 * Codepage tables
 *
 * Copyright 2000 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#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;
extern union cptable cptable_28600;
extern union cptable cptable_28603;
extern union cptable cptable_28604;
extern union cptable cptable_28605;

static const union cptable * const cptables[58] =
{
    &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,
    &cptable_28600,
    &cptable_28603,
    &cptable_28604,
    &cptable_28605,
};
/* ### 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];
}
