trio.c revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * $Id$
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission to use, copy, modify, and distribute this software for any
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * purpose with or without fee is hereby granted, provided that the above
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copyright notice and this permission notice appear in all copies.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *************************************************************************
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A note to trio contributors:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Avoid heap allocation at all costs to ensure that the trio functions
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are async-safe. The exceptions are the printf/fprintf functions, which
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * uses fputc, and the asprintf functions and the <alloc> modifier, which
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by design are required to allocate form the heap.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - Scan is probably too permissive about its modifiers.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - C escapes in %#[] ?
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - Multibyte characters (done for format parsing, except scan groups)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - Complex numbers? (C99 _Complex)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - Boolean values? (C99 _Bool)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - C99 NaN(n-char-sequence) missing. The n-char-sequence can be used
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    to print the mantissa, e.g. NaN(0xc000000000000000)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - Should we support the GNU %a alloc modifier? GNU has an ugly hack
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    for %a, because C99 used %a for other purposes. If specified as
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    %as or %a[ it is interpreted as the alloc modifier, otherwise as
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    the C99 hex-float. This means that you cannot scan %as as a hex-float
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    immediately followed by an 's'.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  - Scanning of collating symbols.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Trio include files
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "triodef.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "trio.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "triop.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "trionan.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(TRIO_MINIMAL)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include "triostr.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Definitions
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *************************************************************************/
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <math.h>
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits.h>
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <float.h>
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) \
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     || defined(USE_MULTIBYTE) || TRIO_WIDECHAR) \
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    && !defined(_WIN32_WCE)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRIO_COMPILER_SUPPORTS_MULTIBYTE
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if !defined(MB_LEN_MAX)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define MB_LEN_MAX 6
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(TRIO_COMPILER_MSVC) && (_MSC_VER >= 1100)) || defined(TRIO_COMPILER_BCB)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRIO_COMPILER_SUPPORTS_MSVC_INT
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32_WCE)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <wincecompat.h>
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generic definitions
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !(defined(DEBUG) || defined(NDEBUG))
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define NDEBUG
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h>
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h>
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(TRIO_COMPILER_SUPPORTS_C99)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define isblank(x) (((x)==32) || ((x)==9))
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_ANCIENT)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <varargs.h>
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <stdarg.h>
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stddef.h>
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_ERRNO_H
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h>
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NULL
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define NULL 0
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NIL ((char)0)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef FALSE
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define FALSE (1 == 0)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRUE (! FALSE)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BOOLEAN_T int
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* mincore() can be used for debugging purposes */
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VALID(x) (NULL != (x))
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_ERRORS
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Encode the error code and the position. This is decoded
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8)))
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRIO_ERROR_RETURN(x,y) (-1)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long trio_flags_t;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Platform specific definitions
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_PLATFORM_UNIX)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <unistd.h>
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <signal.h>
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <locale.h>
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define USE_LOCALE
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_PLATFORM_UNIX */
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_PLATFORM_VMS)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <unistd.h>
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_PLATFORM_WIN32)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(_WIN32_WCE)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <wincecompat.h>
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <io.h>
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define read _read
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define write _write
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_PLATFORM_WIN32 */
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(TRIO_COMPILER_SUPPORTS_ISO94)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <wchar.h>
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <wctype.h>
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef wchar_t trio_wchar_t;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef wint_t trio_wint_t;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef char trio_wchar_t;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int trio_wint_t;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define WCONST(x) L ## x
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define WEOF EOF
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswalnum(x) isalnum(x)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswalpha(x) isalpha(x)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswblank(x) isblank(x)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswcntrl(x) iscntrl(x)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswdigit(x) isdigit(x)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswgraph(x) isgraph(x)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswlower(x) islower(x)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswprint(x) isprint(x)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswpunct(x) ispunct(x)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswspace(x) isspace(x)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswupper(x) isupper(x)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define iswxdigit(x) isxdigit(x)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Compiler dependent definitions
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Support for long long */
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __cplusplus
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if !defined(USE_LONGLONG)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if defined(TRIO_COMPILER_GCC) && !defined(__STRICT_ANSI__)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define USE_LONGLONG
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  elif defined(TRIO_COMPILER_SUNPRO)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define USE_LONGLONG
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  elif defined(_LONG_LONG) || defined(_LONGLONG)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define USE_LONGLONG
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The extra long numbers */
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LONGLONG)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef signed long long int trio_longlong_t;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long long int trio_ulonglong_t;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef signed __int64 trio_longlong_t;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned __int64 trio_ulonglong_t;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_SIGNED long int trio_longlong_t;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long int trio_ulonglong_t;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Maximal and fixed integer types */
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_C99)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <stdint.h>
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef intmax_t trio_intmax_t;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uintmax_t trio_uintmax_t;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int8_t trio_int8_t;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int16_t trio_int16_t;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t trio_int32_t;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t trio_int64_t;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <inttypes.h>
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef intmax_t trio_intmax_t;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uintmax_t trio_uintmax_t;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int8_t trio_int8_t;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int16_t trio_int16_t;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t trio_int32_t;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t trio_int64_t;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef trio_longlong_t trio_intmax_t;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef trio_ulonglong_t trio_uintmax_t;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef __int8 trio_int8_t;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef __int16 trio_int16_t;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef __int32 trio_int32_t;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef __int64 trio_int64_t;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef trio_longlong_t trio_intmax_t;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef trio_ulonglong_t trio_uintmax_t;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(TRIO_INT8_T)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_INT8_T trio_int8_t;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_SIGNED char trio_int8_t;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(TRIO_INT16_T)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_INT16_T trio_int16_t;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_SIGNED short trio_int16_t;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(TRIO_INT32_T)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_INT32_T trio_int32_t;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_SIGNED int trio_int32_t;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(TRIO_INT64_T)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef TRIO_INT64_T trio_int64_t;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef trio_longlong_t trio_int64_t;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (!(defined(TRIO_COMPILER_SUPPORTS_C99) \
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || defined(TRIO_COMPILER_SUPPORTS_UNIX01))) \
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && !defined(_WIN32_WCE)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define floorl(x) floor((double)(x))
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define fmodl(x,y) fmod((double)(x),(double)(y))
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define powl(x,y) pow((double)(x),(double)(y))
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TRIO_FABS(x) (((x) < 0.0) ? -(x) : (x))
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internal Definitions
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef DECIMAL_DIG
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DECIMAL_DIG DBL_DIG
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Long double sizes */
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LDBL_DIG
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define MAX_MANTISSA_DIGITS LDBL_DIG
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define MAX_EXPONENT_DIGITS 4
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define MAX_DOUBLE_DIGITS LDBL_MAX_10_EXP
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define MAX_MANTISSA_DIGITS DECIMAL_DIG
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define MAX_EXPONENT_DIGITS 3
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define MAX_DOUBLE_DIGITS DBL_MAX_10_EXP
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_ANCIENT) || !defined(LDBL_DIG)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# undef LDBL_DIG
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# undef LDBL_MANT_DIG
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# undef LDBL_EPSILON
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define LDBL_DIG DBL_DIG
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define LDBL_MANT_DIG DBL_MANT_DIG
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define LDBL_EPSILON DBL_EPSILON
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The maximal number of digits is for base 2 */
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The width of a pointer. The number of bits in a hex digit is 4 */
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Infinite and Not-A-Number for floating-point */
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INFINITE_LOWER "inf"
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INFINITE_UPPER "INF"
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LONG_INFINITE_LOWER "infinite"
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LONG_INFINITE_UPPER "INFINITE"
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NAN_LOWER "nan"
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NAN_UPPER "NAN"
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Various constants */
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_PRINT = 1,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TYPE_SCAN  = 2,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Flags. FLAGS_LAST must be less than ULONG_MAX */
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_NEW                 = 0,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_STICKY              = 1,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_SPACE               = 2 * FLAGS_STICKY,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_SHOWSIGN            = 2 * FLAGS_SPACE,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_LEFTADJUST          = 2 * FLAGS_SHOWSIGN,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_ALTERNATIVE         = 2 * FLAGS_LEFTADJUST,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_SHORT               = 2 * FLAGS_ALTERNATIVE,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_SHORTSHORT          = 2 * FLAGS_SHORT,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_LONG                = 2 * FLAGS_SHORTSHORT,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_QUAD                = 2 * FLAGS_LONG,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_LONGDOUBLE          = 2 * FLAGS_QUAD,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_SIZE_T              = 2 * FLAGS_LONGDOUBLE,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_PTRDIFF_T           = 2 * FLAGS_SIZE_T,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_INTMAX_T            = 2 * FLAGS_PTRDIFF_T,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_NILPADDING          = 2 * FLAGS_INTMAX_T,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_UNSIGNED            = 2 * FLAGS_NILPADDING,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_UPPER               = 2 * FLAGS_UNSIGNED,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_WIDTH               = 2 * FLAGS_UPPER,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_WIDTH_PARAMETER     = 2 * FLAGS_WIDTH,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_PRECISION           = 2 * FLAGS_WIDTH_PARAMETER,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_BASE                = 2 * FLAGS_PRECISION_PARAMETER,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_BASE_PARAMETER      = 2 * FLAGS_BASE,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_FLOAT_E             = 2 * FLAGS_BASE_PARAMETER,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_FLOAT_G             = 2 * FLAGS_FLOAT_E,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_QUOTE               = 2 * FLAGS_FLOAT_G,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_WIDECHAR            = 2 * FLAGS_QUOTE,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_ALLOC               = 2 * FLAGS_WIDECHAR,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_IGNORE              = 2 * FLAGS_ALLOC,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_IGNORE_PARAMETER    = 2 * FLAGS_IGNORE,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_VARSIZE_PARAMETER   = 2 * FLAGS_IGNORE_PARAMETER,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_FIXED_SIZE          = 2 * FLAGS_VARSIZE_PARAMETER,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_LAST                = FLAGS_FIXED_SIZE,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Reused flags */
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_EXCLUDE             = FLAGS_SHORT,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_USER_DEFINED        = FLAGS_IGNORE,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_ROUNDING            = FLAGS_INTMAX_T,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Compounded flags */
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_ALL_VARSIZES        = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FLAGS_ALL_SIZES           = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NO_POSITION  = -1,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NO_WIDTH     =  0,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NO_PRECISION = -1,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NO_SIZE      = -1,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Do not change these */
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NO_BASE      = -1,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MIN_BASE     =  2,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_BASE     = 36,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BASE_BINARY  =  2,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BASE_OCTAL   =  8,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BASE_DECIMAL = 10,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BASE_HEX     = 16,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Maximal number of allowed parameters */
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_PARAMETERS = 64,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Maximal number of characters in class */
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_CHARACTER_CLASS = UCHAR_MAX + 1,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Maximal string lengths for user-defined specifiers */
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_USER_NAME = 64,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_USER_DATA = 256,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Maximal length of locale separator strings */
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Maximal number of integers in grouping */
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MAX_LOCALE_GROUPS = 64,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Initial size of asprintf buffer */
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DYNAMIC_START_SIZE = 32
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NO_GROUPING ((int)CHAR_MAX)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Fundamental formatting parameter types */
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_UNKNOWN   0
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_INT       1
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_DOUBLE    2
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_CHAR      3
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_STRING    4
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_POINTER   5
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_COUNT     6
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_PARAMETER 7
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FORMAT_GROUP     8
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_GNU
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define FORMAT_ERRNO    9
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define FORMAT_USER_DEFINED 10
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Character constants */
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_IDENTIFIER '%'
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_BACKSLASH '\\'
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_QUOTE '\"'
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_ADJUST ' '
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Character class expressions */
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_ALNUM "[:alnum:]"
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_ALPHA "[:alpha:]"
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_BLANK "[:blank:]"
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_CNTRL "[:cntrl:]"
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_DIGIT "[:digit:]"
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_GRAPH "[:graph:]"
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_LOWER "[:lower:]"
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_PRINT "[:print:]"
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_PUNCT "[:punct:]"
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_SPACE "[:space:]"
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_UPPER "[:upper:]"
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLASS_XDIGIT "[:xdigit:]"
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIFIERS:
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a  Hex-float
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A  Hex-float
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * c  Character
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * C  Widechar character (wint_t)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * d  Decimal
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * e  Float
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * E  Float
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * F  Float
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * F  Float
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * g  Float
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * G  Float
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * i  Integer
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * m  Error message
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * n  Count
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * o  Octal
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * p  Pointer
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * s  String
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * S  Widechar string (wchar_t *)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * u  Unsigned
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * x  Hex
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * X  Hex
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * [] Group
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <> User-defined
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reserved:
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * D  Binary Coded Decimal %D(length,precision) (OS/390)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_CHAR 'c'
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_STRING 's'
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_DECIMAL 'd'
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_INTEGER 'i'
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_UNSIGNED 'u'
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_OCTAL 'o'
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_HEX 'x'
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_HEX_UPPER 'X'
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_FLOAT_E 'e'
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_FLOAT_E_UPPER 'E'
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_FLOAT_F 'f'
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_FLOAT_F_UPPER 'F'
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_FLOAT_G 'g'
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_FLOAT_G_UPPER 'G'
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_POINTER 'p'
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_GROUP '['
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_UNGROUP ']'
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SPECIFIER_COUNT 'n'
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_UNIX98
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_CHAR_UPPER 'C'
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_STRING_UPPER 'S'
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_C99
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_HEXFLOAT 'a'
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_HEXFLOAT_UPPER 'A'
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_GNU
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_ERRNO 'm'
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_BINARY 'b'
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_BINARY_UPPER 'B'
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_USER_DEFINED_BEGIN '<'
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_USER_DEFINED_END '>'
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define SPECIFIER_USER_DEFINED_SEPARATOR ':'
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * QUALIFIERS:
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Numbers = d,i,o,u,x,X
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Float = a,A,e,E,f,F,g,G
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * String = s
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Char = c
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9$ Position
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Use the 9th parameter. 9 can be any number between 1 and
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      the maximal argument
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9 Width
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Set width to 9. 9 can be any number, but must not be postfixed
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      by '$'
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * h  Short
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Numbers:
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      (unsigned) short int
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hh Short short
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Numbers:
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      (unsigned) char
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * l  Long
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Numbers:
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      (unsigned) long int
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    String:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      as the S specifier
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Char:
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      as the C specifier
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ll Long Long
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Numbers:
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      (unsigned) long long int
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * L  Long Double
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Float
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      long double
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * #  Alternative
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Float:
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Decimal-point is always present
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    String:
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      non-printable characters are handled as \number
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Spacing
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * +  Sign
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -  Alignment
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * .  Precision
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * *  Parameter
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    print: use parameter
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    scan: no parameter (ignore)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * q  Quad
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Z  size_t
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * w  Widechar
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * '  Thousands/quote
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Numbers:
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Integer part grouped in thousands
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Binary numbers:
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Number grouped in nibbles (4 bits)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    String:
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Quoted string
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * j  intmax_t
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * t  prtdiff_t
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * z  size_t
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * !  Sticky
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @  Parameter (for both print and scan)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * I  n-bit Integer
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    Numbers:
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      The following options exists
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        I8  = 8-bit integer
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        I16 = 16-bit integer
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        I32 = 32-bit integer
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *        I64 = 64-bit integer
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_POSITION '$'
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_SHORT 'h'
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_LONG 'l'
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_LONG_UPPER 'L'
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_ALTERNATIVE '#'
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_SPACE ' '
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_PLUS '+'
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_MINUS '-'
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_DOT '.'
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_STAR '*'
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define QUALIFIER_CIRCUMFLEX '^' /* For scanlists */
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_C99
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_SIZE_T 'z'
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_PTRDIFF_T 't'
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_INTMAX_T 'j'
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_BSD || TRIO_GNU
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_QUAD 'q'
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_GNU
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_SIZE_T_UPPER 'Z'
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_MISC
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_WIDECHAR 'w'
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_MICROSOFT
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_FIXED_SIZE 'I'
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_QUOTE '\''
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_STICKY '!'
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_VARSIZE '&' /* This should remain undocumented */
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_PARAM '@' /* Experimental */
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_COLON ':' /* For scanlists */
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_EQUAL '=' /* For scanlists */
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define QUALIFIER_ROUNDING_UPPER 'R'
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internal Structures
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *************************************************************************/
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Parameters */
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* An indication of which entry in the data union is used */
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int type;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The flags */
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_flags_t flags;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The width qualifier */
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The precision qualifier */
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int precision;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The base qualifier */
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The size for the variable size qualifier */
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int varsize;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The marker of the end of the specifier */
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int indexAfterSpecifier;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The data from the argument list */
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char *string;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trio_wchar_t *wstring;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trio_pointer_t pointer;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    union {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_intmax_t as_signed;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_uintmax_t as_unsigned;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } number;
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double doubleNumber;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double *doublePointer;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trio_long_double_t longdoubleNumber;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trio_long_double_t *longdoublePointer;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int errorNumber;
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } data;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* For the user-defined specifier */
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char user_name[MAX_USER_NAME];
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char user_data[MAX_USER_DATA];
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} trio_parameter_t;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Container for customized functions */
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trio_outstream_t out;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    trio_instream_t in;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } stream;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_pointer_t closure;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} trio_custom_t;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* General trio "class" */
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _trio_class_t {
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The function to write characters to a stream.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*OutStream) TRIO_PROTO((struct _trio_class_t *, int));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The function to read characters from a stream.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*InStream) TRIO_PROTO((struct _trio_class_t *, int *));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The current location in the stream.
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_pointer_t location;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The character currently being processed.
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int current;
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The number of characters that would have been written/read
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * if there had been sufficient space.
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int processed;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The number of characters that are actually written/read.
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Processed and committed will only differ for the *nprintf
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * and *nscanf functions.
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int committed;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The upper limit of characters that may be written/read.
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The last output error that was detected.
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int error;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} trio_class_t;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* References (for user-defined callbacks) */
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _trio_reference_t {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_class_t *data;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_parameter_t *parameter;
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} trio_reference_t;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Registered entries (for user-defined callbacks) */
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _trio_userdef_t {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct _trio_userdef_t *next;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_callback_t callback;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *name;
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} trio_userdef_t;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internal Variables
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *************************************************************************/
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static TRIO_CONST char rcsid[] = "@(#)$Id$";
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Need this to workaround a parser bug in HP C/iX compiler that fails
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to resolves macro definitions that includes type 'long double',
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * e.g: va_arg(arg_ptr, long double)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_PLATFORM_MPEIX)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static TRIO_CONST trio_long_double_t ___dummy_long_double = 0;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static TRIO_CONST char internalNullString[] = "(nil)";
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LOCALE)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct lconv *internalLocaleValues = NULL;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * UNIX98 says "in a locale where the radix character is not defined,
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the radix character defaults to a period (.)"
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int internalDecimalPointLength = 1;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int internalThousandSeparatorLength = 1;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char internalDecimalPoint = '.';
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char internalDecimalPointString[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ".";
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ",";
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING };
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static TRIO_CONST char internalDigitsLower[] = "0123456789abcdefghijklmnopqrstuvwxyz";
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static TRIO_CONST char internalDigitsUpper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static BOOLEAN_T internalDigitsUnconverted = TRUE;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int internalDigitArray[128];
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static BOOLEAN_T internalCollationUnconverted = TRUE;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS];
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static TRIO_VOLATILE trio_callback_t internalEnterCriticalRegion = NULL;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static TRIO_VOLATILE trio_callback_t internalLeaveCriticalRegion = NULL;
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static trio_userdef_t *internalUserDef = NULL;
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internal Functions
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_MINIMAL)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRIO_STRING_PUBLIC static
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include "triostr.c"
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(TRIO_MINIMAL) */
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioIsQualifier
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Remember to add all new qualifiers to this function.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  QUALIFIER_POSITION must not be added.
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioIsQualifier
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((character),
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char character)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* QUALIFIER_POSITION is not included */
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (character)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case '0': case '1': case '2': case '3': case '4':
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case '5': case '6': case '7': case '8': case '9':
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_PLUS:
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_MINUS:
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_SPACE:
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_DOT:
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_STAR:
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_ALTERNATIVE:
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_SHORT:
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_LONG:
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_LONG_UPPER:
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_CIRCUMFLEX:
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_SIZE_T:
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PTRDIFF_T)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_PTRDIFF_T:
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_INTMAX_T)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_INTMAX_T:
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_QUAD)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_QUAD:
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T_UPPER)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_SIZE_T_UPPER:
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_WIDECHAR)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_WIDECHAR:
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_QUOTE)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_QUOTE:
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_STICKY)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_STICKY:
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_VARSIZE)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_VARSIZE:
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PARAM)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_PARAM:
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_FIXED_SIZE)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_FIXED_SIZE:
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_ROUNDING_UPPER)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case QUALIFIER_ROUNDING_UPPER:
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return TRUE;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioSetLocale
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LOCALE)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioSetLocale(TRIO_NOARGS)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internalLocaleValues = (struct lconv *)localeconv();
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internalLocaleValues)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((internalLocaleValues->decimal_point) &&
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  (internalLocaleValues->decimal_point[0] != NIL))
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  internalDecimalPointLength = trio_length(internalLocaleValues->decimal_point);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (internalDecimalPointLength == 1)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      internalDecimalPoint = internalLocaleValues->decimal_point[0];
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      internalDecimalPoint = NIL;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      trio_copy_max(internalDecimalPointString,
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    sizeof(internalDecimalPointString),
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    internalLocaleValues->decimal_point);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((internalLocaleValues->thousands_sep) &&
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  (internalLocaleValues->thousands_sep[0] != NIL))
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  trio_copy_max(internalThousandSeparator,
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(internalThousandSeparator),
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			internalLocaleValues->thousands_sep);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  internalThousandSeparatorLength = trio_length(internalThousandSeparator);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((internalLocaleValues->grouping) &&
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  (internalLocaleValues->grouping[0] != NIL))
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  trio_copy_max(internalGrouping,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			sizeof(internalGrouping),
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			internalLocaleValues->grouping);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(USE_LOCALE) */
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioCalcThousandSeparatorLength
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((digits),
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int digits)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count = 0;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int step = NO_GROUPING;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *groupingPointer = internalGrouping;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (digits > 0)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*groupingPointer == CHAR_MAX)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Disable grouping */
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break; /* while */
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (*groupingPointer == 0)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Repeat last group */
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (step == NO_GROUPING)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Error in locale */
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* while */
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  step = *groupingPointer++;
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (digits > step)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	count += internalThousandSeparatorLength;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      digits -= step;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return count;
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioFollowedBySeparator
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((position),
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int position)
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int step = 0;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *groupingPointer = internalGrouping;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position--;
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (position == 0)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FALSE;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (position > 0)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*groupingPointer == CHAR_MAX)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Disable grouping */
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break; /* while */
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (*groupingPointer != 0)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  step = *groupingPointer++;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (step == 0)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      position -= step;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (position == 0);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FALSE;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioGetPosition
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the %n$ position.
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioGetPosition
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((format, indexPointer),
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *indexPointer)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_UNIX98
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *tmpformat;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int number = 0;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = *indexPointer;
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  number = (int)trio_to_long(&format[index], &tmpformat, BASE_DECIMAL);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index = (int)(tmpformat - format);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((number != 0) && (QUALIFIER_POSITION == format[index++]))
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *indexPointer = index;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /*
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * number is decreased by 1, because n$ starts from 1, whereas
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * the array it is indexing starts from 0.
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return number - 1;
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NO_POSITION;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioFindNamespace
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find registered user-defined specifier.
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The prev argument is used for optimization only.
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE trio_userdef_t *
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioFindNamespace
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((name, prev),
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *name,
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_userdef_t **prev)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_userdef_t *def;
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internalEnterCriticalRegion)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (void)internalEnterCriticalRegion(NULL);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (def = internalUserDef; def; def = def->next)
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Case-sensitive string comparison */
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (trio_equal_case(def->name, name))
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (prev)
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*prev = def;
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internalLeaveCriticalRegion)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (void)internalLeaveCriticalRegion(NULL);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return def;
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioPower
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Calculate pow(base, exponent), where number and exponent are integers.
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE trio_long_double_t
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioPower
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((number, exponent),
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int number,
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int exponent)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t result;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (number == 10)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (exponent)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Speed up calculation of common cases */
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 0:
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E-1);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 1:
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+0);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 2:
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+1);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 3:
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+2);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 4:
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+3);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 5:
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+4);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 6:
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+5);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 7:
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+6);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 8:
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+7);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case 9:
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+8);
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = powl((trio_long_double_t)number,
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			(trio_long_double_t)exponent);
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return powl((trio_long_double_t)number, (trio_long_double_t)exponent);
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioLogarithm
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE double
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioLogarithm
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((number, base),
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   double number,
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int base)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double result;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (number <= 0.0)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* xlC crashes on log(0) */
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = (number == 0.0) ? trio_ninf() : trio_nan();
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (base == 10)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = log10(number);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  result = log10(number) / log10((double)base);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioLogarithmBase
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE double
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioLogarithmBase
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((base),
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int base)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (base)
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BASE_BINARY : return 1.0;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BASE_OCTAL  : return 3.0;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BASE_DECIMAL: return 3.321928094887362345;
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case BASE_HEX    : return 4.0;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default          : return TrioLogarithm((double)base, 2);
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioParse
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Parse the format string
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioParse
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS5((type, format, parameters, arglist, argarray),
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int type,
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_parameter_t *parameters,
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list *arglist,
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *argarray)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Count the number of times a parameter is referenced */
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned short usedEntries[MAX_PARAMETERS];
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Parameter counters */
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int parameterPosition;
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int currentParam;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int maxParam = -1;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Utility variables */
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_flags_t flags;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int precision;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int varsize;
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base;
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;  /* Index into formatting string */
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int dots;  /* Count number of dots in modifier part */
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T positional;  /* Does the specifier have a positional? */
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T gotSticky = FALSE;  /* Are there any sticky modifiers at all? */
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * indices specifies the order in which the parameters must be
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * read from the va_args (this is necessary to handle positionals)
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int indices[MAX_PARAMETERS];
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pos = 0;
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Various variables */
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char ch;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int charlen;
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int save_errno;
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = -1;
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *tmpformat;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* One and only one of arglist and argarray must be used */
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert((arglist != NULL) ^ (argarray != NULL));
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * The 'parameters' array is not initialized, but we need to
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * know which entries we have used.
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(usedEntries, 0, sizeof(usedEntries));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  save_errno = errno;
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index = 0;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parameterPosition = 0;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (void)mblen(NULL, 0);
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (format[index])
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (! isascii(format[index]))
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * Multibyte characters cannot be legal specifiers or
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * modifiers, so we skip over them.
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  charlen = mblen(&format[index], MB_LEN_MAX);
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  index += (charlen > 0) ? charlen : 1;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  continue; /* while */
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (CHAR_IDENTIFIER == format[index++])
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (CHAR_IDENTIFIER == format[index])
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      index++;
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      continue; /* while */
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  flags = FLAGS_NEW;
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  dots = 0;
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  currentParam = TrioGetPosition(format, &index);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  positional = (NO_POSITION != currentParam);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (!positional)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* We have no positional, get the next counter */
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      currentParam = parameterPosition;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if(currentParam >= MAX_PARAMETERS)
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Bail out completely to make the error more obvious */
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      return TRIO_ERROR_RETURN(TRIO_ETOOMANY, index);
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (currentParam > maxParam)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    maxParam = currentParam;
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Default values */
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  width = NO_WIDTH;
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  precision = NO_PRECISION;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  base = NO_BASE;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  varsize = NO_SIZE;
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  while (TrioIsQualifier(format[index]))
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      ch = format[index++];
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      switch (ch)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_SPACE:
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_SPACE;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_PLUS:
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_SHOWSIGN;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_MINUS:
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_LEFTADJUST;
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags &= ~FLAGS_NILPADDING;
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_ALTERNATIVE:
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_ALTERNATIVE;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_DOT:
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (dots == 0) /* Precision */
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      dots++;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* Skip if no precision */
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (QUALIFIER_DOT == format[index])
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* After the first dot we have the precision */
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags |= FLAGS_PRECISION;
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if ((QUALIFIER_STAR == format[index])
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PARAM)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  || (QUALIFIER_PARAM == format[index])
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  )
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  index++;
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  flags |= FLAGS_PRECISION_PARAMETER;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  precision = TrioGetPosition(format, &index);
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (precision == NO_POSITION)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    {
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      parameterPosition++;
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      if (positional)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				precision = parameterPosition;
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      else
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				{
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  precision = currentParam;
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  currentParam = precision + 1;
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  else
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      if (! positional)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				currentParam = precision + 1;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      if (width > maxParam)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				maxParam = precision;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (currentParam > maxParam)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    maxParam = currentParam;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  precision = trio_to_long(&format[index],
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						   &tmpformat,
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						   BASE_DECIMAL);
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  index = (int)(tmpformat - format);
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (dots == 1) /* Base */
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      dots++;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* After the second dot we have the base */
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags |= FLAGS_BASE;
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if ((QUALIFIER_STAR == format[index])
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PARAM)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  || (QUALIFIER_PARAM == format[index])
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  )
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  index++;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  flags |= FLAGS_BASE_PARAMETER;
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  base = TrioGetPosition(format, &index);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (base == NO_POSITION)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    {
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      parameterPosition++;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      if (positional)
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				base = parameterPosition;
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      else
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				{
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  base = currentParam;
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  currentParam = base + 1;
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				}
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  else
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    {
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      if (! positional)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				currentParam = base + 1;
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      if (base > maxParam)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				maxParam = base;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (currentParam > maxParam)
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    maxParam = currentParam;
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  base = trio_to_long(&format[index],
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					      &tmpformat,
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					      BASE_DECIMAL);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (base > MAX_BASE)
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  index = (int)(tmpformat - format);
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* QUALIFIER_DOT */
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PARAM)
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_PARAM:
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  type = TYPE_PRINT;
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* FALLTHROUGH */
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_STAR:
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* This has different meanings for print and scan */
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (TYPE_PRINT == type)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* Read with from parameter */
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER);
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      width = TrioGetPosition(format, &index);
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (width == NO_POSITION)
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  parameterPosition++;
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (positional)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    width = parameterPosition;
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  else
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    {
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      width = currentParam;
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      currentParam = width + 1;
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (! positional)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    currentParam = width + 1;
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (width > maxParam)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    maxParam = width;
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (currentParam > maxParam)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			maxParam = currentParam;
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* Scan, but do not store result */
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags |= FLAGS_IGNORE;
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* QUALIFIER_STAR */
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case '0':
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (! (flags & FLAGS_LEFTADJUST))
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_NILPADDING;
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* FALLTHROUGH */
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case '1': case '2': case '3': case '4':
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case '5': case '6': case '7': case '8': case '9':
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_WIDTH;
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* &format[index - 1] is used to "rewind" the read
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   * character from format
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   */
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  width = trio_to_long(&format[index - 1],
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       &tmpformat,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       BASE_DECIMAL);
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index = (int)(tmpformat - format);
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_SHORT:
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_SHORTSHORT)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (flags & FLAGS_SHORT)
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_SHORTSHORT;
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_SHORT;
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_LONG:
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_QUAD)
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (flags & FLAGS_LONG)
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_QUAD;
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_LONG;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_LONG_UPPER:
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_LONGDOUBLE;
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T)
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_SIZE_T:
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_SIZE_T;
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Modify flags for later truncation of number */
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (sizeof(size_t) == sizeof(trio_ulonglong_t))
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_QUAD;
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (sizeof(size_t) == sizeof(long))
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_LONG;
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PTRDIFF_T)
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_PTRDIFF_T:
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_PTRDIFF_T;
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t))
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_QUAD;
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (sizeof(ptrdiff_t) == sizeof(long))
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_LONG;
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_INTMAX_T)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_INTMAX_T:
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_INTMAX_T;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t))
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_QUAD;
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (sizeof(trio_intmax_t) == sizeof(long))
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    flags |= FLAGS_LONG;
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_QUAD)
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_QUAD:
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_QUAD;
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_FIXED_SIZE)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_FIXED_SIZE:
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_FIXED_SIZE)
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & (FLAGS_ALL_SIZES | FLAGS_LONGDOUBLE |
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       FLAGS_WIDECHAR | FLAGS_VARSIZE_PARAMETER))
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if ((format[index] == '6') &&
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      (format[index + 1] == '4'))
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      varsize = sizeof(trio_int64_t);
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      index += 2;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if ((format[index] == '3') &&
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   (format[index + 1] == '2'))
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      varsize = sizeof(trio_int32_t);
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      index += 2;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if ((format[index] == '1') &&
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   (format[index + 1] == '6'))
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      varsize = sizeof(trio_int16_t);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      index += 2;
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (format[index] == '8')
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      varsize = sizeof(trio_int8_t);
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      index++;
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_FIXED_SIZE;
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_WIDECHAR)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_WIDECHAR:
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_WIDECHAR;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T_UPPER)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_SIZE_T_UPPER:
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_QUOTE)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_QUOTE:
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_QUOTE;
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_STICKY)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_STICKY:
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_STICKY;
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  gotSticky = TRUE;
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_VARSIZE)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_VARSIZE:
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_VARSIZE_PARAMETER;
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  parameterPosition++;
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (positional)
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    varsize = parameterPosition;
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      varsize = currentParam;
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      currentParam = varsize + 1;
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (currentParam > maxParam)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    maxParam = currentParam;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_ROUNDING_UPPER)
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case QUALIFIER_ROUNDING_UPPER:
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  flags |= FLAGS_ROUNDING;
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Bail out completely to make the error more obvious */
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    } /* while qualifier */
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * Parameters only need the type and value. The value is
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * read later.
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_WIDTH_PARAMETER)
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      usedEntries[width] += 1;
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_PARAMETER;
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].flags = 0;
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      indices[width] = pos;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      width = pos++;
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_PRECISION_PARAMETER)
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      usedEntries[precision] += 1;
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_PARAMETER;
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].flags = 0;
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      indices[precision] = pos;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      precision = pos++;
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_BASE_PARAMETER)
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      usedEntries[base] += 1;
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_PARAMETER;
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].flags = 0;
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      indices[base] = pos;
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = pos++;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_VARSIZE_PARAMETER)
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      usedEntries[varsize] += 1;
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_PARAMETER;
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].flags = 0;
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      indices[varsize] = pos;
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      varsize = pos++;
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  indices[currentParam] = pos;
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  switch (format[index++])
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SPECIFIER_CHAR_UPPER)
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_CHAR_UPPER:
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_WIDECHAR;
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_CHAR:
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (flags & FLAGS_LONG)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		flags |= FLAGS_WIDECHAR;
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (flags & FLAGS_SHORT)
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		flags &= ~FLAGS_WIDECHAR;
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_CHAR;
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SPECIFIER_STRING_UPPER)
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_STRING_UPPER:
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_WIDECHAR;
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_STRING:
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (flags & FLAGS_LONG)
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		flags |= FLAGS_WIDECHAR;
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (flags & FLAGS_SHORT)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		flags &= ~FLAGS_WIDECHAR;
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_STRING;
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_GROUP:
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (TYPE_SCAN == type)
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  int depth = 1;
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  parameters[pos].type = FORMAT_GROUP;
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (format[index] == QUALIFIER_CIRCUMFLEX)
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    index++;
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (format[index] == SPECIFIER_UNGROUP)
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    index++;
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (format[index] == QUALIFIER_MINUS)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    index++;
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Skip nested brackets */
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  while (format[index] != NIL)
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (format[index] == SPECIFIER_GROUP)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  depth++;
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else if (format[index] == SPECIFIER_UNGROUP)
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  if (--depth <= 0)
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    {
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      index++;
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      break;
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    }
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      index++;
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_INTEGER:
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_INT;
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_UNSIGNED:
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UNSIGNED;
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_INT;
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_DECIMAL:
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Disable base modifier */
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags &= ~FLAGS_BASE_PARAMETER;
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = BASE_DECIMAL;
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_INT;
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_OCTAL:
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UNSIGNED;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags &= ~FLAGS_BASE_PARAMETER;
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = BASE_OCTAL;
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_INT;
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SPECIFIER_BINARY)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_BINARY_UPPER:
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UPPER;
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_BINARY:
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_NILPADDING;
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags &= ~FLAGS_BASE_PARAMETER;
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = BASE_BINARY;
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_INT;
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_HEX_UPPER:
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UPPER;
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_HEX:
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UNSIGNED;
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags &= ~FLAGS_BASE_PARAMETER;
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = BASE_HEX;
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_INT;
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_FLOAT_E_UPPER:
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UPPER;
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_FLOAT_E:
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_FLOAT_E;
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_DOUBLE;
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_FLOAT_G_UPPER:
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UPPER;
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_FLOAT_G:
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_FLOAT_G;
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_DOUBLE;
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_FLOAT_F_UPPER:
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UPPER;
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_FLOAT_F:
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_DOUBLE;
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_POINTER:
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (sizeof(trio_pointer_t) == sizeof(trio_ulonglong_t))
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		flags |= FLAGS_QUAD;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (sizeof(trio_pointer_t) == sizeof(long))
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		flags |= FLAGS_LONG;
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_POINTER;
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_COUNT:
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_COUNT;
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SPECIFIER_HEXFLOAT)
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if defined(SPECIFIER_HEXFLOAT_UPPER)
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_HEXFLOAT_UPPER:
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags |= FLAGS_UPPER;
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* FALLTHROUGH */
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_HEXFLOAT:
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = BASE_HEX;
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_DOUBLE;
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FORMAT_ERRNO)
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_ERRNO:
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[pos].type = FORMAT_ERRNO;
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SPECIFIER_USER_DEFINED_BEGIN)
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case SPECIFIER_USER_DEFINED_BEGIN:
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      {
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		unsigned int max;
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int without_namespace = TRUE;
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[pos].type = FORMAT_USER_DEFINED;
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[pos].user_name[0] = NIL;
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		tmpformat = (char *)&format[index];
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while ((ch = format[index]))
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    index++;
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ch == SPECIFIER_USER_DEFINED_END)
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      {
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (without_namespace)
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  {
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /* We must get the handle first */
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parameters[pos].type = FORMAT_PARAMETER;
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parameters[pos].indexAfterSpecifier = index;
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parameters[pos].flags = FLAGS_USER_DEFINED;
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    /* Adjust parameters for insertion of new one */
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    pos++;
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    usedEntries[currentParam] += 1;
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    parameters[pos].type = FORMAT_USER_DEFINED;
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    currentParam++;
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    indices[currentParam] = pos;
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    if (currentParam > maxParam)
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      maxParam = currentParam;
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  }
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* Copy the user data */
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			max = (unsigned int)(&format[index] - tmpformat);
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (max > MAX_USER_DATA)
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  max = MAX_USER_DATA;
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			trio_copy_max(parameters[pos].user_data,
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      max,
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      tmpformat);
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			break; /* while */
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      }
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ch == SPECIFIER_USER_DEFINED_SEPARATOR)
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      {
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			without_namespace = FALSE;
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* Copy the namespace for later looking-up */
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			max = (int)(&format[index] - tmpformat);
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if (max > MAX_USER_NAME)
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  max = MAX_USER_NAME;
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			trio_copy_max(parameters[pos].user_name,
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      max,
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      tmpformat);
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			tmpformat = (char *)&format[index];
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      }
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (ch != SPECIFIER_USER_DEFINED_END)
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      }
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Bail out completely to make the error more obvious */
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*  Count the number of times this entry has been used */
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  usedEntries[currentParam] += 1;
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Find last sticky parameters */
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (gotSticky && !(flags & FLAGS_STICKY))
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      for (i = pos - 1; i >= 0; i--)
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (parameters[i].type == FORMAT_PARAMETER)
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    continue;
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if ((parameters[i].flags & FLAGS_STICKY) &&
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      (parameters[i].type == parameters[pos].type))
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* Do not overwrite current qualifiers */
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY);
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (width == NO_WIDTH)
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			width = parameters[i].width;
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (precision == NO_PRECISION)
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			precision = parameters[i].precision;
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (base == NO_BASE)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			base = parameters[i].base;
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      break;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[pos].indexAfterSpecifier = index;
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[pos].flags = flags;
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[pos].width = width;
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[pos].precision = precision;
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base;
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[pos].varsize = varsize;
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  pos++;
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (! positional)
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parameterPosition++;
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} /* if identifier */
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } /* while format characters left */
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (num = 0; num <= maxParam; num++)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (usedEntries[num] != 1)
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (usedEntries[num] == 0) /* gap detected */
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return TRIO_ERROR_RETURN(TRIO_EGAP, num);
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else /* double references detected */
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return TRIO_ERROR_RETURN(TRIO_EDBLREF, num);
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i = indices[num];
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /*
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * FORMAT_PARAMETERS are only present if they must be read,
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * so it makes no sense to check the ignore flag (besides,
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * the flags variable is not set for that particular type)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((parameters[i].type != FORMAT_PARAMETER) &&
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  (parameters[i].flags & FLAGS_IGNORE))
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	continue; /* for all arguments */
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /*
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * The stack arguments are read according to ANSI C89
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * default argument promotions:
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  char           = int
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  short          = int
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  unsigned char  = unsigned int
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  unsigned short = unsigned int
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  float          = double
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * In addition to the ANSI C89 these types are read (the
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * default argument promotions of C99 has not been
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * considered yet)
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  long long
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  long double
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  size_t
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  ptrdiff_t
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       *  intmax_t
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (parameters[i].type)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_GROUP:
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_STRING:
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_WIDECHAR)
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[i].data.wstring = (argarray == NULL)
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		? va_arg(*arglist, trio_wchar_t *)
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		: (trio_wchar_t *)(argarray[num]);
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      parameters[i].data.string = (argarray == NULL)
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		? va_arg(*arglist, char *)
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		: (char *)(argarray[num]);
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FORMAT_USER_DEFINED)
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_USER_DEFINED:
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_POINTER:
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_COUNT:
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_UNKNOWN:
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[i].data.pointer = (argarray == NULL)
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ? va_arg(*arglist, trio_pointer_t )
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    : argarray[num];
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_CHAR:
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_INT:
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (TYPE_SCAN == type)
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if (argarray == NULL)
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                parameters[i].data.pointer =
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  (trio_pointer_t)va_arg(*arglist, trio_pointer_t);
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              else
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                {
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  if (parameters[i].type == FORMAT_CHAR)
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    parameters[i].data.pointer =
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      (trio_pointer_t)((char *)argarray[num]);
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  else if (parameters[i].flags & FLAGS_SHORT)
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    parameters[i].data.pointer =
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      (trio_pointer_t)((short *)argarray[num]);
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  else
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    parameters[i].data.pointer =
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      (trio_pointer_t)((int *)argarray[num]);
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_VARSIZE) || defined(QUALIFIER_FIXED_SIZE)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (parameters[i].flags
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  & (FLAGS_VARSIZE_PARAMETER | FLAGS_FIXED_SIZE))
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER)
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /*
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * Variable sizes are mapped onto the fixed sizes, in
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * accordance with integer promotion.
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       *
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * Please note that this may not be portable, as we
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * only guess the size, not the layout of the numbers.
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * For example, if int is little-endian, and long is
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * big-endian, then this will fail.
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       */
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned;
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* Used for the I<bits> modifiers */
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      varsize = parameters[i].varsize;
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  parameters[i].flags &= ~FLAGS_ALL_VARSIZES;
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (varsize <= (int)sizeof(int))
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ;
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (varsize <= (int)sizeof(long))
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].flags |= FLAGS_LONG;
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_INTMAX_T)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (varsize <= (int)sizeof(trio_longlong_t))
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].flags |= FLAGS_QUAD;
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].flags |= FLAGS_INTMAX_T;
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].flags |= FLAGS_QUAD;
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(QUALIFIER_VARSIZE) */
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (parameters[i].flags & FLAGS_SIZE_T)
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[i].data.number.as_unsigned = (argarray == NULL)
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ? (trio_uintmax_t)va_arg(*arglist, size_t)
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  : (trio_uintmax_t)(*((size_t *)argarray[num]));
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PTRDIFF_T)
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (parameters[i].flags & FLAGS_PTRDIFF_T)
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[i].data.number.as_unsigned = (argarray == NULL)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ? (trio_uintmax_t)va_arg(*arglist, ptrdiff_t)
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num]));
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_INTMAX_T)
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (parameters[i].flags & FLAGS_INTMAX_T)
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[i].data.number.as_unsigned = (argarray == NULL)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ? (trio_uintmax_t)va_arg(*arglist, trio_intmax_t)
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num]));
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (parameters[i].flags & FLAGS_QUAD)
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[i].data.number.as_unsigned = (argarray == NULL)
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ? (trio_uintmax_t)va_arg(*arglist, trio_ulonglong_t)
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num]));
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (parameters[i].flags & FLAGS_LONG)
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[i].data.number.as_unsigned = (argarray == NULL)
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ? (trio_uintmax_t)va_arg(*arglist, long)
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  : (trio_uintmax_t)(*((long *)argarray[num]));
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (argarray == NULL)
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(*arglist, int);
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (parameters[i].type == FORMAT_CHAR)
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((char *)argarray[num]));
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else if (parameters[i].flags & FLAGS_SHORT)
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((short *)argarray[num]));
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((int *)argarray[num]));
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_PARAMETER:
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * The parameter for the user-defined specifier is a pointer,
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * whereas the rest (width, precision, base) uses an integer.
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (parameters[i].flags & FLAGS_USER_DEFINED)
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parameters[i].data.pointer = (argarray == NULL)
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      ? va_arg(*arglist, trio_pointer_t )
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      : argarray[num];
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    parameters[i].data.number.as_unsigned = (argarray == NULL)
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      ? (trio_uintmax_t)va_arg(*arglist, int)
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      : (trio_uintmax_t)(*((int *)argarray[num]));
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_DOUBLE:
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (TYPE_SCAN == type)
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (parameters[i].flags & FLAGS_LONGDOUBLE)
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[i].data.longdoublePointer = (argarray == NULL)
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ? va_arg(*arglist, trio_long_double_t *)
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  : (trio_long_double_t *)argarray[num];
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                {
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (parameters[i].flags & FLAGS_LONG)
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].data.doublePointer = (argarray == NULL)
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      ? va_arg(*arglist, double *)
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      : (double *)argarray[num];
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].data.doublePointer = (argarray == NULL)
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      ? (double *)va_arg(*arglist, float *)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      : (double *)((float *)argarray[num]);
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                }
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (parameters[i].flags & FLAGS_LONGDOUBLE)
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		parameters[i].data.longdoubleNumber = (argarray == NULL)
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ? va_arg(*arglist, trio_long_double_t)
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  : (trio_long_double_t)(*((trio_long_double_t *)argarray[num]));
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (argarray == NULL)
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    parameters[i].data.longdoubleNumber =
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      (trio_long_double_t)va_arg(*arglist, double);
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (parameters[i].flags & FLAGS_SHORT)
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parameters[i].data.longdoubleNumber =
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  (trio_long_double_t)(*((float *)argarray[num]));
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			parameters[i].data.longdoubleNumber =
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  (trio_long_double_t)(*((double *)argarray[num]));
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FORMAT_ERRNO)
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case FORMAT_ERRNO:
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  parameters[i].data.errorNumber = save_errno;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } /* for all specifiers */
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return num;
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FORMATTING
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioWriteNumber
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Output a number.
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  The complexity of this function is a result of the complexity
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  of the dependencies of the flags.
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioWriteNumber
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS6((self, number, flags, width, precision, base),
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_uintmax_t number,
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width,
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int precision,
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int base)
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isNegative;
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isNumberZero;
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isPrecisionZero;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T ignoreNumber;
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1];
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *bufferend;
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *pointer;
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_CONST char *digits;
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int length;
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *p;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->OutStream));
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base == NO_BASE)
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = BASE_DECIMAL;
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  isNumberZero = (number == 0);
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  isPrecisionZero = (precision == 0);
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ignoreNumber = (isNumberZero
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  && isPrecisionZero
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  && !((flags & FLAGS_ALTERNATIVE) && (base == BASE_OCTAL)));
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_UNSIGNED)
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      isNegative = FALSE;
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags &= ~FLAGS_SHOWSIGN;
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      isNegative = ((trio_intmax_t)number < 0);
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isNegative)
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	number = -((trio_intmax_t)number);
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_QUAD)
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number &= (trio_ulonglong_t)-1;
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags & FLAGS_LONG)
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number &= (unsigned long)-1;
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number &= (unsigned int)-1;
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Build number */
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pointer = bufferend = &buffer[sizeof(buffer) - 1];
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *pointer-- = NIL;
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 1; i < (int)sizeof(buffer); i++)
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *pointer-- = digits[number % base];
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number /= base;
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (number == 0)
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((flags & FLAGS_QUOTE) && TrioFollowedBySeparator(i + 1))
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * We are building the number from the least significant
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * to the most significant digit, so we have to copy the
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * thousand separator backwards
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  length = internalThousandSeparatorLength;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (((int)(pointer - buffer) - length) > 0)
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      p = &internalThousandSeparator[length - 1];
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      while (length-- > 0)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		*pointer-- = *p--;
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (! ignoreNumber)
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Adjust width */
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width -= (bufferend - pointer) - 1;
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Adjust precision */
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NO_PRECISION != precision)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      precision -= (bufferend - pointer) - 1;
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (precision < 0)
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	precision = 0;
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags |= FLAGS_NILPADDING;
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Calculate padding */
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION)))
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? precision
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : 0;
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Adjust width further */
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    width--;
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (base)
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_BINARY:
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_HEX:
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  width -= 2;
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_OCTAL:
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (!(flags & FLAGS_NILPADDING) || (count == 0))
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    width--;
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Output prefixes spaces if needed */
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (! ((flags & FLAGS_LEFTADJUST) ||
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION))))
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (width-- > count)
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, CHAR_ADJUST);
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* width has been adjusted for signs and alternatives */
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isNegative)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self->OutStream(self, '-');
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags & FLAGS_SHOWSIGN)
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self->OutStream(self, '+');
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags & FLAGS_SPACE)
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self->OutStream(self, ' ');
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Prefix is not written when the value is zero */
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (base)
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_BINARY:
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, '0');
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b');
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_OCTAL:
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (!(flags & FLAGS_NILPADDING) || (count == 0))
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    self->OutStream(self, '0');
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_HEX:
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, '0');
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	} /* switch base */
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Output prefixed zero padding if needed */
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_NILPADDING)
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (precision == NO_PRECISION)
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	precision = width;
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (precision-- > 0)
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, '0');
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  width--;
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (! ignoreNumber)
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Output the number itself */
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (*(++pointer))
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, *pointer);
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Output trailing spaces if needed */
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_LEFTADJUST)
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (width-- > 0)
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, CHAR_ADJUST);
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioWriteStringCharacter
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Output a single character of a string
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioWriteStringCharacter
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((self, ch, flags),
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int ch,
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags)
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_ALTERNATIVE)
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (! isprint(ch))
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * Non-printable characters are converted to C escapes or
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * \number, if no C escape exists.
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, CHAR_BACKSLASH);
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  switch (ch)
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\007': self->OutStream(self, 'a'); break;
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\b': self->OutStream(self, 'b'); break;
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\f': self->OutStream(self, 'f'); break;
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\n': self->OutStream(self, 'n'); break;
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\r': self->OutStream(self, 'r'); break;
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\t': self->OutStream(self, 't'); break;
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\v': self->OutStream(self, 'v'); break;
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\\': self->OutStream(self, '\\'); break;
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->OutStream(self, 'x');
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      TrioWriteNumber(self, (trio_uintmax_t)ch,
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      FLAGS_UNSIGNED | FLAGS_NILPADDING,
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      2, 2, BASE_HEX);
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (ch == CHAR_BACKSLASH)
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, CHAR_BACKSLASH);
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, CHAR_BACKSLASH);
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, ch);
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->OutStream(self, ch);
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioWriteString
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Output a string
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioWriteString
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS5((self, string, flags, width, precision),
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *string,
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width,
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int precision)
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int length;
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ch;
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->OutStream));
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (string == NULL)
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string = internalNullString;
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = sizeof(internalNullString) - 1;
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Disable quoting for the null pointer */
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags &= (~FLAGS_QUOTE);
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width = 0;
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = trio_length(string);
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((NO_PRECISION != precision) &&
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (precision < length))
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = precision;
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  width -= length;
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_QUOTE)
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self->OutStream(self, CHAR_QUOTE);
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (! (flags & FLAGS_LEFTADJUST))
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (width-- > 0)
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, CHAR_ADJUST);
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (length-- > 0)
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The ctype parameters must be an unsigned char (or EOF) */
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ch = (int)((unsigned char)(*string++));
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioWriteStringCharacter(self, ch, flags);
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_LEFTADJUST)
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (width-- > 0)
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, CHAR_ADJUST);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_QUOTE)
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self->OutStream(self, CHAR_QUOTE);
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioWriteWideStringCharacter
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Output a wide string as a multi-byte sequence
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioWriteWideStringCharacter
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((self, wch, flags, width),
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_wchar_t wch,
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ch;
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *string;
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[MB_LEN_MAX + 1];
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (width == NO_WIDTH)
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    width = sizeof(buffer);
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size = wctomb(buffer, wch);
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((size <= 0) || (size > width) || (buffer[0] == NIL))
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string = buffer;
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = size;
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((width >= i) && (width-- > 0) && (i-- > 0))
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The ctype parameters must be an unsigned char (or EOF) */
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ch = (int)((unsigned char)(*string++));
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioWriteStringCharacter(self, ch, flags);
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return size;
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_WIDECHAR */
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioWriteWideString
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Output a wide character string as a multi-byte string
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioWriteWideString
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS5((self, wstring, flags, width, precision),
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST trio_wchar_t *wstring,
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width,
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int precision)
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int length;
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->OutStream));
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (void)mblen(NULL, 0);
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (wstring == NULL)
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioWriteString(self, NULL, flags, width, precision);
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NO_PRECISION == precision)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = INT_MAX;
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length = precision;
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width -= length;
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_QUOTE)
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self->OutStream(self, CHAR_QUOTE);
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (! (flags & FLAGS_LEFTADJUST))
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (width-- > 0)
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, CHAR_ADJUST);
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (length > 0)
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size = TrioWriteWideStringCharacter(self, *wstring++, flags, length);
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (size == 0)
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break; /* while */
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      length -= size;
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_LEFTADJUST)
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (width-- > 0)
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, CHAR_ADJUST);
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_QUOTE)
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self->OutStream(self, CHAR_QUOTE);
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_WIDECHAR */
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioWriteDouble
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_211.htm
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "5.2.4.2.2 paragraph #4
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  The accuracy [...] is implementation defined, as is the accuracy
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  of the conversion between floating-point internal representations
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  and string representations performed by the libray routine in
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  <stdio.h>"
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* FIXME: handle all instances of constant long-double number (L)
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   and *l() math functions.
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioWriteDouble
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS6((self, number, flags, width, precision, base),
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_long_double_t number,
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width,
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int precision,
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int base)
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t integerNumber;
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t fractionNumber;
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t workNumber;
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int integerDigits;
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fractionDigits;
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int exponentDigits;
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int baseDigits;
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int integerThreshold;
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fractionThreshold;
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expectedWidth;
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int exponent = 0;
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int uExponent = 0;
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int exponentBase;
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t dblBase;
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t dblIntegerBase;
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t dblFractionBase;
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t integerAdjust;
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t fractionAdjust;
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isNegative;
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isExponentNegative = FALSE;
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T requireTwoDigitExponent;
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isHex;
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_CONST char *digits;
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *groupingPointer;
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T hasOnlyZeroes;
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int zeroes = 0;
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  register int trailingZeroes;
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T keepTrailingZeroes;
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T keepDecimalPoint;
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_long_double_t epsilon;
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->OutStream));
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Determine sign and look for special quantities */
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (trio_fpclassify_and_signbit(number, &isNegative))
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_FP_NAN:
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioWriteString(self,
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      (flags & FLAGS_UPPER)
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      ? NAN_UPPER
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      : NAN_LOWER,
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags, width, precision);
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_FP_INFINITE:
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isNegative)
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Negative infinity */
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  TrioWriteString(self,
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  (flags & FLAGS_UPPER)
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  ? "-" INFINITE_UPPER
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  : "-" INFINITE_LOWER,
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  flags, width, precision);
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return;
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Positive infinity */
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  TrioWriteString(self,
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  (flags & FLAGS_UPPER)
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  ? INFINITE_UPPER
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  : INFINITE_LOWER,
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  flags, width, precision);
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return;
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Finitude */
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Normal numbers */
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_LONGDOUBLE)
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      baseDigits = (base == 10)
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	? LDBL_DIG
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	: (int)floor(LDBL_MANT_DIG / TrioLogarithmBase(base));
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      epsilon = LDBL_EPSILON;
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags & FLAGS_SHORT)
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      baseDigits = (base == BASE_DECIMAL)
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	? FLT_DIG
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	: (int)floor(FLT_MANT_DIG / TrioLogarithmBase(base));
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      epsilon = FLT_EPSILON;
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      baseDigits = (base == BASE_DECIMAL)
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	? DBL_DIG
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	: (int)floor(DBL_MANT_DIG / TrioLogarithmBase(base));
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      epsilon = DBL_EPSILON;
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  isHex = (base == BASE_HEX);
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base == NO_BASE)
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base = BASE_DECIMAL;
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dblBase = (trio_long_double_t)base;
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keepTrailingZeroes = !( (flags & FLAGS_ROUNDING) ||
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  ( (flags & FLAGS_FLOAT_G) &&
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    !(flags & FLAGS_ALTERNATIVE) ) );
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_ROUNDING)
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    precision = baseDigits;
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (precision == NO_PRECISION)
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isHex)
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  keepTrailingZeroes = FALSE;
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  precision = FLT_MANT_DIG;
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  precision = FLT_DIG;
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isNegative)
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    number = -number;
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isHex)
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags |= FLAGS_FLOAT_E;
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_FLOAT_G)
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (precision == 0)
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	precision = 1;
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((number < 1.0E-4) || (number > powl(base,
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					      (trio_long_double_t)precision)))
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Use scientific notation */
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  flags |= FLAGS_FLOAT_E;
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (number < 1.0)
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * Use normal notation. If the integer part of the number is
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * zero, then adjust the precision to include leading fractional
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * zeros.
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  workNumber = TrioLogarithm(number, base);
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  workNumber = TRIO_FABS(workNumber);
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (workNumber - floorl(workNumber) < 0.001)
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    workNumber--;
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  zeroes = (int)floorl(workNumber);
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_FLOAT_E)
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Scale the number */
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      workNumber = TrioLogarithm(number, base);
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (trio_isinf(workNumber) == -1)
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  exponent = 0;
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Undo setting */
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_FLOAT_G)
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    flags &= ~FLAGS_FLOAT_E;
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  exponent = (int)floorl(workNumber);
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  number /= powl(dblBase, (trio_long_double_t)exponent);
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  isExponentNegative = (exponent < 0);
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  uExponent = (isExponentNegative) ? -exponent : exponent;
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (isHex)
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    uExponent *= 4; /* log16(2) */
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* No thousand separators */
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  flags &= ~FLAGS_QUOTE;
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  integerNumber = floorl(number);
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fractionNumber = number - integerNumber;
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Truncated number.
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Precision is number of significant digits for FLOAT_G
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * and number of fractional digits for others.
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  integerDigits = (integerNumber > epsilon)
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? 1 + (int)TrioLogarithm(integerNumber, base)
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : 1;
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0))
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? precision - integerDigits
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : zeroes + precision;
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dblFractionBase = TrioPower(base, fractionDigits);
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  workNumber = number + 0.5 / dblFractionBase;
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (floorl(number) != floorl(workNumber))
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (flags & FLAGS_FLOAT_E)
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  exponent++;
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  isExponentNegative = (exponent < 0);
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  uExponent = (isExponentNegative) ? -exponent : exponent;
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (isHex)
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    uExponent *= 4; /* log16(2) */
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  workNumber = (number + 0.5 / dblFractionBase) / dblBase;
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  integerNumber = floorl(workNumber);
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionNumber = workNumber - integerNumber;
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Adjust if number was rounded up one digit (ie. 99 to 100) */
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  integerNumber = floorl(number + 0.5);
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionNumber = 0.0;
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  integerDigits = (integerNumber > epsilon)
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    ? 1 + (int)TrioLogarithm(integerNumber, base)
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    : 1;
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Estimate accuracy */
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  integerAdjust = fractionAdjust = 0.5;
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_ROUNDING)
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (integerDigits > baseDigits)
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  integerThreshold = baseDigits;
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionDigits = 0;
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  dblFractionBase = 1.0;
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionThreshold = 0;
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  precision = 0; /* Disable decimal-point */
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  integerAdjust = TrioPower(base, integerDigits - integerThreshold - 1);
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionAdjust = 0.0;
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  integerThreshold = integerDigits;
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionThreshold = fractionDigits - integerThreshold;
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionAdjust = 1.0;
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      integerThreshold = INT_MAX;
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fractionThreshold = INT_MAX;
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Calculate expected width.
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *  sign + integer part + thousands separators + decimal point
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *  + fraction + exponent
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fractionAdjust /= dblFractionBase;
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hasOnlyZeroes = (floorl((fractionNumber + fractionAdjust) * dblFractionBase) < epsilon);
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) ||
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       !((precision == 0) ||
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 (!keepTrailingZeroes && hasOnlyZeroes)) );
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_FLOAT_E)
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exponentDigits = (uExponent == 0)
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	? 1
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	: (int)ceil(TrioLogarithm((double)(uExponent + 1),
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  (isHex) ? 10.0 : base));
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exponentDigits = 0;
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  requireTwoDigitExponent = ((base == BASE_DECIMAL) && (exponentDigits == 1));
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedWidth = integerDigits + fractionDigits
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    + (keepDecimalPoint
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ? internalDecimalPointLength
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       : 0)
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    + ((flags & FLAGS_QUOTE)
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ? TrioCalcThousandSeparatorLength(integerDigits)
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       : 0);
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedWidth += sizeof("-") - 1;
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (exponentDigits > 0)
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedWidth += exponentDigits +
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ((requireTwoDigitExponent ? sizeof("E+0") : sizeof("E+")) - 1);
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (isHex)
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedWidth += sizeof("0X") - 1;
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Output prefixing */
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_NILPADDING)
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Leading zeros must be after sign */
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isNegative)
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, '-');
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (flags & FLAGS_SHOWSIGN)
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, '+');
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (flags & FLAGS_SPACE)
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, ' ');
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isHex)
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, '0');
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(flags & FLAGS_LEFTADJUST))
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  for (i = expectedWidth; i < width; i++)
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->OutStream(self, '0');
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Leading spaces must be before sign */
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!(flags & FLAGS_LEFTADJUST))
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  for (i = expectedWidth; i < width; i++)
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->OutStream(self, CHAR_ADJUST);
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isNegative)
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, '-');
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (flags & FLAGS_SHOWSIGN)
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, '+');
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (flags & FLAGS_SPACE)
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->OutStream(self, ' ');
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isHex)
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, '0');
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Output the integer part and thousand separators */
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dblIntegerBase = 1.0 / TrioPower(base, integerDigits - 1);
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < integerDigits; i++)
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      workNumber = floorl(((integerNumber + integerAdjust) * dblIntegerBase));
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i > integerThreshold)
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Beyond accuracy */
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, digits[0]);
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, digits[(int)fmodl(workNumber, dblBase)]);
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dblIntegerBase *= dblBase;
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE)
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  && TrioFollowedBySeparator(integerDigits - i))
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  for (groupingPointer = internalThousandSeparator;
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       *groupingPointer != NIL;
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       groupingPointer++)
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->OutStream(self, *groupingPointer);
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Insert decimal point and build the fraction part */
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trailingZeroes = 0;
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (keepDecimalPoint)
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (internalDecimalPoint)
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, internalDecimalPoint);
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  for (i = 0; i < internalDecimalPointLength; i++)
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->OutStream(self, internalDecimalPointString[i]);
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < fractionDigits; i++)
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((integerDigits > integerThreshold) || (i > fractionThreshold))
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Beyond accuracy */
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  trailingZeroes++;
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionNumber *= dblBase;
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionAdjust *= dblBase;
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  workNumber = floorl(fractionNumber + fractionAdjust);
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  fractionNumber -= workNumber;
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  index = (int)fmodl(workNumber, dblBase);
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (index == 0)
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      trailingZeroes++;
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      while (trailingZeroes > 0)
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Not trailing zeroes after all */
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->OutStream(self, digits[0]);
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  trailingZeroes--;
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->OutStream(self, digits[index]);
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (keepTrailingZeroes)
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (trailingZeroes > 0)
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, digits[0]);
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  trailingZeroes--;
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Output exponent */
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (exponentDigits > 0)
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->OutStream(self,
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      isHex
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      ? ((flags & FLAGS_UPPER) ? 'P' : 'p')
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      : ((flags & FLAGS_UPPER) ? 'E' : 'e'));
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->OutStream(self, (isExponentNegative) ? '-' : '+');
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The exponent must contain at least two digits */
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (requireTwoDigitExponent)
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self->OutStream(self, '0');
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isHex)
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	base = 10.0;
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exponentBase = (int)TrioPower(base, exponentDigits - 1);
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < exponentDigits; i++)
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, digits[(uExponent / exponentBase) % base]);
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  exponentBase /= base;
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Output trailing spaces */
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_LEFTADJUST)
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = expectedWidth; i < width; i++)
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->OutStream(self, CHAR_ADJUST);
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioFormatProcess
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  This is the main engine for formatting output
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioFormatProcess
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((data, format, parameters),
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *data,
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_parameter_t *parameters)
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int charlen;
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_CONST char *string;
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_pointer_t pointer;
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_flags_t flags;
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width;
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int precision;
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base;
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index;
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index = 0;
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = 0;
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (void)mblen(NULL, 0);
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (format[index])
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (! isascii(format[index]))
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  charlen = mblen(&format[index], MB_LEN_MAX);
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * Only valid multibyte characters are handled here. Invalid
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * multibyte characters (charlen == -1) are handled as normal
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * characters.
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (charlen != -1)
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      while (charlen-- > 0)
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  data->OutStream(data, format[index++]);
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      continue; /* while characters left in formatting string */
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (CHAR_IDENTIFIER == format[index])
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (CHAR_IDENTIFIER == format[index + 1])
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      data->OutStream(data, CHAR_IDENTIFIER);
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      index += 2;
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Skip the parameter entries */
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      while (parameters[i].type == FORMAT_PARAMETER)
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		i++;
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      flags = parameters[i].flags;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Find width */
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      width = parameters[i].width;
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (flags & FLAGS_WIDTH_PARAMETER)
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Get width from parameter list */
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  width = (int)parameters[width].data.number.as_signed;
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (width < 0)
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /*
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * A negative width is the same as the - flag and
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * a positive width.
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       */
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags |= FLAGS_LEFTADJUST;
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags &= ~FLAGS_NILPADDING;
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      width = -width;
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Find precision */
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (flags & FLAGS_PRECISION)
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  precision = parameters[i].precision;
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_PRECISION_PARAMETER)
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* Get precision from parameter list */
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      precision = (int)parameters[precision].data.number.as_signed;
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (precision < 0)
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  /*
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   * A negative precision is the same as no
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   * precision
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   */
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  precision = NO_PRECISION;
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  precision = NO_PRECISION;
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Find base */
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = parameters[i].base;
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (flags & FLAGS_BASE_PARAMETER)
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Get base from parameter list */
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  base = (int)parameters[base].data.number.as_signed;
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      switch (parameters[i].type)
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_CHAR:
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_QUOTE)
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    data->OutStream(data, CHAR_QUOTE);
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (! (flags & FLAGS_LEFTADJUST))
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      while (--width > 0)
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			data->OutStream(data, CHAR_ADJUST);
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_WIDECHAR)
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioWriteWideStringCharacter(data,
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						   (trio_wchar_t)parameters[i].data.number.as_signed,
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						   flags,
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)						   NO_WIDTH);
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioWriteStringCharacter(data,
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       (int)parameters[i].data.number.as_signed,
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					       flags);
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_LEFTADJUST)
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      while(--width > 0)
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			data->OutStream(data, CHAR_ADJUST);
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_QUOTE)
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    data->OutStream(data, CHAR_QUOTE);
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_CHAR */
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_INT:
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioWriteNumber(data,
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  parameters[i].data.number.as_unsigned,
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  flags,
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  width,
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  precision,
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  base);
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_INT */
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_DOUBLE:
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioWriteDouble(data,
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  parameters[i].data.longdoubleNumber,
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  flags,
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  width,
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  precision,
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				  base);
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_DOUBLE */
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_STRING:
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_WIDECHAR)
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioWriteWideString(data,
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  parameters[i].data.wstring,
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  flags,
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  width,
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  precision);
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioWriteString(data,
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      parameters[i].data.string,
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      flags,
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      width,
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      precision);
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_STRING */
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_POINTER:
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    trio_reference_t reference;
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    reference.data = data;
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    reference.parameter = &parameters[i];
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    trio_print_pointer(&reference, parameters[i].data.pointer);
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_POINTER */
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_COUNT:
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  pointer = parameters[i].data.pointer;
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (NULL != pointer)
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /*
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * C99 paragraph 7.19.6.1.8 says "the number of
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * characters written to the output stream so far by
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       * this call", which is data->committed
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       */
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (flags & FLAGS_SIZE_T)
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*(size_t *)pointer = (size_t)data->committed;
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PTRDIFF_T)
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (flags & FLAGS_PTRDIFF_T)
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*(ptrdiff_t *)pointer = (ptrdiff_t)data->committed;
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_INTMAX_T)
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (flags & FLAGS_INTMAX_T)
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			*(trio_intmax_t *)pointer = (trio_intmax_t)data->committed;
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      if (flags & FLAGS_QUAD)
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->committed;
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else if (flags & FLAGS_LONG)
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  *(long int *)pointer = (long int)data->committed;
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else if (flags & FLAGS_SHORT)
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  *(short int *)pointer = (short int)data->committed;
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      else
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			{
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  *(int *)pointer = (int)data->committed;
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			}
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_COUNT */
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_PARAMETER:
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_PARAMETER */
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FORMAT_ERRNO)
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_ERRNO:
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  string = trio_error(parameters[i].data.errorNumber);
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (string)
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioWriteString(data,
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      string,
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      flags,
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      width,
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      precision);
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      data->OutStream(data, '#');
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioWriteNumber(data,
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      (trio_uintmax_t)parameters[i].data.errorNumber,
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      flags,
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      width,
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      precision,
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      BASE_DECIMAL);
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break; /* FORMAT_ERRNO */
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(FORMAT_ERRNO) */
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FORMAT_USER_DEFINED)
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		case FORMAT_USER_DEFINED:
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    trio_reference_t reference;
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    trio_userdef_t *def = NULL;
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (parameters[i].user_name[0] == NIL)
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      {
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* Use handle */
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			if ((i > 0) ||
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    (parameters[i - 1].type == FORMAT_PARAMETER))
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  def = (trio_userdef_t *)parameters[i - 1].data.pointer;
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      }
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      {
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* Look up namespace */
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			def = TrioFindNamespace(parameters[i].user_name, NULL);
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      }
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (def) {
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      reference.data = data;
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      reference.parameter = &parameters[i];
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      def->callback(&reference);
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(FORMAT_USER_DEFINED) */
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		default:
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  break;
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		} /* switch parameter type */
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Prepare for next */
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      index = parameters[i].indexAfterSpecifier;
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      i++;
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else /* not identifier */
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  data->OutStream(data, format[index++]);
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data->processed;
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioFormatRef
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioFormatRef
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((reference, format, arglist, argarray),
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_reference_t *reference,
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list *arglist,
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *argarray)
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_parameter_t parameters[MAX_PARAMETERS];
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray);
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status < 0)
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return status;
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormatProcess(reference->data, format, parameters);
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reference->data->error != 0)
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = reference->data->error;
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioFormat
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioFormat
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray),
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t destination,
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   size_t destinationSize,
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   void (*OutStream) TRIO_PROTO((trio_class_t *, int)),
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list *arglist,
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *argarray)
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_class_t data;
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_parameter_t parameters[MAX_PARAMETERS];
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(OutStream));
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&data, 0, sizeof(data));
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.OutStream = OutStream;
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.location = destination;
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.max = destinationSize;
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.error = 0;
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LOCALE)
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NULL == internalLocaleValues)
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioSetLocale();
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray);
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status < 0)
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return status;
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormatProcess(&data, format, parameters);
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.error != 0)
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = data.error;
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioOutStreamFile
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioOutStreamFile
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, output),
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int output)
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FILE *file;
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->location));
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file = (FILE *)self->location;
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->processed++;
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fputc(output, file) == EOF)
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->error = TRIO_ERROR_RETURN(TRIO_EOF, 0);
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioOutStreamFileDescriptor
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioOutStreamFileDescriptor
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, output),
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int output)
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fd;
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char ch;
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fd = *((int *)self->location);
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ch = (char)output;
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->processed++;
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (write(fd, &ch, sizeof(char)) == -1)
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioOutStreamCustom
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioOutStreamCustom
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, output),
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int output)
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t *data;
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->location));
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data = (trio_custom_t *)self->location;
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data->stream.out)
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = (data->stream.out)(data->closure, output);
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status >= 0)
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->committed++;
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (self->error == 0)
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->error = TRIO_ERROR_RETURN(TRIO_ECUSTOM, -status);
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->processed++;
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioOutStreamString
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioOutStreamString
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, output),
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int output)
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char **buffer;
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->location));
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = (char **)self->location;
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **buffer = (char)output;
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*buffer)++;
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->processed++;
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->committed++;
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioOutStreamStringMax
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioOutStreamStringMax
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, output),
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int output)
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char **buffer;
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->location));
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = (char **)self->location;
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (self->processed < self->max)
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **buffer = (char)output;
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*buffer)++;
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->processed++;
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioOutStreamStringDynamic
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioOutStreamStringDynamic
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, output),
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int output)
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->location));
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (self->error == 0)
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_xstring_append_char((trio_string_t *)self->location,
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       (char)output);
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The processed variable must always be increased */
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->processed++;
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Formatted printing functions
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_DOCUMENTATION)
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include "doc/doc_printf.h"
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** @addtogroup Printf
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @{
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * printf
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to standard output stream.
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param ... Arguments.
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_printf
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS2((format, va_alist),
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL);
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to standard output stream.
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vprintf
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((format, args),
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL);
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to standard output stream.
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_printfv
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((format, args),
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t * args)
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(stdout, 0, TrioOutStreamFile, format, NULL, args);
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fprintf
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to file.
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param file File pointer.
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param ... Arguments.
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_fprintf
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((file, format, va_alist),
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FILE *file,
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(file));
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL);
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to file.
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param file File pointer.
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vfprintf
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((file, format, args),
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   FILE *file,
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(file));
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL);
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to file.
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param file File pointer.
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_fprintfv
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((file, format, args),
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   FILE *file,
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t * args)
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(file));
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args);
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dprintf
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to file descriptor.
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param fd File descriptor.
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param ... Arguments.
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_dprintf
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((fd, format, va_alist),
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int fd,
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL);
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to file descriptor.
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param fd File descriptor.
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vdprintf
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((fd, format, args),
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int fd,
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL);
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to file descriptor.
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param fd File descriptor.
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_dprintfv
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((fd, format, args),
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int fd,
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args);
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cprintf
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_cprintf
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS4((stream, closure, format, va_alist),
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    trio_outstream_t stream,
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    trio_pointer_t closure,
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t data;
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(stream));
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.stream.out = stream;
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.closure = closure;
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL);
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vcprintf
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((stream, closure, format, args),
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_outstream_t stream,
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t closure,
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t data;
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(stream));
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.stream.out = stream;
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.closure = closure;
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL);
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_cprintfv
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((stream, closure, format, args),
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_outstream_t stream,
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t closure,
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   void **args)
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t data;
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(stream));
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.stream.out = stream;
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.closure = closure;
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormat(&data, 0, TrioOutStreamCustom, format, NULL, args);
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sprintf
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to string.
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param buffer Output string.
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param ... Arguments.
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_sprintf
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((buffer, format, va_alist),
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char *buffer,
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL);
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *buffer = NIL; /* Terminate with NIL character */
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to string.
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param buffer Output string.
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vsprintf
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((buffer, format, args),
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *buffer,
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL);
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *buffer = NIL;
39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print to string.
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param buffer Output string.
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_sprintfv
39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((buffer, format, args),
39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *buffer,
39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, NULL, args);
39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *buffer = NIL;
39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * snprintf
39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print at most @p max characters to string.
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param buffer Output string.
39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param max Maximum number of characters to print.
39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param ... Arguments.
39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_snprintf
39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS4((buffer, max, format, va_alist),
39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char *buffer,
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    size_t max,
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioOutStreamStringMax, format, &args, NULL);
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max > 0)
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buffer = NIL;
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print at most @p max characters to string.
40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param buffer Output string.
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param max Maximum number of characters to print.
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vsnprintf
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((buffer, max, format, args),
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *buffer,
40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   size_t max,
40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioOutStreamStringMax, format, &args, NULL);
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max > 0)
40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buffer = NIL;
40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Print at most @p max characters to string.
40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param buffer Output string.
40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param max Maximum number of characters to print.
40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param args Arguments.
40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of printed characters.
40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_snprintfv
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((buffer, max, format, args),
40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *buffer,
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   size_t max,
40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioOutStreamStringMax, format, NULL, args);
40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max > 0)
40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *buffer = NIL;
40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * snprintfcat
40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Appends the new string to the buffer string overwriting the '\0'
40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * character at the end of buffer.
40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_snprintfcat
40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS4((buffer, max, format, va_alist),
40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char *buffer,
40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    size_t max,
40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t buf_len;
40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buf_len = trio_length(buffer);
40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = &buffer[buf_len];
40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, max - 1 - buf_len,
40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioOutStreamStringMax, format, &args, NULL);
40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *buffer = NIL;
40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vsnprintfcat
40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((buffer, max, format, args),
40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *buffer,
40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   size_t max,
40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t buf_len;
41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buf_len = trio_length(buffer);
41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = &buffer[buf_len];
41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormat(&buffer, max - 1 - buf_len,
41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      TrioOutStreamStringMax, format, &args, NULL);
41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *buffer = NIL;
41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_aprintf
41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Deprecated */
41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC char *
41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_aprintf
41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS2((format, va_alist),
41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_string_t *info;
41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *result = NULL;
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info = trio_xstring_duplicate("");
41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (info)
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TRIO_VA_START(args, format);
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       format, &args, NULL);
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TRIO_VA_END(args);
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_string_terminate(info);
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = trio_string_extract(info);
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_string_destroy(info);
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Deprecated */
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC char *
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vaprintf
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((format, args),
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_string_t *info;
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *result = NULL;
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info = trio_xstring_duplicate("");
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (info)
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		       format, &args, NULL);
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_string_terminate(info);
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = trio_string_extract(info);
41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_string_destroy(info);
41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_asprintf
41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((result, format, va_alist),
41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    char **result,
41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_string_t *info;
41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result = NULL;
41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info = trio_xstring_duplicate("");
41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (info == NULL)
41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TRIO_VA_START(args, format);
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  format, &args, NULL);
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TRIO_VA_END(args);
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status >= 0)
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  trio_string_terminate(info);
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *result = trio_string_extract(info);
41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_string_destroy(info);
42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vasprintf
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((result, format, args),
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char **result,
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_string_t *info;
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result = NULL;
42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info = trio_xstring_duplicate("");
42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (info == NULL)
42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  format, &args, NULL);
42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status >= 0)
42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  trio_string_terminate(info);
42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  *result = trio_string_extract(info);
42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_string_destroy(info);
42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** @} End of Printf documentation module */
42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * CALLBACK
42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_DOCUMENTATION)
42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include "doc/doc_register.h"
42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @addtogroup UserDefined
42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @{
42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_register
42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Register new user-defined specifier.
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param callback
42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param name
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Handle.
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC trio_pointer_t
42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_register
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((callback, name),
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_callback_t callback,
42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *name)
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_userdef_t *def;
42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_userdef_t *prev = NULL;
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (callback == NULL)
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (name)
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Handle built-in namespaces */
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (name[0] == ':')
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (trio_equal(name, ":enter"))
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      internalEnterCriticalRegion = callback;
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else if (trio_equal(name, ":leave"))
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      internalLeaveCriticalRegion = callback;
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return NULL;
42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Bail out if namespace is too long */
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (trio_length(name) >= MAX_USER_NAME)
42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return NULL;
42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Bail out if namespace already is registered */
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      def = TrioFindNamespace(name, &prev);
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (def)
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return NULL;
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t));
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (def)
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (internalEnterCriticalRegion)
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(void)internalEnterCriticalRegion(NULL);
43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (name)
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Link into internal list */
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (prev == NULL)
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    internalUserDef = def;
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev->next = def;
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Initialize */
43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      def->callback = callback;
43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      def->name = (name == NULL)
43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	? NULL
43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	: trio_duplicate(name);
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      def->next = NULL;
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (internalLeaveCriticalRegion)
43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	(void)internalLeaveCriticalRegion(NULL);
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (trio_pointer_t)def;
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Unregister an existing user-defined specifier.
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param handle
43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_unregister
43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((handle),
43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t handle)
43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_userdef_t *self = (trio_userdef_t *)handle;
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_userdef_t *def;
43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_userdef_t *prev = NULL;
43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (self->name)
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      def = TrioFindNamespace(self->name, &prev);
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (def)
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (internalEnterCriticalRegion)
43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (void)internalEnterCriticalRegion(NULL);
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (prev == NULL)
43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    internalUserDef = NULL;
43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    prev->next = def->next;
43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (internalLeaveCriticalRegion)
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    (void)internalLeaveCriticalRegion(NULL);
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_destroy(self->name);
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_FREE(self);
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_format [public]
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_CONST char *
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_format
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FORMAT_USER_DEFINED)
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->user_data);
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_argument [public]
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_pointer_t
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_argument
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(FORMAT_USER_DEFINED)
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ((trio_reference_t *)ref)->parameter->data.pointer;
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_width / trio_set_width [public]
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_width
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ((trio_reference_t *)ref)->parameter->width;
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_width
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, width),
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ((trio_reference_t *)ref)->parameter->width = width;
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_precision / trio_set_precision [public]
44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_precision
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->precision);
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_precision
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, precision),
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int precision)
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ((trio_reference_t *)ref)->parameter->precision = precision;
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_base / trio_set_base [public]
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_base
44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->base);
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_base
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, base),
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int base)
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ((trio_reference_t *)ref)->parameter->base = base;
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_long / trio_set_long [public]
44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_long
44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONG)
44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_long
44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_long),
44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_long)
44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_long)
44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONG;
44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONG;
44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_longlong / trio_set_longlong [public]
44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_longlong
44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUAD)
44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_longlong
44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_longlong),
45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_longlong)
45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_longlong)
45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUAD;
45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUAD;
45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_longdouble / trio_set_longdouble [public]
45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_longdouble
45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONGDOUBLE)
45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_longdouble
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_longdouble),
45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_longdouble)
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_longdouble)
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONGDOUBLE;
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE;
45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_short / trio_set_short [public]
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_short
45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORT)
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_short
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_short),
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_short)
45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_short)
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORT;
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORT;
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_shortshort / trio_set_shortshort [public]
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_shortshort
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORTSHORT)
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_shortshort
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_shortshort),
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_shortshort)
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_shortshort)
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORTSHORT;
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT;
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_alternative / trio_set_alternative [public]
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_alternative
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_ALTERNATIVE)
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_alternative
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_alternative),
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_alternative)
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_alternative)
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_ALTERNATIVE;
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE;
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_alignment / trio_set_alignment [public]
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_alignment
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LEFTADJUST)
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_alignment
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_leftaligned),
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_leftaligned)
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_leftaligned)
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LEFTADJUST;
46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST;
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_spacing /trio_set_spacing [public]
46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_spacing
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SPACE)
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_spacing
46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_space),
46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_space)
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_space)
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SPACE;
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SPACE;
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_sign / trio_set_sign [public]
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_sign
46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHOWSIGN)
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_sign
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_sign),
46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_sign)
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_sign)
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHOWSIGN;
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN;
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_padding / trio_set_padding [public]
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_padding
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_NILPADDING)
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_padding
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_padding),
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_padding)
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_padding)
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_NILPADDING;
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_NILPADDING;
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_quote / trio_set_quote [public]
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_quote
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUOTE)
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_quote
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_quote),
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_quote)
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_quote)
47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUOTE;
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUOTE;
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_upper / trio_set_upper [public]
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_upper
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_UPPER)
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_upper
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_upper),
47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_upper)
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_upper)
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_UPPER;
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_UPPER;
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_largest / trio_set_largest [public]
47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_C99
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_largest
47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_INTMAX_T)
47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_largest
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_largest),
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_largest)
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_largest)
47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_INTMAX_T;
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_INTMAX_T;
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_ptrdiff / trio_set_ptrdiff [public]
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_ptrdiff
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_PTRDIFF_T)
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_ptrdiff
48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_ptrdiff),
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_ptrdiff)
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_ptrdiff)
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_PTRDIFF_T;
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T;
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_get_size / trio_set_size [public]
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_C99
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_get_size
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((ref),
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref)
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SIZE_T)
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? TRUE
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : FALSE;
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_set_size
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, is_size),
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int is_size)
48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_size)
48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SIZE_T;
48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SIZE_T;
48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_print_int [public]
48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_print_int
48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, number),
48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int number)
48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_reference_t *self = (trio_reference_t *)ref;
48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioWriteNumber(self->data,
48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  (trio_uintmax_t)number,
48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->flags,
48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->width,
48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->precision,
48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->base);
48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_print_uint [public]
48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_print_uint
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, number),
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   unsigned int number)
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_reference_t *self = (trio_reference_t *)ref;
48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioWriteNumber(self->data,
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  (trio_uintmax_t)number,
48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->flags | FLAGS_UNSIGNED,
48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->width,
48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->precision,
48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->base);
48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_print_double [public]
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_print_double
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, number),
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   double number)
48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_reference_t *self = (trio_reference_t *)ref;
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioWriteDouble(self->data,
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  number,
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->flags,
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->width,
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->precision,
48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->base);
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_print_string [public]
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_print_string
49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, string),
49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *string)
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_reference_t *self = (trio_reference_t *)ref;
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioWriteString(self->data,
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  string,
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->flags,
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->width,
49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->parameter->precision);
49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_print_ref [public]
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_print_ref
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((ref, format, va_alist),
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    trio_pointer_t ref,
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list arglist;
49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(arglist, format);
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL);
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(arglist);
49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_vprint_ref [public]
49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vprint_ref
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((ref, format, arglist),
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list arglist)
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL);
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_printv_ref [public]
49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_printv_ref
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((ref, format, argarray),
49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *argarray)
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioFormatRef((trio_reference_t *)ref, format, NULL, argarray);
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_EXTENSION */
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_print_pointer [public]
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_print_pointer
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((ref, pointer),
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t ref,
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t pointer)
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_reference_t *self = (trio_reference_t *)ref;
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_flags_t flags;
49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_uintmax_t number;
49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NULL == pointer)
49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TRIO_CONST char *string = internalNullString;
49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (*string)
49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	self->data->OutStream(self->data, *string++);
49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /*
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * The subtraction of the null pointer is a workaround
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * to avoid a compiler warning. The performance overhead
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * is negligible (and likely to be removed by an
49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * optimizing compiler). The (char *) casting is done
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * to please ANSI C++.
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number = (trio_uintmax_t)((char *)pointer - (char *)0);
49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Shrink to size of pointer */
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number &= (trio_uintmax_t)-1;
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags = self->parameter->flags;
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE |
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	        FLAGS_NILPADDING);
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioWriteNumber(self->data,
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      number,
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      flags,
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      POINTER_WIDTH,
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      NO_PRECISION,
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      BASE_HEX);
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** @} End of UserDefined documentation module */
50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LOCALES
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_locale_set_decimal_point
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Decimal point can only be one character. The input argument is a
50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * string to enable multibyte characters. At most MB_LEN_MAX characters
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will be used.
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC void
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_locale_set_decimal_point
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((decimalPoint),
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *decimalPoint)
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LOCALE)
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NULL == internalLocaleValues)
50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioSetLocale();
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internalDecimalPointLength = trio_length(decimalPoint);
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internalDecimalPointLength == 1)
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internalDecimalPoint = *decimalPoint;
50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internalDecimalPoint = NIL;
50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trio_copy_max(internalDecimalPointString,
50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    sizeof(internalDecimalPointString),
50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    decimalPoint);
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_locale_set_thousand_separator
50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See trio_locale_set_decimal_point
50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC void
50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_locale_set_thousand_separator
50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((thousandSeparator),
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *thousandSeparator)
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LOCALE)
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NULL == internalLocaleValues)
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioSetLocale();
50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_copy_max(internalThousandSeparator,
50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sizeof(internalThousandSeparator),
50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		thousandSeparator);
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  internalThousandSeparatorLength = trio_length(internalThousandSeparator);
50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_locale_set_grouping
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Array of bytes. Reversed order.
50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  CHAR_MAX : No further grouping
50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  0        : Repeat last group for the remaining digits (not necessary
50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *             as C strings are zero-terminated)
50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  n        : Set current group to n
50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Same order as the grouping attribute in LC_NUMERIC.
50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC void
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_locale_set_grouping
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((grouping),
50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *grouping)
50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LOCALE)
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NULL == internalLocaleValues)
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioSetLocale();
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_copy_max(internalGrouping,
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		sizeof(internalGrouping),
50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		grouping);
50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SCANNING
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioSkipWhitespaces
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioSkipWhitespaces
51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((self),
51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self)
51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ch;
51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ch = self->current;
51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (isspace(ch))
51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, &ch);
51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ch;
51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioGetCollation
51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioGetCollation(TRIO_NOARGS)
51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int j;
51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int k;
51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char first[2];
51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char second[2];
51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* This is computationally expensive */
51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  first[1] = NIL;
51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  second[1] = NIL;
51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      k = 0;
51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first[0] = (char)i;
51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (j = 0; j < MAX_CHARACTER_CLASS; j++)
51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  second[0] = (char)j;
51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (trio_equal_locale(first, second))
51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    internalCollationArray[i][k++] = (char)j;
51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internalCollationArray[i][k] = NIL;
51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioGetCharacterClass
51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FIXME:
51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  multibyte
51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioGetCharacterClass
51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((format, indexPointer, flagsPointer, characterclass),
51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *indexPointer,
51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t *flagsPointer,
51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *characterclass)
51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = *indexPointer;
51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char ch;
51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char range_begin;
51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char range_end;
51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *flagsPointer &= ~FLAGS_EXCLUDE;
51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (format[index] == QUALIFIER_CIRCUMFLEX)
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *flagsPointer |= FLAGS_EXCLUDE;
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index++;
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * If the ungroup character is at the beginning of the scanlist,
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * it will be part of the class, and a second ungroup character
51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * must follow to end the group.
51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (format[index] == SPECIFIER_UNGROUP)
51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      characterclass[(int)SPECIFIER_UNGROUP]++;
51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index++;
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Minus is used to specify ranges. To include minus in the class,
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * it must be at the beginning of the list
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (format[index] == QUALIFIER_MINUS)
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      characterclass[(int)QUALIFIER_MINUS]++;
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      index++;
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Collect characters */
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ch = format[index];
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (ch != SPECIFIER_UNGROUP) && (ch != NIL);
52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ch = format[++index])
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (ch)
52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case QUALIFIER_MINUS: /* Scanlist ranges */
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * Both C99 and UNIX98 describes ranges as implementation-
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * defined.
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   *
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * We support the following behaviour (although this may
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * change as we become wiser)
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * - only increasing ranges, ie. [a-b] but not [b-a]
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * - transitive ranges, ie. [a-b-c] == [a-c]
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * - trailing minus, ie. [a-] is interpreted as an 'a'
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   *   and a '-'
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * - duplicates (although we can easily convert these
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   *   into errors)
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  range_begin = format[index - 1];
52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  range_end = format[++index];
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (range_end == SPECIFIER_UNGROUP)
52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Trailing minus is included */
52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      characterclass[(int)ch]++;
52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      ch = range_end;
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* for */
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (range_end == NIL)
52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (range_begin > range_end)
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return TRIO_ERROR_RETURN(TRIO_ERANGE, index);
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  for (i = (int)range_begin; i <= (int)range_end; i++)
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    characterclass[i]++;
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  ch = range_end;
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_EXTENSION
52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case SPECIFIER_GROUP:
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  switch (format[index + 1])
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case QUALIFIER_DOT: /* Collating symbol */
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /*
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       * FIXME: This will be easier to implement when multibyte
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       * characters have been implemented. Until now, we ignore
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       * this feature.
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	       */
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      for (i = index + 2; ; i++)
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (format[i] == NIL)
52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* Error in syntax */
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return -1;
52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (format[i] == QUALIFIER_DOT)
52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    break; /* for */
52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (format[++i] != SPECIFIER_UNGROUP)
52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return -1;
52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      index = i;
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case QUALIFIER_EQUAL: /* Equivalence class expressions */
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      {
52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		unsigned int j;
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		unsigned int k;
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (internalCollationUnconverted)
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    /* Lazy evaluation of collation array */
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TrioGetCollation();
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    internalCollationUnconverted = FALSE;
52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		for (i = index + 2; ; i++)
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (format[i] == NIL)
52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      /* Error in syntax */
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      return -1;
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if (format[i] == QUALIFIER_EQUAL)
52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      break; /* for */
52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      {
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			/* Mark any equivalent character */
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			k = (unsigned int)format[i];
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			for (j = 0; internalCollationArray[k][j] != NIL; j++)
52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  characterclass[(int)internalCollationArray[k][j]]++;
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      }
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (format[++i] != SPECIFIER_UNGROUP)
52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  return -1;
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		index = i;
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      }
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case QUALIFIER_COLON: /* Character class expressions */
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1,
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				 &format[index]))
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isalnum(i))
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_ALNUM) - 1;
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1,
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isalpha(i))
53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_ALPHA) - 1;
53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1,
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (iscntrl(i))
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_CNTRL) - 1;
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1,
53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isdigit(i))
53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_DIGIT) - 1;
53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1,
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isgraph(i))
53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_GRAPH) - 1;
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_LOWER, sizeof(CLASS_LOWER) - 1,
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (islower(i))
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_LOWER) - 1;
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_PRINT, sizeof(CLASS_PRINT) - 1,
53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isprint(i))
53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_PRINT) - 1;
53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1,
53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (ispunct(i))
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_PUNCT) - 1;
53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_SPACE, sizeof(CLASS_SPACE) - 1,
53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isspace(i))
53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_SPACE) - 1;
53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_UPPER, sizeof(CLASS_UPPER) - 1,
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isupper(i))
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_UPPER) - 1;
53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_equal_max(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1,
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      &format[index]))
53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (isxdigit(i))
53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      characterclass[i]++;
53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += sizeof(CLASS_XDIGIT) - 1;
53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  characterclass[(int)ch]++;
53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      characterclass[(int)ch]++;
54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_EXTENSION */
54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  characterclass[(int)ch]++;
54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadNumber
54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We implement our own number conversion in preference of strtol and
54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * strtoul, because we must handle 'long long' and thousand separators.
54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadNumber
54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS5((self, target, flags, width, base),
54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_uintmax_t *target,
54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width,
54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int base)
54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_uintmax_t number = 0;
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int digit;
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count;
54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isNegative = FALSE;
54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T gotNumber = FALSE;
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int j;
54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->InStream));
54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE));
54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (internalDigitsUnconverted)
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Lazy evaluation of digits array */
54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memset(internalDigitArray, -1, sizeof(internalDigitArray));
54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++)
54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  internalDigitArray[(int)internalDigitsLower[j]] = j;
54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  internalDigitArray[(int)internalDigitsUpper[j]] = j;
54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      internalDigitsUnconverted = FALSE;
54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioSkipWhitespaces(self);
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(flags & FLAGS_UNSIGNED))
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Leading sign */
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (self->current == '+')
54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->InStream(self, NULL);
54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (self->current == '-')
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->InStream(self, NULL);
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  isNegative = TRUE;
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = self->processed;
54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_ALTERNATIVE)
54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (base)
54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case NO_BASE:
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_OCTAL:
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_HEX:
54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	case BASE_BINARY:
54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (self->current == '0')
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->InStream(self, NULL);
54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (self->current)
54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if ((base == BASE_HEX) &&
54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      (trio_to_upper(self->current) == 'X'))
54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      self->InStream(self, NULL);
54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if ((base == BASE_BINARY) &&
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			   (trio_to_upper(self->current) == 'B'))
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      self->InStream(self, NULL);
54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return FALSE;
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	default:
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  break;
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (((width == NO_WIDTH) || (self->processed - count < width)) &&
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 (! ((self->current == EOF) || isspace(self->current))))
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isascii(self->current))
55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  digit = internalDigitArray[self->current];
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Abort if digit is not allowed in the specified base */
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if ((digit == -1) || (digit >= base))
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break;
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (flags & FLAGS_QUOTE)
55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Compare with thousands separator */
55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  for (j = 0; internalThousandSeparator[j] && self->current; j++)
55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (internalThousandSeparator[j] != self->current)
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->InStream(self, NULL);
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (internalThousandSeparator[j])
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break; /* Mismatch */
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue; /* Match */
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number *= base;
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number += digit;
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gotNumber = TRUE; /* we need at least one digit */
55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, NULL);
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Was anything read at all? */
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!gotNumber)
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FALSE;
55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target)
55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *target = (isNegative) ? -((trio_intmax_t)number) : number;
55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadChar
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadChar
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((self, target, flags, width),
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *target,
55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char ch;
55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_uintmax_t number;
55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->InStream));
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0;
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (self->current != EOF) && (i < width);
55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i++)
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ch = (char)self->current;
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, NULL);
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH))
55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  switch (self->current)
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case '\\': ch = '\\'; break;
55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 'a': ch = '\007'; break;
55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 'b': ch = '\b'; break;
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 'f': ch = '\f'; break;
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 'n': ch = '\n'; break;
55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 'r': ch = '\r'; break;
55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 't': ch = '\t'; break;
55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case 'v': ch = '\v'; break;
55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (isdigit(self->current))
55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Read octal number */
55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL))
55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return 0;
55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ch = (char)number;
55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else if (trio_to_upper(self->current) == 'X')
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  /* Read hexadecimal number */
55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  self->InStream(self, NULL);
55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX))
55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return 0;
55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ch = (char)number;
55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  ch = (char)self->current;
56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break;
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (target)
56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	target[i] = ch;
56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i + 1;
56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadString
56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadString
56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((self, target, flags, width),
56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *target,
56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->InStream));
56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioSkipWhitespaces(self);
56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Continue until end of string is reached, a whitespace is encountered,
56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * or width is exceeded
56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0;
56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ((width == NO_WIDTH) || (i < width)) &&
56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (! ((self->current == EOF) || isspace(self->current)));
56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i++)
56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0)
56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break; /* for */
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target)
56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target[i] = NIL;
56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadWideChar
56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadWideChar
56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((self, target, flags, width),
56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_wchar_t *target,
56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int j;
56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int amount = 0;
56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_wchar_t wch;
56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[MB_LEN_MAX + 1];
56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->InStream));
56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0;
56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (self->current != EOF) && (i < width);
56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i++)
56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isascii(self->current))
56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (TrioReadChar(self, buffer, flags, 1) == 0)
56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return 0;
56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  buffer[1] = NIL;
56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /*
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * Collect a multibyte character, by enlarging buffer until
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * it contains a fully legal multibyte character, or the
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   * buffer is full.
56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   */
56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  j = 0;
56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  do
56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      buffer[j++] = (char)self->current;
56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      buffer[j] = NIL;
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->InStream(self, NULL);
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j));
56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (target)
56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  size = mbtowc(&wch, buffer, sizeof(buffer));
56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (size > 0)
57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    target[i] = wch;
57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      amount += size;
57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, NULL);
57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return amount;
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_WIDECHAR */
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadWideString
57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadWideString
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((self, target, flags, width),
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_wchar_t *target,
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->InStream));
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioSkipWhitespaces(self);
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (void)mblen(NULL, 0);
57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Continue until end of string is reached, a whitespace is encountered,
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * or width is exceeded
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0;
57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ((width == NO_WIDTH) || (i < width)) &&
57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (! ((self->current == EOF) || isspace(self->current)));
57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       )
57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size = TrioReadWideChar(self, &target[i], flags, 1);
57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (size == 0)
57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break; /* for */
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i += size;
57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target)
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target[i] = WCONST('\0');
57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_WIDECHAR */
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadGroup
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FIXME: characterclass does not work with multibyte characters
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadGroup
57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS5((self, target, characterclass, flags, width),
57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   char *target,
57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *characterclass,
57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ch;
57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->InStream));
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ch = self->current;
57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (i = 0;
57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ((width == NO_WIDTH) || (i < width)) &&
57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (! ((ch == EOF) ||
57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0))));
57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i++)
57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (target)
57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	target[i] = (char)ch;
57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, &ch);
57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (target)
57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    target[i] = NIL;
57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadDouble
57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FIXME:
57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  add long double
57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  handle base
57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadDouble
58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((self, target, flags, width),
58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t target,
58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags,
58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int width)
58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ch;
58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char doubleString[512];
58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = 0;
58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int start;
58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int j;
58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOLEAN_T isHex = FALSE;
58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  doubleString[0] = 0;
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1))
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    width = sizeof(doubleString) - 1;
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrioSkipWhitespaces(self);
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Read entire double number from stream. trio_to_double requires
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * a string as input, but InStream can be anything, so we have to
58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * collect all characters.
58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ch = self->current;
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((ch == '+') || (ch == '-'))
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      doubleString[index++] = (char)ch;
58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, &ch);
58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width--;
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  start = index;
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (ch)
58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 'n':
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 'N':
58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Not-a-number */
58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (index != 0)
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break;
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* FALLTHROUGH */
58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 'i':
58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 'I':
58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Infinity */
58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while (isalpha(ch) && (index - start < width))
58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  doubleString[index++] = (char)ch;
58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->InStream(self, &ch);
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      doubleString[index] = NIL;
58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Case insensitive string comparison */
58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (trio_equal(&doubleString[start], INFINITE_UPPER) ||
58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  trio_equal(&doubleString[start], LONG_INFINITE_UPPER))
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_LONGDOUBLE)
58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if ((start == 1) && (doubleString[0] == '-'))
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  *((trio_long_double_t *)target) = trio_ninf();
58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  *((trio_long_double_t *)target) = trio_pinf();
58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if ((start == 1) && (doubleString[0] == '-'))
58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  *((double *)target) = trio_ninf();
58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  *((double *)target) = trio_pinf();
58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return TRUE;
58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (trio_equal(doubleString, NAN_UPPER))
58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* NaN must not have a preceeding + nor - */
58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_LONGDOUBLE)
58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      *((trio_long_double_t *)target) = trio_nan();
58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      *((double *)target) = trio_nan();
58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return TRUE;
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return FALSE;
58945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case '0':
58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      doubleString[index++] = (char)ch;
58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, &ch);
58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (trio_to_upper(ch) == 'X')
58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  isHex = TRUE;
59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  doubleString[index++] = (char)ch;
59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->InStream(self, &ch);
59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((ch != EOF) && (index - start < width))
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Integer part */
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isHex ? isxdigit(ch) : isdigit(ch))
59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  doubleString[index++] = (char)ch;
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->InStream(self, &ch);
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (flags & FLAGS_QUOTE)
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Compare with thousands separator */
59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  for (j = 0; internalThousandSeparator[j] && self->current; j++)
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (internalThousandSeparator[j] != self->current)
59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break;
59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->InStream(self, &ch);
59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (internalThousandSeparator[j])
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    break; /* Mismatch */
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    continue; /* Match */
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	break; /* while */
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ch == '.')
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Decimal part */
59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      doubleString[index++] = (char)ch;
59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->InStream(self, &ch);
59415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while ((isHex ? isxdigit(ch) : isdigit(ch)) &&
59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (index - start < width))
59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  doubleString[index++] = (char)ch;
59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->InStream(self, &ch);
59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (isHex ? (trio_to_upper(ch) == 'P') : (trio_to_upper(ch) == 'E'))
59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Exponent */
59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  doubleString[index++] = (char)ch;
59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  self->InStream(self, &ch);
59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if ((ch == '+') || (ch == '-'))
59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      doubleString[index++] = (char)ch;
59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->InStream(self, &ch);
59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  while (isdigit(ch) && (index - start < width))
59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      doubleString[index++] = (char)ch;
59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      self->InStream(self, &ch);
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((index == start) || (*doubleString == NIL))
59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return FALSE;
59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  doubleString[index] = 0;
59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags & FLAGS_LONGDOUBLE)
59715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL);
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *((double *)target) = trio_to_double(doubleString, NULL);
59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TRUE;
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioReadPointer
59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE BOOLEAN_T
59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioReadPointer
59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((self, target, flags),
59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *target,
59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_flags_t flags)
59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_uintmax_t number;
59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[sizeof(internalNullString)];
59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING);
59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (TrioReadNumber(self,
59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     &number,
59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     flags,
59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     POINTER_WIDTH,
60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		     BASE_HEX))
60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /*
60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * The strange assignment of number is a workaround for a compiler
60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * warning
60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (target)
60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*target = (char *)0 + number;
60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return TRUE;
60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (TrioReadString(self,
60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  (flags & FLAGS_IGNORE)
60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  ? NULL
60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  : buffer,
60145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  0,
60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			  sizeof(internalNullString) - 1))
60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (trio_equal_case(buffer, internalNullString))
60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (target)
60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    *target = NULL;
60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return TRUE;
60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FALSE;
60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioScanProcess
60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioScanProcess
60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((data, format, parameters),
60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *data,
60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_parameter_t *parameters)
60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int charlen;
60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cnt;
60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int assignment;
60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ch;
60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index; /* Index of format string */
60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i; /* Index of current parameter */
60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_flags_t flags;
60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width;
60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int base;
60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_pointer_t pointer;
60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assignment = 0;
60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = 0;
60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index = 0;
60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data->InStream(data, &ch);
60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (void)mblen(NULL, 0);
60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (format[index])
60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (! isascii(format[index]))
60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  charlen = mblen(&format[index], MB_LEN_MAX);
60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (charlen != -1)
60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Compare multibyte characters in format string */
60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      for (cnt = 0; cnt < charlen - 1; cnt++)
60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (ch != format[index + cnt])
60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  data->InStream(data, &ch);
60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      continue; /* while characters left in formatting string */
60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT))
60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  return (assignment > 0) ? assignment : EOF;
60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (CHAR_IDENTIFIER == format[index])
60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (CHAR_IDENTIFIER == format[index + 1])
60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Two % in format matches one % in input stream */
60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (CHAR_IDENTIFIER == ch)
60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  data->InStream(data, &ch);
60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  index += 2;
60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  continue; /* while format chars left */
60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Skip the parameter entries */
61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  while (parameters[i].type == FORMAT_PARAMETER)
61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    i++;
61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  flags = parameters[i].flags;
61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Find width */
61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  width = parameters[i].width;
61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_WIDTH_PARAMETER)
61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Get width from parameter list */
61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      width = (int)parameters[width].data.number.as_signed;
61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  /* Find base */
61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  base = parameters[i].base;
61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (flags & FLAGS_BASE_PARAMETER)
61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Get base from parameter list */
61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      base = (int)parameters[base].data.number.as_signed;
61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  switch (parameters[i].type)
61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_INT:
61245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      {
61255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		trio_uintmax_t number;
61265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (0 == base)
61285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  base = BASE_DECIMAL;
61295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!TrioReadNumber(data,
61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    &number,
61325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    flags,
61335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    width,
61345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				    base))
61355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  return assignment;
61365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!(flags & FLAGS_IGNORE))
61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    assignment++;
61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pointer = parameters[i].data.pointer;
61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (flags & FLAGS_SIZE_T)
61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(size_t *)pointer = (size_t)number;
61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PTRDIFF_T)
61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (flags & FLAGS_PTRDIFF_T)
61495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(ptrdiff_t *)pointer = (ptrdiff_t)number;
61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_INTMAX_T)
61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (flags & FLAGS_INTMAX_T)
61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(trio_intmax_t *)pointer = (trio_intmax_t)number;
61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    if (flags & FLAGS_QUAD)
61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number;
61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if (flags & FLAGS_LONG)
61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(long int *)pointer = (long int)number;
61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else if (flags & FLAGS_SHORT)
61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(short int *)pointer = (short int)number;
61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    else
61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(int *)pointer = (int)number;
61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      }
61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* FORMAT_INT */
61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_STRING:
61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (flags & FLAGS_WIDECHAR)
61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (!TrioReadWideString(data,
61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  (flags & FLAGS_IGNORE)
61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  ? NULL
61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  : parameters[i].data.wstring,
61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  flags,
61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					  width))
61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return assignment;
61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
61835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (!TrioReadString(data,
61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      (flags & FLAGS_IGNORE)
61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      ? NULL
61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      : parameters[i].data.string,
61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      flags,
61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      width))
61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return assignment;
61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (!(flags & FLAGS_IGNORE))
61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		assignment++;
61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* FORMAT_STRING */
61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_DOUBLE:
61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      {
61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		trio_pointer_t pointer;
61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (flags & FLAGS_IGNORE)
62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pointer = NULL;
62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		else
62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    pointer = (flags & FLAGS_LONGDOUBLE)
62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      ? (trio_pointer_t)parameters[i].data.longdoublePointer
62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      : (trio_pointer_t)parameters[i].data.doublePointer;
62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!TrioReadDouble(data, pointer, flags, width))
62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return assignment;
62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!(flags & FLAGS_IGNORE))
62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    assignment++;
62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		break; /* FORMAT_DOUBLE */
62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      }
62205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_GROUP:
62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      {
62225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int characterclass[MAX_CHARACTER_CLASS + 1];
62235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		int rc;
62245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Skip over modifiers */
62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		while (format[index] != SPECIFIER_GROUP)
62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  {
62285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    index++;
62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  }
62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Skip over group specifier */
62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		index++;
62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		memset(characterclass, 0, sizeof(characterclass));
62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		rc = TrioGetCharacterClass(format,
62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   &index,
62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   &flags,
62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   characterclass);
62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (rc < 0)
62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  return rc;
62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!TrioReadGroup(data,
62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   (flags & FLAGS_IGNORE)
62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   ? NULL
62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   : parameters[i].data.string,
62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   characterclass,
62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   flags,
62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   parameters[i].width))
62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  return assignment;
62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (!(flags & FLAGS_IGNORE))
62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  assignment++;
62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      }
62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* FORMAT_GROUP */
62535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_COUNT:
62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      pointer = parameters[i].data.pointer;
62565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (NULL != pointer)
62575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
62585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  int count = data->committed;
62595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (ch != EOF)
62605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    count--; /* a character is read, but is not consumed yet */
62615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_SIZE_T)
62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *(size_t *)pointer = (size_t)count;
62645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
62655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
62665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_PTRDIFF_T)
62675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_PTRDIFF_T)
62685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *(ptrdiff_t *)pointer = (ptrdiff_t)count;
62695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(QUALIFIER_INTMAX_T)
62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_INTMAX_T)
62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    *(trio_intmax_t *)pointer = (trio_intmax_t)count;
62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (flags & FLAGS_QUAD)
62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)count;
62795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (flags & FLAGS_LONG)
62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(long int *)pointer = (long int)count;
62835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else if (flags & FLAGS_SHORT)
62855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
62865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(short int *)pointer = (short int)count;
62875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  else
62895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    {
62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		      *(int *)pointer = (int)count;
62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    }
62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* FORMAT_COUNT */
62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_CHAR:
62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if TRIO_WIDECHAR
62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (flags & FLAGS_WIDECHAR)
62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
62995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (TrioReadWideChar(data,
63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       (flags & FLAGS_IGNORE)
63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       ? NULL
63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       : parameters[i].data.wstring,
63035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       flags,
63045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				       (width == NO_WIDTH) ? 1 : width) == 0)
63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return assignment;
63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      else
63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  if (TrioReadChar(data,
63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   (flags & FLAGS_IGNORE)
63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   ? NULL
63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   : parameters[i].data.string,
63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   flags,
63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   (width == NO_WIDTH) ? 1 : width) == 0)
63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    return assignment;
63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (!(flags & FLAGS_IGNORE))
63195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		assignment++;
63205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* FORMAT_CHAR */
63215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_POINTER:
63235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (!TrioReadPointer(data,
63245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   (flags & FLAGS_IGNORE)
63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   ? NULL
63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   : (trio_pointer_t *)parameters[i].data.pointer,
63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				   flags))
63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return assignment;
63295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      if (!(flags & FLAGS_IGNORE))
63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		assignment++;
63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* FORMAT_POINTER */
63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    case FORMAT_PARAMETER:
63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      break; /* FORMAT_PARAMETER */
63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    default:
63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  ch = data->current;
63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  index = parameters[i].indexAfterSpecifier;
63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  i++;
63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else /* Not an % identifier */
63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  if (isspace((int)format[index]))
63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
63475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      /* Whitespaces may match any amount of whitespaces */
63485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      ch = TrioSkipWhitespaces(data);
63495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
63505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else if (ch == format[index])
63515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    {
63525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      data->InStream(data, &ch);
63535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    }
63545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  else
63555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return assignment;
63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  index++;
63585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return assignment;
63615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
63625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
63645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioScan
63655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
63665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE int
63675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioScan
63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray),
63695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t source,
63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   size_t sourceSize,
63715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   void (*InStream) TRIO_PROTO((trio_class_t *, int *)),
63725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
63735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list *arglist,
63745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *argarray)
63755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
63775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_parameter_t parameters[MAX_PARAMETERS];
63785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_class_t data;
63795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(InStream));
63815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
63825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&data, 0, sizeof(data));
63845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.InStream = InStream;
63855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.location = (trio_pointer_t)source;
63865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.max = sourceSize;
63875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.error = 0;
63885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_LOCALE)
63905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (NULL == internalLocaleValues)
63915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TrioSetLocale();
63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
63945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
63955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray);
63975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status < 0)
63985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return status;
63995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioScanProcess(&data, format, parameters);
64015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.error != 0)
64025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status = data.error;
64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
64065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
64095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioInStreamFile
64105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioInStreamFile
64135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, intPointer),
64145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
64155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *intPointer)
64165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
64175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FILE *file = (FILE *)self->location;
64185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
64205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(file));
64215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->current = fgetc(file);
64235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (self->current == EOF)
64245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->error = (ferror(file))
64265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	? TRIO_ERROR_RETURN(TRIO_ERRNO, 0)
64275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	: TRIO_ERROR_RETURN(TRIO_EOF, 0);
64285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->processed++;
64325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
64335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (VALID(intPointer))
64365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *intPointer = self->current;
64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
64425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioInStreamFileDescriptor
64435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
64445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioInStreamFileDescriptor
64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, intPointer),
64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *intPointer)
64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
64505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fd = *((int *)self->location);
64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char input;
64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size = read(fd, &input, sizeof(char));
64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size == -1)
64585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);
64605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->current = EOF;
64615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
64635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->current = (size == 0) ? EOF : input;
64655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (self->current != EOF)
64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
64695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->processed++;
64705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (VALID(intPointer))
64735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *intPointer = self->current;
64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
64775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
64795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioInStreamCustom
64805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
64815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
64825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioInStreamCustom
64835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, intPointer),
64845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
64855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *intPointer)
64865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
64875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t *data;
64885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
64905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->location));
64915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data = (trio_custom_t *)self->location;
64935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->current = (data->stream.in == NULL)
64955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ? NIL
64965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : (data->stream.in)(data->closure);
64975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (self->current == NIL)
64995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
65005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->current = EOF;
65015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
65035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
65045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->processed++;
65055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
65065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (VALID(intPointer))
65095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
65105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *intPointer = self->current;
65115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
65155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TrioInStreamString
65165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PRIVATE void
65185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrioInStreamString
65195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((self, intPointer),
65205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_class_t *self,
65215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int *intPointer)
65225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
65235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char **buffer;
65245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self));
65265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(self->location));
65275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = (unsigned char **)self->location;
65295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  self->current = (*buffer)[0];
65305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (self->current == NIL)
65315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
65325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->current = EOF;
65335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
65355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
65365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*buffer)++;
65375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->processed++;
65385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self->committed++;
65395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (VALID(intPointer))
65425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
65435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *intPointer = self->current;
65445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
65455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
65485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Formatted scanning functions
65505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/
65525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TRIO_DOCUMENTATION)
65545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include "doc/doc_scanf.h"
65555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
65565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** @addtogroup Scanf
65575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @{
65585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
65595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
65615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * scanf
65625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
65655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Scan characters from standard input stream.
65665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param format Formatting string.
65685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @param ... Arguments.
65695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   @return Number of scanned characters.
65705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
65725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_scanf
65735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS2((format, va_alist),
65745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
65755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
65765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
65775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
65785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
65795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
65815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
65835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioScan((trio_pointer_t)stdin, 0,
65845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TrioInStreamFile,
65855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    format, &args, NULL);
65865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
65875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
65885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
65895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
65915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vscanf
65925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((format, args),
65935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
65945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
65955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
65965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
65975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)stdin, 0,
65995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamFile,
66005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, &args, NULL);
66015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
66045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_scanfv
66055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS2((format, args),
66065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
66075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
66085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
66095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
66105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)stdin, 0,
66125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamFile,
66135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, NULL, args);
66145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
66175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fscanf
66185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
66195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
66205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_fscanf
66215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((file, format, va_alist),
66225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    FILE *file,
66235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
66245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
66255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
66265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
66275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
66285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(file));
66305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
66315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
66335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioScan((trio_pointer_t)file, 0,
66345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TrioInStreamFile,
66355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    format, &args, NULL);
66365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
66375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
66385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
66415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vfscanf
66425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((file, format, args),
66435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   FILE *file,
66445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
66455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
66465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
66475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(file));
66485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
66495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)file, 0,
66515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamFile,
66525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, &args, NULL);
66535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
66565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_fscanfv
66575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((file, format, args),
66585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   FILE *file,
66595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
66605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
66615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
66625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(file));
66635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
66645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)file, 0,
66665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamFile,
66675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, NULL, args);
66685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
66715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dscanf
66725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
66735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
66745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_dscanf
66755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((fd, format, va_alist),
66765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    int fd,
66775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
66785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
66795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
66805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
66815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
66825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
66845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
66865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioScan((trio_pointer_t)&fd, 0,
66875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TrioInStreamFileDescriptor,
66885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    format, &args, NULL);
66895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
66905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
66915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
66925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
66945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vdscanf
66955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((fd, format, args),
66965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int fd,
66975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
66985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
66995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
67015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)&fd, 0,
67035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamFileDescriptor,
67045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, &args, NULL);
67055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
67085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_dscanfv
67095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((fd, format, args),
67105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int fd,
67115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
67125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
67135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
67155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)&fd, 0,
67175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamFileDescriptor,
67185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, NULL, args);
67195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
67225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cscanf
67235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
67245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
67255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_cscanf
67265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS4((stream, closure, format, va_alist),
67275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    trio_instream_t stream,
67285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    trio_pointer_t closure,
67295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
67305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
67315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
67335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
67345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t data;
67355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(stream));
67375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
67385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
67405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.stream.in = stream;
67415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.closure = closure;
67425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL);
67435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
67445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
67455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
67485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vcscanf
67495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((stream, closure, format, args),
67505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_instream_t stream,
67515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t closure,
67525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
67535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
67545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t data;
67565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(stream));
67585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
67595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.stream.in = stream;
67615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.closure = closure;
67625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL);
67635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
67665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_cscanfv
67675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS4((stream, closure, format, args),
67685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_instream_t stream,
67695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t closure,
67705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
67715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
67725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trio_custom_t data;
67745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(stream));
67765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
67775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.stream.in = stream;
67795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.closure = closure;
67805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args);
67815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
67825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
67845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sscanf
67855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
67865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
67875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_sscanf
67885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_VARGS3((buffer, format, va_alist),
67895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *buffer,
67905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_CONST char *format,
67915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    TRIO_VA_DECL)
67925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
67935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int status;
67945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  va_list args;
67955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
67975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
67985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_START(args, format);
68005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = TrioScan((trio_pointer_t)&buffer, 0,
68015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    TrioInStreamString,
68025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    format, &args, NULL);
68035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRIO_VA_END(args);
68045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return status;
68055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
68085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_vsscanf
68095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((buffer, format, args),
68105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *buffer,
68115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
68125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   va_list args)
68135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
68145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
68155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
68165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)&buffer, 0,
68185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamString,
68195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, &args, NULL);
68205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC int
68235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_sscanfv
68245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS3((buffer, format, args),
68255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *buffer,
68265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   TRIO_CONST char *format,
68275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   trio_pointer_t *args)
68285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
68295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(buffer));
68305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(VALID(format));
68315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TrioScan((trio_pointer_t)&buffer, 0,
68335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  TrioInStreamString,
68345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		  format, NULL, args);
68355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
68365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** @} End of Scanf documentation module */
68385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*************************************************************************
68405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * trio_strerror
68415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
68425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_PUBLIC TRIO_CONST char *
68435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)trio_strerror
68445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TRIO_ARGS1((errorcode),
68455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   int errorcode)
68465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
68475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Textual versions of the error codes */
68485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (TRIO_ERROR_CODE(errorcode))
68495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
68505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_EOF:
68515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "End of file";
68525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_EINVAL:
68535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Invalid argument";
68545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_ETOOMANY:
68555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Too many arguments";
68565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_EDBLREF:
68575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Double reference";
68585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_EGAP:
68595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Reference gap";
68605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_ENOMEM:
68615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Out of memory";
68625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_ERANGE:
68635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Invalid range";
68645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRIO_ECUSTOM:
68655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Custom error";
68665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
68675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "Unknown";
68685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
68695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6870