This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/Rw/numbrw.h

590 lines
20 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __NUMBRW_H
#define __NUMBRW_H
#pragma option push -b -a8 -pc -Vx- -Ve- -A- -w-inl -w-aus -w-sig
// -*- C++ -*-
/****************************************************************************
*
* rw/numbrw - Internal classes for numeric formatting and parsing.
*
***************************************************************************
*
* Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
*
* This computer software is owned by Rogue Wave Software, Inc. and is
* protected by U.S. copyright laws and other laws and by international
* treaties. This computer software is furnished by Rogue Wave Software,
* Inc. pursuant to a written license agreement and may be used, copied,
* transmitted, and stored only in accordance with the terms of such
* license and with the inclusion of the above copyright notice. This
* computer software or any other copies thereof may not be provided or
* otherwise made available to any other person.
*
* U.S. Government Restricted Rights. This computer software is provided
* with Restricted Rights. Use, duplication, or disclosure by the
* Government is subject to restrictions as set forth in subparagraph (c)
* (1) (ii) of The Rights in Technical Data and Computer Software clause
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
* Commercial Computer Software Restricted Rights at 48 CFR 52.227-19,
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
* Flatiron Parkway, Boulder, Colorado 80301 USA.
*
***************************************************************************/
#ifndef __STD_RW_LOCNUMRW__
#define __STD_RW_LOCNUMRW__
#ifndef _RWSTD_NO_NEW_HEADER
#include <ctime>
#else
#include <time.h>
#endif
#ifndef _RWSTD_NO_NAMESPACE
namespace __rwstd {
#endif
// -------------------------------------------------------
// Implementation class template -- timepunct_init<charT>.
// -------------------------------------------------------
// Structure used to initialize the private data members of timepunct<charT>.
template <class charT>
class _RWSTDExportTemplate timepunct_init
{
public:
const charT *dn_[7][2]; // Day names and abbreviations
const charT *mn_[12][2]; // Month names and abbreviations
const charT *ampm_[2]; // AM/PM strings
const charT *bad_; // Bad value output signal
const charT *ord_[100]; // Ordinal numbers
const charT *pat_[6]; // Patterns for formats "xXcDrT" resp.
};
template <class charT>
class _RWSTDExport timepunct_loc;
_RWSTD_TEMPLATE
class _RWSTDExport timepunct_loc<char>
{
typedef _RW_STD::basic_string<char,_RW_STD::char_traits<char>,_RW_STD::allocator<char> > string_type;
const timepunct_init<char>& ti_;
public:
timepunct_loc (const timepunct_init<char> &i)
: ti_(i)
{}
const string_type get_day(int i, bool abbr) const;
const string_type get_month(int i, bool abbr) const;
const string_type get_ampm(bool afternoon) const;
const string_type get_bad() const { return ti_.bad_; }
const string_type get_ord(int i) const { return ti_.ord_[i]; }
const string_type get_pattern(int i) const { return ti_.pat_[i]; }
};
#ifndef _RWSTD_NO_WIDE_CHAR
_RWSTD_TEMPLATE
class _RWSTDExport timepunct_loc<wchar_t>
{
typedef _RW_STD::basic_string<wchar_t,_RW_STD::char_traits<wchar_t>,_RW_STD::allocator<wchar_t> > string_type;
const timepunct_init<wchar_t>& ti_;
public:
timepunct_loc (const timepunct_init<wchar_t> &i)
: ti_(i)
{}
#ifndef _RWSTD_NO_WSTR
const string_type get_day(int i, bool abbr) const;
const string_type get_month(int i, bool abbr) const;
const string_type get_ampm(bool afternoon) const;
#else
const string_type get_day(int i, bool abbr) const { return ti_.dn_[i][abbr]; }
const string_type get_month(int i, bool abbr) const { return ti_.mn_[i][abbr]; }
const string_type get_ampm(bool afternoon) const { return ti_.ampm_[afternoon]; }
#endif // _RWSTD_NO_WSTR
const string_type get_bad() const { return ti_.bad_; }
const string_type get_ord(int i) const { return ti_.ord_[i]; }
const string_type get_pattern(int i) const { return ti_.pat_[i]; }
};
#endif // _RWSTD_NO_WIDE_CHAR
template <class charT>
class _RWSTDExportTemplate timepunct_loc
{
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
const timepunct_init<charT>& ti_;
public:
timepunct_loc (const timepunct_init<charT> &i)
: ti_(i)
{}
const string_type get_day(int i, bool abbr) const { return ti_.dn_[i][abbr]; }
const string_type get_month(int i, bool abbr) const { return ti_.mn_[i][abbr]; }
const string_type get_ampm(bool afternoon) const { return ti_.ampm_[afternoon]; }
const string_type get_bad() const { return ti_.bad_; }
const string_type get_ord(int i) const { return ti_.ord_[i]; }
const string_type get_pattern(int i) const { return ti_.pat_[i]; }
};
// -------------------------------------------------------
// Implementation class template -- timepunct_data<charT>.
// -------------------------------------------------------
// timepunct<charT> derives from this (via rwstd::timepunct_impl) to get its
// private data members.
template <class charT>
class _RWSTDExportTemplate timepunct_data {
friend class timepunct<charT>;
friend class keyword_cracker<charT>;
public:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
private:
string_type dn_[7][2];
string_type mn_[12][2];
string_type ampm_[2];
string_type bad_;
string_type ord_[100];
string_type pat_[6];
keyword_def<charT> dn_defs_[7][2];
keyword_map<charT> dn_map_;
keyword_def<charT> mn_defs_[12][2];
keyword_map<charT> mn_map_;
keyword_def<charT> ampm_defs_[2];
keyword_map<charT> ampm_map_;
protected:
timepunct_data (const timepunct_loc<charT> &i);
void __initpat (const locale*);
void __initfacet (const locale*);
};
// -------------------------------------------------------
// Implementation class template -- timepunct_impl<charT>.
// -------------------------------------------------------
// timepunct<charT> derives from this to get the parts of its behavior that
// must be specialized on the character type. Currently the only specialized
// behavior is the initialization logic in the constructor.
template <class charT>
class _RWSTDExportTemplate timepunct_impl :
public timepunct_data<charT>
{
protected:
timepunct_impl(void);
};
_RWSTD_TEMPLATE
class _RWSTDExport timepunct_impl<char>: // Specialization
public timepunct_data<char>
{
#if !defined(_MSC_VER) || defined(__BORLANDC__)
static _RWSTDExport timepunct_init<char> __ivals; // Vendor-supplied
#else
static timepunct_init<char> __ivals;
#endif
protected:
timepunct_impl (void):
timepunct_data<char>(timepunct_loc<char>(__ivals)) { }
};
#ifndef _RWSTD_NO_WIDE_CHAR
_RWSTD_TEMPLATE
class _RWSTDExport timepunct_impl<wchar_t>: // Specialization
public timepunct_data<wchar_t>
{
#if !defined(_MSC_VER) || defined(__BORLANDC__)
static _RWSTDExport timepunct_init<wchar_t> __ivals; // Vendor-supplied
#else
static timepunct_init<wchar_t> __ivals;
#endif
protected:
timepunct_impl(void):
timepunct_data<wchar_t>(timepunct_loc<wchar_t>(__ivals)) { }
};
#endif // _RWSTD_NO_WIDE_CHAR
// ----------------------------------------------------
// Time and date punctuation facet -- timepunct<charT>.
// ----------------------------------------------------
template <class charT>
class _RWSTDExportTemplate timepunct : public _RW_STD::locale::facet,
public timepunct_impl<charT>
{
public:
typedef charT char_type;
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> >
string_type;
_EXPLICIT timepunct (size_t refs=0):
_RW_STD::locale::facet(refs,_RW_STD::locale::time) { }
string_type dayname (int day, bool abbreviated) const
{ return do_dayname(day,abbreviated); }
string_type monthname (int month, bool abbreviated) const
{ return do_monthname(month,abbreviated); }
string_type ordinal (int number) const
{ return do_ordinal(number); }
static _RW_STD::locale::id id;
// Implementation:
enum { __facet_cat = _RW_STD::locale::time, __ok_implicit = 1 };
protected:
virtual ~timepunct() { }
virtual string_type do_dayname (int day, bool abbreviated) const;
virtual string_type do_monthname (int month, bool abbreviated) const;
virtual string_type do_ordinal (int number) const;
private:
void __initfacet (const locale*);
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
_RW_STD::locale::id &__get_id (void) const { return id; }
#endif
};
// --------------------------------------------------------
// Implementation class template -- keyword_cracker<charT>.
// --------------------------------------------------------
// Gives derived classes a backdoor way to get the private keyword_map and
// other members out of numpunct and timepunct facets.
template <class charT>
class _RWSTDExportTemplate keyword_cracker {
public:
static const keyword_map<charT>& get_tf_map
(const _RW_STD::numpunct<charT> &nump)
{ return nump.tf_map_; }
static const keyword_map<charT>& get_day_map
(const timepunct<charT>& timp)
{ return timp.dn_map_; }
static const keyword_map<charT>& get_month_map
(const timepunct<charT>& timp)
{ return timp.mn_map_; }
static const keyword_map<charT>& get_ampm_map
(const timepunct<charT>& timp)
{ return timp.ampm_map_; }
#ifndef _RWSTD_NO_NAMESPACE
static const _TYPENAME _RW_STD::numpunct<charT>::string_type& get_tf_string
#else
static const _TYPENAME numpunct<charT>::string_type& get_tf_string
#endif
(const _RW_STD::numpunct<charT>& nump,bool v)
{ return v? nump.tn_ : nump.fn_; }
static const _TYPENAME timepunct<charT>::string_type&
get_day_string
(const timepunct<charT>& timp,unsigned n,bool abbr)
{ return n<7? timp.dn_[n][abbr] : timp.bad_; }
static const _TYPENAME timepunct<charT>::string_type&
get_month_string
(const timepunct<charT>& timp,unsigned n,bool abbr)
{ return n<12? timp.mn_[n][abbr] : timp.bad_; }
static const _TYPENAME timepunct<charT>::string_type&
get_ampm_string
(const timepunct<charT>& timp,bool pm)
{ return timp.ampm_[pm]; }
static const _TYPENAME timepunct<charT>::string_type&
get_ord_string
(const timepunct<charT>& timp,unsigned n)
{ return n<99? timp.ord_[n] : timp.bad_; }
static const _TYPENAME timepunct<charT>::string_type&
get_patt_string
(const timepunct<charT>& timp,unsigned n)
{ return n<6? timp.pat_[n] : timp.bad_; }
};
// -------------------------------------------------------------
// Implementation class template -- digit_handler_base_1<charT>.
// -------------------------------------------------------------
// Contains charT-dependent functionality that is common to the digit_reader
// and digit_writer classes, particularly related to getting access to ctype
// and punct facets they both use.
template <class charT>
class _RWSTDExportTemplate digit_handler_base_1:
public keyword_cracker<charT>
{
public:
const _RW_STD::ctype<charT> &ctyp;
const digit_map<charT>& dmap;
const punct_data<charT>& punct;
// Constructor for general numerics, gets punct from loc's numpunct facet.
digit_handler_base_1 (const _RW_STD::locale &loc);
// Constructor for money, passed punct_data is in fact a moneypunct facet.
digit_handler_base_1 (const _RW_STD::locale &loc,const punct_data<charT>&);
};
// ------------------------------------------
// Implementation class -- digit_reader_base.
// ------------------------------------------
// Contains digit_reader members that do not depend on the digit_reader
// template parameters, particularly for converting strings of char digits
// to long and floating-point binary values.
class _RWSTDExport digit_reader_base : public digit_map_base
{
public:
enum {
good = 0x0000,
no_digits = 0x0001,
too_many_digits = 0x0002,
too_many_groups = 0x0004,
group_too_long = 0x0008,
group_is_empty = 0x0010,
bad_grouping = 0x0020,
bad_exponent = 0x0040,
overflow = 0x0080,
bad_curr_symbol = 0x0100,
bad_sign = 0x0200
};
enum {
digit_buf_size = LDBL_MAX_10_EXP+200
};
// Fields defining digits to be converted, usually filled in by derived
// class before calling one of the conversion methods below.
int error; // Bit-field
int radix; // 8, 10, or 16, 0=not yet determined
bool is_signed; // Sign allowed in input
bool negative; // Minus sign was present
bool advanced; // Iterator was advanced
bool reached_end; // Needed a char, but iterator matched end
bool exp_negative; // Minus sign was present on exponent
char *frac_beg; // Start of fractional part of digits
char *exp_beg; // Start of exponent in digits
char digits[digit_buf_size]; // Binary digits (i.e. 0,1,2 not '0','1','2')
digit_reader_base (void): error(good), radix(0),
is_signed(true), negative(false), advanced(false), reached_end(false)
{ }
unsigned long to_ulong (char *end);
unsigned long to_ulong_dec (char *beg,char *end);
#ifdef _RWSTD_LONG_LONG
unsigned _RWSTD_LONG_LONG to_ulong_ulong (char *end);
#endif
void *to_pointer (char *end);
float to_float (char *end);
double to_double (char *end);
long double to_long_double (char *end);
private:
void to_floating_point (char *end, char *pattern, void *result);
};
// ------------------------------------------------------------
// Implementation class template -- digit_reader_base_1<charT>.
// ------------------------------------------------------------
// Contains parts of digit_reader that depend on charT but not on the iterator
// type.
template <class charT>
class _RWSTDExportTemplate digit_reader_base_1 :
public digit_reader_base,
public digit_handler_base_1<charT>
{
public:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
protected:
// Constructor for general numerics, gets punct from loc's numpunct<charT>.
digit_reader_base_1 (const _RW_STD::locale &loc);
// Constructor for use by derived money_reader, caller passes punct, which
// in fact is loc's moneypunct<charT,true|false> facet.
digit_reader_base_1 (const _RW_STD::locale &loc, const punct_data<charT>&);
// These could be moved to digit_handler_base_1<charT> ...
charT get_decimal_point() const { return this->punct.dp_; }
charT get_thousands_sep() const { return this->punct.ts_; }
const char *get_grouping() const { return this->punct.gr_.c_str(); }
};
// -------------------------------------------------------------------
// Implementation class template -- digit_reader<charT,InputIterator>.
// -------------------------------------------------------------------
// Facets that do numeric input use temporary objects of this class to
// extract keywords and strings of digits and punctuation from the input
// stream.
template <class charT,class InputIterator>
class _RWSTDExportTemplate digit_reader :
public digit_reader_base_1<charT>
{
public:
// Constructor for reading general numerics.
digit_reader (InputIterator& in,InputIterator& end,
_RW_STD::ios_base &io);
protected:
// Constructor for use by derived money_reader class.
digit_reader (InputIterator& in,InputIterator& end,
_RW_STD::ios_base &io,const punct_data<charT>&);
public:
char *get_int_digits (void); // Get integer-format digits
char *get_float_digits (void); // Get floating point-format digits
char *get_pointer_digits (void); // Get pointer-format digits
// Parse keyword from input, return associated integer value
int get_keyword (const keyword_map<charT>&);
protected:
_RW_STD::ios_base &io;
InputIterator& in;
InputIterator& end;
const char *grouping;
charT thousands_sep;
char groups[40];
char *gpos;
// Helper functions
char *get_digit_string (char*); // Get a string of digits
char *get_digit_groups (char*); // Get grouped digits (recursive)
inline bool at_end (void) { // Test for end of stream, and
#ifdef _HPACC_
if (_RW_STD::operator == (in,end)) {
#else
if (in == end) { // remember whether end was
#endif
this->reached_end=true; // ever reached
return true;
}
return false;
}
};
// ------------------------------------------
// Implementation class -- digit_writer_base.
// ------------------------------------------
// Contains the parts of digit_writer that do not depend on the template
// parameters.
class _RWSTDExport digit_writer_base :
public digit_map_base
{
public:
digit_writer_base (_RW_STD::ios_base &b);
void get_pattern(char *p, char *prefix, bool is_signed);
bool get_f_pattern(char *p, char prefix);
void digitize (const void*);
void digitize (unsigned short);
void digitize (short);
void digitize (unsigned int);
void digitize (int);
void digitize (unsigned long);
void digitize (long);
#ifdef _RWSTD_LONG_LONG
void digitize (unsigned _RWSTD_LONG_LONG);
void digitize (_RWSTD_LONG_LONG);
#endif
void digitize (double);
#ifndef _RWSTD_NO_LONG_DOUBLE
void digitize (long double);
#endif
_RW_STD::ios_base &io;
_RW_STD::ios_base::fmtflags flags;
int precision,width,radix,iprecision,num_groups;
enum { left, internal, right } adjust;
bool fractional,separable;
char *start,*end,*group;
char buffer[400];
char groups[150];
int calc_groups (int,const char*);
};
// ------------------------------------------------------------
// Implementation class template -- digit_writer_base_1<charT>.
// ------------------------------------------------------------
// Contains parts of digit_writer<charT,OutputWriter> that depend only on the
// charT parameter.
template <class charT>
class _RWSTDExportTemplate digit_writer_base_1 :
public digit_writer_base,
public digit_handler_base_1<charT>
{
public:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
protected:
// Constructor for general numerics, gets punct from loc's numpunct<charT>.
digit_writer_base_1
(_RW_STD::ios_base&,const _RW_STD::locale&);
// Constructor for money, passed punct is really a moneypunct<charT,Intl>.
digit_writer_base_1 (_RW_STD::ios_base&,const punct_data<charT>&);
// These could be moved to digit_handler_base_1<charT> ...
charT get_decimal_point() const { return this->punct.dp_; }
charT get_thousands_sep() const { return this->punct.ts_; }
const char *get_grouping() const { return this->punct.gr_.c_str(); }
};
// --------------------------------------------------------------------
// Implementation class template -- digit_writer<charT,OutputIterator>.
// --------------------------------------------------------------------
// Facets that do numeric output use temporary objects of this type (on the
// stack) to convert numeric quantities into sequences of digits and other
// punctuation.
template <class charT,class OutputIterator>
class _RWSTDExportTemplate digit_writer :
public digit_writer_base_1<charT>
{
public:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
// Constructor for general numerics.
digit_writer (OutputIterator&,_RW_STD::ios_base&);
protected:
// Constructor for use by derived money_writer classes, passed punct_data is
// really a moneypunct<charT,Intl> facet.
digit_writer (OutputIterator&,_RW_STD::ios_base&,
const punct_data<charT>&);
public:
void put_digits (charT fill);
void put_keyword (const string_type&,charT fill);
protected:
OutputIterator &out;
};
#ifndef _RWSTD_NO_NAMESPACE
} // namespace __rwstd
#endif
#ifdef _RWSTD_COMPILE_INSTANTIATE
#include <rw/numbrw.cc>
#endif
#endif
#pragma option pop
#endif /* __NUMBRW_H */