blob: 1ec77350d82ede0e1614ffc181a5e3344aaf6595 [file] [log] [blame]
/************************************************************************
*
* fmt_defs.h - declarations and definitions of types and functions
* used to implement the snprintfa helper functions
*
* $Id$
*
************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you 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.
*
* Copyright 2005-2006 Rogue Wave Software.
*
**************************************************************************/
#ifndef RW_FMT_DEFS_H_INCLUDED
#define RW_FMT_DEFS_H_INCLUDED
#include <rw_testdefs.h>
#include <stddef.h> // for ptrdiff_t, size_t
/********************************************************************/
// convenience typedefs
typedef unsigned char UChar;
typedef unsigned short UShrt;
typedef unsigned int UInt;
typedef unsigned long ULong;
#ifdef _RWSTD_LONG_LONG
typedef unsigned _RWSTD_LONG_LONG ULLong;
#endif // _RWSTD_LONG_LONG
typedef void (*funptr_t)();
struct DummyStruct { };
typedef void (DummyStruct::*memptr_t)() const;
/********************************************************************/
struct Buffer {
char **pbuf; // pointer to the output buffer
size_t *pbufsize; // pointer to the size of the buffer
size_t maxsize; // maximum not-to-exceed size
size_t endoff; // offset of the last character
};
/********************************************************************/
struct FmtSpec
{
// optional flags
unsigned fl_minus : 1;
unsigned fl_plus : 1;
unsigned fl_pound : 1;
unsigned fl_space : 1;
unsigned fl_zero : 1;
// optional length modifier
enum Modifier {
mod_none = 0,
mod_h, // short modifier
mod_hh, // char modifier
mod_l, // long modifier
mod_ll, // long long modifier
mod_j, // intmax_t modifier
mod_z, // size_t modifier
mod_t, // ptrdiff_t modifier
mod_L, // long double modifier
mod_ext_A, // extension: arrays
mod_ext_I // extension: int as ios::iostate
};
Modifier mod : 5;
unsigned cond : 1; // have an if/else clause
unsigned cond_true : 1; // if/else clause is active (true)
unsigned cond_begin : 1; // beginning of an if/else clause
unsigned cond_end : 1; // end of an if/else clause
// note that the signedness of a bitfield is implementation-defined
// unless explicitly declared signed or unsigned
// extension: 8, 16, 32, and 64 bit integer width modifier
signed int iwidth : 4;
// extension: optional numerical base 2 - 36
signed int base : 7;
// extension: optional parameter number
long paramno;
// optional field width and precision
int width;
int prec;
// extension: string argument
char *strarg;
// required conversion specifier
int cvtspec;
// extension: fill character
int fill;
#ifndef _RWSTD_NO_LONG_DOUBLE
typedef long double ldbl_t;
#else
typedef double ldbl_t; // bogus (for convenience)
#endif // _RWSTD_NO_LONG_DOUBLE
#ifdef _RWSTD_LONG_LONG
typedef _RWSTD_LONG_LONG llong_t;
#else
typedef long llong_t; // bogus (for convenience)
#endif // _RWSTD_LONG_LONG
#ifdef _RWSTD_INT64_T
typedef _RWSTD_INT64_T i64_t;
#else
typedef int i64_t; // likely bogus (for convenience)
#endif // _RWSTD_INT64_T
#ifdef _RWSTD_INT32_T
typedef _RWSTD_INT32_T i32_t;
#else
typedef int i32_t;
#endif // _RWSTD_INT64_T
#ifdef _RWSTD_WINT_T
typedef _RWSTD_WINT_T wint_t;
#else
typedef int wint_t;
#endif // _RWSTD_WINT_T
typedef ::size_t size_t;
typedef ptrdiff_t diff_t;
typedef ::funptr_t funptr_t;
typedef ::memptr_t memptr_t;
typedef int int_t;
typedef long long_t;
typedef void* ptr_t;
typedef double dbl_t;
union {
ldbl_t ldbl_;
llong_t llong_;
i64_t i64_;
ptr_t ptr_;
long_t long_;
i32_t i32_;
int_t int_;
diff_t diff_;
size_t size_;
wint_t wint_;
dbl_t dbl_;
memptr_t memptr_;
funptr_t funptr_;
} param;
};
/********************************************************************/
// format a character string
extern int
_rw_fmtstr (const FmtSpec&, Buffer&, const char*, size_t);
// format errno value/name
extern int
_rw_fmterrno (const FmtSpec&, Buffer&, int);
// format Windows GetLastError(), or errno value/name
extern int
_rw_fmtlasterror (const FmtSpec&, Buffer&, int);
// format the name/value of an LC_XXX constant/environment variable
extern int
_rw_fmtlc (const FmtSpec&, Buffer&, int);
// format ctype_base::mask
extern int
_rw_fmtmask (const FmtSpec&, Buffer&, int);
// format a character mask (alpha|alnum|...|xdigit)
extern int
_rw_fmtcharmask (const FmtSpec&, Buffer&, int);
// format ios_base::iostate
extern int
_rw_fmtiostate (const FmtSpec&, Buffer&, int);
// format ios_base::fmtflags
extern int
_rw_fmtflags (const FmtSpec&, Buffer&, int);
// format ios_base::openmode
extern int
_rw_fmtopenmode (const FmtSpec&, Buffer&, int);
// format ios_base::seekdir
extern int
_rw_fmtseekdir (const FmtSpec&, Buffer&, int);
// format ios_base::event
extern int
_rw_fmtevent (const FmtSpec&, Buffer&, int);
extern int
_rw_fmtmonpat (const FmtSpec&, Buffer&, const char [4]);
// format a signal value/name
extern int
_rw_fmtsignal (const FmtSpec&, Buffer&, int);
// format a bitset of arbitrary size
extern int
_rw_fmtbits (const FmtSpec&, Buffer&, const void*, size_t);
#endif // RW_FMT_DEFS_H_INCLUDED