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