/**************************************************************************
 *
 * codecvte.h - Example of user defined codecvt facet. 
 *
 * $Id$
 *
 ***************************************************************************
 *
 * 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.
 * 
 **************************************************************************/

#ifndef CODECVTE_H_INCLUDED
 
#include <locale>       // for codecvt
#include <cwchar>       // for mbstate_t, size_t

#include <examples.h>


#define RWSTD_TABLE_SIZE 59
 
// This facet performs a conversion from  Latin Alphabet No. 1 
// (ISO 8859-1) to U.S.  ASCII code page 437.  Some conversions are
// one way (from ISO to ASCII, but not back again) because this ASCII 
// code page has no equivilent to the ISO character.

class ex_codecvt: public std::codecvt<char, char, std::mbstate_t>
{
    static const char table_[RWSTD_TABLE_SIZE][3];
                           
protected:

    virtual result
    do_in (std::mbstate_t&,
           const char*  from,
           const char*  from_end,
           const char* &from_next,
           char*        to,
           char*        to_limit,
           char*       &to_next) const {

        const std::size_t from_size = std::size_t (from_end - from);
        const std::size_t to_size   = std::size_t (to_limit - to);
        
        std::size_t i = from_size < to_size ? from_size : to_size;

        from_next = from;
        to_next   = to;

        for (std::size_t j = 0; j < i; ++j, ++from_next, ++to_next) {

            *to_next = *from_next;

            for (int k = 0; k < RWSTD_TABLE_SIZE; ++k) {  
                if (   *from_next >= table_[k][0]
                    && *from_next <= table_[k][1]) {
                    *to_next = table_[k][2];
                    break;
                }
            }
        }

        return ok;
    }

    virtual result
    do_out (std::mbstate_t&,
            const char*  from,
            const char*  from_end,
            const char* &from_next,
            char*        to,
            char*        to_limit,
            char*       &to_next) const {

        const std::size_t from_size = std::size_t (from_end - from);
        const std::size_t to_size   = std::size_t (to_limit - to);
        
        std::size_t i = from_size < to_size ? from_size : to_size;

        from_next = from;
        to_next   = to;

        for (std::size_t j = 0; j < i; ++j, ++from_next, ++to_next) {

            *to_next = *from_next;

            for (std::size_t k = 0; k < RWSTD_TABLE_SIZE; ++k) {  
                if (   *from_next == table_[k][2]
                    && table_[k][0] == table_[k][1]) {
                    *to_next = table_[k][1];
                    break;
                }
            }
        }

        return ok;
    }

    virtual bool do_always_noconv () const _THROWS (()) {
        return false;
    }

    virtual int do_encoding () const _THROWS (()) {
        return 1;
    }
};

 
const char ex_codecvt::table_[RWSTD_TABLE_SIZE][3] = {
    { '\xa2', '\xa2', '\x9b' }, { '\xa3', '\xa3', '\x9c' },
    { '\xa5', '\xa5', '\x9d' }, { '\xa7', '\xa7', '\x15' },
    { '\xa8', '\xa8', '\x22' }, { '\xaa', '\xaa', '\xa6' },
    { '\xab', '\xab', '\xae' }, { '\xb5', '\xb5', '\xe6' },
    { '\xb6', '\xb6', '\x14' }, { '\xb7', '\xb7', '\xfa' },
    { '\xba', '\xba', '\xa7' }, { '\xbb', '\xbb', '\xaf' },
    { '\xbc', '\xbc', '\xac' }, { '\xbd', '\xbd', '\xab' },
    { '\xbf', '\xbf', '\xa8' }, { '\xc0', '\xc3', '\x41' },
    { '\xc4', '\xc4', '\x8e' }, { '\xc5', '\xc5', '\x41' },
    { '\xc6', '\xc6', '\x92' }, { '\xc7', '\xc7', '\x80' },
    { '\xc8', '\xc8', '\x45' }, { '\xc9', '\xc9', '\x90' },
    { '\xca', '\xcb', '\x45' }, { '\xcc', '\xcf', '\x49' },
    { '\xd1', '\xd1', '\xa5' }, { '\xd2', '\xd5', '\x4f' },
    { '\xd6', '\xd6', '\x99' }, { '\xd8', '\xd8', '\xed' },
    { '\xd9', '\xdb', '\x55' }, { '\xdc', '\xdc', '\x9a' },
    { '\xdd', '\xdd', '\x59' }, { '\xdf', '\xdf', '\xe1' },
    { '\xe0', '\xe0', '\x85' }, { '\xe1', '\xe1', '\xa0' },
    { '\xe2', '\xe2', '\x83' }, { '\xe3', '\xe3', '\x61' },
    { '\xe4', '\xe4', '\x84' }, { '\xe5', '\xe5', '\x86' },
    { '\xe6', '\xe6', '\x91' }, { '\xe7', '\xe7', '\x87' },
    { '\xe8', '\xe8', '\x8a' }, { '\xe9', '\xe9', '\x82' },
    { '\xea', '\xea', '\x88' }, { '\xeb', '\xeb', '\x89' },
    { '\xec', '\xec', '\x8d' }, { '\xed', '\xed', '\xa1' },
    { '\xee', '\xee', '\x8c' }, { '\xef', '\xef', '\x8b' },
    { '\xf1', '\xf1', '\xa4' }, { '\xf2', '\xf2', '\x95' },
    { '\xf3', '\xf3', '\xa2' }, { '\xf4', '\xf4', '\x93' },
    { '\xf5', '\xf5', '\x6f' }, { '\xf6', '\xf6', '\x94' },
    { '\xf9', '\xf9', '\x97' }, { '\xfa', '\xfa', '\xa3' },
    { '\xfb', '\xfb', '\x96' }, { '\xfc', '\xfc', '\x81' },
    { '\xff', '\xff', '\x98' }
};

#endif   // CODECVTE_H_INCLUDED
