235 lines
5.8 KiB
C++
235 lines
5.8 KiB
C++
//
|
|
// The developer of the original code and/or files is Tripwire, Inc.
|
|
// Portions created by Tripwire, Inc. are copyright (C) 2000-2017 Tripwire,
|
|
// Inc. Tripwire is a registered trademark of Tripwire, Inc. All rights
|
|
// reserved.
|
|
//
|
|
// This program is free software. The contents of this file are subject
|
|
// to the terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 2 of the License, or (at your
|
|
// option) any later version. You may redistribute it and/or modify it
|
|
// only in compliance with the GNU General Public License.
|
|
//
|
|
// This program is distributed in the hope that it will be useful.
|
|
// However, this program is distributed AS-IS WITHOUT ANY
|
|
// WARRANTY; INCLUDING THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS
|
|
// FOR A PARTICULAR PURPOSE. Please see the GNU General Public License
|
|
// for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
|
// USA.
|
|
//
|
|
// Nothing in the GNU General Public License or any other license to use
|
|
// the code or files shall permit you to use Tripwire's trademarks,
|
|
// service marks, or other intellectual property without Tripwire's
|
|
// prior written consent.
|
|
//
|
|
// If you have any questions, please contact Tripwire, Inc. at either
|
|
// info@tripwire.org or www.tripwire.org.
|
|
//
|
|
/*
|
|
* Name....: ntdbs.h
|
|
* Date....: 09/16/99
|
|
* Creator.: rdifalco
|
|
*
|
|
* Allows dbchar_t (aka: WCHAR16) to be used with basic_string.
|
|
*
|
|
* std::basic_string<dbchar_t> (aka: tss::dbstring) should be
|
|
* used instead of wc16_string!
|
|
*
|
|
* NOTE: If platform's wchar_t is already a dbchar_t (i.e. 2 bytes)
|
|
* then tss::dbstring and dbchar_t are synonyms for std::wstring
|
|
* and wchar_t.
|
|
*/
|
|
|
|
#ifndef __NTDBS_H
|
|
#define __NTDBS_H
|
|
|
|
#include "stringutil.h"
|
|
#include "ntmbs.h"
|
|
|
|
#if IS_KAI
|
|
#define IS_STDLIB_MODENA 1 // Has special char_traits req's!
|
|
#ifdef MSIPL_WCHART
|
|
#define MBSTATE_T_DEFINED
|
|
#endif
|
|
#else
|
|
#define IS_STDLIB_MODENA 0
|
|
#define MBSTATE_T_DEFINED
|
|
#endif
|
|
|
|
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
// Char traits for WCHAR16 (aka dbchar_t) and NTMBCS (mctype_t)
|
|
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
#if ( WCHAR_IS_16_BITS )
|
|
namespace tss { typedef std::wstring dbstring; }
|
|
|
|
#elif ( WCHAR_IS_32_BITS )
|
|
namespace std { template <> struct char_traits< dbchar_t >; }
|
|
namespace tss { typedef std::basic_string<dbchar_t> dbstring; }
|
|
|
|
#else
|
|
#error "wchar_t is not correctly factored!"
|
|
|
|
#endif
|
|
|
|
|
|
#if WCHAR_IS_32_BITS // We already have a dbstring implicitly in wstring!!!
|
|
|
|
#include <locale>
|
|
|
|
// specialize *std*::char_traits!!!
|
|
|
|
template<>
|
|
struct std::char_traits< dbchar_t >
|
|
{
|
|
typedef dbchar_t char_type;
|
|
typedef wint_t int_type;
|
|
typedef streampos pos_type;
|
|
typedef streamoff off_type;
|
|
|
|
#ifdef MBSTATE_T_DEFINED
|
|
typedef mbstate_t state_type;
|
|
#else
|
|
typedef int state_type; // Shame on you KAI! This is ANSI-C!
|
|
#endif
|
|
|
|
static
|
|
void assign( char_type& lhs, const char_type& rhs ) {
|
|
lhs = rhs;
|
|
}
|
|
|
|
static
|
|
bool eq( const char_type& lhs, const char_type& rhs ) {
|
|
return lhs == rhs;
|
|
}
|
|
|
|
static
|
|
bool lt( const char_type& lhs, const char_type& rhs ) {
|
|
return lhs < rhs;
|
|
}
|
|
|
|
static
|
|
int compare( const char_type* lhs, const char_type* rhs, size_t N )
|
|
{
|
|
for ( ; N; ++lhs, ++rhs, --N )
|
|
if ( *lhs != *rhs )
|
|
return ( *lhs < *rhs ) ? -1 : +1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static
|
|
size_t length( const char_type* psz )
|
|
{
|
|
if ( psz == 0 )
|
|
return 0;
|
|
else
|
|
{
|
|
const char_type* end;
|
|
for ( end = psz; *end; end++ );
|
|
return (size_t)( end - psz );
|
|
}
|
|
}
|
|
|
|
static
|
|
char_type* copy( char_type* lhs, const char_type* rhs, size_t N )
|
|
{
|
|
for ( char_type* at = lhs; N; ++at, ++rhs, --N )
|
|
*at = *rhs;
|
|
|
|
return lhs;
|
|
}
|
|
|
|
static
|
|
const char_type*
|
|
find( const char_type* psz, size_t N, const char_type& ch )
|
|
{
|
|
for ( ; N; ++psz, --N )
|
|
if ( *psz == ch )
|
|
return psz;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static
|
|
char_type* move( char_type* lhs, const char_type* rhs, size_t N ) {
|
|
return (char_type*)memmove( lhs, rhs, N * sizeof(char_type) );
|
|
}
|
|
|
|
static
|
|
char_type* assign( char_type* lhs, size_t N, char_type ch )
|
|
{
|
|
for ( char_type* at = lhs; N; ++at, --N )
|
|
*at = ch;
|
|
return lhs;
|
|
}
|
|
|
|
static
|
|
int_type not_eof( const int_type& ch ) {
|
|
return int_type( !eq( ch, eof() ) ? ch : ~ch );
|
|
}
|
|
|
|
static
|
|
char_type to_char_type( const int_type& ch )
|
|
{
|
|
return
|
|
eq_int_type( ch, to_int_type( ch ) )
|
|
? ch
|
|
: char_type(0);
|
|
}
|
|
|
|
static
|
|
int_type to_int_type( const char_type& ch ) {
|
|
return (int_type)ch;
|
|
}
|
|
|
|
static
|
|
bool eq_int_type( const int_type& lhs, const int_type& rhs ) {
|
|
return lhs == rhs;
|
|
}
|
|
|
|
#if IS_STDLIB_MODENA
|
|
|
|
// CAUTION:RAD -- Extra members required by Modena!!
|
|
|
|
#ifdef MBSTATE_T_DEFINED // This is ANSI-C *not* ANSI-C++!!
|
|
static
|
|
state_type get_state( pos_type pos ) {
|
|
return pos.state();
|
|
}
|
|
|
|
static
|
|
pos_type get_pos( pos_type pos, state_type state ) {
|
|
return pos_type( pos.offset(), state );
|
|
}
|
|
#endif//MBSTATE_T_DEFINED
|
|
|
|
static
|
|
char_type newline() {
|
|
return L'\n';
|
|
}
|
|
|
|
static
|
|
char_type eos() {
|
|
return 0;
|
|
}
|
|
|
|
#endif//IS_STDLIB_MODENA
|
|
|
|
static
|
|
int_type eof() {
|
|
return (wint_t)(0xFFFF);
|
|
}
|
|
};
|
|
|
|
#endif//WCHAR_IS_16_BITS // We already have a dbstring implicitly in wstring!!!
|
|
|
|
|
|
#endif//__NTDBS_H
|
|
|