/***************************************************************************
 *
 * _localedef.h
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Copyright 2005-2006 The Apache Software Foundation or its licensors,
 * as applicable.
 *
 * Copyright 2001-2006 Rogue Wave Software.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 **************************************************************************/

#ifndef _RWSTD_LOC_LOCALEDEF_H_INCLUDED
#define _RWSTD_LOC_LOCALEDEF_H_INCLUDED


#include <rw/_defs.h>


_RWSTD_NAMESPACE (__rw) { 

// LC_CTYPE structures
struct __rw_mask_elm
{
    wchar_t         ch;        // the wide character value
    _RWSTD_UINT32_T mask;      // the mask for that character
};

struct __rw_upper_elm
{
    wchar_t lower;    // the lower case wide character
    wchar_t upper;    // the upper case wide character that the lower maps to
};

struct __rw_lower_elm
{
    wchar_t upper;    // the upper case wide character
    wchar_t lower;    // the lower case wide character that the upper maps to
};


// returns a pointer to a character at the given byte offset
// from the end of the structure
#define _RWSTD_CHAR_ARRAY(off)   \
    (_RWSTD_REINTERPRET_CAST (const char*, this + 1) + (off))

// returns a pointer to a wide character at the given byte offset
// from the end of the structure
#define _RWSTD_WCHAR_T_ARRAY(off)   \
    _RWSTD_REINTERPRET_CAST (const wchar_t*, _RWSTD_CHAR_ARRAY (off))

#define _RWSTD_UINT_ARRAY(off)    \
    _RWSTD_REINTERPRET_CAST (const _RWSTD_UINT32_T*, _RWSTD_CHAR_ARRAY (off))

// returns a pointer to the i-th element of an array
// at the given byte offset from the end of the structure
#define _RWSTD_ARRAY_ELM(T, off, i)                        \
    _RWSTD_REINTERPRET_CAST (const T*,                     \
        (  _RWSTD_REINTERPRET_CAST (const char*, this + 1) \
         + (off) + (i) * sizeof (T)))


struct __rw_codecvt_t
{
    // offsets from the end of *this
    _RWSTD_UINT32_T codeset_off;
    _RWSTD_UINT32_T charmap_off;
    _RWSTD_UINT32_T n_to_w_tab_off;
    _RWSTD_UINT32_T w_to_n_tab_off;
    _RWSTD_UINT32_T utf8_to_ext_tab_off;
    _RWSTD_UINT32_T wchar_off;
    _RWSTD_UINT32_T xliteration_off;
    _RWSTD_UINT32_T codecvt_ext_off;

    // the size of the longest multibyte character
    unsigned char mb_cur_max;

    // the name of the codeset and its database file
    const char* codeset_name () const {
        return _RWSTD_CHAR_ARRAY (codeset_off);
    }

    // the name of the character map description file
    const char* charmap_name () const {
        return _RWSTD_CHAR_ARRAY (charmap_off);
    }

    // pointer to the first table for wide to narrow conversions
    const _RWSTD_UINT32_T* w_to_n_tab () const {
        return _RWSTD_UINT_ARRAY (w_to_n_tab_off);
    }

    // pointer to the first table for narrow to wide conversions
    const _RWSTD_UINT32_T* n_to_w_tab () const {
        return _RWSTD_UINT_ARRAY (n_to_w_tab_off);
    }
    
    // pointer to the first table for utf8 to external conversions
    const _RWSTD_UINT32_T* utf8_to_ext_tab () const {
        return _RWSTD_UINT_ARRAY (utf8_to_ext_tab_off);
    }

    // returns the value of the wide character at a given offset
    // obtained from one of the n_to_w_tab() tables
    wchar_t get_internal_at_offset (_RWSTD_UINT32_T off) const {
        return *(_RWSTD_ARRAY_ELM (wchar_t, wchar_off, off * 2));

    }

    // returns the value of the UCS character at a given offset
    wchar_t get_ucs4_at_offset (_RWSTD_UINT32_T off) const {
        return *(_RWSTD_ARRAY_ELM (wchar_t, wchar_off, off * 2 + 1));
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (codecvt_ext_off);
    }

    const _RWSTD_UINT32_T* get_xliteration_tab () const {
        return _RWSTD_UINT_ARRAY (xliteration_off);
    }
};


// LC_CTYPE structure
struct __rw_ctype_t
{
    _RWSTD_UINT32_T codeset_off;        // byte offset of the codeset_name
    _RWSTD_UINT32_T charmap_off;        // byte offset of the charmap name
    _RWSTD_UINT32_T wmask_s;
    _RWSTD_UINT32_T wtoupper_off;       // byte offset of the wtoupper_tab
    _RWSTD_UINT32_T wtolower_off;       // byte offset of the wtolower_tab
    _RWSTD_UINT32_T wmask_off;          // byte offset of the wmask_tab_tab

    // this is added to allow for future extensions
    _RWSTD_UINT32_T ctype_ext_off;      // extended ctype data offset

    unsigned char toupper_tab[256];   // the narrow char to_upper table
    unsigned char tolower_tab[256];   // the narrow char to_lower table
    _RWSTD_UINT32_T  mask_tab[256];      // the narrow char mask table
    unsigned char mb_cur_max;         // max number of bytes per MB character

    _RWSTD_SIZE_T wtoupper_s () const {
        return (wtolower_off - wtoupper_off) / sizeof (__rw_upper_elm);
    }

    _RWSTD_SIZE_T wtolower_s () const {
        return (wmask_off - wtolower_off) / sizeof (__rw_lower_elm);
    }

    _RWSTD_SIZE_T codeset_s () const {
        return charmap_off - codeset_off;
    }

    _RWSTD_SIZE_T charmap_s () const {
        return wtoupper_off - charmap_off;
    }

    const char* codeset_name () const {
        return _RWSTD_CHAR_ARRAY (codeset_off);
    }

    const char* charmap_name () const {
        return _RWSTD_CHAR_ARRAY (charmap_off);
    }

    __rw_upper_elm wtoupper_tab (_RWSTD_SIZE_T idx) const {
        return *_RWSTD_ARRAY_ELM (__rw_upper_elm, wtoupper_off, idx);
    }

    __rw_lower_elm wtolower_tab (_RWSTD_SIZE_T idx) const {
        return *_RWSTD_ARRAY_ELM (__rw_lower_elm, wtolower_off, idx);
    }

    __rw_mask_elm wmask_tab (_RWSTD_SIZE_T idx) const {
        return *_RWSTD_ARRAY_ELM (__rw_mask_elm, wmask_off, idx);
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (ctype_ext_off);
    }

};
    

// LC_COLLATE structure
struct __rw_collate_t
{
    _RWSTD_UINT32_T codeset_off;    // byte offset of the codeset_name
    _RWSTD_UINT32_T charmap_off;    // byte offset to the charmap name

    _RWSTD_UINT32_T n_ce_tab_off;
    _RWSTD_UINT32_T w_ce_tab_off;

    _RWSTD_UINT32_T weight_tab_off;  // offset to the weight information

    _RWSTD_UINT32_T n_char_tab_off; // offset to the first nchar table
    _RWSTD_UINT32_T n_char_off_tab_off;  // offset to offset table for nchars
    _RWSTD_UINT32_T n_char_first_char_off; // offset to first character info

    _RWSTD_UINT32_T w_char_tab_off; // offset to the first wide character table
    _RWSTD_UINT32_T w_char_off_tab_off;  // offset to offset table for wchars
    _RWSTD_UINT32_T w_char_first_char_off; // offset to first character info

    _RWSTD_UINT32_T n_ce_off_tab_off;
    _RWSTD_UINT32_T w_ce_off_tab_off;
    _RWSTD_UINT32_T n_ce_first_char_off;
    _RWSTD_UINT32_T w_ce_first_char_off;
    _RWSTD_UINT32_T n_ce_last_char_off;
    _RWSTD_UINT32_T w_ce_last_char_off;

    _RWSTD_UINT32_T undefined_weight_idx;

    _RWSTD_UINT32_T elm_size;       // number of bytes in each coll array elem
    _RWSTD_UINT32_T num_elms;       // numer of elements in coll array

    _RWSTD_UINT32_T num_wchars;     // number of wide chars in wchar mapping

    // this is added to allow for future extensions
    _RWSTD_UINT32_T collate_ext_off;      // extended collate data offset

    _RWSTD_UINT32_T undefined_optimization;

    unsigned char longest_weight;    // the longest weight value
    unsigned char num_weights;       // number of weights
    unsigned char largest_ce;

    unsigned char weight_type[256];  // weight types (ex. forward)

    // get the offset of a table number `tabno'
    _RWSTD_UINT32_T get_n_tab_off (_RWSTD_UINT32_T tabno) const {
        return (_RWSTD_UINT32_T)
            (sizeof (_RWSTD_UINT32_T) * (*(const _RWSTD_UINT32_T*)(
             (_RWSTD_SIZE_T)((const char*)this + sizeof *this 
                            + n_char_off_tab_off 
                            + (tabno * sizeof (_RWSTD_UINT32_T))))));
    }
    _RWSTD_UINT32_T get_n_ce_tab_off (_RWSTD_UINT32_T tabno) const {
        return (_RWSTD_UINT32_T)
            (sizeof (_RWSTD_UINT32_T) * (*(const _RWSTD_UINT32_T*)(
             (_RWSTD_SIZE_T)((const char*)this + sizeof *this 
                            + n_ce_off_tab_off 
                            + (tabno * sizeof (_RWSTD_UINT32_T))))));
    }

    _RWSTD_UINT32_T get_w_ce_tab_off (_RWSTD_UINT32_T tabno) const {
        return (_RWSTD_UINT32_T)
            (sizeof (_RWSTD_UINT32_T) * (*(const _RWSTD_UINT32_T*)(
             (_RWSTD_SIZE_T)((const char*)this + sizeof *this 
                            + w_ce_off_tab_off 
                            + (tabno * sizeof (_RWSTD_UINT32_T))))));
    }

    unsigned char get_first_char_in_n_tab (_RWSTD_UINT32_T tabno) const {
        return *((const unsigned char*)this + sizeof *this 
                 + n_char_first_char_off + tabno);
        
    }

    unsigned char get_first_char_in_n_ce_tab (_RWSTD_UINT32_T tabno) const {
        return *((const unsigned char*)this + sizeof *this 
                 + n_ce_first_char_off + tabno);
    }

    unsigned char get_first_char_in_w_ce_tab (_RWSTD_UINT32_T tabno) const {
        return *((const unsigned char*)this + sizeof *this 
                 + w_ce_first_char_off + tabno);
    }

    unsigned char get_last_char_in_n_ce_tab (_RWSTD_UINT32_T tabno) const {
        return *((const unsigned char*)this + sizeof *this 
                 + n_ce_last_char_off  + tabno);
    }

    unsigned char get_last_char_in_w_ce_tab (_RWSTD_UINT32_T tabno) const {
        return *((const unsigned char*)this + sizeof *this 
                 + w_ce_last_char_off + tabno);
    }

    const _RWSTD_UINT32_T* get_n_tab (_RWSTD_UINT32_T tabno) const {
        return (const _RWSTD_UINT32_T*)
            ((_RWSTD_SIZE_T)((const char*)this + sizeof *this
                               + n_char_tab_off + get_n_tab_off (tabno)));

    }
    const _RWSTD_UINT32_T* get_n_ce_tab (_RWSTD_UINT32_T tabno) const {
        return (const _RWSTD_UINT32_T*)
            ((_RWSTD_SIZE_T)((const char*)this + sizeof *this
                             + n_ce_tab_off + get_n_ce_tab_off (tabno)));
    }

    const _RWSTD_UINT32_T* get_w_ce_tab (_RWSTD_UINT32_T tabno) const {
        return (const _RWSTD_UINT32_T*)
            ((_RWSTD_SIZE_T)((const char*)this + sizeof *this
                             + w_ce_tab_off + get_w_ce_tab_off (tabno)));
    }

    _RWSTD_UINT32_T get_w_tab_off (_RWSTD_UINT32_T tabno) const {
        return (_RWSTD_UINT32_T)
            (sizeof (_RWSTD_UINT32_T) * (*(const _RWSTD_UINT32_T*)(
             (_RWSTD_SIZE_T)((const char*)this + sizeof *this
                            + w_char_off_tab_off 
                            + (tabno * sizeof (_RWSTD_UINT32_T))))));
    }

    unsigned char get_first_char_in_w_tab (_RWSTD_UINT32_T tabno) const {
        return *((const unsigned char*)this + sizeof *this 
                 + w_char_first_char_off + tabno);
        
    }

    const _RWSTD_UINT32_T* get_w_tab (_RWSTD_UINT32_T tabno) const {
        return (const _RWSTD_UINT32_T*)
            ((_RWSTD_SIZE_T)((const char*)this + sizeof *this
                             + w_char_tab_off + get_w_tab_off (tabno)));

    }

    const _RWSTD_UINT32_T* coll () const {
        return _RWSTD_UINT_ARRAY (weight_tab_off); 
    }

    const char* codeset_name () const {
        return _RWSTD_CHAR_ARRAY (codeset_off);
    }

    const char* charmap_name () const {
        return _RWSTD_CHAR_ARRAY (charmap_off);
    }

    const _RWSTD_UINT32_T* get_weight (_RWSTD_UINT32_T idx) const {
        return (const _RWSTD_UINT32_T*)((_RWSTD_SIZE_T)((const char*)coll ()
                                                        + elm_size * idx));
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (collate_ext_off);
    }
};


// punct structure for monetary and numeric facets
struct __rw_punct_t
{
    _RWSTD_UINT32_T decimal_point_off [2];   // narrow and wide decimal_point
    _RWSTD_UINT32_T thousands_sep_off [2];   // narrow and wide thousands_sep
    _RWSTD_UINT32_T grouping_off;            // grouping string
    _RWSTD_UINT32_T punct_ext_off;           // offset of extended data

    // decimal_point (0) points to a char*, decimal_point (1) to wchar_t*
    const void* decimal_point (bool wide) const {
        return _RWSTD_CHAR_ARRAY (decimal_point_off [wide]);
    }

    // thousands_sep (0) points to a char*, thousands_sep (1) to wchar_t*
    const void* thousands_sep (bool wide) const {
        return _RWSTD_CHAR_ARRAY (thousands_sep_off [wide]);
    }

    const void* grouping () const {
        return _RWSTD_CHAR_ARRAY (grouping_off);
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (punct_ext_off);
    }
};


// LC_MONETARY structure
struct __rw_mon_t
{
    _RWSTD_UINT32_T codeset_off;           // byte offset of the codeset_name
    _RWSTD_UINT32_T charmap_off;           // byte offset to the charmap name

    _RWSTD_UINT32_T curr_symbol_off [2][2];    // byte offset of curr_symbol
    _RWSTD_UINT32_T positive_sign_off [2];     // byte offset of positive_sign
    _RWSTD_UINT32_T negative_sign_off [2];     // byte offset of negative_sign

    // this is added to allow for future extensions
    _RWSTD_UINT32_T monetary_ext_off;      // extended monetary data offset

    // monetary format pattern for positive values
    char pos_format[2][4];    

    // monetary format pattern for negative values
    char neg_format[2][4];    

    // num of frac digits to write using currency_symbol 
    char frac_digits[2];      

    // 0 = currency symbol then pos value
    // 1 = pos value then currency symbol 
    char p_cs_precedes[2];    
                                     

    // separation of curr symbol and value
    // 0 - no separation
    // 1 = if the symbol and sign are adjacent, a space separates them from 
    //     the value; otherwise, a space separates the symbol from the value 
    // 2 = if the symbol and sign are adjacent, a space separates them; 
    //     otherwise, a space separates  the sign from the value
    char p_sep_by_space[2];   

    // 0 = currency symbol succeeds the neg value
    // 1 = currency symbol precedes the neg value
    char n_cs_precedes[2]; 

    // 0 = no space seperates curr sym from neg value
    // 1 = space seperates symbol from neg value
    // 2 = space seperates symbol and sign string
    char n_sep_by_space[2];

    // 0 = Parentheses enclose the quantity of the curr sym
    // 1 = Sign string precedes the quantity and curr sym
    // 2 = sign string succeeds the quantity and curr sym
    // 3 = sign string precedes the curr symbol
    // 4 = sign string succeeds the curr symbol
    char p_sign_posn[2];

    // 0 = Parentheses enclose the quantity of the curr sym
    // 1 = Sign string precedes the quantity and curr sym
    // 2 = sign string succeeds the quantity and curr sym
    // 3 = sign string precedes the curr symbol
    // 4 = sign string succeeds the curr symbol
    char n_sign_posn[2];

    const void* curr_symbol (bool intl, bool wide) const {
        return _RWSTD_CHAR_ARRAY (curr_symbol_off [intl][wide]);
    }

    const void* positive_sign (bool wide) const {
        return _RWSTD_CHAR_ARRAY (positive_sign_off [wide]);
    }

    const void* negative_sign (bool wide) const {
        return _RWSTD_CHAR_ARRAY (negative_sign_off [wide]);
    }

    const char* codeset_name () const {
        return _RWSTD_CHAR_ARRAY (codeset_off);
    }

    const char* charmap_name () const {
        return _RWSTD_CHAR_ARRAY (charmap_off);
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (monetary_ext_off);
    }
};


// LC_NUMERIC structure
struct __rw_num_t
{
    _RWSTD_UINT32_T codeset_off;       // byte offset of the codeset_name
    _RWSTD_UINT32_T charmap_off;       // byte offset to the charmap name

    _RWSTD_UINT32_T truename_off [2];  // offset of narrow and wide truename
    _RWSTD_UINT32_T falsename_off [2]; // offset of narrow and wide falsename

    _RWSTD_UINT32_T numeric_ext_off;     // extended numeric data offset

    const void* truename (bool wide) const {
        return _RWSTD_CHAR_ARRAY (truename_off [wide]);
    }

    const void* falsename (bool wide) const {
        return _RWSTD_CHAR_ARRAY (falsename_off [wide]);
    }

    const char* codeset_name () const {
        return _RWSTD_CHAR_ARRAY (codeset_off);
    }

    const char* charmap_name () const {
        return _RWSTD_CHAR_ARRAY (charmap_off);
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (numeric_ext_off);
    }
};


// LC_MESSAGES structure
struct __rw_messages_t
{
    _RWSTD_UINT32_T codeset_off;
    _RWSTD_UINT32_T charmap_off;
    
    _RWSTD_UINT32_T yesexpr_off[2];
    _RWSTD_UINT32_T noexpr_off[2];

    _RWSTD_UINT32_T messages_ext_off;

    const void* yesexpr (bool wide) const {
        return _RWSTD_CHAR_ARRAY (yesexpr_off[wide]);
    }

    const void* noexpr (bool wide) const {
        return _RWSTD_CHAR_ARRAY (noexpr_off[wide]);
    }

    const char* codeset_name () const {
        return _RWSTD_CHAR_ARRAY (codeset_off);
    }

    const char* charmap_name () const {
        return _RWSTD_CHAR_ARRAY (charmap_off);
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (messages_ext_off);
    }

};


// LC_TIME structure
struct __rw_time_t
{
    _RWSTD_UINT32_T codeset_off;     // byte offset of the codeset_name
    _RWSTD_UINT32_T charmap_off;     // byte offset to the charmap name
    _RWSTD_UINT32_T num_eras;        // the number of eras
    _RWSTD_UINT32_T num_alt_digits;  // the number of alt_digits

    _RWSTD_UINT32_T era_off;            // bute offset of the first era
    _RWSTD_UINT32_T alt_digits_off;      // byte offset to offset array 
    _RWSTD_UINT32_T abday_off[2][7];    // byte offset of each abday
    _RWSTD_UINT32_T day_off[2][7];      // byte offset of each day
    _RWSTD_UINT32_T abmon_off[2][12];   // byte offset of each abmon
    _RWSTD_UINT32_T mon_off[2][12];     // byte offset of each mon
    _RWSTD_UINT32_T am_pm_off[2][2];    // byte offset of am and pm
    _RWSTD_UINT32_T d_t_fmt_off[2];     // byte offset of d_t_fmt
    _RWSTD_UINT32_T d_fmt_off[2];       // byte offset of d_fmt
    _RWSTD_UINT32_T t_fmt_off[2];       // byte offset of t_fmt
    _RWSTD_UINT32_T t_fmt_ampm_off[2];  // byte offset of t_fmt_ampm
    _RWSTD_UINT32_T era_d_t_fmt_off[2]; // byte offset of era_d_t_fmt
    _RWSTD_UINT32_T era_d_fmt_off[2];   // byte offset of era_d_fmt
    _RWSTD_UINT32_T era_t_fmt_off[2];   // byte offset of era_t_fmt

    // this is added to allow for future extensions
    _RWSTD_UINT32_T time_ext_off;      // extended time data offset

    // %a: abbreviated weekday name [tm_wday]
    const void* abday (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (abday_off [wide][idx]);
    }

    // %A: full weekday name [tm_wday]
    const void* day (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (day_off [wide][idx]);
    }

    // %b: abbreviated month name [tm_mon]
    const void* abmon (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (abmon_off [wide][idx]);
    }

    // %B: full month name [tm_mon]
    const void* mon (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (mon_off [wide][idx]);
    }

    // %p: the locale's equivalent of the AM/PM designations
    //     associated with a 12-hour clock [tm_hour]
    const void* am_pm (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (am_pm_off [wide][idx]);
    }

    // %c: the appropriate date and time representation
    const void* d_t_fmt (bool wide) const {
        return _RWSTD_CHAR_ARRAY (d_t_fmt_off[wide]);
    }

    // %x: the appropriate date representation
    const void* d_fmt (bool wide) const {
        return _RWSTD_CHAR_ARRAY (d_fmt_off[wide]);
    }

    // %X: the appropriate time representation
    const void* t_fmt (bool wide) const {
        return _RWSTD_CHAR_ARRAY (t_fmt_off[wide]);
    }

    const void* t_fmt_ampm (bool wide) const {
        return _RWSTD_CHAR_ARRAY (t_fmt_ampm_off[wide]);
    }

    struct era_t {
        _RWSTD_UINT32_T name_off [2];   // narrow and wide era names
        _RWSTD_UINT32_T fmt_off [2];    // narrow and wide format of the year

        // negative offset represents direction of '-', otherwise '+'
        _RWSTD_INT32_T  offset;         // year closest to start_date

        // the beginning of time is represented by INT_MIN stored in
        // year [1], and CHAR_MIN in month [1] and day [1]
        // the end of time is represented by INT_MAX stored in
        // year [1], and CHAR_MAX in month [1] and day [1]
        _RWSTD_INT32_T  year [2];       // start and end year
        char            month [2];      // start and end month [0..11]
        char            day [2];        // start and end day [1..31]
    };

    // era description segment
    const era_t* era (_RWSTD_SIZE_T idx) const {
        return _RWSTD_ARRAY_ELM (era_t, era_off, idx);
    }

    // the number of era description segments
    _RWSTD_SIZE_T era_count () const {
        return num_eras;
    }

    const void* era_name (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (era (idx)->name_off[wide]);
    }

    const void* era_fmt (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (era (idx)->fmt_off[wide]);
    }

    // %Ec: the locale's alternate date and time representation
    const void* era_d_t_fmt (bool wide) const {
        return _RWSTD_CHAR_ARRAY (era_d_t_fmt_off[wide]);
    }

    // %Ex: the locale's alternative date representation
    const void* era_d_fmt (bool wide) const {
        return _RWSTD_CHAR_ARRAY (era_d_fmt_off[wide]);
    }

    // %EX: the locale's alternative time representation
    const void* era_t_fmt (bool wide) const {
        return _RWSTD_CHAR_ARRAY (era_t_fmt_off[wide]);
    }

    // alternative symbols for digits, corresponding to the %O modifier
    const void* alt_digits (_RWSTD_SIZE_T idx, bool wide) const {
        return _RWSTD_CHAR_ARRAY (*_RWSTD_ARRAY_ELM 
                                  (_RWSTD_UINT32_T, alt_digits_off, 
                                   idx * 2 + wide));
    }

    // number of alternative digits
    _RWSTD_UINT32_T alt_digits_count () const {
        return num_alt_digits;
    }

    const char* codeset_name () const {
        return _RWSTD_CHAR_ARRAY (codeset_off);
    }

    const char* charmap_name () const {
        return _RWSTD_CHAR_ARRAY (charmap_off);
    }

    const void* get_ext () const {
        return _RWSTD_CHAR_ARRAY (time_ext_off);
    }
};


static inline _RWSTD_SIZE_T
__rw_itoutf8 (_RWSTD_UINT32_T wchar, char *to)
{
    typedef unsigned char _UChar;

    if (wchar < 0x80U) {
        to [0] = _UChar (wchar);
        return 1U;
    }
    if (wchar < 0x800U) {
        to [0] = _UChar (0xc0U | (wchar >> 6));
        to [1] = _UChar (0x80U | (wchar & 0x3fU));
        return 2U;
    }
    if (wchar < 0x10000U) {
        to [0] = _UChar (0xe0U | (wchar >> 12));
        to [1] = _UChar (0x80U | (wchar >>  6 & 0x3fU));
        to [2] = _UChar (0x80U | (wchar       & 0x3fU));
        return 3U;
    }
    if (wchar < 0x200000U) {
        to [0] = _UChar (0xf0U | (wchar >> 18));
        to [1] = _UChar (0x80U | (wchar >> 12 & 0x3fU));
        to [2] = _UChar (0x80U | (wchar >>  6 & 0x3fU));
        to [3] = _UChar (0x80U | (wchar       & 0x3fU));
        return 4U;
    }
    if (wchar < 0x4000000U) {
        to [0] = _UChar (0xf8U | (wchar >> 24));
        to [1] = _UChar (0x80U | (wchar >> 18 & 0x3fU));
        to [2] = _UChar (0x80U | (wchar >> 12 & 0x3fU));
        to [3] = _UChar (0x80U | (wchar >>  6 & 0x3fU));
        to [4] = _UChar (0x80U | (wchar       & 0x3fU));
        return 5U;
    }
    to [0] = _UChar (0xfcU | (wchar >> 30));
    to [1] = _UChar (0x80U | (wchar >> 24 & 0x3fU));
    to [2] = _UChar (0x80U | (wchar >> 18 & 0x3fU));
    to [3] = _UChar (0x80U | (wchar >> 12 & 0x3fU));
    to [4] = _UChar (0x80U | (wchar >>  6 & 0x3fU));
    to [5] = _UChar (0x80U | (wchar       & 0x3fU));
    return 6U;
}


// converts a single UTF-8 character starting at `from' to its UCS-4
// representation and, if successful, stores the result in `*ret'
// returns a pointer to the beginning of the next UTF-8 character
// or 0 on error
// returns `from' when the sequence in the range [`from', `from_end')
// forms an incomplete UTF-8 character
static inline const char*
__rw_utf8toucs4 (_RWSTD_INT32_T *ret, const char *from, const char *from_end)
{
    _RWSTD_ASSERT (0 != ret);
    _RWSTD_ASSERT (0 != from);
    _RWSTD_ASSERT (from <= from_end);

    typedef _RWSTD_INT32_T _Int32;

    const unsigned char* const byte =
        _RWSTD_REINTERPRET_CAST (const unsigned char*, from);

    if (byte [0] < 0x80U) {
        *ret = _Int32 (byte [0]);
        return from + 1;
    }

    if (byte [0] < 0xc2U) {
        // sequences beginning with a byte in the range [0x80, 0xc2)
        // do not form a valid UTF-8 character
        return 0;
    }

    const _RWSTD_PTRDIFF_T len = from_end - from;

    if (byte [0] < 0xe0U) {
        if (len < 2)
            return from;

        *ret = _Int32 ((byte [0] & 0x1fU) << 6 | byte [1] & 0x3fU);
        return from + 2;
    }

    if (byte [0] < 0xf0U) {
        if (len < 3)
            return from;

        *ret = _Int32 (  (byte [0] & 0x0fU) << 12
                       | (byte [1] & 0x3fU) <<  6
                       | (byte [2] & 0x3fU));
        return from + 3;
    }

    if (byte [0] < 0xf8U) {
        if (len < 4)
            return from;

        *ret = _Int32 (  (byte [0] & 0x07U) << 18
                       | (byte [1] & 0x3fU) << 12 
                       | (byte [2] & 0x3fU) <<  6
                       | (byte [3] & 0x3fU));
        return from + 4;
    }

    if (byte [0] < 0xfcU) {
        if (len < 5)
            return from;

        *ret = _Int32 (  (byte [0] & 0x03U) << 24
                       | (byte [1] & 0x3fU) << 18
                       | (byte [2] & 0x3fU) << 12
                       | (byte [3] & 0x3fU) <<  6 
                       | (byte [4] & 0x3fU));
        return from + 5;
    }

    if (byte [0] < 0xfeU) {
        if (len < 6)
            return from;

        *ret = _Int32 (  (byte [0] & 0x01U) << 30
                       | (byte [1] & 0x3fU) << 24 
                       | (byte [2] & 0x3fU) << 18 
                       | (byte [3] & 0x3fU) << 12 
                       | (byte [4] & 0x3fU) <<  6 
                       | (byte [5] & 0x3fU));
        return from + 6;
    }

    return 0;
}


// looks up the offset of the wide character corresponing to the multibyte
// character starting at `from'; returns the offset on success, UINT_MAX if
// no such wide character exists (i.e., on conversion error), or any value
// with bit 31 set if the the range [`from', `from_end') forms an incomplete
// multibyte character (i.e., if it's an initial subsequence of one)
static inline 
unsigned __rw_mbtowco (const unsigned *cvtbl,
                       const char     *&from,
                       const char     *from_end)
{
    typedef unsigned char _UChar;

    // `bit31' has the most significant bit set and all others clear
    const unsigned bit31 = 0x80000000U;

    const char *next = from;

    unsigned wc;

    for (const unsigned *ptbl = cvtbl; (wc = ptbl [_UChar (*next)]) & bit31; ) {

        // check if it is valid and if so, whether we have reached the
        // end of the source sequence and found an incomplete character
        // note, however, that an incomplete character does not mean 
        // partial conversion
        if (wc == _RWSTD_UINT_MAX || ++next == from_end)
            return wc;

        // use the `wc' value to compute the address of the next table
        ptbl = cvtbl + 256 * (wc & ~bit31);
    }

    from = next + 1;

    return wc;
}


}   // namespace __rw


#endif    // _RWSTD_LOC_LOCALEDEF_H_INCLUDED
