/***************************************************************************
 *
 * punct.cpp
 *
 * $Id: //stdlib/dev/source/stdlib/punct.cpp#46 $
 *
 ***************************************************************************
 *
 * Copyright (c) 1994-2005 Quovadx,  Inc., acting through its  Rogue Wave
 * Software division. 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.
 * 
 **************************************************************************/

#define _RWSTD_LIB_SRC

#include <rw/_defs.h>

#ifndef _RWSTD_NO_V3_LOCALE

#include <locale.h>   // for lconv, localeconv(), setlocale()
#include <stdio.h>    // for sprintf()
#include <stdlib.h>   // for mbstowcs()
#include <string.h>   // for memcpy()

#include <ios>        // for ios_base, needed by <rw/_punct.h>
#include <memory>     // for operator new() and delete()

#include "access.h"

#include <loc/_localedef.h>
#include <loc/_moneypunct.h>
#include <loc/_numpunct.h>

#include <rw/_error.h>

#include "setlocale.h"


#if defined (_MSC_VER) && defined (_WIN64)
  // shut up MSVC/Win64 complaints about possible loss of data
#  pragma warning (disable: 4244)
#endif   // MSVC/Win64


_RWSTD_NAMESPACE (__rw) {


static inline void __rw_copy (void *dst, const void *src, _RWSTD_SIZE_T n)
{
    ::memcpy (dst, src, n);
}

static inline void __rw_widen (void *dst, const void *src, _RWSTD_SIZE_T n)
{
    ::mbstowcs (_RWSTD_STATIC_CAST (wchar_t*, dst),
                _RWSTD_STATIC_CAST (const char*, src), n);
}


static const void*
__rw_get_numpunct (const __rw_facet *pfacet, int flags)
{
    const int   member = flags & ~(__rw_mon | __rw_wide | __rw_intl);
    const bool  winx   = !!(flags & __rw_wide);   // wide or narrow index
    const void *pdata  = pfacet->_C_data ();      // mapped locale database

    if (pdata) {

        const __rw_punct_t *pun =
            _RWSTD_STATIC_CAST (const __rw_punct_t*, pdata);

        const __rw_num_t *num;
    
        switch (member) {

        case __rw_dp: return pun->decimal_point (winx);
        case __rw_ts: return pun->thousands_sep (winx);
        case __rw_gr: return pun->grouping ();

        case __rw_tn:
            num = _RWSTD_STATIC_CAST (const __rw_num_t*, pun->get_ext ());
            _RWSTD_ASSERT (num);
            return num->truename (winx);

        case __rw_fn:
            num = _RWSTD_STATIC_CAST (const __rw_num_t*, pun->get_ext ());
            _RWSTD_ASSERT (num);
            return num->falsename (winx);

        default: _RWSTD_ASSERT (!"bad discriminant");
        }

        return 0;
    }
    else if (0 == __rw_access::_C_get_name (*pfacet)) {   // "C" locale

        static const void* const cdata[] = {
            ".", L".", ",", L",", "", L"", "true", L"true", "false", L"false"
        };

        switch (member) {

        case __rw_dp: return cdata [0 + winx];   // 22.2.3.1.2, p1
        case __rw_ts: return cdata [2 + winx];   // 22.2.3.1.2, p2
        case __rw_gr: return cdata [4 + winx];   // 22.2.3.1.2, p3
        case __rw_tn: return cdata [6 + winx];   // 22.2.3.1.2, p4
        case __rw_fn: return cdata [8 + winx];

        default: _RWSTD_ASSERT (!"bad discriminant");
        }

        return 0;
    }

    const char* const locname = __rw_access::_C_get_name (*pfacet) ?
        __rw_access::_C_get_name (*pfacet) : "C";
    
    // set all categories -- need LC_NUMERIC and LC_CTYPE
    const __rw_setlocale clocale (locname, _RWSTD_LC_ALL);

    // get the lconv data
    const lconv* const pconv = localeconv ();
    if (!pconv)
        __rw_throw (_RWSTD_ERROR_LOCALE_BAD_NAME, locname);

    // be prepared to handle (non-conforming) null pointers
    // (e.g., AIX -- see bug #558)
    const char* const grp = pconv->grouping ? pconv->grouping : "";
    const char* const dp  = pconv->decimal_point ? pconv->decimal_point : "";
    const char* const ts  = pconv->thousands_sep ? pconv->thousands_sep : "";

    // the size of the narrow grouping string in bytes
    const _RWSTD_SIZE_T grsz = strlen (grp) + 1;

    // compute the sizes of all members in bytes
    _RWSTD_SIZE_T dpsz = strlen (dp) + 1;
    _RWSTD_SIZE_T tssz = strlen (ts) + 1;
    _RWSTD_SIZE_T tnsz = sizeof "true";
    _RWSTD_SIZE_T fnsz = sizeof "false";

    if (winx) {
        // adjust for wide characters
        dpsz *= sizeof (wchar_t);
        tssz *= sizeof (wchar_t);
        tnsz *= sizeof (wchar_t);
        fnsz *= sizeof (wchar_t);
    }

    // compute the actual size of the variable size structure
    const _RWSTD_SIZE_T size =
          sizeof (__rw_punct_t)
        + sizeof (__rw_num_t)
        + sizeof (_RWSTD_SIZE_T)   // maximum padding for alignment
        + grsz + dpsz + tssz + tnsz + fnsz;

    // allocate variable size structure(s)
    __rw_punct_t* const pun = 
        _RWSTD_STATIC_CAST (__rw_punct_t*, ::operator new (size));

    // compute offsets into the varaiable size structure
    pun->decimal_point_off [winx] = 0;
    pun->thousands_sep_off [winx] = pun->decimal_point_off [winx] + dpsz;

    // point widen to a wrapper for mbstowcs() for wchar_t or memcpy otherwise
    void (*widen)(void*, const void*, _RWSTD_SIZE_T) =
        winx ? __rw_widen : __rw_copy;

    // copy strings from lconv data members to the varaiable size structure
    char* s = _RWSTD_REINTERPRET_CAST (char*, pun + 1);

    widen (s + pun->decimal_point_off [winx], dp, dpsz);
    widen (s + pun->thousands_sep_off [winx], ts, tssz);

    // set the offset of the extended punctuation data
    pun->punct_ext_off = pun->thousands_sep_off [winx] + tssz;

    // adjust alignment
    if (pun->punct_ext_off % sizeof (_RWSTD_SIZE_T))
        pun->punct_ext_off += 
            sizeof (_RWSTD_SIZE_T) - pun->punct_ext_off % sizeof(_RWSTD_SIZE_T);

    s = _RWSTD_REINTERPRET_CAST (char*, pun + 1) + pun->punct_ext_off;

    __rw_num_t* const num = _RWSTD_REINTERPRET_CAST (__rw_num_t*, s);

    s += sizeof *num;

    // invalidate members (offsets) by setting them to 0xff
    memset (num, ~0, sizeof *num);

    num->truename_off  [winx] = 0;
    num->falsename_off [winx] = num->truename_off [winx] + tnsz;

    widen (s + num->truename_off  [winx], "true", tnsz);
    widen (s + num->falsename_off [winx], "false", fnsz);

    // place narrow grouping string last to avoid alignment issues
    pun->grouping_off =
        _RWSTD_STATIC_CAST (_RWSTD_UINT32_T,
        pun->punct_ext_off + sizeof *num + num->falsename_off [winx] + fnsz);

    memcpy (s + num->falsename_off [winx] + fnsz, grp, grsz);

    // set `impdata' and `impsize' (facet base dtor will delete)
    __rw_access::_C_get_impdata (*_RWSTD_CONST_CAST (__rw_facet*, pfacet)) =
        pun;

    __rw_access::_C_get_impsize (*_RWSTD_CONST_CAST (__rw_facet*, pfacet)) =
        (_RWSTD_SIZE_T)(-1);

    // call self recursively on already initialized `impdata'
    return __rw_get_numpunct (pfacet, flags);
}

/***************************************************************************/


static const void*
__rw_get_moneypunct (const __rw_facet *pfacet, int flags)
{
    const int   member = flags & ~(__rw_mon | __rw_wide | __rw_intl);
    const bool  winx   = !!(flags & __rw_wide);   // wide or narrow index
    const bool  intl   = !!(flags & __rw_intl);   // international or domestic
    const void *pdata  = pfacet->_C_data ();      // mapped locale database

    if (pdata) {

        const __rw_punct_t *pun =
            _RWSTD_STATIC_CAST (const __rw_punct_t*, pdata);

        const __rw_mon_t *mon;
    
        switch (member) {
        case __rw_dp: return pun->decimal_point (winx);
        case __rw_ts: return pun->thousands_sep (winx);
        case __rw_gr: return pun->grouping ();

        }

        // get extended data
        mon = _RWSTD_STATIC_CAST (const __rw_mon_t*, pun->get_ext ());
        _RWSTD_ASSERT (mon);

        typedef unsigned char UChar;

        switch (member) {

        case __rw_cs: return mon->curr_symbol (intl, winx);
        case __rw_ps: return mon->positive_sign (winx);
        case __rw_ns: return mon->negative_sign (winx);

        case __rw_pf: return mon->pos_format [intl];
        case __rw_nf: return mon->neg_format [intl];

        case __rw_fd:
            return _RWSTD_REINTERPRET_CAST (void*, (_RWSTD_SIZE_T)
                                            UChar (mon->frac_digits [intl]));

        default: _RWSTD_ASSERT (!"bad discriminant");
        }

        return 0;
    }
    else if (0 == __rw_access::_C_get_name (*pfacet)) {   // "C" locale

        static const void* const cdata[] = {
            ".", L".", ",", L",", "", L"", "", L"", "", L"",
            "", L"", "", L"", "\2\3\0\4", "\2\3\0\4", 
        };

        switch (member) {

        case __rw_dp: return cdata [0 + winx];
        case __rw_ts: return cdata [2 + winx];
        case __rw_gr: return cdata [4 + winx];
        case __rw_cs: return cdata [6 + winx + 2 * intl];
        case __rw_ps: return cdata [10 + winx];
        case __rw_ns: return cdata [12 + winx];
        case __rw_pf: return cdata [14];
        case __rw_nf: return cdata [15];

        // the number of fractional digits in the "C" locale is not specified
        case __rw_fd: return 0;   // no fractional digits

        default: _RWSTD_ASSERT (!"bad discriminant");
        }

        return 0;
    }

    const char* const locname = __rw_access::_C_get_name (*pfacet) ?
        __rw_access::_C_get_name (*pfacet) : "C";
    
    // set all categories -- need LC_NUMERIC and LC_CTYPE
    const __rw_setlocale clocale (locname, _RWSTD_LC_ALL);

    // get the lconv data
    const lconv* const pconv = localeconv ();
    if (!pconv)
        __rw_throw (_RWSTD_ERROR_LOCALE_BAD_NAME, locname);

    _RWSTD_ASSERT (pconv->mon_grouping);
    _RWSTD_ASSERT (pconv->mon_decimal_point);
    _RWSTD_ASSERT (pconv->mon_thousands_sep);

    // the size of the narrow grouping string in bytes
    const _RWSTD_SIZE_T grsz = ::strlen (pconv->mon_grouping) + 1;

    // compute the sizes of all members in bytes
    _RWSTD_SIZE_T dpsz = ::strlen (pconv->mon_decimal_point) + 1;
    _RWSTD_SIZE_T tssz = ::strlen (pconv->mon_thousands_sep) + 1;
    _RWSTD_SIZE_T pssz = ::strlen (pconv->positive_sign) + 1;
    _RWSTD_SIZE_T nssz = ::strlen (pconv->negative_sign) + 1;

    const char* const cs = intl ? pconv->int_curr_symbol
                                : pconv->currency_symbol;

    _RWSTD_SIZE_T cssz = ::strlen (cs) + 1;

    if (winx) {
        // adjust for wide characters
        dpsz *= sizeof (wchar_t);
        tssz *= sizeof (wchar_t);
        pssz *= sizeof (wchar_t);
        nssz *= sizeof (wchar_t);
        cssz *= sizeof (wchar_t);
    }

    // compute the actual size of the variable size structure
    const _RWSTD_SIZE_T size =
          sizeof (__rw_punct_t)
        + sizeof (__rw_mon_t)
        + sizeof (_RWSTD_SIZE_T)   // maximum padding for alignment
        + grsz + dpsz + tssz + pssz + nssz + cssz;

    // allocate variable size structure(s)
    __rw_punct_t* const pun = 
        _RWSTD_STATIC_CAST (__rw_punct_t*, ::operator new (size));

    // compute offsets into the varaiable size structure
    pun->decimal_point_off [winx] = 0;
    pun->thousands_sep_off [winx] = pun->decimal_point_off [winx] + dpsz;

    // point widen to a wrapper for mbstowcs() for wchar_t or memcpy otherwise
    void (*widen)(void*, const void*, _RWSTD_SIZE_T) =
        winx ? __rw_widen : __rw_copy;

    // copy strings from lconv data members to the varaiable size structure
    char* s = _RWSTD_REINTERPRET_CAST (char*, pun + 1);

    widen (s + pun->decimal_point_off [winx], pconv->mon_decimal_point, dpsz);
    widen (s + pun->thousands_sep_off [winx], pconv->mon_thousands_sep, tssz);

    // set the offset of the extended punctuation data
    pun->punct_ext_off = pun->thousands_sep_off [winx] + tssz;

    // adjust alignment
    if (pun->punct_ext_off % sizeof (_RWSTD_SIZE_T))
        pun->punct_ext_off += 
            sizeof (_RWSTD_SIZE_T) - pun->punct_ext_off % sizeof(_RWSTD_SIZE_T);

    s = _RWSTD_REINTERPRET_CAST (char*, pun + 1) + pun->punct_ext_off;

    __rw_mon_t* const mon = _RWSTD_REINTERPRET_CAST (__rw_mon_t*, s);

    s += sizeof *mon;

    // invalidate members (offsets) by setting them to 0xff
    ::memset (mon, ~0, sizeof *mon);

    mon->positive_sign_off [winx] = 0;
    mon->negative_sign_off [winx] = mon->positive_sign_off [winx] + pssz;

    widen (s + mon->positive_sign_off [winx], pconv->positive_sign, pssz);
    widen (s + mon->negative_sign_off [winx], pconv->negative_sign, nssz);

    mon->curr_symbol_off [intl][winx] = mon->negative_sign_off [winx] + nssz;
    widen (s + mon->curr_symbol_off [intl][winx], cs, cssz);

    pun->grouping_off =
        _RWSTD_STATIC_CAST (_RWSTD_UINT32_T,
          pun->punct_ext_off + sizeof *mon
        + mon->curr_symbol_off [intl][winx] + cssz);

    // place narrow grouping string last to avoid alignment issues
    ::memcpy (s + mon->curr_symbol_off [intl][winx] + cssz,
            pconv->mon_grouping, grsz);

    mon->frac_digits [0]    = pconv->frac_digits;
    mon->frac_digits [1]    = pconv->int_frac_digits;

    // initialize domestic C90 formats
    mon->p_cs_precedes [0]  = pconv->p_cs_precedes;
    mon->n_cs_precedes [0]  = pconv->n_cs_precedes;
    mon->p_sep_by_space [0] = pconv->p_sep_by_space;
    mon->n_sep_by_space [0] = pconv->n_sep_by_space;
    mon->p_sign_posn [0]    = pconv->p_sign_posn;
    mon->n_sign_posn [0]    = pconv->n_sign_posn;

#ifndef _RWSTD_NO_LCONV_INT_FMAT

    // copy international formats from C99 members
    mon->p_cs_precedes [1]  = pconv->int_p_cs_precedes;
    mon->n_cs_precedes [1]  = pconv->int_n_cs_precedes;
    mon->p_sep_by_space [1] = pconv->int_p_sep_by_space;
    mon->n_sep_by_space [1] = pconv->int_n_sep_by_space;
    mon->p_sign_posn [1]    = pconv->int_p_sign_posn;
    mon->n_sign_posn [1]    = pconv->int_n_sign_posn;

#else   // if defined (_RWSTD_NO_LCONV_INT_FMAT)

    // copy international formats from local members
    mon->p_cs_precedes [1]  = mon->p_cs_precedes [0];
    mon->n_cs_precedes [1]  = mon->n_cs_precedes [0];
    mon->p_sep_by_space [1] = mon->p_sep_by_space [0];
    mon->n_sep_by_space [1] = mon->n_sep_by_space [0];
    mon->p_sign_posn [1]    = mon->p_sign_posn [0];
    mon->n_sign_posn [1]    = mon->n_sign_posn [0];

#endif   // _RWSTD_NO_LCONV_INT_FMAT

    enum {
        // for syntactic convenience
        none   = _V3_LOCALE::money_base::none,
        space  = _V3_LOCALE::money_base::space,
        symbol = _V3_LOCALE::money_base::symbol,
        sign   = _V3_LOCALE::money_base::sign,
        value  = _V3_LOCALE::money_base::value
    };

    static const _V3_LOCALE::money_base::pattern pat[] = {

        // cs_precedes [0..1]:
        //
        // An integer set to 1 if the currency_symbol precedes the value
        // for a monetary value, and set to 0 if the symbol succeeds
        // the value.

        // sep_by_space [0..2]:
        //
        // 0  No space separates the currency_symbol from the value for
        //    a monetary value.
        // 1  If the currency symbol and sign string are adjacent, a space
        //    separates them from the value; otherwise, a space separates
        //    the currency symbol from the value.
        // 2  If the currency symbol and sign string are adjacent, a space
        //    separates them; otherwise, a space separates the sign string
        //    from the value.

        // sign_posn [0..4]:
        //
        // An integer set to a value indicating the positioning of the
        // positive_sign for a monetary value. The following integer
        // values shall be recognized:
        //
        // 0  Parentheses enclose the value and the currency_symbol.
        // 1  The sign string precedes the value and the currency_symbol.
        // 2  The sign string succeeds the value and the currency_symbol.
        // 3  The sign string immediately precedes the currency_symbol.
        // 4  The sign string immediately succeeds the currency_symbol.

        // +-------- cs_precedes
        // |+----- sep_by_space
        // ||+-- sign_posn
        // |||
        // VVV  ....        -     1      $       .           // pattern
        /* 000: -1$. */ { { sign, value, symbol, none } },   // "\3\4\2\0"
        /* 001: -1$. */ { { sign, value, symbol, none } },   // "\3\4\2\0"
        /* 002: 1$-. */ { { value, symbol, sign, none } },   // "\4\2\3\0"
        /* 003: 1-$. */ { { value, sign, symbol, none } },   // "\4\3\2\0"
        /* 004: 1$-. */ { { value, symbol, sign, none } },   // "\4\2\3\0"

        /* 010: -1 $ */ { { sign, value, space, symbol } },  // "\3\4\1\2"
        /* 011: -1 $ */ { { sign, value, space, symbol } },  // "\3\4\1\2"
        /* 012: 1 $- */ { { value, space, symbol, sign } },  // "\4\1\2\3"
        /* 013: 1 -$ */ { { value, space, sign, symbol } },  // "\4\3\3\2"
        /* 014: 1 $- */ { { value, space, symbol, sign } },  // "\4\1\2\3"

        /* 020: - 1$ */ { { sign, space, value, symbol } },  // "\3\1\4\2"
        /* 021: - 1$ */ { { sign, space, value, symbol } },  // "\3\1\4\2"
        /* 022: 1$ - */ { { value, symbol, space, sign } },  // "\4\2\1\3"
        /* 023: 1- $ */ { { value, sign, space, symbol } },  // "\4\3\1\2"
        /* 024: 1$ - */ { { value, symbol, space, sign } },  // "\4\2\1\3"

        /* 100: -$1. */ { { sign, symbol, value, none } },   // "\3\2\4\0"
        /* 101: -$1. */ { { sign, symbol, value, none } },   // "\3\2\4\0"
        /* 102: $1-. */ { { symbol, value, sign, none } },   // "\2\4\3\0"
        /* 103: -$1. */ { { sign, symbol, value, none } },   // "\3\2\4\0"
        /* 104: $-1. */ { { symbol, sign, value, none } },   // "\2\3\4\0"

        /* 110: -$ 1 */ { { sign, symbol, space, value } },  // "\3\2\1\4"
        /* 111: -$ 1 */ { { sign, symbol, space, value } },  // "\3\2\1\4"
        /* 112: $ 1- */ { { symbol, space, value, sign } },  // "\2\1\4\3"
        /* 113: -$ 1 */ { { sign, symbol, space, value } },  // "\3\2\1\4"
        /* 114: $- 1 */ { { symbol, sign, space, value } },  // "\2\3\1\4"

        /* 120: - $1 */ { { sign, space, symbol, value } },  // "\3\1\2\4"
        /* 121: - $1 */ { { sign, space, symbol, value } },  // "\3\1\2\4"
        /* 122: $1 - */ { { symbol, value, space, sign } },  // "\2\4\1\3"
        /* 123: - $1 */ { { sign, space, symbol, value } },  // "\3\1\2\4"
        /* 124: $ -1 */ { { symbol, space, sign, value } }   // "\2\1\3\4"
    };

    typedef _RWSTD_SIZE_T SizeT;

    _RWSTD_SIZE_T inx =   SizeT (mon->p_cs_precedes [intl]) * (3U * 5U)
                        + SizeT (mon->p_sep_by_space [intl]) * 5U
                        + SizeT (mon->p_sign_posn [intl]);

    if (inx < sizeof pat / sizeof *pat)
        ::memcpy (mon->pos_format [intl], pat + inx, sizeof *pat);
    else
        ::memset (mon->pos_format [intl], none, sizeof *pat);

    inx =   SizeT (mon->n_cs_precedes [intl]) * (3U * 5U)
          + SizeT (mon->n_sep_by_space [intl]) * 5U
          + SizeT (mon->n_sign_posn [intl]);

    if (inx < sizeof pat / sizeof *pat)
        ::memcpy (mon->neg_format [intl], pat + inx, sizeof *pat);
    else
        ::memset (mon->neg_format [intl], none, sizeof *pat);

    // set `impdata' and `impsize' (facet base dtor will delete)
    __rw_access::_C_get_impdata (*_RWSTD_CONST_CAST (__rw_facet*, pfacet)) =
        pun;

    __rw_access::_C_get_impsize(*_RWSTD_CONST_CAST (__rw_facet*, pfacet)) =
        (_RWSTD_SIZE_T)(-1);

    // call self recursively on already initialized `impdata'
    return __rw_get_moneypunct (pfacet, flags);
}

/***************************************************************************/


/* _RWSTD_SPECIALIZED_FUNCTION */ _RWSTD_EXPORT
const char*
__rw_get_punct(const __rw_facet *pfacet, int flags, char)
{
    typedef const char *CPChar;

    if (flags & __rw_mon)
        return CPChar (__rw_get_moneypunct (pfacet, flags & ~__rw_mon));

    return CPChar (__rw_get_numpunct (pfacet, flags));
}


#ifndef _RWSTD_NO_WCHAR_T

/* _RWSTD_SPECIALIZED_FUNCTION */ _RWSTD_EXPORT
const wchar_t*
__rw_get_punct(const __rw_facet *pfacet, int flags, wchar_t)
{
    flags |= __rw_wide;

    typedef const wchar_t *CPWChar;

    if (flags & __rw_mon)
        return CPWChar (__rw_get_moneypunct (pfacet, flags & ~__rw_mon));

    return CPWChar (__rw_get_numpunct (pfacet, flags));
}

#endif   // _RWSTD_NO_WCHAR_T


const char*
__rw_get_stdio_fmat (char buf [32], int type, unsigned fmtflags, int prec)
{
    char *pbuf = buf;

    // format of the specifier:
    //     "%[+][#](.[0-9]*)(h|l|L|LL)(o|x|X|i|d|e|E|f|F|g|G|p)"

    *pbuf++ = '%';

    if (fmtflags & _RWSTD_IOS_SHOWPOS)
        *pbuf++ = '+';

    if (type & __rw_facet::_C_floating) {
        if (fmtflags & _RWSTD_IOS_SHOWPOINT)
            *pbuf++ = '#';

        const int fltfld = fmtflags & _RWSTD_IOS_FLOATFIELD;

        // follows resolution of lwg issue 231
        if (   (   _RWSTD_IOS_FIXED      == fltfld
                || _RWSTD_IOS_SCIENTIFIC == fltfld)
            && prec >= 0 || prec > 0) {

            // 7.19.6.1, p5 of C99 specifies that, when given using the
            // asterisk, negative precision is treated the same as if
            // it were omitted; treat negative precision the same here
            pbuf += sprintf (pbuf, ".%d", prec);
        }
    }
    else if (fmtflags & _RWSTD_IOS_SHOWBASE)
        *pbuf++ = '#';

    enum {
        // for convenience
        Short   = __rw_facet::_C_ushort  & __rw_facet::_C_typemask,
        Long    = __rw_facet::_C_ulong   & __rw_facet::_C_typemask,
        LLong   = __rw_facet::_C_ullong  & __rw_facet::_C_typemask,
        Double  = __rw_facet::_C_double  & __rw_facet::_C_typemask,
        LDouble = __rw_facet::_C_ldouble & __rw_facet::_C_typemask
    };

    const int basetype = type & __rw_facet::_C_typemask;

    switch (basetype) {

    case Short: *pbuf++ = 'h'; break;
    case Long:
    case Double:
        *pbuf++ = 'l';
        break;

    case LDouble: *pbuf++ = 'L'; break;

    case LLong:

#ifdef _RWSTD_LLONG_PRINTF_PREFIX

        ::memcpy (pbuf, _RWSTD_LLONG_PRINTF_PREFIX,
                sizeof _RWSTD_LLONG_PRINTF_PREFIX - 1);
        pbuf += sizeof _RWSTD_LLONG_PRINTF_PREFIX - 1;

#else

        _RWSTD_ASSERT (!"long long printf prefix not configured");

#endif   // _RWSTD_LLONG_PRINTF_PREFIX

        break;
    }

    if (type & __rw_facet::_C_floating) {

        switch (fmtflags & _RWSTD_IOS_FLOATFIELD) {
        case _RWSTD_IOS_FIXED:
            *pbuf++ = 'f';
            break;

        case _RWSTD_IOS_SCIENTIFIC:
            *pbuf++ = fmtflags & _RWSTD_IOS_UPPERCASE ? 'E' : 'e';
            break;

        default:
            *pbuf++ = fmtflags & _RWSTD_IOS_UPPERCASE ? 'G' : 'g';
        }
    }
    else if (type == __rw_facet::_C_pvoid)
        *pbuf++ = 'p';
    else if (type == __rw_facet::_C_bool && fmtflags & _RWSTD_IOS_BOOLALPHA)
        --pbuf;   // empty format indicates bool
    else {
        switch (fmtflags & _RWSTD_IOS_BASEFIELD) {
        case _RWSTD_IOS_OCT: *pbuf++ = 'o'; break;
        case _RWSTD_IOS_DEC: *pbuf++ = 'd'; break;
        case _RWSTD_IOS_HEX:
            *pbuf++ = fmtflags & _RWSTD_IOS_UPPERCASE ? 'X' : 'x';
            break;
        default:
            *pbuf++ = 'i';
            
        }
    }

    *pbuf++ = '\0';

    _RWSTD_ASSERT (pbuf - buf < 32);

    return buf;
}


}   // namespace __rw


#endif   // _RWSTD_NO_V3_LOCALE
