| /************************************************************************ |
| * |
| * 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 |