You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1942 lines
64 KiB
1942 lines
64 KiB
/* /////////////////////////////////////////////////////////////////////////
|
|
* File: pantheios/pantheios.h
|
|
*
|
|
* Purpose: Pantheios Core and Util APIs.
|
|
*
|
|
* Created: 21st June 2005
|
|
* Updated: 6th August 2012
|
|
*
|
|
* Home: http://www.pantheios.org/
|
|
*
|
|
* Copyright (c) 2005-2012, Matthew Wilson and Synesis Software
|
|
* Copyright (c) 1999-2005, Synesis Software and Matthew Wilson
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* - Neither the name(s) of Matthew Wilson and Synesis Software nor the
|
|
* names of any contributors may be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* ////////////////////////////////////////////////////////////////////// */
|
|
|
|
|
|
/** \file pantheios/pantheios.h
|
|
*
|
|
* [C, C++] Primary include file for the \ref group__core_library and
|
|
* \ref group__util_library.
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS
|
|
#define PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Version information
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_PANTHEIOS_MAJOR 3
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_PANTHEIOS_MINOR 46
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_PANTHEIOS_REVISION 1
|
|
# define PANTHEIOS_VER_PANTHEIOS_H_PANTHEIOS_EDIT 350
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** \def PANTHEIOS_VER_MAJOR
|
|
* The major version number of Pantheios
|
|
*/
|
|
|
|
/** \def PANTHEIOS_VER_MINOR
|
|
* The minor version number of Pantheios
|
|
*/
|
|
|
|
/** \def PANTHEIOS_VER_REVISION
|
|
* The revision version number of Pantheios
|
|
*/
|
|
|
|
/** \def PANTHEIOS_VER
|
|
* The current composite version number of Pantheios
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_VER_1_0_1_B2 0x01000102
|
|
# define PANTHEIOS_VER_1_0_1_B193 0x010001c1
|
|
# define PANTHEIOS_VER_1_0_1_B194 0x010001c2
|
|
# define PANTHEIOS_VER_1_0_1_B195 0x010001c3
|
|
# define PANTHEIOS_VER_1_0_1_B196 0x010001c4
|
|
# define PANTHEIOS_VER_1_0_1_B197 0x010001c5
|
|
# define PANTHEIOS_VER_1_0_1_B198 0x010001c6
|
|
# define PANTHEIOS_VER_1_0_1_B199 0x010001c7
|
|
# define PANTHEIOS_VER_1_0_1_B200 0x010001c8
|
|
# define PANTHEIOS_VER_1_0_1_B201 0x010001c9
|
|
# define PANTHEIOS_VER_1_0_1_B202 0x010001ca
|
|
# define PANTHEIOS_VER_1_0_1_B203 0x010001cb
|
|
# define PANTHEIOS_VER_1_0_1_B204 0x010001cc
|
|
# define PANTHEIOS_VER_1_0_1_B205 0x010001cd
|
|
# define PANTHEIOS_VER_1_0_1_B206 0x010001ce
|
|
# define PANTHEIOS_VER_1_0_1_B207 0x010001cf
|
|
# define PANTHEIOS_VER_1_0_1_B208 0x010001d0
|
|
# define PANTHEIOS_VER_1_0_1_B209 0x010001d1
|
|
# define PANTHEIOS_VER_1_0_1_B210 0x010001d2
|
|
# define PANTHEIOS_VER_1_0_1_B211 0x010001d3
|
|
# define PANTHEIOS_VER_1_0_1_B212 0x010001d4
|
|
# define PANTHEIOS_VER_1_0_1_B213 0x010001d5
|
|
# define PANTHEIOS_VER_1_0_1_B214 0x010001d6
|
|
# define PANTHEIOS_VER_1_0_1 0x010001ff
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#define PANTHEIOS_VER_MAJOR 1
|
|
#define PANTHEIOS_VER_MINOR 0
|
|
#define PANTHEIOS_VER_REVISION 1
|
|
|
|
#define PANTHEIOS_VER PANTHEIOS_VER_1_0_1_B214
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Includes - 1
|
|
*/
|
|
|
|
/* Pantheios core API relies on STLSoft for compiler/library discrimination,
|
|
* and various fundamental types.
|
|
*/
|
|
#ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
|
|
# include <stlsoft/stlsoft.h>
|
|
#endif /* !STLSOFT_INCL_STLSOFT_H_STLSOFT */
|
|
|
|
#if !defined(_STLSOFT_VER) || \
|
|
_STLSOFT_VER < 0x010973ff
|
|
# error This version Pantheios requires STLSoft 1.9.115, or later. (www.stlsoft.org)
|
|
#endif /* STLSoft version */
|
|
|
|
#ifndef PANTHEIOS_INCL_H_STDARG
|
|
# define PANTHEIOS_INCL_H_STDARG
|
|
# include <stdarg.h> /* for va_list */
|
|
#endif /* !PANTHEIOS_INCL_H_STDARG */
|
|
#ifndef PANTHEIOS_INCL_H_STDDEF
|
|
# define PANTHEIOS_INCL_H_STDDEF
|
|
# include <stddef.h> /* for size_t */
|
|
#endif /* !PANTHEIOS_INCL_H_STDDEF */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Feature detection
|
|
*/
|
|
|
|
/* By default, Pantheios is a multi-byte string library
|
|
*
|
|
* If you define \c PANTHEIOS_USE_WIDE_STRINGS, then it will be built in
|
|
* wide string form.
|
|
*
|
|
* Also, if you are compiling for Windows (32-bit or 64-bit) and define
|
|
* either \c _UNICODE or \c UNICODE, then \c PANTHEIOS_USE_WIDE_STRINGS will
|
|
* be defined automatically.
|
|
*
|
|
* In either case, if you define \c PANTHEIOS_NO_USE_WIDE_STRINGS, then the
|
|
* wide string support will be suppressed.
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_USE_WIDE_STRINGS
|
|
# if defined(_WIN32) && \
|
|
defined(UNICODE) && \
|
|
defined(_UNICODE)
|
|
# define PANTHEIOS_USE_WIDE_STRINGS
|
|
# endif /* _WIN32 && UNICODE && _UNICODE */
|
|
#endif /* !PANTHEIOS_USE_WIDE_STRINGS */
|
|
|
|
#ifdef PANTHEIOS_NO_USE_WIDE_STRINGS
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
# undef PANTHEIOS_USE_WIDE_STRINGS
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
#endif /* PANTHEIOS_NO_USE_WIDE_STRINGS */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Includes - 2
|
|
*/
|
|
|
|
#ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
# ifndef _WCHAR_T_DEFINED
|
|
# include <wchar.h> /* for wchar_t (if not built-in) */
|
|
# endif /* !_WCHAR_T_DEFINED */
|
|
#endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
|
|
/* TODO: make this include relative */
|
|
#include <pantheios/internal/string_encoding.h>
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Macros and definitions
|
|
*/
|
|
|
|
/** \def PANTHEIOS_STRINGIZE(x)
|
|
*
|
|
* Macro for stringizing symbols during preprocessing phase
|
|
*
|
|
* \ingroup group__utility
|
|
*
|
|
* \param x The preprocessor symbol whose value will be turned into a string
|
|
*/
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_STRINGIZE_(x) #x
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
#define PANTHEIOS_STRINGIZE(x) PANTHEIOS_STRINGIZE_(x)
|
|
|
|
/** \def PANTHEIOS_MAKE_EXTENDED_SEVERITY(sev, xi)
|
|
*
|
|
* Defines a composite severity level comprising
|
|
* a \link pantheios::pan_severity_t stock severity level\endlink and
|
|
* 28-bits of extended information
|
|
*
|
|
* \param sev A \link pantheios::pan_severity_t stock severity level\endlink
|
|
* \param xi28 The extended severity information. Must be no larger than
|
|
* 28-bits
|
|
*
|
|
* \pre 0 == (xi28 & ~0xf0000000)
|
|
*/
|
|
#define PANTHEIOS_MAKE_EXTENDED_SEVERITY(sev, xi28) \
|
|
\
|
|
(((sev) & 0x0f) | (((xi28) << 4) & ~0x0f))
|
|
|
|
/** \def PANTHEIOS_CARG_STR(s)
|
|
*
|
|
* \param s A (nul-terminated) C-style string pointer/array
|
|
*
|
|
* \note The length of this macro is necessary to disambiguate with respect to
|
|
* arbitrary codebases. For convenience, it is recommended that you
|
|
* <code>#define</code> a shorter macro for use in your code, as in:
|
|
\htmlonly
|
|
<pre>
|
|
\#define PANARG_S(s) PANTHEIOS_CARG_STR(s)
|
|
</pre>
|
|
\endhtmlonly
|
|
*/
|
|
|
|
#define PANTHEIOS_CARG_STR(s) (s), (-1)
|
|
|
|
/** \def PANTHEIOS_CARG_STR_LEN(s, n)
|
|
*
|
|
* \param s A C-style string pointer/array, whose length is \c n
|
|
* \param n The length of the string pointed to by the \c s parameter
|
|
*
|
|
* \note The length of this macro is necessary to disambiguate with respect to
|
|
* arbitrary codebases. For convenience, it is recommended that you
|
|
* <code>#define</code> a shorter macro for use in your code, as in:
|
|
\htmlonly
|
|
<pre>
|
|
\#define PANARG_SN(s, n) PANTHEIOS_CARG_STR_LEN(s, n)
|
|
</pre>
|
|
\endhtmlonly
|
|
*/
|
|
|
|
#define PANTHEIOS_CARG_STR_LEN(s, n) (s), (n)
|
|
|
|
/** \def PANTHEIOS_DECLSPEC
|
|
*
|
|
* Storage class specifier to be applied to all Pantheios API functions
|
|
*
|
|
* \ingroup group__utility
|
|
*
|
|
* Defaults to no symbol. Can be defined to a symbol appropriate to the
|
|
* operating system and linkage model. e.g. on Windows you might choose to
|
|
* define it to <code>__declspec(dllexport)</code> when building Pantheios
|
|
* and to <code>__declspec(dllimport)</code> in client code using Pantheios.
|
|
*
|
|
* Used in the PANTHEIOS_CALL() macro.
|
|
*/
|
|
|
|
/** \def PANTHEIOS_EXTERN_C
|
|
*
|
|
* Resolves to <code>extern</code> when compiling in C, and
|
|
* <code>extern "C"</code> when compiling in C++.
|
|
*
|
|
* \ingroup group__utility
|
|
*
|
|
* Used in the PANTHEIOS_CALL() macro.
|
|
*/
|
|
|
|
/** \def PANTHEIOS_CALLCONV
|
|
*
|
|
* Calling convention specifier to be applied to all Pantheios API functions
|
|
*
|
|
* Used in the PANTHEIOS_CALL() macro.
|
|
*
|
|
* \ingroup group__utility
|
|
*/
|
|
|
|
/** \def PANTHEIOS_CALL(rt)
|
|
*
|
|
* Used to declare and define Pantheios API functions.
|
|
*
|
|
* \ingroup group__utility
|
|
*/
|
|
|
|
/** \def PANTHEIOS_DECLARE_DEPRECATION(symtype, oldfn, newfn)
|
|
*
|
|
* Used to mark an inline (C++) function as deprecated
|
|
*
|
|
* \ingroup group__utility
|
|
*/
|
|
|
|
/** \def PANTHEIOS_CALL_DEPRECATED(rt, oldfn, newfn)
|
|
*
|
|
* Used to declare an API function as deprecated
|
|
*
|
|
* \see PANTHEIOS_CALL
|
|
* \see PANTHEIOS_DECLARE_DEPRECATION
|
|
*
|
|
* \ingroup group__utility
|
|
*/
|
|
|
|
#if !defined(PANTHEIOS_DECLSPEC)
|
|
# define PANTHEIOS_DECLSPEC
|
|
#endif /* !PANTHEIOS_DECLSPEC */
|
|
|
|
#if defined(__cplusplus) || \
|
|
defined(PANTHEIOS_DOCUMENTATION_SKIP_SECTION)
|
|
# define PANTHEIOS_EXTERN_C extern "C"
|
|
#else /* ? __cplusplus */
|
|
# define PANTHEIOS_EXTERN_C extern
|
|
#endif /* !__cplusplus */
|
|
|
|
#if !defined(PANTHEIOS_CALLCONV)
|
|
# define PANTHEIOS_CALLCONV
|
|
#endif /* !PANTHEIOS_CALLCONV */
|
|
|
|
#define PANTHEIOS_CALL(rt) PANTHEIOS_DECLSPEC PANTHEIOS_EXTERN_C rt PANTHEIOS_CALLCONV
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_CPP_CALL(rt) PANTHEIOS_DECLSPEC extern "C++" rt PANTHEIOS_CALLCONV
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#ifdef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_DECLARE_DEPRECATION(symtype, oldfn, newfn)
|
|
# define PANTHEIOS_CALL_DEPRECATED(rt, oldfn, newfn) PANTHEIOS_CALL(rt)
|
|
#else /* ? PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
# if defined(STLSOFT_COMPILER_IS_MSVC) && \
|
|
( _MSC_VER >= 1500 || \
|
|
( _MSC_VER >= 1400 && \
|
|
defined(_MSC_FULL_VER) && \
|
|
_MSC_FULL_VER >= 140050320))
|
|
# define PANTHEIOS_DECLARE_DEPRECATION(symtype, oldfn, newfn) __declspec(deprecated("The " symtype " " PANTHEIOS_STRINGIZE(oldfn) " is deprecated and will be removed from a future version of Pantheios; use " PANTHEIOS_STRINGIZE(newfn) " instead"))
|
|
# define PANTHEIOS_CALL_DEPRECATED(rt, oldfn, newfn) PANTHEIOS_DECLARE_DEPRECATION("function", oldfn, newfn) PANTHEIOS_DECLSPEC PANTHEIOS_EXTERN_C rt PANTHEIOS_CALLCONV
|
|
# else /* ? compiler */
|
|
# define PANTHEIOS_DECLARE_DEPRECATION(symtype, oldfn, newfn)
|
|
# define PANTHEIOS_CALL_DEPRECATED(rt, oldfn, newfn) PANTHEIOS_CALL(rt)
|
|
# endif /* compiler */
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Namespace
|
|
*/
|
|
|
|
#if defined(STLSOFT_CF_NAMESPACE_SUPPORT)
|
|
# define PANTHEIOS_CF_NAMESPACE_SUPPORT
|
|
#else /* STLSOFT_CF_NAMESPACE_SUPPORT */
|
|
# ifdef PANTHEIOS_CF_NAMESPACE_SUPPORT
|
|
# undef PANTHEIOS_CF_NAMESPACE_SUPPORT
|
|
# endif /* PANTHEIOS_CF_NAMESPACE_SUPPORT */
|
|
#endif /* STLSOFT_CF_NAMESPACE_SUPPORT */
|
|
|
|
#if !defined(PANTHEIOS_CF_NAMESPACE_SUPPORT) && \
|
|
!defined(PANTHEIOS_DOCUMENTATION_SKIP_SECTION) && \
|
|
!defined(PANTHEIOS_NO_NAMESPACE)
|
|
# define PANTHEIOS_NO_NAMESPACE
|
|
#endif /* __cplusplus, etc. */
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
/** The Pantheios root namespace - \c pantheios.
|
|
*
|
|
* This the the root namespace for Pantheios, and contains the C-API functions, along
|
|
* with appropriate type-defs
|
|
*/
|
|
namespace pantheios
|
|
{
|
|
|
|
/** The namespace within which utility functions are located
|
|
*
|
|
* These functions are not ordinarily called directly by Pantheios users
|
|
*/
|
|
namespace util
|
|
{
|
|
} /* namespace util */
|
|
|
|
/** The namespace within which functions related to the core are located
|
|
*
|
|
* These functions are never called directly by Pantheios users
|
|
*/
|
|
namespace core
|
|
{
|
|
} /* namespace core */
|
|
|
|
# define PANTHEIOS_NS_QUAL(x) ::pantheios::x
|
|
# define PANTHEIOS_SUBNS_QUAL(sns, x) ::pantheios::sns::x
|
|
|
|
#else /* ? !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
# define PANTHEIOS_NS_QUAL(x) x
|
|
# define PANTHEIOS_SUBNS_QUAL(sns, x) x
|
|
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/** \def PANTHEIOS_NS_QUAL(x)
|
|
*
|
|
* Puts \c x in the \c pantheios namespace if namespace is supported (and
|
|
* not suppressed), otherwise \c x is unqualified
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SUBNS_QUAL(sns, x)
|
|
*
|
|
* Puts \c x in the \c pantheios::sns namespace if namespace is supported
|
|
* (and not suppressed), otherwise \c x is unqualified
|
|
*/
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Types
|
|
*/
|
|
|
|
/* Basic types */
|
|
|
|
/** 8-bit unsigned integer type. */
|
|
typedef stlsoft_ns_qual(ss_uint8_t) pan_uint8_t;
|
|
/** 16-bit unsigned integer type. */
|
|
typedef stlsoft_ns_qual(ss_uint16_t) pan_uint16_t;
|
|
/** 32-bit unsigned integer type. */
|
|
typedef stlsoft_ns_qual(ss_uint32_t) pan_uint32_t;
|
|
/** 64-bit unsigned integer type. */
|
|
typedef stlsoft_ns_qual(ss_uint64_t) pan_uint64_t;
|
|
|
|
/** 8-bit signed integer type. */
|
|
typedef stlsoft_ns_qual(ss_sint8_t) pan_sint8_t;
|
|
/** 16-bit signed integer type. */
|
|
typedef stlsoft_ns_qual(ss_sint16_t) pan_sint16_t;
|
|
/** 32-bit signed integer type. */
|
|
typedef stlsoft_ns_qual(ss_sint32_t) pan_sint32_t;
|
|
/** 64-bit signed integer type. */
|
|
typedef stlsoft_ns_qual(ss_sint64_t) pan_sint64_t;
|
|
|
|
|
|
/** Character type used by the library
|
|
*
|
|
* This will be <code>wchar_t</code> if
|
|
* <code>PANTHEIOS_USE_WIDE_STRINGS</code> is defined, otherwise
|
|
* <code>char</code>.
|
|
*/
|
|
#ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
typedef wchar_t pan_char_t;
|
|
#else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
typedef char pan_char_t;
|
|
#endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
|
|
/** \def PAN_CHAR_T
|
|
*
|
|
* The type \c pan_char_t, suitably namespace qualified in the contexts in
|
|
* which the \c pantheios namespace is operative. Acts as a convenient
|
|
* shorthand for <code>::pantheios::pan_char_t</code> when in C++ (and
|
|
* namespace not suppressed) or <code>pan_char_t</code> otherwise.
|
|
*/
|
|
#define PAN_CHAR_T PANTHEIOS_NS_QUAL(pan_char_t)
|
|
|
|
/** String slice used by the \ref group__application_layer_interface
|
|
* to communicate with the \ref group__core_library.
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* This structure represents a character string as a slice, in the form of a
|
|
* pointer to the first character, and a count of the number of characters in
|
|
* the slice.
|
|
*
|
|
* \note The slice need not be nul-terminated. Hence, slices may overlap.
|
|
*/
|
|
struct pan_slice_t
|
|
{
|
|
size_t len; /*!< Number of characters in the c-style string represented by the slice. */
|
|
pan_char_t const* ptr; /*!< Pointer to the first character in the c-style string represented by the slice. */
|
|
|
|
#ifdef __cplusplus
|
|
/** Constructs a null/empty slice. */
|
|
pan_slice_t();
|
|
/** Constructs a slice from the given pointer and length. */
|
|
pan_slice_t(pan_char_t const* p, size_t l);
|
|
/** Copy constructor. */
|
|
pan_slice_t(pan_slice_t const& rhs);
|
|
/** Copy assignment operator. */
|
|
pan_slice_t& operator =(pan_slice_t const& rhs);
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
/** "private" constructor for supporting C-compatible log functions. */
|
|
pan_slice_t(int len, pan_char_t const* p);
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
/**
|
|
*
|
|
* \pre fromLen <= 32767
|
|
* \pre toLen <= 32767
|
|
*/
|
|
static size_t get_lazy_length(size_t fromLen, size_t toLen);
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
private:
|
|
static size_t calc_length_n_(pan_char_t const* s, size_t len);
|
|
|
|
#endif /* __cplusplus */
|
|
};
|
|
#if !defined(__cplusplus)
|
|
typedef struct pan_slice_t pan_slice_t;
|
|
#endif /* !__cplusplus */
|
|
|
|
|
|
#ifndef PANTHEIOS_NO_STOCK_LEVELS
|
|
/** API Severity level
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \remarks the enumerator values correspond to those of the SysLog protocol
|
|
*
|
|
* \note This type is not used throughout the Pantheios architecture, serving merely
|
|
* to define the eight stock severity levels. Instead, the
|
|
* \link pantheios::pan_sev_t pan_sev_t\endlink type (a 32-bit signed integer)
|
|
* is used instead. This is because Pantheios supports any severity level
|
|
* (that can be expressed in 32-bits). The definition of these SysLog-inspired
|
|
* values is simply what the
|
|
* \link group__backend__stock_backends stock back ends\endlink
|
|
* are implemented to recognise.
|
|
*/
|
|
enum pan_severity_t
|
|
{
|
|
SEV_EMERGENCY = 0 /*!< system is unusable */
|
|
, SEV_ALERT = 1 /*!< action must be taken immediately */
|
|
, SEV_CRITICAL = 2 /*!< critical conditions */
|
|
, SEV_ERROR = 3 /*!< error conditions */
|
|
, SEV_WARNING = 4 /*!< warning conditions */
|
|
, SEV_NOTICE = 5 /*!< normal but significant condition */
|
|
, SEV_INFORMATIONAL = 6 /*!< informational */
|
|
, SEV_DEBUG = 7 /*!< debug-level messages */
|
|
|
|
# if defined(PANTHEIOS_NO_NAMESPACE)
|
|
, PANTHEIOS_SEV_EMERGENCY = SEV_EMERGENCY
|
|
, PANTHEIOS_SEV_ALERT = SEV_ALERT
|
|
, PANTHEIOS_SEV_CRITICAL = SEV_CRITICAL
|
|
, PANTHEIOS_SEV_ERROR = SEV_ERROR
|
|
, PANTHEIOS_SEV_WARNING = SEV_WARNING
|
|
, PANTHEIOS_SEV_NOTICE = SEV_NOTICE
|
|
, PANTHEIOS_SEV_INFORMATIONAL = SEV_INFORMATIONAL
|
|
, PANTHEIOS_SEV_DEBUG = SEV_DEBUG
|
|
# endif /* PANTHEIOS_NO_NAMESPACE */
|
|
|
|
};
|
|
# if !defined(__cplusplus)
|
|
typedef enum pan_severity_t pan_severity_t;
|
|
# endif /* !__cplusplus */
|
|
#endif /* !PANTHEIOS_NO_STOCK_LEVELS */
|
|
|
|
/** Severity level type
|
|
*
|
|
* \remarks This is not of type \link pantheios::pan_severity_t pan_severity_t\endlink,
|
|
* because the Pantheios API can accept any severity level that can be
|
|
* expressed within 32 bits.
|
|
*/
|
|
typedef stlsoft_ns_qual(ss_sint32_t) pan_sev_t;
|
|
|
|
#if defined(__cplusplus) && \
|
|
!defined(PANTHEIOS_NO_STOCK_LEVELS) && \
|
|
!defined(PANTHEIOS_DOCUMENTATION_SKIP_SECTION)
|
|
# define PANTHEIOS_INCLUDING_STOCKLEVELS
|
|
# include "./internal/stock_levels.hpp" /* Stock/custom level type */
|
|
# undef PANTHEIOS_INCLUDING_STOCKLEVELS
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* API
|
|
*/
|
|
|
|
/** Returns information about the version of Pantheios
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* The value returned is split into 4 x 8 bits, as follows:
|
|
* - bits 24-31: the major version (PANTHEIOS_VER_MAJOR)
|
|
* - bits 16-23: the minor version (PANTHEIOS_VER_MINOR)
|
|
* - bits 8-15: the revision number (PANTHEIOS_VER_REVISION)
|
|
* - bits 0-7: the alpha/beta designatorm, or 0xFF for a non-beta release
|
|
*
|
|
* \return The value of PANTHEIOS_VER at the time that Pantheios was
|
|
* built
|
|
*
|
|
* \remarks This function may be called without having initialised the
|
|
* Pantheios library
|
|
*/
|
|
PANTHEIOS_CALL(pan_uint32_t) pantheios_getVersion(void);
|
|
|
|
/** Initialises the Pantheios library
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \return Indicates
|
|
* \retval <0 initialisation has failed, and the library cannot be used
|
|
* \retval >=0 initialisation has succeeded, and the library can be used.
|
|
* pantheios_uninit() should be called when the library is no longer needed
|
|
*
|
|
* \note C++ compilation units that include pantheios/pantheios.hpp do not
|
|
* need to explicitly call pantheios_init() / pantheios_uninit(), since
|
|
* they will be automatically called by the pantheios_initialiser Schwarz
|
|
* counter class defined by the C++ inclusion. Further note that this is
|
|
* disabled by the definition of the <code>PANTHEIOS_NO_AUTO_INIT</code>,
|
|
* which is automatically defined by a Windows DLL build (as detected by
|
|
* the presence of any of the <code>__DLL__</code>, <code>_WINDLL</code>
|
|
* or <code>_USRDLL</code> symbols).
|
|
* Auto-initialisation can be forced regardless of the definition of
|
|
* <code>PANTHEIOS_NO_AUTO_INIT</code> by the definition of the symbol
|
|
* <code>PANTHEIOS_FORCE_AUTO_INIT</code>.
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_init(void);
|
|
|
|
/** Uninitialises the Pantheios library
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* Should be called for every call to pantheios_init() that returns a
|
|
* non-negative code
|
|
*
|
|
* \note C++ compilation units that include pantheios/pantheios.hpp do not
|
|
* need to explicitly call pantheios_init() / pantheios_uninit(), since
|
|
* they will be automatically called by the pantheios_initialiser Schwarz
|
|
* counter class defined by the C++ inclusion. Further note that this is
|
|
* disabled by the definition of the <code>PANTHEIOS_NO_AUTO_INIT</code>,
|
|
* which is automatically defined by a Windows DLL build (as detected by
|
|
* the presence of any of the <code>__DLL__</code>, <code>_WINDLL</code>
|
|
* or <code>_USRDLL</code> symbols).
|
|
* Auto-initialisation can be forced regardless of the definition of
|
|
* <code>PANTHEIOS_NO_AUTO_INIT</code> by the definition of the symbol
|
|
* <code>PANTHEIOS_FORCE_AUTO_INIT</code>.
|
|
*/
|
|
PANTHEIOS_CALL(void) pantheios_uninit(void);
|
|
|
|
/** Indicates whether a given severity is currently being logged by the
|
|
* process.
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \param severity The severity level to test. Usually one of the \link pantheios::pan_severity_t PANTHEIOS_SEV_*\endlink enumerators.
|
|
*
|
|
* \retval 0 The given severity level is not being logged.
|
|
* \retval 1 The given severity level is being logged.
|
|
*
|
|
* This function is used by \ref group__application_layer_interface "Application Layer API"
|
|
* for filtering statements prior to formatting their elements for output. It
|
|
* is also useful in those rare circumstances where you may need to undertake
|
|
* a significant amount of client-side preparation of arguments to be passed
|
|
* to the diagnostic logging statements.
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_isSeverityLogged(pan_sev_t severity);
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
/** [Currently undocumented] Gets the process identity.
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*
|
|
* \warning Calling this function before the pantheios_init() (or after
|
|
* pantheios_uninit()) results in undefined behaviour. Don't do it! If you
|
|
* need the process identity at a time that is potentially outside the
|
|
* lifetime of the Pantheios core, then use a front-end that itself uses
|
|
* PANTHEIOS_FE_PROCESS_IDENTITY, and use that.
|
|
*/
|
|
PANTHEIOS_CALL(pan_char_t const*) pantheios_getProcessIdentity(void);
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Returns a constant pointer to a non-NULL non-modifiable nul-terminated string
|
|
* representing the severity level.
|
|
*
|
|
* \ingroup group__util_library
|
|
*
|
|
* \param severity The severity level whose string equivalent is to be
|
|
* returned. Must be one of the
|
|
* \link pantheios::pan_severity_t PANTHEIOS_SEV_*\endlink enumerators,
|
|
* otherwise, the empty string (<code>""</code>) will be returned.
|
|
*/
|
|
PANTHEIOS_CALL(pan_char_t const*) pantheios_getStockSeverityString(pan_sev_t severity);
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
PANTHEIOS_CALL_DEPRECATED(pan_char_t const*, pantheios_getSeverityString, pantheios_getStockSeverityString) pantheios_getSeverityString(pan_sev_t severity);
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Returns the length of the string returned by pantheios_getSeverityString().
|
|
*
|
|
* \ingroup group__util_library
|
|
*
|
|
* \param severity The severity level whose string equivalent is to be
|
|
* returned. Must be one of the
|
|
* \link pantheios::pan_severity_t PANTHEIOS_SEV_*\endlink enumerators,
|
|
* otherwise, 0 will be returned.
|
|
*/
|
|
PANTHEIOS_CALL(size_t) pantheios_getStockSeverityStringLength(pan_sev_t severity);
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
PANTHEIOS_CALL_DEPRECATED(size_t, pantheios_getSeverityStringLength, pantheios_getStockSeverityStringLength) pantheios_getSeverityStringLength(pan_sev_t severity);
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Returns a constant pointer to a non-NULL non-modifiable nul-terminated
|
|
* string representing the initialisation code.
|
|
*
|
|
* \ingroup group__util_library
|
|
*
|
|
* \param code The initialisation code whose string explanation is to be
|
|
* returned. If the error code is not recognised,
|
|
* the empty string (<code>""</code>) will be returned.
|
|
*/
|
|
PANTHEIOS_CALL(char const*) pantheios_getInitCodeString(int code);
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
PANTHEIOS_CALL_DEPRECATED(char const*, pantheios_getInitErrorString, pantheios_getInitCodeString) pantheios_getInitErrorString(int code);
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Returns the length of the string returned by pantheios_getInitCodeString().
|
|
*
|
|
* \ingroup group__util_library
|
|
*
|
|
* \param code The initialisation code whose string equivalent is to be
|
|
* returned. If the error code is not recognised, 0 will be returned.
|
|
*/
|
|
PANTHEIOS_CALL(size_t) pantheios_getInitCodeStringLength(int code);
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
PANTHEIOS_CALL_DEPRECATED(size_t, pantheios_getInitErrorStringLength, pantheios_getInitCodeStringLength) pantheios_getInitErrorStringLength(int code);
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
namespace core
|
|
{
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/** Core logging function, which receives a severity and an array of string
|
|
* slices, and outputs them to the back-end
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \param severity The severity of the log entry
|
|
* \param slices Pointer to the array of slices
|
|
* \param numSlices The number of slices
|
|
*
|
|
* \return An indicator of success
|
|
* \retval <0 An error occurred
|
|
* \retval >=0 The log entry was successfully passed to the back-end
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_log_n(
|
|
pan_sev_t severity
|
|
, size_t numSlices
|
|
#ifdef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
, pantheios::pan_slice_t const* slices
|
|
#else /* ? PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
, pan_slice_t const* slices
|
|
#endif /* PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
);
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# define PANTHEIOS_INCLUDING_C_API_FUNCTIONS
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
#include "./internal/generated/log_functions.h" /* pantheios_log_1() (pantheios::log_1()), etc. */
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
# undef PANTHEIOS_INCLUDING_C_API_FUNCTIONS
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
} /* namespace core */
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/** printf()-form of logging function, passing the formatted result to
|
|
* the back-end
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \param severity The severity of the log entry
|
|
* \param format The format string
|
|
*
|
|
* \warning This function is not type-safe. C++ application code should
|
|
* prefer the \ref group__application_layer_interface "application layer"
|
|
* functions.
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_logprintf(
|
|
pan_sev_t severity
|
|
, pan_char_t const* format
|
|
, ...
|
|
)
|
|
#if defined(STLSOFT_COMPILER_IS_GCC) /* TODO: Change this to proper discriminated feature */
|
|
__attribute__((format(printf,2,3)))
|
|
#endif /* compiler */
|
|
;
|
|
|
|
/** vprintf()-form of logging function, passing the formatted result to
|
|
* the back-end
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \param severity The severity of the log entry
|
|
* \param format The format string
|
|
* \param args <code>va_list</code> form of the arguments
|
|
*
|
|
* \note The behaviour is undefined if the total size of the formatted output
|
|
* exceeds 4095 characters.
|
|
*
|
|
* \warning This function is not type-safe. C++ application code should
|
|
* prefer the \ref group__application_layer_interface "application layer"
|
|
* functions.
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_logvprintf(
|
|
pan_sev_t severity
|
|
, pan_char_t const* format
|
|
, va_list args
|
|
);
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Utility functions
|
|
*/
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
namespace util
|
|
{
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/** Prints a bail-out message to operating system-dependent
|
|
* facilities (e.g. console, file, debugger, event log, etc.) in
|
|
* the event that initialisation (of front-end and/or back-end(s))
|
|
* does not succeed.
|
|
*
|
|
* This is invoked within the core, and certain stock front-/back-ends,
|
|
* if initialisation fails. Implementors of custom front-/back-ends may also
|
|
* use it if they fail to initialise, in order to provide information that
|
|
* can be tracked by a user / system administrator.
|
|
*
|
|
* \param severity The severity level at which the event will be represented
|
|
* to the operating-system dependent facilities
|
|
* \param message The message to be emitted
|
|
* \param processId An optional identifier of the process within which the
|
|
* subsystem has failed. May be NULL
|
|
* \param qualifier An optional additional qualifier (e.g. error string) that
|
|
* may be used to pass additional information about the reason why the
|
|
* subsystem has failed. May be NULL
|
|
*
|
|
* \remarks On UNIX systems, this function will output to the console, the
|
|
* file "logging-bailout.txt" in the current directory, and to Syslog. On
|
|
* Windows systems, this function will output to the console, the file
|
|
* "logging-bailout.txt" in the current directory, the Windows debugger, and
|
|
* to the Windows Event Log.
|
|
*
|
|
* \see pantheios_onBailOut3
|
|
*/
|
|
PANTHEIOS_CALL(void) pantheios_onBailOut4(
|
|
int severity
|
|
, char const* message
|
|
, char const* processId
|
|
, char const* qualifier
|
|
);
|
|
|
|
/** Prints a bail-out message to operating system-dependent
|
|
* facilities (e.g. console, file, debugger, event log, etc.) in
|
|
* the event that initialisation (of front-end and/or back-end(s))
|
|
* does not succeed.
|
|
*
|
|
* This is invoked within the core, and certain stock front-/back-ends,
|
|
* if initialisation fails. Implementors of custom front-/back-ends may also
|
|
* use it if they fail to initialise, in order to provide information that
|
|
* can be tracked by a user / system administrator.
|
|
*
|
|
* \param severity The severity level at which the event will be represented
|
|
* to the operating-system dependent facilities
|
|
* \param message The message to be emitted
|
|
* \param processId An optional identifier of the process within which the
|
|
* subsystem has failed. May be NULL
|
|
*
|
|
* \remarks On UNIX systems, this function will output to the console, the
|
|
* file "logging-bailout.txt" in the current directory, and to Syslog. On
|
|
* Windows systems, this function will output to the console, the file
|
|
* "logging-bailout.txt" in the current directory, the Windows debugger, and
|
|
* to the Windows Event Log.
|
|
*
|
|
* \see pantheios_onBailOut4
|
|
*
|
|
* \note This is equivalent to calling pantheios_onBailOut4() specifying NULL
|
|
* for the <code>qualifier</code> parameter
|
|
*/
|
|
PANTHEIOS_CALL(void) pantheios_onBailOut3(
|
|
int severity
|
|
, char const* message
|
|
, char const* processId
|
|
);
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
/** [Currently undocumented] Calculates the length of a string, in light of
|
|
* special conditions indicated by special values of the len parameter.
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
PANTHEIOS_CALL(size_t) pantheios_util_strnlen(pan_char_t const* s, size_t len);
|
|
PANTHEIOS_CALL_DEPRECATED(size_t, pantheios_strnlen, pantheios_util_strnlen) pantheios_strnlen(pan_char_t const* s, size_t len);
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
} /* namespace util */
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Core functions
|
|
*/
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
namespace core
|
|
{
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
/* /////////////////////////////////////
|
|
* Undocumented API functions
|
|
*
|
|
* ALL OF THE FUNCTIONS IN THIS SECTION ARE NOT PART OF THE PUBLICLY
|
|
* DOCUMENTED API OF PANTHEIOS, AND ARE SUBJECT TO REMOVAL/CHANGE IN A
|
|
* FUTURE RELEASE.
|
|
*/
|
|
|
|
/** [Currently undocumented] Indicates whether the Pantheios libraries are
|
|
* undergoing initialisation.
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_isInitialising(void);
|
|
/** [Currently undocumented] Indicates whether the Pantheios libraries have
|
|
* been successfully initialised.
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_isInitialised(void);
|
|
/** [Currently undocumented] Exits the process with all haste, .
|
|
*
|
|
* \warning Calling this function causes the process to exit immediately,
|
|
* potentially leaking resources. Do not call this unless in extremis AND
|
|
* you know what you're doing!
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
# if defined(STLSOFT_COMPILER_IS_MSVC)
|
|
__declspec(noreturn)
|
|
# endif /* compiler */
|
|
PANTHEIOS_CALL(void) pantheios_exitProcess(int code)
|
|
# if defined(STLSOFT_COMPILER_IS_GCC)
|
|
__attribute__((noreturn))
|
|
# endif /* compiler */
|
|
;
|
|
/** [Currently undocumented] Equivalent to pantheios_exitProcess().
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
PANTHEIOS_CALL_DEPRECATED(void, pantheios_exit_process, pantheios_exitProcess) pantheios_exit_process(int code);
|
|
|
|
/** [Currently undocumented] Allocates a permanent block of memory.
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*
|
|
* \remarks Memory block is not release until Pantheios is uninitialised.
|
|
*
|
|
* \param cb The number of bytes to allocate
|
|
*
|
|
* \return the NULL pointer if allocation failed, otherwise a pointer to a
|
|
* correctly aligned block of bytes, all of whose values are 0x00.
|
|
*/
|
|
PANTHEIOS_CALL(void*) pantheios_malloc(size_t cb);
|
|
|
|
/* Memory allocation/deallocation for inserter memory blocks */
|
|
|
|
/** [Currently undocumented] Allocates inserter memory.
|
|
*
|
|
* \warning Future versions of Pantheios might release asynchronously the
|
|
* memory allocated by this function, thereby breaking any code that calls
|
|
* it and uses it for purposes other than in the implementation of
|
|
* TEMPORARY inserter instances. Do you call this unless you know what
|
|
* you're doing!
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
PANTHEIOS_CALL(void*) pantheios_inserterAllocate(size_t cb);
|
|
/** [Currently undocumented] Deallocates memory allocated with pantheios_inserterAllocate().
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
PANTHEIOS_CALL(void) pantheios_inserterDeallocate(void* pv);
|
|
|
|
/** [Currently undocumented] Returns a pointer to a pad string of (up to)
|
|
* the requested length.
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*
|
|
* \param minimumWidth The requested length of the pad string
|
|
* \param actualWidth Pointer to a variable to receive the actual number of
|
|
* pad characters available. Result may be less than \c minimumWidth but
|
|
* will never be so for requests less than 1000. Must not be NULL.
|
|
*
|
|
* \remarks Guaranteed to support up to 1000 characters.
|
|
*
|
|
* \note The string is NOT guaranteed to be nul-terminated!
|
|
*
|
|
* \pre (NULL != actualWidth)
|
|
*/
|
|
PANTHEIOS_CALL(pan_char_t const*) pantheios_getPad(size_t minimumWidth, size_t* actualWidth);
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
} /* namespace core */
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Core functions
|
|
*/
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
namespace core
|
|
{
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/** Returns a (thread-safe) unique back-end identifier
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* This function provides back-end identiers, useful with custom use of
|
|
* Pantheios \ref group__backend "back-ends", that are guaranteed unique
|
|
* throughout a given process, even in the case where it is invoked by
|
|
* multiple threads concurrently.
|
|
*
|
|
* \note The returned values from this function are always >1000, so as not
|
|
* to clash with any of the
|
|
* \ref group__backend__stock_ids "pre-defined values" used by the
|
|
* Pantheios infrastructure.
|
|
*
|
|
* \pre The behaviour of this function is undefined if it is called more
|
|
* than INT_MAX - 1000 times in the lifetime of a process
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_getNextBackEndId(void);
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
} /* namespace core */
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/** A functional equivalent to\htmlonly <code>::puts()</code>\endhtmlonly, incorporating a
|
|
* severity level.
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* Using this function skips the application layer entirely and, if the
|
|
* given severity level is enabled, goes straight to the back-end. It is
|
|
* therefore more suitable for use in emergency bail-out situations, such as
|
|
* in an application-level <code>catch(...)</code> clause.
|
|
*
|
|
* \param severity The severity of the message to be output.
|
|
* \param message The message to be output.
|
|
*/
|
|
PANTHEIOS_CALL(void) pantheios_logputs(
|
|
pan_sev_t severity
|
|
, pan_char_t const* message
|
|
);
|
|
|
|
/** [DEPRECATED] Equivalent to \link pantheios::pantheios_logputs() pantheios_logputs()\endlink.
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \deprecated This function is now obsolete, and will be removed from a future
|
|
* version of Pantheios; instead
|
|
* use \link pantheios::pantheios_logputs pantheios_logputs()\endlink.
|
|
*/
|
|
PANTHEIOS_CALL_DEPRECATED(void, pantheios_puts, pantheios_logputs) pantheios_puts(pan_sev_t severity, pan_char_t const* message);
|
|
|
|
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
PANTHEIOS_CALL(void) pantheios_logassertfail(
|
|
pan_sev_t severity
|
|
, char const* fileLine
|
|
, char const* message
|
|
);
|
|
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Back-end map functions
|
|
*/
|
|
|
|
#if 0 /* Not yet released */
|
|
|
|
/** Indicates whether the back-end map contains the given back-end
|
|
* Id and, if it does, optionally returns the associated token into a
|
|
* caller-supplied pointer.
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \param backEndId The identifier of the back-end
|
|
* \param ptoken Pointer to a <code>void*</code> variable to receive the
|
|
* pointer to the token. May be NULL, if the caller does not want to
|
|
* retrieve the token.
|
|
*
|
|
* \return A Boolean value indicating whether the back-end is registered in
|
|
* the map.
|
|
* \retval 0 The value of backEndId is not in the map
|
|
* \retval 1 The value of backEndId is in the map
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_backEndMap_lookup(int backEndId, void** ptoken);
|
|
|
|
/** Adds an entry into the back-end map.
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \param backEndId The identifier of the back-end
|
|
* \param token The token value to add
|
|
*
|
|
* \return A value indicating whether the addition was successful
|
|
* \retval 0 The entry is added, and backEndId is linked to token
|
|
* \retval 1 An entry already exists for backEndId. It is NOT updated.
|
|
* \retval <0 The operation failed
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_backEndMap_add(int backEndId, void* token);
|
|
|
|
/** Removes an entry from the back-end map.
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \param backEndId The identifier of the back-end to be removed
|
|
*
|
|
* \return A value indicating whether the removal was successful
|
|
* \retval 0 No entry for the given backEndId exists
|
|
* \retval 1 The entry is removed
|
|
* \retval <0 The operation failed
|
|
*/
|
|
PANTHEIOS_CALL(int) pantheios_backEndMap_remove(int backEndId);
|
|
#endif /* 0 */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Generated function control
|
|
*/
|
|
|
|
#if defined(PANTHEIOS_DOCUMENTATION_SKIP_SECTION) || \
|
|
!defined(PANTHEIOS_APPL_PARAMS_LIMIT)
|
|
/** \def PANTHEIOS_APPL_PARAMS_LIMIT
|
|
* The number of parameters available in
|
|
* the \ref group__application_layer_interface "Application Layer API",
|
|
* which can be overridden by defining it to a number between 1 and 32 to
|
|
* reduce compilation times where larger parameter lists are not required.
|
|
*/
|
|
# define PANTHEIOS_APPL_PARAMS_LIMIT PANTHEIOS_APPL_PARAMS_LIMIT_MAX_GENERATED
|
|
#endif /* PANTHEIOS_DOCUMENTATION_SKIP_SECTION || !PANTHEIOS_APPL_PARAMS_LIMIT */
|
|
|
|
/* Sanity check on PANTHEIOS_APPL_PARAMS_LIMIT */
|
|
#if PANTHEIOS_APPL_PARAMS_LIMIT < 0 || \
|
|
PANTHEIOS_APPL_PARAMS_LIMIT > PANTHEIOS_APPL_PARAMS_LIMIT_MAX_GENERATED
|
|
# error PANTHEIOS_APPL_PARAMS_LIMIT Must be defined to be a number between 1 and PANTHEIOS_APPL_PARAMS_LIMIT_MAX_GENERATED
|
|
#endif /* PANTHEIOS_APPL_PARAMS_LIMIT */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* API functions for C++
|
|
*/
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
|
|
/** 8-bit unsigned integer type. */
|
|
typedef pan_uint8_t uint8_t;
|
|
/** 16-bit unsigned integer type. */
|
|
typedef pan_uint16_t uint16_t;
|
|
/** 32-bit unsigned integer type. */
|
|
typedef pan_uint32_t uint32_t;
|
|
/** 64-bit unsigned integer type. */
|
|
typedef pan_uint64_t uint64_t;
|
|
|
|
/** 8-bit signed integer type. */
|
|
typedef pan_sint8_t sint8_t;
|
|
/** 16-bit signed integer type. */
|
|
typedef pan_sint16_t sint16_t;
|
|
/** 32-bit signed integer type. */
|
|
typedef pan_sint32_t sint32_t;
|
|
/** 64-bit signed integer type. */
|
|
typedef pan_sint64_t sint64_t;
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Utility Functions
|
|
*/
|
|
|
|
namespace util
|
|
{
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
inline void onBailOut(int severity, char const* message, char const* processId)
|
|
{
|
|
pantheios_onBailOut3(severity, message, processId);
|
|
}
|
|
|
|
inline void onBailOut(int severity, char const* message, char const* processId, char const* qualifier)
|
|
{
|
|
pantheios_onBailOut4(severity, message, processId, qualifier);
|
|
}
|
|
|
|
inline size_t strnlen(pan_char_t const* s, size_t len)
|
|
{
|
|
return pantheios_util_strnlen(s, len);
|
|
}
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
} /* namespace util */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Core Functions
|
|
*/
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_init "pantheios_init()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline int init()
|
|
{
|
|
return pantheios_init();
|
|
}
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_uninit "pantheios_uninit()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline void uninit()
|
|
{
|
|
pantheios_uninit();
|
|
}
|
|
|
|
namespace core
|
|
{
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
inline int isInitialising()
|
|
{
|
|
return pantheios_isInitialising();
|
|
}
|
|
|
|
inline int isInitialised()
|
|
{
|
|
return pantheios_isInitialised();
|
|
}
|
|
|
|
# if defined(STLSOFT_COMPILER_IS_GCC)
|
|
void exitProcess(int code)
|
|
__attribute__((noreturn));
|
|
# endif /* compiler */
|
|
|
|
# if defined(STLSOFT_COMPILER_IS_MSVC)
|
|
__declspec(noreturn)
|
|
# endif /* compiler */
|
|
inline void exitProcess(int code)
|
|
{
|
|
pantheios_exitProcess(code);
|
|
}
|
|
|
|
inline PANTHEIOS_DECLARE_DEPRECATION("function", exit_process, exitProcess) void exit_process(int code)
|
|
{
|
|
exitProcess(code);
|
|
}
|
|
|
|
#ifndef malloc
|
|
inline void* malloc(size_t cb)
|
|
{
|
|
return pantheios_malloc(cb);
|
|
}
|
|
#endif /* !malloc */
|
|
|
|
inline void* inserterAllocate(size_t cb)
|
|
{
|
|
return pantheios_inserterAllocate(cb);
|
|
}
|
|
|
|
inline void inserterDeallocate(void* pv)
|
|
{
|
|
pantheios_inserterDeallocate(pv);
|
|
}
|
|
|
|
inline pan_char_t const* getPad(size_t minimumWidth, size_t* actualWidth)
|
|
{
|
|
return pantheios_getPad(minimumWidth, actualWidth);
|
|
}
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
} /* namespace core */
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_isSeverityLogged "pantheios_isSeverityLogged()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline int isSeverityLogged(pan_sev_t severity)
|
|
{
|
|
return pantheios_isSeverityLogged(severity);
|
|
}
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
/** [Currently undocumented] Equivalent to \ref pantheios::pantheios_getProcessIdentity "pantheios_getProcessIdentity()"
|
|
*
|
|
* \note THIS FUNCTION IS NOT PART OF THE PUBLICLY DOCUMENTED API OF
|
|
* PANTHEIOS, AND IS SUBJECT TO REMOVAL/CHANGE IN A FUTURE RELEASE.
|
|
*/
|
|
inline pan_char_t const* getProcessIdentity()
|
|
{
|
|
return pantheios_getProcessIdentity();
|
|
}
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_getStockSeverityString "pantheios_getStockSeverityString()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline pan_char_t const* getStockSeverityString(pan_sev_t severity)
|
|
{
|
|
return pantheios_getStockSeverityString(severity);
|
|
}
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
inline PANTHEIOS_DECLARE_DEPRECATION("function", getSeverityString, getStockSeverityString) pan_char_t const* getSeverityString(pan_sev_t severity)
|
|
{
|
|
return getStockSeverityString(severity);
|
|
}
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_getStockSeverityStringLength "pantheios_getStockSeverityStringLength()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline size_t getStockSeverityStringLength(pan_sev_t severity)
|
|
{
|
|
return pantheios_getStockSeverityStringLength(severity);
|
|
}
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
inline PANTHEIOS_DECLARE_DEPRECATION("function", getSeverityStringLength, getStockSeverityStringLength) size_t getSeverityStringLength(pan_sev_t severity)
|
|
{
|
|
return getStockSeverityStringLength(severity);
|
|
}
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_getInitCodeString "pantheios_getInitCodeString()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline char const* getInitCodeString(int code)
|
|
{
|
|
return pantheios_getInitCodeString(code);
|
|
}
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
inline PANTHEIOS_DECLARE_DEPRECATION("function", getInitErrorString, getInitCodeString) char const* getInitErrorString(int code)
|
|
{
|
|
return getInitCodeString(code);
|
|
}
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_getInitCodeStringLength "pantheios_getInitCodeStringLength()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline size_t getInitCodeStringLength(int code)
|
|
{
|
|
return pantheios_getInitCodeStringLength(code);
|
|
}
|
|
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
inline PANTHEIOS_DECLARE_DEPRECATION("function", getInitErrorStringLength, getInitCodeStringLength) size_t getInitErrorStringLength(int code)
|
|
{
|
|
return getStockSeverityStringLength(code);
|
|
}
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
|
|
namespace core
|
|
{
|
|
|
|
/** Equivalent to \ref pantheios::core::pantheios_getNextBackEndId "pantheios_getNextBackEndId()".
|
|
*
|
|
* \pre The behaviour of this function is undefined if it is called more
|
|
* than INT_MAX - 1000 times in the lifetime of a process
|
|
*/
|
|
inline int getNextBackEndId()
|
|
{
|
|
return pantheios_getNextBackEndId();
|
|
}
|
|
|
|
} /* namespace core */
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_logputs "pantheios_logputs()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline void logputs(
|
|
pan_sev_t severity
|
|
, pan_char_t const* message
|
|
)
|
|
{
|
|
pantheios_logputs(severity, message);
|
|
}
|
|
|
|
/** [DEPRECATED] Equivalent to \ref pantheios::pantheios_logputs "pantheios_logputs()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*
|
|
* \deprecated This function is now obsolete, and will be removed from a future
|
|
* version of Pantheios; instead
|
|
* use \link pantheios::logputs logputs()\endlink.
|
|
*/
|
|
inline PANTHEIOS_DECLARE_DEPRECATION("function", puts, logputs) void puts(pan_sev_t severity, pan_char_t const* message)
|
|
{
|
|
pantheios_logputs(severity, message);
|
|
}
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_logprintf "pantheios_logprintf()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
|
|
#if !defined(PANTHEIOS_DOCUMENTATION_SKIP_SECTION) && \
|
|
defined(STLSOFT_COMPILER_IS_GCC) /* TODO: Change this to proper discriminated feature */
|
|
int logprintf(
|
|
pan_sev_t severity
|
|
, pan_char_t const* format
|
|
, ...
|
|
)
|
|
__attribute__((format(printf,2,3)))
|
|
;
|
|
#endif /* compiler */
|
|
|
|
inline int logprintf(
|
|
pan_sev_t severity
|
|
, pan_char_t const* format
|
|
, ...
|
|
)
|
|
{
|
|
va_list args;
|
|
int ret;
|
|
|
|
va_start(args, format);
|
|
|
|
ret = pantheios_logvprintf(severity, format, args);
|
|
|
|
va_end(args);
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
/** Equivalent to \ref pantheios::pantheios_logvprintf "pantheios_logvprintf()".
|
|
*
|
|
* \ingroup group__core_library
|
|
*/
|
|
inline int logvprintf(
|
|
pan_sev_t severity
|
|
, pan_char_t const* format
|
|
, va_list args
|
|
)
|
|
{
|
|
return pantheios_logvprintf(severity, format, args);
|
|
}
|
|
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* String access shims
|
|
*/
|
|
|
|
/* TODO: move all these shims into a separate file */
|
|
|
|
#ifdef __cplusplus
|
|
|
|
# if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
namespace shims
|
|
{
|
|
# endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/** Returns a nul-terminated non-NULL C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_ptr_w(pan_slice_t const& s)
|
|
{
|
|
return (0 == s.len) ? L"" : s.ptr;
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_ptr_a(pan_slice_t const& s)
|
|
{
|
|
return (0 == s.len) ? "" : s.ptr;
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a nul-terminated non-NULL C-style string representing the slice */
|
|
inline pan_char_t const* c_str_ptr(pan_slice_t const& s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_ptr_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_ptr_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
/** Returns a nul-terminated potentially null C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_ptr_null_w(pan_slice_t const& s)
|
|
{
|
|
return (0 != s.len) ? s.ptr : NULL;
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_ptr_null_a(pan_slice_t const& s)
|
|
{
|
|
return (0 != s.len) ? s.ptr : NULL;
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a nul-terminated potentially null C-style string representing the slice */
|
|
inline pan_char_t const* c_str_ptr_null(pan_slice_t const& s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_ptr_null_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_ptr_null_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
/** Returns a possibly non-nul-terminated non-NULL C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_data_w(pan_slice_t const& s)
|
|
{
|
|
return c_str_ptr(s);
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_data_a(pan_slice_t const& s)
|
|
{
|
|
return c_str_ptr(s);
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a possibly non-nul-terminated non-NULL C-style string representing the slice */
|
|
inline pan_char_t const* c_str_data(pan_slice_t const& s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_data_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_data_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
/** Returns the number of characters in the length of the C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline size_t c_str_len_w(pan_slice_t const& s)
|
|
{
|
|
return s.len;
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline size_t c_str_len_a(pan_slice_t const& s)
|
|
{
|
|
return s.len;
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns the number of characters in the length of the C-style string representing the slice */
|
|
inline size_t c_str_len(pan_slice_t const& s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_len_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_len_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
|
|
|
|
/** Returns a nul-terminated non-NULL C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_ptr_w(pan_slice_t const* s)
|
|
{
|
|
return (NULL != s) ? c_str_ptr_w(*s) : L"";
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_ptr_a(pan_slice_t const* s)
|
|
{
|
|
return (NULL != s) ? c_str_ptr_a(*s) : "";
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a nul-terminated non-NULL C-style string representing the slice */
|
|
inline pan_char_t const* c_str_ptr(pan_slice_t const* s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_ptr_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_ptr_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
/** Returns a nul-terminated potentially null C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_ptr_null_w(pan_slice_t const* s)
|
|
{
|
|
return (NULL != s && (0 != s->len)) ? s->ptr : NULL;
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_ptr_null_a(pan_slice_t const* s)
|
|
{
|
|
return (NULL != s && (0 != s->len)) ? s->ptr : NULL;
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a nul-terminated potentially null C-style string representing the slice */
|
|
inline pan_char_t const* c_str_ptr_null(pan_slice_t const* s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_ptr_null_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_ptr_null_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
/** Returns a possibly non-nul-terminated non-NULL C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_data_w(pan_slice_t const* s)
|
|
{
|
|
return c_str_ptr(s);
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_data_a(pan_slice_t const* s)
|
|
{
|
|
return c_str_ptr(s);
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a possibly non-nul-terminated non-NULL C-style string representing the slice */
|
|
inline pan_char_t const* c_str_data(pan_slice_t const* s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_data_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_data_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
/** Returns the number of characters in the length of the C-style string representing the slice */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline size_t c_str_len_w(pan_slice_t const* s)
|
|
{
|
|
return (NULL != s) ? s->len : 0;
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline size_t c_str_len_a(pan_slice_t const* s)
|
|
{
|
|
return (NULL != s) ? s->len : 0;
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns the number of characters in the length of the C-style string representing the slice */
|
|
inline size_t c_str_len(pan_slice_t const* s)
|
|
{
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
return c_str_len_w(s);
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
return c_str_len_a(s);
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
}
|
|
|
|
|
|
|
|
# ifndef PANTHEIOS_NO_STOCK_LEVELS
|
|
/** Returns a possibly non-nul-terminated non-NULL C-style string representing the severity */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_data_w(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityString(severity);
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_data_a(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityString(severity);
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a possibly non-nul-terminated non-NULL C-style string representing the severity */
|
|
inline pan_char_t const* c_str_data(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityString(severity);
|
|
}
|
|
|
|
/** Returns the number of characters in the length of the C-style string representing the severity */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline size_t c_str_len_w(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityStringLength(severity);
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline size_t c_str_len_a(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityStringLength(severity);
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns the number of characters in the length of the C-style string representing the severity */
|
|
inline size_t c_str_len(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityStringLength(severity);
|
|
}
|
|
|
|
/** Returns a nul-terminated non-NULL C-style string representing the severity */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_ptr_w(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityString(severity);
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_ptr_a(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityString(severity);
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a nul-terminated non-NULL C-style string representing the severity */
|
|
inline pan_char_t const* c_str_ptr(pan_severity_t severity)
|
|
{
|
|
return pantheios_getStockSeverityString(severity);
|
|
}
|
|
|
|
/** Returns a nul-terminated potentially null C-style string representing the severity */
|
|
# ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
inline wchar_t const* c_str_ptr_null_w(pan_severity_t severity)
|
|
{
|
|
wchar_t const* s = pantheios_getStockSeverityString(severity);
|
|
|
|
return ('\0' != *s) ? s : NULL;
|
|
}
|
|
# else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
inline char const* c_str_ptr_null_a(pan_severity_t severity)
|
|
{
|
|
char const* s = pantheios_getStockSeverityString(severity);
|
|
|
|
return ('\0' != *s) ? s : NULL;
|
|
}
|
|
# endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
/** Returns a nul-terminated potentially null C-style string representing the severity */
|
|
inline pan_char_t const* c_str_ptr_null(pan_severity_t severity)
|
|
{
|
|
pan_char_t const* s = pantheios_getStockSeverityString(severity);
|
|
|
|
return ('\0' != *s) ? s : NULL;
|
|
}
|
|
# endif /* !PANTHEIOS_NO_STOCK_LEVELS */
|
|
|
|
# if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
} /* namespace shims */
|
|
# endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* pan_slice_t
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
# ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
|
|
inline /* static */ size_t pan_slice_t::calc_length_n_(pan_char_t const* s, size_t len)
|
|
{
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
return pantheios::util::strnlen(s, len);
|
|
#else /* ? !PANTHEIOS_NO_NAMESPACE */
|
|
return pantheios_util_strnlen(s, len);
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
}
|
|
|
|
inline pan_slice_t::pan_slice_t()
|
|
: len(0)
|
|
, ptr(NULL)
|
|
{}
|
|
|
|
inline pan_slice_t::pan_slice_t(pan_char_t const* p, size_t l)
|
|
: len(l)
|
|
, ptr(p)
|
|
{
|
|
static size_t const topBit = size_t(0x01) << (sizeof(size_t) * 8 - 1);
|
|
|
|
if(topBit & len)
|
|
{
|
|
this->len = calc_length_n_(p, len);
|
|
}
|
|
}
|
|
|
|
inline pan_slice_t::pan_slice_t(pan_slice_t const& rhs)
|
|
: len(rhs.len)
|
|
, ptr(rhs.ptr)
|
|
{}
|
|
inline pan_slice_t& pan_slice_t::operator =(pan_slice_t const& rhs)
|
|
{
|
|
len = rhs.len;
|
|
ptr = rhs.ptr;
|
|
|
|
return *this;
|
|
}
|
|
|
|
inline pan_slice_t::pan_slice_t(int l, pan_char_t const* p)
|
|
: len(calc_length_n_(p, static_cast<size_t>(l)))
|
|
, ptr(p)
|
|
{}
|
|
|
|
# endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
#endif /* __cplusplus */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Namespace
|
|
*/
|
|
|
|
#if !defined(PANTHEIOS_NO_NAMESPACE)
|
|
} /* namespace pantheios */
|
|
|
|
|
|
# ifndef PANTHEIOS_NO_STOCK_LEVELS
|
|
|
|
/* #define the severity levels at the global level, since the construction
|
|
* of pantheios::PANTHEIOS_SEV_xxx is too wordy and unnecessary.
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_EMERGENCY
|
|
*
|
|
* Equivalent to pantheios::SEV_EMERGENCY
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_ALERT
|
|
*
|
|
* Equivalent to pantheios::SEV_ALERT
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_CRITICAL
|
|
*
|
|
* Equivalent to pantheios::SEV_CRITICAL
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_ERROR
|
|
*
|
|
* Equivalent to pantheios::SEV_ERROR
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_WARNING
|
|
*
|
|
* Equivalent to pantheios::SEV_WARNING
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_NOTICE
|
|
*
|
|
* Equivalent to pantheios::SEV_NOTICE
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_INFORMATIONAL
|
|
*
|
|
* Equivalent to pantheios::SEV_INFORMATIONAL
|
|
*/
|
|
|
|
/** \def PANTHEIOS_SEV_DEBUG
|
|
*
|
|
* Equivalent to pantheios::SEV_DEBUG
|
|
*/
|
|
|
|
# define PANTHEIOS_SEV_EMERGENCY ::pantheios::SEV_EMERGENCY
|
|
# define PANTHEIOS_SEV_ALERT ::pantheios::SEV_ALERT
|
|
# define PANTHEIOS_SEV_CRITICAL ::pantheios::SEV_CRITICAL
|
|
# define PANTHEIOS_SEV_ERROR ::pantheios::SEV_ERROR
|
|
# define PANTHEIOS_SEV_WARNING ::pantheios::SEV_WARNING
|
|
# define PANTHEIOS_SEV_NOTICE ::pantheios::SEV_NOTICE
|
|
# define PANTHEIOS_SEV_INFORMATIONAL ::pantheios::SEV_INFORMATIONAL
|
|
# define PANTHEIOS_SEV_DEBUG ::pantheios::SEV_DEBUG
|
|
|
|
# endif /* !PANTHEIOS_NO_STOCK_LEVELS */
|
|
|
|
|
|
#ifdef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
|
|
/** The <a href = "http://stlsoft.org" target="_blank">STLSoft</a> namespace - \c stlsoft.
|
|
*
|
|
* The Pantheios project inserts overloads of the <strong>c_str_data_a</strong> and <strong>c_str_len_a</strong>
|
|
* <a href = "http://www.drdobbs.com/184401689"><em>String Access Shims</em></a>
|
|
* into the <code>stlsoft</code> namespace, for generalised manipulation of various Pantheios types,
|
|
* including
|
|
* \c pantheios::pan_slice_t, \c pantheios::integer,
|
|
* \c pantheios::pointer, and \c pantheios::real.
|
|
*
|
|
* Because <a href = "http://www.synesis.com.au/resources/articles/cpp/shims.pdf"><em>Shims</em></a>
|
|
* are unbound sets of functions, opening and extending the
|
|
* <code>stlsoft</code> namespace in this way is quite legitimate.
|
|
*/
|
|
#endif /* PANTHEIOS_DOCUMENTATION_SKIP_SECTION */
|
|
namespace stlsoft
|
|
{
|
|
|
|
#ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
using ::pantheios::shims::c_str_data_w;
|
|
using ::pantheios::shims::c_str_len_w;
|
|
using ::pantheios::shims::c_str_ptr_w;
|
|
using ::pantheios::shims::c_str_ptr_null_w;
|
|
#else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
using ::pantheios::shims::c_str_data_a;
|
|
using ::pantheios::shims::c_str_len_a;
|
|
using ::pantheios::shims::c_str_ptr_a;
|
|
using ::pantheios::shims::c_str_ptr_null_a;
|
|
#endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
using ::pantheios::shims::c_str_data;
|
|
using ::pantheios::shims::c_str_len;
|
|
using ::pantheios::shims::c_str_ptr;
|
|
using ::pantheios::shims::c_str_ptr_null;
|
|
|
|
} /* namespace stlsoft */
|
|
|
|
#else /* ? !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
# ifdef __cplusplus
|
|
namespace stlsoft
|
|
{
|
|
|
|
#ifdef PANTHEIOS_USE_WIDE_STRINGS
|
|
using ::c_str_data_w;
|
|
using ::c_str_len_w;
|
|
using ::c_str_ptr_w;
|
|
using ::c_str_ptr_null_w;
|
|
#else /* ? PANTHEIOS_USE_WIDE_STRINGS */
|
|
using ::c_str_data_a;
|
|
using ::c_str_len_a;
|
|
using ::c_str_ptr_a;
|
|
using ::c_str_ptr_null_a;
|
|
#endif /* PANTHEIOS_USE_WIDE_STRINGS */
|
|
using ::c_str_data;
|
|
using ::c_str_len;
|
|
using ::c_str_ptr;
|
|
using ::c_str_ptr_null;
|
|
|
|
} /* namespace stlsoft */
|
|
# endif /* __cplusplus */
|
|
|
|
#endif /* !PANTHEIOS_NO_NAMESPACE */
|
|
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
* Inclusion
|
|
*/
|
|
|
|
#ifdef STLSOFT_PPF_pragma_once_SUPPORT
|
|
# pragma once
|
|
#endif /* STLSOFT_PPF_pragma_once_SUPPORT */
|
|
|
|
/* ////////////////////////////////////////////////////////////////////// */
|
|
|
|
#endif /* !PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS */
|
|
|
|
/* ///////////////////////////// end of file //////////////////////////// */
|