192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * $Id$
492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.
692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Permission to use, copy, modify, and distribute this software for any
892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * purpose with or without fee is hereby granted, provided that the above
992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * copyright notice and this permission notice appear in all copies.
1092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
1192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
1492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
1592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
1692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *************************************************************************
1792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
1870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * A note to trio contributors:
1970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese *
2092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Avoid heap allocation at all costs to ensure that the trio functions
2192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * are async-safe. The exceptions are the printf/fprintf functions, which
2292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * uses fputc, and the asprintf functions and the <alloc> modifier, which
2392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * by design are required to allocate form the heap.
2492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
2592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard ************************************************************************/
2692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*
2870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * TODO:
2992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  - Scan is probably too permissive about its modifiers.
3092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  - C escapes in %#[] ?
3192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  - Multibyte characters (done for format parsing, except scan groups)
3292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  - Complex numbers? (C99 _Complex)
3392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  - Boolean values? (C99 _Bool)
34a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard *  - C99 NaN(n-char-sequence) missing. The n-char-sequence can be used
35a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard *    to print the mantissa, e.g. NaN(0xc000000000000000)
3692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  - Should we support the GNU %a alloc modifier? GNU has an ugly hack
3792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    for %a, because C99 used %a for other purposes. If specified as
3892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    %as or %a[ it is interpreted as the alloc modifier, otherwise as
3992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    the C99 hex-float. This means that you cannot scan %as as a hex-float
4092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    immediately followed by an 's'.
41906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *  - Scanning of collating symbols.
4292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
4392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
44906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
45906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * Trio include files
46906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
47450296070e14629141738fbb34b9a0ad13af1f02Bjorn Reese#include "triodef.h"
48906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#include "trio.h"
49906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#include "triop.h"
50450296070e14629141738fbb34b9a0ad13af1f02Bjorn Reese#include "trionan.h"
51b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if !defined(TRIO_MINIMAL)
52b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# include "triostr.h"
53906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
54906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
55b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/**************************************************************************
56b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
57b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Definitions
58b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
59b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *************************************************************************/
60b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
61a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard#include <math.h>
62a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard#include <limits.h>
63a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard#include <float.h>
64a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard
6559d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#if (defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) \
6659d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard     || defined(USE_MULTIBYTE) || TRIO_WIDECHAR) \
6759d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard    && !defined(_WIN32_WCE)
68906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define TRIO_COMPILER_SUPPORTS_MULTIBYTE
69906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# if !defined(MB_LEN_MAX)
70906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define MB_LEN_MAX 6
71906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# endif
72906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
73906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
74a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard#if (defined(TRIO_COMPILER_MSVC) && (_MSC_VER >= 1100)) || defined(TRIO_COMPILER_BCB)
75a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard# define TRIO_COMPILER_SUPPORTS_MSVC_INT
76a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard#endif
77a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard
7859d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#if defined(_WIN32_WCE)
7959d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#include <wincecompat.h>
8059d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#endif
8159d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard
8292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
83906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * Generic definitions
8492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
8592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
86906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if !(defined(DEBUG) || defined(NDEBUG))
8770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese# define NDEBUG
8870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif
89a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard
9070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#include <assert.h>
9192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#include <ctype.h>
92906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if !defined(TRIO_COMPILER_SUPPORTS_C99)
93906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define isblank(x) (((x)==32) || ((x)==9))
94906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
95b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(TRIO_COMPILER_ANCIENT)
96b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# include <varargs.h>
97b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#else
98b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# include <stdarg.h>
99b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
100906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#include <stddef.h>
10159d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard
1024d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen#if defined( HAVE_ERRNO_H ) || defined( __VMS )
10392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#include <errno.h>
10459d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#endif
10592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
10692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#ifndef NULL
10792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define NULL 0
10892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
10992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define NIL ((char)0)
110906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#ifndef FALSE
111906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define FALSE (1 == 0)
112906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define TRUE (! FALSE)
11392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
114906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#define BOOLEAN_T int
11592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
11692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* mincore() can be used for debugging purposes */
11792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define VALID(x) (NULL != (x))
11892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
119b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if TRIO_ERRORS
120b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /*
121b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard   * Encode the error code and the position. This is decoded
122b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard   * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION.
123b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard   */
124b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8)))
125b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#else
126b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define TRIO_ERROR_RETURN(x,y) (-1)
127b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
128906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
1290f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#ifndef VA_LIST_IS_ARRAY
1300f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#define TRIO_VA_LIST_PTR	va_list *
1310f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#define TRIO_VA_LIST_ADDR(l)	(&(l))
1320f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#define TRIO_VA_LIST_DEREF(l)	(*(l))
1330f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#else
1340f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#define TRIO_VA_LIST_PTR	va_list
1350f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#define TRIO_VA_LIST_ADDR(l)	(l)
1360f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#define TRIO_VA_LIST_DEREF(l)	(l)
1370f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#endif
1380f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat
139a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillardtypedef unsigned long trio_flags_t;
140a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard
141906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
142906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
143906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * Platform specific definitions
14492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
1450f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat#if defined(TRIO_PLATFORM_UNIX) || defined(TRIO_PLATFORM_OS400)
146906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# include <unistd.h>
147906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# include <signal.h>
148906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# include <locale.h>
149906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define USE_LOCALE
150026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif /* TRIO_PLATFORM_UNIX */
151026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(TRIO_PLATFORM_VMS)
152026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese# include <unistd.h>
153026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif
154026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(TRIO_PLATFORM_WIN32)
15559d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard# if defined(_WIN32_WCE)
15659d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#  include <wincecompat.h>
15759d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard# else
15859d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#  include <io.h>
15959d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#  define read _read
16059d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#  define write _write
16159d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard# endif
162026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif /* TRIO_PLATFORM_WIN32 */
163906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
164906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
165906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# if defined(TRIO_COMPILER_SUPPORTS_ISO94)
166906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  include <wchar.h>
167906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  include <wctype.h>
168b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef wchar_t trio_wchar_t;
169b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef wint_t trio_wint_t;
170906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# else
171b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef char trio_wchar_t;
172b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef int trio_wint_t;
173026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#  define WCONST(x) L ## x
174906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define WEOF EOF
175906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswalnum(x) isalnum(x)
176906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswalpha(x) isalpha(x)
177906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswblank(x) isblank(x)
178906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswcntrl(x) iscntrl(x)
179906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswdigit(x) isdigit(x)
180906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswgraph(x) isgraph(x)
181906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswlower(x) islower(x)
182906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswprint(x) isprint(x)
183906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswpunct(x) ispunct(x)
184906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswspace(x) isspace(x)
185906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswupper(x) isupper(x)
186906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  define iswxdigit(x) isxdigit(x)
187906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# endif
18892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
18992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
190906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
19192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
192906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * Compiler dependent definitions
19392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
19492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
195906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/* Support for long long */
196906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#ifndef __cplusplus
197906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# if !defined(USE_LONGLONG)
198026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#  if defined(TRIO_COMPILER_GCC) && !defined(__STRICT_ANSI__)
199906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#   define USE_LONGLONG
200026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#  elif defined(TRIO_COMPILER_SUNPRO)
201906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#   define USE_LONGLONG
202906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  elif defined(_LONG_LONG) || defined(_LONGLONG)
203906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#   define USE_LONGLONG
204906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#  endif
20592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# endif
20692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
20792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
20892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* The extra long numbers */
20992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(USE_LONGLONG)
210906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef signed long long int trio_longlong_t;
211906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef unsigned long long int trio_ulonglong_t;
212a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
213906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef signed __int64 trio_longlong_t;
214906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef unsigned __int64 trio_ulonglong_t;
215906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#else
216b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef TRIO_SIGNED long int trio_longlong_t;
217906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef unsigned long int trio_ulonglong_t;
218906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
219906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
220906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/* Maximal and fixed integer types */
2214d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen#if defined(TRIO_COMPILER_SUPPORTS_C99) && !defined( __VMS )
222906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# include <stdint.h>
223906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef intmax_t trio_intmax_t;
224906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef uintmax_t trio_uintmax_t;
225906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int8_t trio_int8_t;
226906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int16_t trio_int16_t;
227906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int32_t trio_int32_t;
228906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int64_t trio_int64_t;
2294d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) || defined( __VMS )
230906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# include <inttypes.h>
2314d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen#ifdef __VMS
2324d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansentypedef long long int          intmax_t;
2334d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansentypedef unsigned long long int uintmax_t;
2344d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen#endif
235906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef intmax_t trio_intmax_t;
236906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef uintmax_t trio_uintmax_t;
237906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int8_t trio_int8_t;
238906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int16_t trio_int16_t;
239906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int32_t trio_int32_t;
240906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef int64_t trio_int64_t;
241a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
242906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef trio_longlong_t trio_intmax_t;
243906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef trio_ulonglong_t trio_uintmax_t;
244906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef __int8 trio_int8_t;
245906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef __int16 trio_int16_t;
246906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef __int32 trio_int32_t;
247906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef __int64 trio_int64_t;
24892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#else
249906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef trio_longlong_t trio_intmax_t;
250906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef trio_ulonglong_t trio_uintmax_t;
251906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# if defined(TRIO_INT8_T)
252906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef TRIO_INT8_T trio_int8_t;
253906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# else
254b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef TRIO_SIGNED char trio_int8_t;
255906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# endif
256906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# if defined(TRIO_INT16_T)
257906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef TRIO_INT16_T trio_int16_t;
258906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# else
259b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef TRIO_SIGNED short trio_int16_t;
260906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# endif
261906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# if defined(TRIO_INT32_T)
262906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef TRIO_INT32_T trio_int32_t;
263906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# else
264b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef TRIO_SIGNED int trio_int32_t;
265906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# endif
266906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# if defined(TRIO_INT64_T)
267906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef TRIO_INT64_T trio_int64_t;
268906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# else
269906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesetypedef trio_longlong_t trio_int64_t;
270906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# endif
27192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
27292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
27359d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard#if (!(defined(TRIO_COMPILER_SUPPORTS_C99) \
27459d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard || defined(TRIO_COMPILER_SUPPORTS_UNIX01))) \
27559d3ed8fe0ae9e8f453501d0993f2bc2f3f34ae8Daniel Veillard && !defined(_WIN32_WCE)
276b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define floorl(x) floor((double)(x))
277b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define fmodl(x,y) fmod((double)(x),(double)(y))
278b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define powl(x,y) pow((double)(x),(double)(y))
279b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
280b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
281b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define TRIO_FABS(x) (((x) < 0.0) ? -(x) : (x))
282906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
283906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
284b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Internal Definitions
285906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
286906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
287b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#ifndef DECIMAL_DIG
288b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define DECIMAL_DIG DBL_DIG
289b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
290b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
291906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/* Long double sizes */
292906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#ifdef LDBL_DIG
293906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define MAX_MANTISSA_DIGITS LDBL_DIG
294906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define MAX_EXPONENT_DIGITS 4
295b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define MAX_DOUBLE_DIGITS LDBL_MAX_10_EXP
29692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#else
297b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define MAX_MANTISSA_DIGITS DECIMAL_DIG
298906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define MAX_EXPONENT_DIGITS 3
299b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define MAX_DOUBLE_DIGITS DBL_MAX_10_EXP
300b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
301b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
302b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(TRIO_COMPILER_ANCIENT) || !defined(LDBL_DIG)
303b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# undef LDBL_DIG
304b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# undef LDBL_MANT_DIG
305b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# undef LDBL_EPSILON
306b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define LDBL_DIG DBL_DIG
307b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define LDBL_MANT_DIG DBL_MANT_DIG
308b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define LDBL_EPSILON DBL_EPSILON
30992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
31092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
311906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/* The maximal number of digits is for base 2 */
312906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT)
31392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* The width of a pointer. The number of bits in a hex digit is 4 */
314b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4)
31592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
31692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* Infinite and Not-A-Number for floating-point */
31770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#define INFINITE_LOWER "inf"
31870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#define INFINITE_UPPER "INF"
31970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#define LONG_INFINITE_LOWER "infinite"
32070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#define LONG_INFINITE_UPPER "INFINITE"
32170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#define NAN_LOWER "nan"
32270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#define NAN_UPPER "NAN"
32392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
3245706b6d8767e3c3f2e5b277b54e1af68035bc111Daniel Richard G#if !defined(HAVE_ISASCII) && !defined(isascii)
3254d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen#ifndef __VMS
3264d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen# define isascii(x) ((unsigned int)(x) < 128)
3274d041a2e809f538c87af261f86008b6de833ca2bJacob (Jouk) Jansen#endif
3285706b6d8767e3c3f2e5b277b54e1af68035bc111Daniel Richard G#endif
3295706b6d8767e3c3f2e5b277b54e1af68035bc111Daniel Richard G
33092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* Various constants */
33192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillardenum {
33292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  TYPE_PRINT = 1,
33392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  TYPE_SCAN  = 2,
33492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
335a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  /* Flags. FLAGS_LAST must be less than ULONG_MAX */
33692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_NEW                 = 0,
33792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_STICKY              = 1,
33892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_SPACE               = 2 * FLAGS_STICKY,
33992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_SHOWSIGN            = 2 * FLAGS_SPACE,
34092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_LEFTADJUST          = 2 * FLAGS_SHOWSIGN,
34192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_ALTERNATIVE         = 2 * FLAGS_LEFTADJUST,
34292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_SHORT               = 2 * FLAGS_ALTERNATIVE,
34392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_SHORTSHORT          = 2 * FLAGS_SHORT,
34492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_LONG                = 2 * FLAGS_SHORTSHORT,
34592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_QUAD                = 2 * FLAGS_LONG,
34692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_LONGDOUBLE          = 2 * FLAGS_QUAD,
34792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_SIZE_T              = 2 * FLAGS_LONGDOUBLE,
34892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_PTRDIFF_T           = 2 * FLAGS_SIZE_T,
34992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_INTMAX_T            = 2 * FLAGS_PTRDIFF_T,
35092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_NILPADDING          = 2 * FLAGS_INTMAX_T,
35192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_UNSIGNED            = 2 * FLAGS_NILPADDING,
35292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_UPPER               = 2 * FLAGS_UNSIGNED,
35392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_WIDTH               = 2 * FLAGS_UPPER,
35492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_WIDTH_PARAMETER     = 2 * FLAGS_WIDTH,
35592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_PRECISION           = 2 * FLAGS_WIDTH_PARAMETER,
35692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION,
35792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_BASE                = 2 * FLAGS_PRECISION_PARAMETER,
35892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_BASE_PARAMETER      = 2 * FLAGS_BASE,
35992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_FLOAT_E             = 2 * FLAGS_BASE_PARAMETER,
36092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_FLOAT_G             = 2 * FLAGS_FLOAT_E,
36192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_QUOTE               = 2 * FLAGS_FLOAT_G,
36292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_WIDECHAR            = 2 * FLAGS_QUOTE,
36392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_ALLOC               = 2 * FLAGS_WIDECHAR,
36492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_IGNORE              = 2 * FLAGS_ALLOC,
36592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_IGNORE_PARAMETER    = 2 * FLAGS_IGNORE,
366906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  FLAGS_VARSIZE_PARAMETER   = 2 * FLAGS_IGNORE_PARAMETER,
367906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  FLAGS_FIXED_SIZE          = 2 * FLAGS_VARSIZE_PARAMETER,
368a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  FLAGS_LAST                = FLAGS_FIXED_SIZE,
36992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Reused flags */
37092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  FLAGS_EXCLUDE             = FLAGS_SHORT,
37170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  FLAGS_USER_DEFINED        = FLAGS_IGNORE,
372b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  FLAGS_ROUNDING            = FLAGS_INTMAX_T,
37392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Compounded flags */
37470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  FLAGS_ALL_VARSIZES        = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T,
375906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  FLAGS_ALL_SIZES           = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT,
37692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
37792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  NO_POSITION  = -1,
37892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  NO_WIDTH     =  0,
37992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  NO_PRECISION = -1,
38092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  NO_SIZE      = -1,
38192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
382b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* Do not change these */
38392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  NO_BASE      = -1,
38492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  MIN_BASE     =  2,
38592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  MAX_BASE     = 36,
38692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  BASE_BINARY  =  2,
38792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  BASE_OCTAL   =  8,
38892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  BASE_DECIMAL = 10,
38992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  BASE_HEX     = 16,
39092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
39192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Maximal number of allowed parameters */
39292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  MAX_PARAMETERS = 64,
39392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Maximal number of characters in class */
394026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  MAX_CHARACTER_CLASS = UCHAR_MAX + 1,
39592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
39670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /* Maximal string lengths for user-defined specifiers */
39770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  MAX_USER_NAME = 64,
39870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  MAX_USER_DATA = 256,
399f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
40092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Maximal length of locale separator strings */
401906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX,
40292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Maximal number of integers in grouping */
403026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  MAX_LOCALE_GROUPS = 64,
404026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
405026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* Initial size of asprintf buffer */
406026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  DYNAMIC_START_SIZE = 32
40792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard};
40892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
40992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define NO_GROUPING ((int)CHAR_MAX)
41092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
41192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* Fundamental formatting parameter types */
41292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_UNKNOWN   0
41392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_INT       1
41492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_DOUBLE    2
41592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_CHAR      3
41692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_STRING    4
41792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_POINTER   5
41892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_COUNT     6
41992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_PARAMETER 7
42092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define FORMAT_GROUP     8
421906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_GNU
42270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese# define FORMAT_ERRNO    9
42370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif
424906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_EXTENSION
42570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese# define FORMAT_USER_DEFINED 10
42692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
42792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
42892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* Character constants */
42992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define CHAR_IDENTIFIER '%'
43092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define CHAR_BACKSLASH '\\'
43192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define CHAR_QUOTE '\"'
43292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define CHAR_ADJUST ' '
43392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
43492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/* Character class expressions */
435b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_ALNUM "[:alnum:]"
436b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_ALPHA "[:alpha:]"
437b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_BLANK "[:blank:]"
438b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_CNTRL "[:cntrl:]"
439b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_DIGIT "[:digit:]"
440b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_GRAPH "[:graph:]"
441b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_LOWER "[:lower:]"
442b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_PRINT "[:print:]"
443b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_PUNCT "[:punct:]"
444b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_SPACE "[:space:]"
445b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_UPPER "[:upper:]"
446b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define CLASS_XDIGIT "[:xdigit:]"
44792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
44892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*
44992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * SPECIFIERS:
45092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
45192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
45292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * a  Hex-float
45392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * A  Hex-float
45492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * c  Character
45592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * C  Widechar character (wint_t)
45692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * d  Decimal
45792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * e  Float
45892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * E  Float
45992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * F  Float
46092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * F  Float
46192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * g  Float
46292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * G  Float
46392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * i  Integer
46492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * m  Error message
46592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * n  Count
46692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * o  Octal
46792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * p  Pointer
46892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * s  String
469906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * S  Widechar string (wchar_t *)
47092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * u  Unsigned
47192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * x  Hex
47292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * X  Hex
47370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * [] Group
47470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * <> User-defined
47592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
47692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Reserved:
47792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
47892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * D  Binary Coded Decimal %D(length,precision) (OS/390)
47992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
48092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_CHAR 'c'
48192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_STRING 's'
48292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_DECIMAL 'd'
48392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_INTEGER 'i'
48492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_UNSIGNED 'u'
48592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_OCTAL 'o'
48692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_HEX 'x'
48792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_HEX_UPPER 'X'
48892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_FLOAT_E 'e'
48992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_FLOAT_E_UPPER 'E'
49092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_FLOAT_F 'f'
49192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_FLOAT_F_UPPER 'F'
49292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_FLOAT_G 'g'
49392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_FLOAT_G_UPPER 'G'
49492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_POINTER 'p'
49592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_GROUP '['
49692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_UNGROUP ']'
49792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define SPECIFIER_COUNT 'n'
498906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_UNIX98
49992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define SPECIFIER_CHAR_UPPER 'C'
50092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define SPECIFIER_STRING_UPPER 'S'
50192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
502906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_C99
50392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define SPECIFIER_HEXFLOAT 'a'
50492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define SPECIFIER_HEXFLOAT_UPPER 'A'
50592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
506906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_GNU
50792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define SPECIFIER_ERRNO 'm'
50892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
509906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_EXTENSION
51092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define SPECIFIER_BINARY 'b'
51192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define SPECIFIER_BINARY_UPPER 'B'
51270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese# define SPECIFIER_USER_DEFINED_BEGIN '<'
51370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese# define SPECIFIER_USER_DEFINED_END '>'
51470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese# define SPECIFIER_USER_DEFINED_SEPARATOR ':'
51592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
51692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
51792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*
51892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * QUALIFIERS:
51992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
52092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
52192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Numbers = d,i,o,u,x,X
52292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Float = a,A,e,E,f,F,g,G
52392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * String = s
52492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Char = c
52592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
52692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
52792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * 9$ Position
52892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      Use the 9th parameter. 9 can be any number between 1 and
52992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      the maximal argument
53092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
53192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * 9 Width
53292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      Set width to 9. 9 can be any number, but must not be postfixed
53392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      by '$'
53492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
53592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * h  Short
53692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Numbers:
53792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      (unsigned) short int
53892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
53992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * hh Short short
54092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Numbers:
54192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      (unsigned) char
54292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
54392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * l  Long
54492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Numbers:
54592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      (unsigned) long int
54692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    String:
54792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      as the S specifier
54892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Char:
54992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      as the C specifier
55092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
55192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * ll Long Long
55292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Numbers:
55392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      (unsigned) long long int
55492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
55592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * L  Long Double
55692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Float
55792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      long double
55892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
55992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * #  Alternative
56092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Float:
56192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      Decimal-point is always present
56292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    String:
56392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      non-printable characters are handled as \number
56492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
56592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Spacing
56692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
56792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * +  Sign
56892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
56992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * -  Alignment
57092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
57192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * .  Precision
57292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
57392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * *  Parameter
57492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    print: use parameter
57592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    scan: no parameter (ignore)
57692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
57792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * q  Quad
57892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
57992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Z  size_t
58092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
58192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * w  Widechar
58292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
58392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * '  Thousands/quote
58492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Numbers:
58592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      Integer part grouped in thousands
58692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    Binary numbers:
58792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      Number grouped in nibbles (4 bits)
58892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *    String:
58992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *      Quoted string
59092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
59192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * j  intmax_t
59292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * t  prtdiff_t
59392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * z  size_t
59492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
59592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * !  Sticky
59692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * @  Parameter (for both print and scan)
597906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *
598906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * I  n-bit Integer
599906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *    Numbers:
600906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *      The following options exists
601906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *        I8  = 8-bit integer
602906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *        I16 = 16-bit integer
603906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *        I32 = 32-bit integer
604906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *        I64 = 64-bit integer
60592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
60692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_POSITION '$'
60792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_SHORT 'h'
60892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_LONG 'l'
60992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_LONG_UPPER 'L'
61092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_ALTERNATIVE '#'
61192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_SPACE ' '
61292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_PLUS '+'
61392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_MINUS '-'
61492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_DOT '.'
61592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#define QUALIFIER_STAR '*'
616b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#define QUALIFIER_CIRCUMFLEX '^' /* For scanlists */
617906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_C99
61892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_SIZE_T 'z'
61992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_PTRDIFF_T 't'
62092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_INTMAX_T 'j'
62192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
622906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_BSD || TRIO_GNU
62392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_QUAD 'q'
62492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
625906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_GNU
62692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_SIZE_T_UPPER 'Z'
62792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
628906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_MISC
62992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_WIDECHAR 'w'
63092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
631906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_MICROSOFT
632906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define QUALIFIER_FIXED_SIZE 'I'
633906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
634906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_EXTENSION
63592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_QUOTE '\''
63692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_STICKY '!'
63792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_VARSIZE '&' /* This should remain undocumented */
63892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_PARAM '@' /* Experimental */
63992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# define QUALIFIER_COLON ':' /* For scanlists */
640906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese# define QUALIFIER_EQUAL '=' /* For scanlists */
641b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define QUALIFIER_ROUNDING_UPPER 'R'
64292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
64392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
64470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
64570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
646b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
647b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Internal Structures
648b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
649b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *************************************************************************/
65070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
65170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/* Parameters */
65292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillardtypedef struct {
653026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* An indication of which entry in the data union is used */
65492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int type;
655026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The flags */
656a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  trio_flags_t flags;
657026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The width qualifier */
65892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int width;
659026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The precision qualifier */
66070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int precision;
661026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The base qualifier */
66292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int base;
663026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The size for the variable size qualifier */
66492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int varsize;
665026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The marker of the end of the specifier */
66692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int indexAfterSpecifier;
667026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The data from the argument list */
66892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  union {
66992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    char *string;
670906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
671b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    trio_wchar_t *wstring;
672906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
673b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    trio_pointer_t pointer;
67492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    union {
675b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      trio_intmax_t as_signed;
676b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      trio_uintmax_t as_unsigned;
67792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    } number;
67892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    double doubleNumber;
67992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    double *doublePointer;
680b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    trio_long_double_t longdoubleNumber;
681b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    trio_long_double_t *longdoublePointer;
68292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    int errorNumber;
68392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  } data;
68470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /* For the user-defined specifier */
68570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  char user_name[MAX_USER_NAME];
68670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  char user_data[MAX_USER_DATA];
687026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese} trio_parameter_t;
68892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
689b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/* Container for customized functions */
690b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtypedef struct {
691b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  union {
692b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    trio_outstream_t out;
693b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    trio_instream_t in;
694b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  } stream;
695b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_pointer_t closure;
696b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard} trio_custom_t;
697b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
69870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/* General trio "class" */
699026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesetypedef struct _trio_class_t {
700026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /*
701026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * The function to write characters to a stream.
702026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   */
703b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  void (*OutStream) TRIO_PROTO((struct _trio_class_t *, int));
704026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /*
705026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * The function to read characters from a stream.
706026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   */
707b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  void (*InStream) TRIO_PROTO((struct _trio_class_t *, int *));
708026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /*
709026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * The current location in the stream.
710026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   */
711b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_pointer_t location;
71270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
713026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * The character currently being processed.
714026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   */
715026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  int current;
716026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /*
717026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * The number of characters that would have been written/read
718026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * if there had been sufficient space.
71992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
72070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int processed;
72170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
72270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese   * The number of characters that are actually written/read.
723026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * Processed and committed will only differ for the *nprintf
72492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * and *nscanf functions.
72592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
72670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int committed;
727026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /*
728026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * The upper limit of characters that may be written/read.
729026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   */
73070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int max;
731026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /*
732026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * The last output error that was detected.
733026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   */
734026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  int error;
735026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese} trio_class_t;
73692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
73770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/* References (for user-defined callbacks) */
738026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesetypedef struct _trio_reference_t {
739026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_class_t *data;
740026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_parameter_t *parameter;
741026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese} trio_reference_t;
74270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
74370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/* Registered entries (for user-defined callbacks) */
744026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesetypedef struct _trio_userdef_t {
745026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  struct _trio_userdef_t *next;
74670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  trio_callback_t callback;
74770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  char *name;
748026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese} trio_userdef_t;
74970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
75092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
751b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
752b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Internal Variables
753b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
754b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *************************************************************************/
75592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
756026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesestatic TRIO_CONST char rcsid[] = "@(#)$Id$";
757026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
758026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/*
759026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * Need this to workaround a parser bug in HP C/iX compiler that fails
760026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * to resolves macro definitions that includes type 'long double',
761026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * e.g: va_arg(arg_ptr, long double)
762026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
763026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(TRIO_PLATFORM_MPEIX)
764b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardstatic TRIO_CONST trio_long_double_t ___dummy_long_double = 0;
76592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
766026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
767026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesestatic TRIO_CONST char internalNullString[] = "(nil)";
76892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
76992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(USE_LOCALE)
77070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesestatic struct lconv *internalLocaleValues = NULL;
77192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
77270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
77370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*
77470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * UNIX98 says "in a locale where the radix character is not defined,
77592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * the radix character defaults to a period (.)"
77692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
777b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardstatic int internalDecimalPointLength = 1;
778b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardstatic int internalThousandSeparatorLength = 1;
779b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardstatic char internalDecimalPoint = '.';
780b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardstatic char internalDecimalPointString[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ".";
781906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesestatic char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ",";
78270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesestatic char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING };
78392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
784026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesestatic TRIO_CONST char internalDigitsLower[] = "0123456789abcdefghijklmnopqrstuvwxyz";
785026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesestatic TRIO_CONST char internalDigitsUpper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
78670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesestatic BOOLEAN_T internalDigitsUnconverted = TRUE;
78770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesestatic int internalDigitArray[128];
788906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_EXTENSION
789906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesestatic BOOLEAN_T internalCollationUnconverted = TRUE;
790906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reesestatic char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS];
791906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
79292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
793b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if TRIO_EXTENSION
794026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesestatic TRIO_VOLATILE trio_callback_t internalEnterCriticalRegion = NULL;
795026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesestatic TRIO_VOLATILE trio_callback_t internalLeaveCriticalRegion = NULL;
796026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reesestatic trio_userdef_t *internalUserDef = NULL;
797b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
79892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
79992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
80070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
801b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
802b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Internal Functions
803b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
804b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard ************************************************************************/
805b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
806b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(TRIO_MINIMAL)
807b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# define TRIO_STRING_PUBLIC static
808b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard# include "triostr.c"
809b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif /* defined(TRIO_MINIMAL) */
81092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
81192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
812026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioIsQualifier
81392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
81492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Description:
81592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  Remember to add all new qualifiers to this function.
81692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  QUALIFIER_POSITION must not be added.
81792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
818026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE BOOLEAN_T
819b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioIsQualifier
820b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((character),
821b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char character)
82292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
82392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* QUALIFIER_POSITION is not included */
824b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  switch (character)
82592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
82692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case '0': case '1': case '2': case '3': case '4':
82792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case '5': case '6': case '7': case '8': case '9':
82892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_PLUS:
82992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_MINUS:
83092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_SPACE:
83192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_DOT:
83292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_STAR:
83392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_ALTERNATIVE:
83492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_SHORT:
83592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_LONG:
83692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_LONG_UPPER:
83792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_CIRCUMFLEX:
83892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T)
83992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_SIZE_T:
84092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
84192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_PTRDIFF_T)
84292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_PTRDIFF_T:
84392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
84492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_INTMAX_T)
84592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_INTMAX_T:
84692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
84792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_QUAD)
84892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_QUAD:
84992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
85092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T_UPPER)
85192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_SIZE_T_UPPER:
85292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
85392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_WIDECHAR)
85492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_WIDECHAR:
85592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
85692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_QUOTE)
85792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_QUOTE:
85892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
85992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_STICKY)
86092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_STICKY:
86192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
86292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_VARSIZE)
86392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_VARSIZE:
86492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
86592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_PARAM)
86692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case QUALIFIER_PARAM:
86792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
868906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(QUALIFIER_FIXED_SIZE)
869906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    case QUALIFIER_FIXED_SIZE:
870906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
871b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(QUALIFIER_ROUNDING_UPPER)
872b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case QUALIFIER_ROUNDING_UPPER:
873b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
87492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      return TRUE;
87592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    default:
87692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      return FALSE;
87792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
87892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
87992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
88092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
881026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioSetLocale
88292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
88370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#if defined(USE_LOCALE)
884b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE void
885b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioSetLocale(TRIO_NOARGS)
88692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
88770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  internalLocaleValues = (struct lconv *)localeconv();
888906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (internalLocaleValues)
88992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
890906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if ((internalLocaleValues->decimal_point) &&
891906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  (internalLocaleValues->decimal_point[0] != NIL))
892906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
893b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  internalDecimalPointLength = trio_length(internalLocaleValues->decimal_point);
894b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (internalDecimalPointLength == 1)
895b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
896b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      internalDecimalPoint = internalLocaleValues->decimal_point[0];
897b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
898b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  else
899b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
900b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      internalDecimalPoint = NIL;
901b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      trio_copy_max(internalDecimalPointString,
902b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			    sizeof(internalDecimalPointString),
903b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			    internalLocaleValues->decimal_point);
904b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
905906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
906906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if ((internalLocaleValues->thousands_sep) &&
907906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  (internalLocaleValues->thousands_sep[0] != NIL))
908906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
909026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  trio_copy_max(internalThousandSeparator,
910026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			sizeof(internalThousandSeparator),
911026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			internalLocaleValues->thousands_sep);
912b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  internalThousandSeparatorLength = trio_length(internalThousandSeparator);
913906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
914906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if ((internalLocaleValues->grouping) &&
915906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  (internalLocaleValues->grouping[0] != NIL))
916906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
917026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  trio_copy_max(internalGrouping,
918026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			sizeof(internalGrouping),
919026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			internalLocaleValues->grouping);
920906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
92192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
92292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
92370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif /* defined(USE_LOCALE) */
92492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
925b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE int
926b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioCalcThousandSeparatorLength
927b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((digits),
928b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int digits)
929b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
930b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if TRIO_EXTENSION
931b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int count = 0;
932b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int step = NO_GROUPING;
933b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  char *groupingPointer = internalGrouping;
934b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
935b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  while (digits > 0)
936b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
937b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (*groupingPointer == CHAR_MAX)
938b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
939b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Disable grouping */
940b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break; /* while */
941b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
942b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else if (*groupingPointer == 0)
943b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
944b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Repeat last group */
945b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (step == NO_GROUPING)
946b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
947b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      /* Error in locale */
948b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      break; /* while */
949b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
950b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
951b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
952b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
953b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  step = *groupingPointer++;
954b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
955b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (digits > step)
956b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	count += internalThousandSeparatorLength;
957b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      digits -= step;
958b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
959b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return count;
960b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#else
961b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return 0;
962b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
963b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
964b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
965b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE BOOLEAN_T
966b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioFollowedBySeparator
967b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((position),
968b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int position)
969b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
970b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if TRIO_EXTENSION
971b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int step = 0;
972b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  char *groupingPointer = internalGrouping;
973b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
974b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  position--;
975b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (position == 0)
976b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    return FALSE;
977b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  while (position > 0)
978b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
979b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (*groupingPointer == CHAR_MAX)
980b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
981b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Disable grouping */
982b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break; /* while */
983b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
984b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else if (*groupingPointer != 0)
985b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
986b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  step = *groupingPointer++;
987b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
988b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (step == 0)
989b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	break;
990b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      position -= step;
991b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
992b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return (position == 0);
993b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#else
994b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return FALSE;
995b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
996b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
997b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
99892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
999026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioGetPosition
100092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
100192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Get the %n$ position.
100292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
1003026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
1004b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioGetPosition
1005b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((format, indexPointer),
1006b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
1007b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *indexPointer)
100892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
1009b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if TRIO_UNIX98
101092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char *tmpformat;
101192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int number = 0;
101292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int index = *indexPointer;
101392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1014026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  number = (int)trio_to_long(&format[index], &tmpformat, BASE_DECIMAL);
101592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  index = (int)(tmpformat - format);
101692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if ((number != 0) && (QUALIFIER_POSITION == format[index++]))
101792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
101892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      *indexPointer = index;
101970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /*
102070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * number is decreased by 1, because n$ starts from 1, whereas
102192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       * the array it is indexing starts from 0.
102292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       */
102392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      return number - 1;
102492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
1025b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
102692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return NO_POSITION;
102792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
102892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1029b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if TRIO_EXTENSION
103092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
1031026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioFindNamespace
103270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese *
103370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * Find registered user-defined specifier.
1034b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * The prev argument is used for optimization only.
103570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
1036026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE trio_userdef_t *
1037b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioFindNamespace
1038b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((name, prev),
1039b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *name,
1040b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_userdef_t **prev)
104170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
1042026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_userdef_t *def;
1043f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
1044906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (internalEnterCriticalRegion)
1045906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    (void)internalEnterCriticalRegion(NULL);
1046f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
104770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  for (def = internalUserDef; def; def = def->next)
104870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    {
104970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /* Case-sensitive string comparison */
1050026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      if (trio_equal_case(def->name, name))
1051906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	break;
1052f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
105370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      if (prev)
105470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	*prev = def;
105570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    }
1056f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
1057906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (internalLeaveCriticalRegion)
1058906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    (void)internalLeaveCriticalRegion(NULL);
1059f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
106070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return def;
106170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
1062b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
1063b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
1064b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
1065b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * TrioPower
1066b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
1067b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Description:
1068b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  Calculate pow(base, exponent), where number and exponent are integers.
1069b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
1070b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE trio_long_double_t
1071b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioPower
1072b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((number, exponent),
1073b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int number,
1074b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int exponent)
1075b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
1076b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t result;
1077b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
1078b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (number == 10)
1079b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
1080b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      switch (exponent)
1081b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
1082b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Speed up calculation of common cases */
1083b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 0:
1084b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E-1);
1085b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1086b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 1:
1087b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+0);
1088b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1089b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 2:
1090b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+1);
1091b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1092b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 3:
1093b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+2);
1094b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1095b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 4:
1096b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+3);
1097b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1098b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 5:
1099b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+4);
1100b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1101b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 6:
1102b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+5);
1103b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1104b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 7:
1105b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+6);
1106b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1107b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 8:
1108b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+7);
1109b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1110b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case 9:
1111b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+8);
1112b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1113b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	default:
1114b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = powl((trio_long_double_t)number,
1115b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			(trio_long_double_t)exponent);
1116b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  break;
1117b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
1118b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
1119b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
1120b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
1121b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return powl((trio_long_double_t)number, (trio_long_double_t)exponent);
1122b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
1123b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return result;
1124b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
1125b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
1126b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
1127b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * TrioLogarithm
1128b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
1129b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE double
1130b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioLogarithm
1131b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((number, base),
1132b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   double number,
1133b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int base)
1134b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
1135b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  double result;
1136b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
1137b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (number <= 0.0)
1138b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
1139b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      /* xlC crashes on log(0) */
1140b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      result = (number == 0.0) ? trio_ninf() : trio_nan();
1141b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
1142b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
1143b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
1144b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (base == 10)
1145b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
1146b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = log10(number);
1147b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
1148b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
1149b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
1150b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  result = log10(number) / log10((double)base);
1151b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
1152b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
1153b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return result;
1154b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
1155b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
1156b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
1157b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * TrioLogarithmBase
1158b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
1159b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE double
1160b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioLogarithmBase
1161b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((base),
1162b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int base)
1163b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
1164b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  switch (base)
1165b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
1166b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case BASE_BINARY : return 1.0;
1167b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case BASE_OCTAL  : return 3.0;
1168b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case BASE_DECIMAL: return 3.321928094887362345;
1169b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case BASE_HEX    : return 4.0;
1170b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    default          : return TrioLogarithm((double)base, 2);
1171b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
1172b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
117370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
117470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
1175026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioParse
117692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
117792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Description:
117892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  Parse the format string
117992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
1180026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
1181b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioParse
1182b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS5((type, format, parameters, arglist, argarray),
1183b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int type,
1184b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
1185b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_parameter_t *parameters,
11860f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat	   TRIO_VA_LIST_PTR arglist,
1187b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *argarray)
118892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
118992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Count the number of times a parameter is referenced */
119092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  unsigned short usedEntries[MAX_PARAMETERS];
119192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Parameter counters */
119292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int parameterPosition;
119392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int currentParam;
119492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int maxParam = -1;
119592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Utility variables */
1196a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  trio_flags_t flags;
119792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int width;
119892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int precision;
119992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int varsize;
120092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int base;
120192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int index;  /* Index into formatting string */
120292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int dots;  /* Count number of dots in modifier part */
120392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  BOOLEAN_T positional;  /* Does the specifier have a positional? */
1204b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  BOOLEAN_T gotSticky = FALSE;  /* Are there any sticky modifiers at all? */
120570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
120670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese   * indices specifies the order in which the parameters must be
120792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * read from the va_args (this is necessary to handle positionals)
120892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
120992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int indices[MAX_PARAMETERS];
121092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int pos = 0;
121192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Various variables */
121292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char ch;
1213026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
121492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int charlen;
1215026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif
1216b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int save_errno;
121792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i = -1;
121892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int num;
121992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char *tmpformat;
122092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1221b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* One and only one of arglist and argarray must be used */
1222b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert((arglist != NULL) ^ (argarray != NULL));
1223f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
122470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
122570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese   * The 'parameters' array is not initialized, but we need to
122692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * know which entries we have used.
122792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
122892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  memset(usedEntries, 0, sizeof(usedEntries));
122992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1230b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  save_errno = errno;
123192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  index = 0;
123292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  parameterPosition = 0;
1233906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
1234b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  (void)mblen(NULL, 0);
123592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
1236f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
123792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  while (format[index])
123892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
1239906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
124092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (! isascii(format[index]))
124192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
124270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  /*
124370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	   * Multibyte characters cannot be legal specifiers or
124492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * modifiers, so we skip over them.
124592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   */
124692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  charlen = mblen(&format[index], MB_LEN_MAX);
124792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  index += (charlen > 0) ? charlen : 1;
124892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  continue; /* while */
124992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
1250906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
125192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (CHAR_IDENTIFIER == format[index++])
125292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
125392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (CHAR_IDENTIFIER == format[index])
125492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
125592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      index++;
125692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      continue; /* while */
125792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
125892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
125992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  flags = FLAGS_NEW;
126092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  dots = 0;
126192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  currentParam = TrioGetPosition(format, &index);
126292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  positional = (NO_POSITION != currentParam);
126392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (!positional)
126492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
126592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* We have no positional, get the next counter */
126692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      currentParam = parameterPosition;
126792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
126892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard          if(currentParam >= MAX_PARAMETERS)
126992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
127092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Bail out completely to make the error more obvious */
127192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      return TRIO_ERROR_RETURN(TRIO_ETOOMANY, index);
127292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
127392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
127492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (currentParam > maxParam)
127592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    maxParam = currentParam;
127692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
127792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Default values */
127892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  width = NO_WIDTH;
127992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  precision = NO_PRECISION;
128092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  base = NO_BASE;
128192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  varsize = NO_SIZE;
128292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
128370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  while (TrioIsQualifier(format[index]))
128492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
128592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      ch = format[index++];
128692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
128792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      switch (ch)
128892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
128992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_SPACE:
129092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_SPACE;
129192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
129292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
129392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_PLUS:
129492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_SHOWSIGN;
129592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
129692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
129792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_MINUS:
129892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_LEFTADJUST;
129992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags &= ~FLAGS_NILPADDING;
130092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
130192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
130292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_ALTERNATIVE:
130392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_ALTERNATIVE;
130492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
130592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
130692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_DOT:
130792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (dots == 0) /* Precision */
130892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
130992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      dots++;
131092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
131192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      /* Skip if no precision */
131292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (QUALIFIER_DOT == format[index])
131392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			break;
1314f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
131592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      /* After the first dot we have the precision */
131692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      flags |= FLAGS_PRECISION;
1317b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      if ((QUALIFIER_STAR == format[index])
1318b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(QUALIFIER_PARAM)
1319b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  || (QUALIFIER_PARAM == format[index])
1320b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
1321b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  )
132292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
132392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  index++;
132492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  flags |= FLAGS_PRECISION_PARAMETER;
132592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
132692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  precision = TrioGetPosition(format, &index);
132792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (precision == NO_POSITION)
132892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    {
132992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      parameterPosition++;
133092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      if (positional)
133192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				precision = parameterPosition;
133292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      else
133392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				{
133492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  precision = currentParam;
133592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  currentParam = precision + 1;
133692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				}
133792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    }
133892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  else
133992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    {
134092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      if (! positional)
134192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				currentParam = precision + 1;
134292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      if (width > maxParam)
134392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				maxParam = precision;
134492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    }
134592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (currentParam > maxParam)
134692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    maxParam = currentParam;
134792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
134892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else
134992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
1350026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			  precision = trio_to_long(&format[index],
1351026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese						   &tmpformat,
1352026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese						   BASE_DECIMAL);
135392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  index = (int)(tmpformat - format);
135492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
135592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
135692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (dots == 1) /* Base */
135792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
135892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      dots++;
1359f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
136092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      /* After the second dot we have the base */
136192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      flags |= FLAGS_BASE;
1362b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      if ((QUALIFIER_STAR == format[index])
1363b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(QUALIFIER_PARAM)
1364b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  || (QUALIFIER_PARAM == format[index])
1365b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
1366b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  )
136792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
136892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  index++;
136992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  flags |= FLAGS_BASE_PARAMETER;
137092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  base = TrioGetPosition(format, &index);
137192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (base == NO_POSITION)
137292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    {
137392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      parameterPosition++;
137492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      if (positional)
137592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				base = parameterPosition;
137692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      else
137792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				{
137892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  base = currentParam;
137992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  currentParam = base + 1;
138092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				}
138192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    }
138292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  else
138392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    {
138492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      if (! positional)
138592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				currentParam = base + 1;
138692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      if (base > maxParam)
138792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				maxParam = base;
138892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    }
138992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (currentParam > maxParam)
139092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    maxParam = currentParam;
139192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
139292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else
139392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
1394026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			  base = trio_to_long(&format[index],
1395026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese					      &tmpformat,
1396026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese					      BASE_DECIMAL);
139792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (base > MAX_BASE)
139892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
139992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  index = (int)(tmpformat - format);
140092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
140192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
140292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
140392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
140492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
140592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
140692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* QUALIFIER_DOT */
140792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1408b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(QUALIFIER_PARAM)
140992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_PARAM:
141092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  type = TYPE_PRINT;
141192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* FALLTHROUGH */
1412b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
141392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_STAR:
141492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* This has different meanings for print and scan */
141592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (TYPE_PRINT == type)
141692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
141792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      /* Read with from parameter */
141892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER);
141992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      width = TrioGetPosition(format, &index);
142092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (width == NO_POSITION)
142192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
142292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  parameterPosition++;
142392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (positional)
142492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    width = parameterPosition;
142592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  else
142692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    {
142792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      width = currentParam;
142892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			      currentParam = width + 1;
142992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    }
143092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
143192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else
143292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
143392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (! positional)
143492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    currentParam = width + 1;
143592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  if (width > maxParam)
143692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			    maxParam = width;
143792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
143892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (currentParam > maxParam)
143992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			maxParam = currentParam;
144092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
144192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
144292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
144392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      /* Scan, but do not store result */
144492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      flags |= FLAGS_IGNORE;
144592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
144692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
144792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* QUALIFIER_STAR */
144892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
144992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case '0':
145092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (! (flags & FLAGS_LEFTADJUST))
145192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_NILPADDING;
145292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* FALLTHROUGH */
145392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case '1': case '2': case '3': case '4':
145492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case '5': case '6': case '7': case '8': case '9':
145592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_WIDTH;
145692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* &format[index - 1] is used to "rewind" the read
145792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		   * character from format
145892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		   */
1459026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		  width = trio_to_long(&format[index - 1],
1460026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				       &tmpformat,
1461026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				       BASE_DECIMAL);
146292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  index = (int)(tmpformat - format);
146392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
146492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
146592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_SHORT:
146692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_SHORTSHORT)
146792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
146892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (flags & FLAGS_SHORT)
146992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_SHORTSHORT;
147092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
147192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_SHORT;
147292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
147392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
147492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_LONG:
147592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_QUAD)
147692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
147792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (flags & FLAGS_LONG)
147892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_QUAD;
147992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
148092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_LONG;
148192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
148292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
148392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_LONG_UPPER:
148492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_LONGDOUBLE;
148592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
148692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
148792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T)
148892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_SIZE_T:
148992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_SIZE_T;
149092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* Modify flags for later truncation of number */
1491906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (sizeof(size_t) == sizeof(trio_ulonglong_t))
149292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_QUAD;
149392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (sizeof(size_t) == sizeof(long))
149492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_LONG;
149592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
149692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
149792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
149892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_PTRDIFF_T)
149992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_PTRDIFF_T:
150092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_PTRDIFF_T;
1501906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t))
150292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_QUAD;
150392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (sizeof(ptrdiff_t) == sizeof(long))
150492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_LONG;
150592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
150692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
150792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
150892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_INTMAX_T)
150992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_INTMAX_T:
151092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_INTMAX_T;
1511906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t))
151292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_QUAD;
1513906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else if (sizeof(trio_intmax_t) == sizeof(long))
151492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    flags |= FLAGS_LONG;
151592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
151692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
151792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
151892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_QUAD)
151992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_QUAD:
152092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_QUAD;
152192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
152292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
152392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1524906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(QUALIFIER_FIXED_SIZE)
1525906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		case QUALIFIER_FIXED_SIZE:
1526906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (flags & FLAGS_FIXED_SIZE)
1527906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1528906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
1529906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (flags & (FLAGS_ALL_SIZES | FLAGS_LONGDOUBLE |
1530906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			       FLAGS_WIDECHAR | FLAGS_VARSIZE_PARAMETER))
1531906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1532906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
1533906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if ((format[index] == '6') &&
1534906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      (format[index + 1] == '4'))
1535906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
1536906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      varsize = sizeof(trio_int64_t);
1537906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      index += 2;
1538906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
1539906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else if ((format[index] == '3') &&
1540906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			   (format[index + 1] == '2'))
1541906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
1542906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      varsize = sizeof(trio_int32_t);
1543906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      index += 2;
1544906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
1545906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else if ((format[index] == '1') &&
1546906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			   (format[index + 1] == '6'))
1547906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
1548906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      varsize = sizeof(trio_int16_t);
1549906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      index += 2;
1550906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
1551906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else if (format[index] == '8')
1552906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
1553906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      varsize = sizeof(trio_int8_t);
1554906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      index++;
1555906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
1556906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else
1557906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1558f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
1559906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  flags |= FLAGS_FIXED_SIZE;
1560906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  break;
1561906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
1562906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
156392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_WIDECHAR)
156492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_WIDECHAR:
156592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_WIDECHAR;
156692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
156792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
156892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
156992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T_UPPER)
157092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_SIZE_T_UPPER:
157192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
157292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
157392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
157492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_QUOTE)
157592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_QUOTE:
157692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_QUOTE;
157792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
157892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
157992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
158092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_STICKY)
158192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_STICKY:
158292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  flags |= FLAGS_STICKY;
1583b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  gotSticky = TRUE;
158492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
158592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
1586f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
158792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_VARSIZE)
158892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case QUALIFIER_VARSIZE:
1589906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  flags |= FLAGS_VARSIZE_PARAMETER;
159092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  parameterPosition++;
159192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (positional)
159292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    varsize = parameterPosition;
159392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
159492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
159592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      varsize = currentParam;
159692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      currentParam = varsize + 1;
159792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
159892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (currentParam > maxParam)
159992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    maxParam = currentParam;
160092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
160192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
160292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1603b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(QUALIFIER_ROUNDING_UPPER)
1604b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		case QUALIFIER_ROUNDING_UPPER:
1605b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  flags |= FLAGS_ROUNDING;
1606b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  break;
1607b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
1608b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
160992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		default:
161092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* Bail out completely to make the error more obvious */
161192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard                  return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
161292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
161392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    } /* while qualifier */
161492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
161570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  /*
161670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	   * Parameters only need the type and value. The value is
161792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * read later.
161892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   */
161992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (flags & FLAGS_WIDTH_PARAMETER)
162092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
162192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      usedEntries[width] += 1;
162292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_PARAMETER;
1623026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      parameters[pos].flags = 0;
162492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      indices[width] = pos;
162592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      width = pos++;
162692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
162792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (flags & FLAGS_PRECISION_PARAMETER)
162892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
162992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      usedEntries[precision] += 1;
163092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_PARAMETER;
1631026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      parameters[pos].flags = 0;
163292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      indices[precision] = pos;
163392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      precision = pos++;
163492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
163592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (flags & FLAGS_BASE_PARAMETER)
163692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
163792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      usedEntries[base] += 1;
163892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_PARAMETER;
1639026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      parameters[pos].flags = 0;
164092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      indices[base] = pos;
164192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      base = pos++;
164292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
1643906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  if (flags & FLAGS_VARSIZE_PARAMETER)
164492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
164592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      usedEntries[varsize] += 1;
164692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_PARAMETER;
1647026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      parameters[pos].flags = 0;
164892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      indices[varsize] = pos;
164992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      varsize = pos++;
165092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
1651f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
165292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  indices[currentParam] = pos;
1653f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
165492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  switch (format[index++])
165592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
165692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(SPECIFIER_CHAR_UPPER)
165792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_CHAR_UPPER:
1658906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      flags |= FLAGS_WIDECHAR;
165992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
166092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
166192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_CHAR:
1662906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      if (flags & FLAGS_LONG)
1663906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		flags |= FLAGS_WIDECHAR;
1664906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      else if (flags & FLAGS_SHORT)
1665906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		flags &= ~FLAGS_WIDECHAR;
166692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_CHAR;
166792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
166892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
166992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(SPECIFIER_STRING_UPPER)
167092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_STRING_UPPER:
1671906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      flags |= FLAGS_WIDECHAR;
167292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
167392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
167492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_STRING:
1675906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      if (flags & FLAGS_LONG)
1676906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		flags |= FLAGS_WIDECHAR;
1677906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      else if (flags & FLAGS_SHORT)
1678906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		flags &= ~FLAGS_WIDECHAR;
167992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_STRING;
168092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
168192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
168292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_GROUP:
168392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (TYPE_SCAN == type)
168492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
1685906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  int depth = 1;
168692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  parameters[pos].type = FORMAT_GROUP;
1687906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (format[index] == QUALIFIER_CIRCUMFLEX)
1688906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    index++;
1689906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (format[index] == SPECIFIER_UNGROUP)
1690906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    index++;
1691906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (format[index] == QUALIFIER_MINUS)
1692906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    index++;
1693906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  /* Skip nested brackets */
1694906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  while (format[index] != NIL)
169592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
1696906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      if (format[index] == SPECIFIER_GROUP)
1697906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			{
1698906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			  depth++;
1699906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			}
1700906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      else if (format[index] == SPECIFIER_UNGROUP)
1701906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			{
1702906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			  if (--depth <= 0)
1703906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			    {
1704906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			      index++;
1705906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			      break;
1706906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			    }
1707906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			}
1708906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      index++;
170992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
171092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
171192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
1712f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
171392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_INTEGER:
171492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_INT;
171592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
1716f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
171792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_UNSIGNED:
171892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UNSIGNED;
171992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_INT;
172092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
172192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
172292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_DECIMAL:
172392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Disable base modifier */
172492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags &= ~FLAGS_BASE_PARAMETER;
172592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      base = BASE_DECIMAL;
172692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_INT;
172792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
172892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
172992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_OCTAL:
1730a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	      flags |= FLAGS_UNSIGNED;
173192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags &= ~FLAGS_BASE_PARAMETER;
173292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      base = BASE_OCTAL;
173392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_INT;
173492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
173592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
173692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(SPECIFIER_BINARY)
173792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_BINARY_UPPER:
173892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UPPER;
173992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
174092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_BINARY:
174192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_NILPADDING;
174292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags &= ~FLAGS_BASE_PARAMETER;
174392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      base = BASE_BINARY;
174492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_INT;
174592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
174692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
174792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
174892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_HEX_UPPER:
174992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UPPER;
175092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
175192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_HEX:
175292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UNSIGNED;
175392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags &= ~FLAGS_BASE_PARAMETER;
175492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      base = BASE_HEX;
175592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_INT;
175692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
175792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
175892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_FLOAT_E_UPPER:
175992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UPPER;
176092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
176192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_FLOAT_E:
176292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_FLOAT_E;
176392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_DOUBLE;
176492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
176592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
176692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_FLOAT_G_UPPER:
176792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UPPER;
176892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
176992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_FLOAT_G:
177092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_FLOAT_G;
177192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_DOUBLE;
177292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
177392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
177492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_FLOAT_F_UPPER:
177592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UPPER;
177692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
177792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_FLOAT_F:
177892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_DOUBLE;
177992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
178092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
178192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_POINTER:
1782b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if (sizeof(trio_pointer_t) == sizeof(trio_ulonglong_t))
1783b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		flags |= FLAGS_QUAD;
1784b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      else if (sizeof(trio_pointer_t) == sizeof(long))
1785b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		flags |= FLAGS_LONG;
178692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_POINTER;
178792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
178892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
178992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_COUNT:
179092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_COUNT;
179192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
179292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
179392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(SPECIFIER_HEXFLOAT)
179492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# if defined(SPECIFIER_HEXFLOAT_UPPER)
179592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_HEXFLOAT_UPPER:
179692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags |= FLAGS_UPPER;
179792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* FALLTHROUGH */
179892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard# endif
179992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_HEXFLOAT:
180092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      base = BASE_HEX;
180192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_DOUBLE;
180292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
180392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
180492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
180592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(FORMAT_ERRNO)
180692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case SPECIFIER_ERRNO:
180792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      parameters[pos].type = FORMAT_ERRNO;
180892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
180992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
181092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
181170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#if defined(SPECIFIER_USER_DEFINED_BEGIN)
181270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case SPECIFIER_USER_DEFINED_BEGIN:
181370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      {
181470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		unsigned int max;
181570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		int without_namespace = TRUE;
1816f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
181770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		parameters[pos].type = FORMAT_USER_DEFINED;
181870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		parameters[pos].user_name[0] = NIL;
181970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		tmpformat = (char *)&format[index];
1820f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
182170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		while ((ch = format[index]))
182270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  {
182370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    index++;
182470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    if (ch == SPECIFIER_USER_DEFINED_END)
182570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      {
182670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			if (without_namespace)
182770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			  {
182870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    /* We must get the handle first */
182970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    parameters[pos].type = FORMAT_PARAMETER;
183070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    parameters[pos].indexAfterSpecifier = index;
183170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    parameters[pos].flags = FLAGS_USER_DEFINED;
183270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    /* Adjust parameters for insertion of new one */
183370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    pos++;
183470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    usedEntries[currentParam] += 1;
183570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    parameters[pos].type = FORMAT_USER_DEFINED;
183670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    currentParam++;
183770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    indices[currentParam] = pos;
183870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    if (currentParam > maxParam)
183970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			      maxParam = currentParam;
184070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			  }
184170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			/* Copy the user data */
184270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			max = (unsigned int)(&format[index] - tmpformat);
184370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			if (max > MAX_USER_DATA)
184470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			  max = MAX_USER_DATA;
1845026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			trio_copy_max(parameters[pos].user_data,
1846026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      max,
1847026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      tmpformat);
184870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			break; /* while */
184970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      }
185070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    if (ch == SPECIFIER_USER_DEFINED_SEPARATOR)
185170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      {
185270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			without_namespace = FALSE;
185370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			/* Copy the namespace for later looking-up */
185470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			max = (int)(&format[index] - tmpformat);
185570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			if (max > MAX_USER_NAME)
185670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			  max = MAX_USER_NAME;
1857026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			trio_copy_max(parameters[pos].user_name,
1858026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      max,
1859026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      tmpformat);
186070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			tmpformat = (char *)&format[index];
186170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      }
186270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  }
186370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		if (ch != SPECIFIER_USER_DEFINED_END)
186470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
186570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      }
186670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      break;
186770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */
1868f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
186992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    default:
187092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Bail out completely to make the error more obvious */
187192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard              return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
187292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
187392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
187492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /*  Count the number of times this entry has been used */
187592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  usedEntries[currentParam] += 1;
1876f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
187792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Find last sticky parameters */
1878b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (gotSticky && !(flags & FLAGS_STICKY))
187992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
188092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      for (i = pos - 1; i >= 0; i--)
188192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
188292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (parameters[i].type == FORMAT_PARAMETER)
188392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    continue;
188492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if ((parameters[i].flags & FLAGS_STICKY) &&
188592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      (parameters[i].type == parameters[pos].type))
188692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
188792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      /* Do not overwrite current qualifiers */
188870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY);
188992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (width == NO_WIDTH)
189092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			width = parameters[i].width;
189192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (precision == NO_PRECISION)
189292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			precision = parameters[i].precision;
189392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (base == NO_BASE)
189492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			base = parameters[i].base;
189592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      break;
189692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
189792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
189892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
1899f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
190092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  parameters[pos].indexAfterSpecifier = index;
190192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  parameters[pos].flags = flags;
190292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  parameters[pos].width = width;
190392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  parameters[pos].precision = precision;
190492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base;
190592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  parameters[pos].varsize = varsize;
190692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  pos++;
1907f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
190870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  if (! positional)
190992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    parameterPosition++;
1910f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
191192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	} /* if identifier */
1912f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
191392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    } /* while format characters left */
191492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
191592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  for (num = 0; num <= maxParam; num++)
191692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
191792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (usedEntries[num] != 1)
191892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
191992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (usedEntries[num] == 0) /* gap detected */
192092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    return TRIO_ERROR_RETURN(TRIO_EGAP, num);
192192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else /* double references detected */
192292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    return TRIO_ERROR_RETURN(TRIO_EDBLREF, num);
192392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
1924f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
192592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      i = indices[num];
192692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
192770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /*
192870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * FORMAT_PARAMETERS are only present if they must be read,
192992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       * so it makes no sense to check the ignore flag (besides,
193092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       * the flags variable is not set for that particular type)
193192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       */
193292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if ((parameters[i].type != FORMAT_PARAMETER) &&
193392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  (parameters[i].flags & FLAGS_IGNORE))
193492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	continue; /* for all arguments */
193592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
193670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /*
193770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * The stack arguments are read according to ANSI C89
193892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       * default argument promotions:
193992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *
194092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  char           = int
194192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  short          = int
194292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  unsigned char  = unsigned int
194392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  unsigned short = unsigned int
194492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  float          = double
194592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *
194692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       * In addition to the ANSI C89 these types are read (the
194792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       * default argument promotions of C99 has not been
194892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       * considered yet)
194992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *
195092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  long long
195192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  long double
195292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  size_t
195392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  ptrdiff_t
195492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       *  intmax_t
195592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       */
195692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      switch (parameters[i].type)
195792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
195892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_GROUP:
195992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_STRING:
1960906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
1961906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  if (flags & FLAGS_WIDECHAR)
1962906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    {
1963906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      parameters[i].data.wstring = (argarray == NULL)
19640f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_wchar_t *)
1965b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		: (trio_wchar_t *)(argarray[num]);
1966906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    }
1967906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  else
1968906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
1969906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    {
1970906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      parameters[i].data.string = (argarray == NULL)
19710f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		? va_arg(TRIO_VA_LIST_DEREF(arglist), char *)
1972906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		: (char *)(argarray[num]);
1973906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    }
197492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
197592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
1976b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(FORMAT_USER_DEFINED)
1977b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	case FORMAT_USER_DEFINED:
1978b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
197992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_POINTER:
198092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_COUNT:
198192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_UNKNOWN:
1982906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  parameters[i].data.pointer = (argarray == NULL)
19830f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat	    ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t )
198470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    : argarray[num];
198592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
198692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
198792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_CHAR:
198892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_INT:
198992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (TYPE_SCAN == type)
199092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
1991906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese              if (argarray == NULL)
1992f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                parameters[i].data.pointer =
19930f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat                  (trio_pointer_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t);
199470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese              else
199570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                {
199670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                  if (parameters[i].type == FORMAT_CHAR)
199770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                    parameters[i].data.pointer =
1998b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard                      (trio_pointer_t)((char *)argarray[num]);
199970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                  else if (parameters[i].flags & FLAGS_SHORT)
200070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                    parameters[i].data.pointer =
2001b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard                      (trio_pointer_t)((short *)argarray[num]);
200270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                  else
200370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                    parameters[i].data.pointer =
2004b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard                      (trio_pointer_t)((int *)argarray[num]);
200570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                }
200692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
200792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else
200892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
2009906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(QUALIFIER_VARSIZE) || defined(QUALIFIER_FIXED_SIZE)
2010026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      if (parameters[i].flags
2011026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		  & (FLAGS_VARSIZE_PARAMETER | FLAGS_FIXED_SIZE))
201292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
2013906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER)
2014906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
2015906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      /*
2016906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       * Variable sizes are mapped onto the fixed sizes, in
2017906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       * accordance with integer promotion.
2018906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       *
2019906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       * Please note that this may not be portable, as we
2020906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       * only guess the size, not the layout of the numbers.
2021906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       * For example, if int is little-endian, and long is
2022906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       * big-endian, then this will fail.
2023906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		       */
2024906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned;
2025906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
2026906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else
2027906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
2028906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      /* Used for the I<bits> modifiers */
2029906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      varsize = parameters[i].varsize;
2030906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
203170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  parameters[i].flags &= ~FLAGS_ALL_VARSIZES;
2032f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
203392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (varsize <= (int)sizeof(int))
203492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    ;
203592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (varsize <= (int)sizeof(long))
203692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    parameters[i].flags |= FLAGS_LONG;
203792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_INTMAX_T)
2038906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else if (varsize <= (int)sizeof(trio_longlong_t))
203992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    parameters[i].flags |= FLAGS_QUAD;
204092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
204192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    parameters[i].flags |= FLAGS_INTMAX_T;
204292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#else
204392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
204492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    parameters[i].flags |= FLAGS_QUAD;
204592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
204692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
204770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif /* defined(QUALIFIER_VARSIZE) */
204892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
204992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (parameters[i].flags & FLAGS_SIZE_T)
2050906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		parameters[i].data.number.as_unsigned = (argarray == NULL)
20510f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), size_t)
2052906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  : (trio_uintmax_t)(*((size_t *)argarray[num]));
205392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
205492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
205592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_PTRDIFF_T)
205692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (parameters[i].flags & FLAGS_PTRDIFF_T)
2057906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		parameters[i].data.number.as_unsigned = (argarray == NULL)
20580f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), ptrdiff_t)
2059906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num]));
206092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
206192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
206292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_INTMAX_T)
206392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (parameters[i].flags & FLAGS_INTMAX_T)
2064906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		parameters[i].data.number.as_unsigned = (argarray == NULL)
20650f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_intmax_t)
2066906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num]));
206792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
206892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
206992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (parameters[i].flags & FLAGS_QUAD)
2070906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		parameters[i].data.number.as_unsigned = (argarray == NULL)
20710f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_ulonglong_t)
2072906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num]));
207392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else if (parameters[i].flags & FLAGS_LONG)
2074906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		parameters[i].data.number.as_unsigned = (argarray == NULL)
20750f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), long)
2076906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  : (trio_uintmax_t)(*((long *)argarray[num]));
207792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
207870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		{
2079906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (argarray == NULL)
20800f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		    parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), int);
208170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  else
208270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    {
208370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      if (parameters[i].type == FORMAT_CHAR)
2084906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((char *)argarray[num]));
208570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      else if (parameters[i].flags & FLAGS_SHORT)
2086906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((short *)argarray[num]));
208770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      else
2088906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((int *)argarray[num]));
208970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    }
209070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		}
209192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
209292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
209392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
209492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_PARAMETER:
209570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  /*
209670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	   * The parameter for the user-defined specifier is a pointer,
209770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	   * whereas the rest (width, precision, base) uses an integer.
209870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	   */
209970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  if (parameters[i].flags & FLAGS_USER_DEFINED)
2100906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    parameters[i].data.pointer = (argarray == NULL)
21010f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat	      ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t )
210270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      : argarray[num];
210370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  else
2104906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    parameters[i].data.number.as_unsigned = (argarray == NULL)
21050f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat	      ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), int)
2106906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      : (trio_uintmax_t)(*((int *)argarray[num]));
210792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
210892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
210992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_DOUBLE:
211092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (TYPE_SCAN == type)
211192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
2112b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if (parameters[i].flags & FLAGS_LONGDOUBLE)
2113906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		parameters[i].data.longdoublePointer = (argarray == NULL)
21140f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_long_double_t *)
2115b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  : (trio_long_double_t *)argarray[num];
211692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
211770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                {
2118b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  if (parameters[i].flags & FLAGS_LONG)
2119b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    parameters[i].data.doublePointer = (argarray == NULL)
21200f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		      ? va_arg(TRIO_VA_LIST_DEREF(arglist), double *)
2121b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      : (double *)argarray[num];
2122b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  else
2123b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    parameters[i].data.doublePointer = (argarray == NULL)
21240f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		      ? (double *)va_arg(TRIO_VA_LIST_DEREF(arglist), float *)
2125b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      : (double *)((float *)argarray[num]);
212670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese                }
212792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
212892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else
212992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
2130b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if (parameters[i].flags & FLAGS_LONGDOUBLE)
2131906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		parameters[i].data.longdoubleNumber = (argarray == NULL)
21320f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_long_double_t)
2133b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  : (trio_long_double_t)(*((trio_long_double_t *)argarray[num]));
213492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
213570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		{
2136906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (argarray == NULL)
2137026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		    parameters[i].data.longdoubleNumber =
21380f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		      (trio_long_double_t)va_arg(TRIO_VA_LIST_DEREF(arglist), double);
213970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  else
214070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    {
214170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      if (parameters[i].flags & FLAGS_SHORT)
2142026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			parameters[i].data.longdoubleNumber =
2143b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  (trio_long_double_t)(*((float *)argarray[num]));
214470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      else
2145026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			parameters[i].data.longdoubleNumber =
2146b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  (trio_long_double_t)(*((double *)argarray[num]));
214770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    }
214870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		}
214992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
215092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
215192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
215292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(FORMAT_ERRNO)
215392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case FORMAT_ERRNO:
2154b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  parameters[i].data.errorNumber = save_errno;
215592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
215692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
215792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
215892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	default:
215992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
216092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
216192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    } /* for all specifiers */
216292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return num;
216392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
216492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
216592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
216692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
216792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
2168026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * FORMATTING
216992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
217092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard ************************************************************************/
217192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
217292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
217392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
2174026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioWriteNumber
217592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
217692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Description:
217792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  Output a number.
217892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  The complexity of this function is a result of the complexity
217992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  of the dependencies of the flags.
218092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
2181026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
2182b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioWriteNumber
2183b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS6((self, number, flags, width, precision, base),
2184b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
2185b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_uintmax_t number,
2186a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
2187b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width,
2188b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int precision,
2189b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int base)
219092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
219192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  BOOLEAN_T isNegative;
2192a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  BOOLEAN_T isNumberZero;
2193a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  BOOLEAN_T isPrecisionZero;
2194a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  BOOLEAN_T ignoreNumber;
2195906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1];
219692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char *bufferend;
219792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char *pointer;
2198026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  TRIO_CONST char *digits;
219992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i;
220092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int length;
220192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char *p;
220292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int count;
220392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
220492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
220592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self->OutStream));
2206026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));
220792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
220870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;
2209b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (base == NO_BASE)
2210b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    base = BASE_DECIMAL;
221192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2212a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  isNumberZero = (number == 0);
2213a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  isPrecisionZero = (precision == 0);
2214a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  ignoreNumber = (isNumberZero
2215a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		  && isPrecisionZero
2216a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		  && !((flags & FLAGS_ALTERNATIVE) && (base == BASE_OCTAL)));
2217a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard
2218a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  if (flags & FLAGS_UNSIGNED)
2219a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    {
2220a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      isNegative = FALSE;
2221a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      flags &= ~FLAGS_SHOWSIGN;
2222a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    }
2223a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  else
2224a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    {
2225a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      isNegative = ((trio_intmax_t)number < 0);
2226a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      if (isNegative)
2227a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	number = -((trio_intmax_t)number);
2228a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    }
222992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
223092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_QUAD)
2231906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    number &= (trio_ulonglong_t)-1;
223292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else if (flags & FLAGS_LONG)
223392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    number &= (unsigned long)-1;
223492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else
223592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    number &= (unsigned int)-1;
2236f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
223792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Build number */
223892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  pointer = bufferend = &buffer[sizeof(buffer) - 1];
223992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  *pointer-- = NIL;
224092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  for (i = 1; i < (int)sizeof(buffer); i++)
224192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
224292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      *pointer-- = digits[number % base];
224392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      number /= base;
224492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (number == 0)
224592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	break;
224692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2247b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if ((flags & FLAGS_QUOTE) && TrioFollowedBySeparator(i + 1))
224892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
224992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /*
225092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * We are building the number from the least significant
225192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * to the most significant digit, so we have to copy the
225292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * thousand separator backwards
225392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   */
2254b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  length = internalThousandSeparatorLength;
225592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (((int)(pointer - buffer) - length) > 0)
225692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
225770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      p = &internalThousandSeparator[length - 1];
225892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      while (length-- > 0)
225992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		*pointer-- = *p--;
226092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
226192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
226292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
226392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2264a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  if (! ignoreNumber)
2265a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    {
2266a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      /* Adjust width */
2267a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      width -= (bufferend - pointer) - 1;
2268a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    }
226992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
227092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Adjust precision */
227192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (NO_PRECISION != precision)
227292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
227392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      precision -= (bufferend - pointer) - 1;
227492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (precision < 0)
227592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	precision = 0;
227692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      flags |= FLAGS_NILPADDING;
227792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
227892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2279a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  /* Calculate padding */
2280a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION)))
2281a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? precision
2282a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : 0;
2283f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
228492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Adjust width further */
228592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
228692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    width--;
2287a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)
228892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
228992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      switch (base)
229092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
229192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_BINARY:
229292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_HEX:
229392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  width -= 2;
229492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
229592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_OCTAL:
2296a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  if (!(flags & FLAGS_NILPADDING) || (count == 0))
2297a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	    width--;
229892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
229992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	default:
230092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
230192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
230292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
230392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
230492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Output prefixes spaces if needed */
230592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (! ((flags & FLAGS_LEFTADJUST) ||
230692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	 ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION))))
230792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
230892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      while (width-- > count)
230992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, CHAR_ADJUST);
231092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
231192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
231292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* width has been adjusted for signs and alternatives */
231392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (isNegative)
231492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    self->OutStream(self, '-');
231592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else if (flags & FLAGS_SHOWSIGN)
231692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    self->OutStream(self, '+');
231792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else if (flags & FLAGS_SPACE)
231892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    self->OutStream(self, ' ');
231992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2320a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  /* Prefix is not written when the value is zero */
2321a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)
232292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
232392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      switch (base)
232492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
232592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_BINARY:
232692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, '0');
232792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b');
232892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
232992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
233092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_OCTAL:
2331a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  if (!(flags & FLAGS_NILPADDING) || (count == 0))
2332a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	    self->OutStream(self, '0');
233392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
233492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
233592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_HEX:
233692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, '0');
233792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
233892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
233992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
234092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	default:
234192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
234292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	} /* switch base */
234392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
234492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
234592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Output prefixed zero padding if needed */
234692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_NILPADDING)
234792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
234892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (precision == NO_PRECISION)
234992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	precision = width;
235092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      while (precision-- > 0)
235192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
235292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, '0');
235392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  width--;
235492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
235592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
235692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2357a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  if (! ignoreNumber)
235892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2359a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      /* Output the number itself */
2360a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      while (*(++pointer))
2361a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	{
2362a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  self->OutStream(self, *pointer);
2363a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	}
236492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
236592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
236692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Output trailing spaces if needed */
236792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_LEFTADJUST)
236892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
236992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      while (width-- > 0)
237092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, CHAR_ADJUST);
237192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
237292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
237392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
237492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
2375026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioWriteStringCharacter
2376906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *
2377906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * Description:
2378906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *  Output a single character of a string
2379906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
2380026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
2381b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioWriteStringCharacter
2382b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((self, ch, flags),
2383b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
2384b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int ch,
2385a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags)
2386906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese{
2387906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (flags & FLAGS_ALTERNATIVE)
2388906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2389b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (! isprint(ch))
2390906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
2391906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  /*
2392906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * Non-printable characters are converted to C escapes or
2393906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * \number, if no C escape exists.
2394906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   */
2395906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  self->OutStream(self, CHAR_BACKSLASH);
2396906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  switch (ch)
2397906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    {
2398906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\007': self->OutStream(self, 'a'); break;
2399906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\b': self->OutStream(self, 'b'); break;
2400906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\f': self->OutStream(self, 'f'); break;
2401906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\n': self->OutStream(self, 'n'); break;
2402906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\r': self->OutStream(self, 'r'); break;
2403906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\t': self->OutStream(self, 't'); break;
2404906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\v': self->OutStream(self, 'v'); break;
2405906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case '\\': self->OutStream(self, '\\'); break;
2406906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    default:
2407906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      self->OutStream(self, 'x');
2408b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      TrioWriteNumber(self, (trio_uintmax_t)ch,
2409906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			      FLAGS_UNSIGNED | FLAGS_NILPADDING,
2410906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			      2, 2, BASE_HEX);
2411906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      break;
2412906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    }
2413906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
2414906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      else if (ch == CHAR_BACKSLASH)
2415906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
2416906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  self->OutStream(self, CHAR_BACKSLASH);
2417906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  self->OutStream(self, CHAR_BACKSLASH);
2418906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
2419906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      else
2420906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
2421906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  self->OutStream(self, ch);
2422906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
2423906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2424906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  else
2425906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2426906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      self->OutStream(self, ch);
2427906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2428906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese}
2429906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2430906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
2431026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioWriteString
243292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
243392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * Description:
243492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  Output a string
243592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
2436026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
2437b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioWriteString
2438b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS5((self, string, flags, width, precision),
2439b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
2440b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *string,
2441a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
2442b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width,
2443b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int precision)
244492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
244592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int length;
244692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int ch;
244792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
244892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
244992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self->OutStream));
245092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
245192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (string == NULL)
245292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2453026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      string = internalNullString;
2454026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      length = sizeof(internalNullString) - 1;
245592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Disable quoting for the null pointer */
245692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      flags &= (~FLAGS_QUOTE);
245792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      width = 0;
245892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
245992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else
246092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2461026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      length = trio_length(string);
246292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
246392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if ((NO_PRECISION != precision) &&
246492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      (precision < length))
246592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
246692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      length = precision;
246792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
246892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  width -= length;
246992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
247092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_QUOTE)
247192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    self->OutStream(self, CHAR_QUOTE);
247292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
247392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (! (flags & FLAGS_LEFTADJUST))
247492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
247592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      while (width-- > 0)
247692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, CHAR_ADJUST);
247792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
247892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
247992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  while (length-- > 0)
248092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
248192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* The ctype parameters must be an unsigned char (or EOF) */
2482906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      ch = (int)((unsigned char)(*string++));
2483906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      TrioWriteStringCharacter(self, ch, flags);
248492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
248592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
248692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_LEFTADJUST)
248792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
248892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      while (width-- > 0)
248992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, CHAR_ADJUST);
249092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
249192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_QUOTE)
249292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    self->OutStream(self, CHAR_QUOTE);
249392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
249492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
249592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
2496026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioWriteWideStringCharacter
2497906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *
2498906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * Description:
2499906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *  Output a wide string as a multi-byte sequence
250092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
2501906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
2502026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
2503b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioWriteWideStringCharacter
2504b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((self, wch, flags, width),
2505b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
2506b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_wchar_t wch,
2507a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
2508b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
250992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
2510906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int size;
251192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i;
2512906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int ch;
2513906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  char *string;
2514906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  char buffer[MB_LEN_MAX + 1];
251570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
2516906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (width == NO_WIDTH)
2517906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    width = sizeof(buffer);
2518f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2519906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  size = wctomb(buffer, wch);
2520906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if ((size <= 0) || (size > width) || (buffer[0] == NIL))
2521906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    return 0;
252292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2523906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  string = buffer;
2524906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  i = size;
2525906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  while ((width >= i) && (width-- > 0) && (i-- > 0))
252692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2527906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      /* The ctype parameters must be an unsigned char (or EOF) */
2528906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      ch = (int)((unsigned char)(*string++));
2529906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      TrioWriteStringCharacter(self, ch, flags);
2530906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2531906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  return size;
2532906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese}
2533906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_WIDECHAR */
2534906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2535906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
2536026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioWriteWideString
2537906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *
2538906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese * Description:
2539906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese *  Output a wide character string as a multi-byte string
2540906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
2541906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
2542026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
2543b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioWriteWideString
2544b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS5((self, wstring, flags, width, precision),
2545b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
2546b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST trio_wchar_t *wstring,
2547a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
2548b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width,
2549b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int precision)
2550906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese{
2551906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int length;
2552906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int size;
2553906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2554906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self));
2555906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self->OutStream));
2556906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2557906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
2558b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  (void)mblen(NULL, 0);
2559906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
2560f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2561906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (wstring == NULL)
2562906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2563906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      TrioWriteString(self, NULL, flags, width, precision);
2564906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      return;
2565906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2566f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2567906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (NO_PRECISION == precision)
2568906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2569906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      length = INT_MAX;
2570906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2571906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  else
2572906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2573906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      length = precision;
2574906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      width -= length;
2575906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2576906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2577906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (flags & FLAGS_QUOTE)
2578906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    self->OutStream(self, CHAR_QUOTE);
2579906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2580906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (! (flags & FLAGS_LEFTADJUST))
2581906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2582906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      while (width-- > 0)
2583906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	self->OutStream(self, CHAR_ADJUST);
2584906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2585906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2586906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  while (length > 0)
2587906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2588906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      size = TrioWriteWideStringCharacter(self, *wstring++, flags, length);
2589906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (size == 0)
2590906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	break; /* while */
2591906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      length -= size;
2592906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2593906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2594906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (flags & FLAGS_LEFTADJUST)
2595906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2596906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      while (width-- > 0)
2597906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	self->OutStream(self, CHAR_ADJUST);
2598906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
2599906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (flags & FLAGS_QUOTE)
2600906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    self->OutStream(self, CHAR_QUOTE);
2601906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese}
2602906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_WIDECHAR */
2603906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2604906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
2605026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioWriteDouble
2606b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
2607b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_211.htm
2608b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
2609b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * "5.2.4.2.2 paragraph #4
2610b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
2611b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  The accuracy [...] is implementation defined, as is the accuracy
2612b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  of the conversion between floating-point internal representations
2613b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  and string representations performed by the libray routine in
2614b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  <stdio.h>"
2615b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
2616b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/* FIXME: handle all instances of constant long-double number (L)
2617b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *   and *l() math functions.
2618906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
2619026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
2620b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioWriteDouble
2621b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS6((self, number, flags, width, precision, base),
2622b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
2623b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_long_double_t number,
2624a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
2625b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width,
2626b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int precision,
2627b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int base)
2628b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
2629b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t integerNumber;
2630b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t fractionNumber;
2631b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t workNumber;
2632906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int integerDigits;
2633906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int fractionDigits;
2634906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int exponentDigits;
2635b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int baseDigits;
2636b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int integerThreshold;
2637b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int fractionThreshold;
2638906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int expectedWidth;
2639b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int exponent = 0;
2640906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  unsigned int uExponent = 0;
2641b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int exponentBase;
2642b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t dblBase;
2643b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t dblIntegerBase;
2644b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t dblFractionBase;
2645b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t integerAdjust;
2646b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t fractionAdjust;
2647906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  BOOLEAN_T isNegative;
2648906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  BOOLEAN_T isExponentNegative = FALSE;
2649b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  BOOLEAN_T requireTwoDigitExponent;
2650906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  BOOLEAN_T isHex;
2651026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  TRIO_CONST char *digits;
2652b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  char *groupingPointer;
2653906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int i;
2654b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int index;
2655b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  BOOLEAN_T hasOnlyZeroes;
2656906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int zeroes = 0;
2657b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  register int trailingZeroes;
2658b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  BOOLEAN_T keepTrailingZeroes;
2659b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  BOOLEAN_T keepDecimalPoint;
2660b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_long_double_t epsilon;
2661f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2662906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self));
2663906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self->OutStream));
2664b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));
2665906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2666b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* Determine sign and look for special quantities */
2667b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  switch (trio_fpclassify_and_signbit(number, &isNegative))
2668906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
2669b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_FP_NAN:
267092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      TrioWriteString(self,
267192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      (flags & FLAGS_UPPER)
2672b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      ? NAN_UPPER
2673b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      : NAN_LOWER,
267492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      flags, width, precision);
267592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      return;
2676f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2677b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_FP_INFINITE:
2678b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (isNegative)
2679b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
2680b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Negative infinity */
2681b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  TrioWriteString(self,
2682b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  (flags & FLAGS_UPPER)
2683b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  ? "-" INFINITE_UPPER
2684b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  : "-" INFINITE_LOWER,
2685b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  flags, width, precision);
2686b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  return;
2687b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
2688b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
2689b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
2690b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Positive infinity */
2691b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  TrioWriteString(self,
2692b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  (flags & FLAGS_UPPER)
2693b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  ? INFINITE_UPPER
2694b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  : INFINITE_LOWER,
2695b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  flags, width, precision);
2696b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  return;
2697b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
269892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
269992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    default:
270070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /* Finitude */
270192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      break;
270292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
2703f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2704b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* Normal numbers */
2705b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (flags & FLAGS_LONGDOUBLE)
270692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2707b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      baseDigits = (base == 10)
2708b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	? LDBL_DIG
2709b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	: (int)floor(LDBL_MANT_DIG / TrioLogarithmBase(base));
2710b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      epsilon = LDBL_EPSILON;
2711b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
2712b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else if (flags & FLAGS_SHORT)
2713b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
2714b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      baseDigits = (base == BASE_DECIMAL)
2715b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	? FLT_DIG
2716b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	: (int)floor(FLT_MANT_DIG / TrioLogarithmBase(base));
2717b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      epsilon = FLT_EPSILON;
2718b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
2719b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
2720b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
2721b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      baseDigits = (base == BASE_DECIMAL)
2722b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	? DBL_DIG
2723b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	: (int)floor(DBL_MANT_DIG / TrioLogarithmBase(base));
2724b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      epsilon = DBL_EPSILON;
272592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
272692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
272770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;
272892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  isHex = (base == BASE_HEX);
2729b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (base == NO_BASE)
2730b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    base = BASE_DECIMAL;
2731b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  dblBase = (trio_long_double_t)base;
2732b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  keepTrailingZeroes = !( (flags & FLAGS_ROUNDING) ||
2733b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			  ( (flags & FLAGS_FLOAT_G) &&
2734b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			    !(flags & FLAGS_ALTERNATIVE) ) );
2735b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
2736b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (flags & FLAGS_ROUNDING)
2737b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    precision = baseDigits;
2738a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard
273992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (precision == NO_PRECISION)
2740a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    {
2741a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      if (isHex)
2742a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	{
2743a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  keepTrailingZeroes = FALSE;
2744a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  precision = FLT_MANT_DIG;
2745a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	}
2746a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      else
2747a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	{
2748a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  precision = FLT_DIG;
2749a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	}
2750a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    }
2751f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
275292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (isNegative)
275392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    number = -number;
2754906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2755b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (isHex)
2756b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    flags |= FLAGS_FLOAT_E;
2757f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2758b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (flags & FLAGS_FLOAT_G)
275992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
276092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (precision == 0)
276192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	precision = 1;
2762906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
2763b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if ((number < 1.0E-4) || (number > powl(base,
2764b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard					      (trio_long_double_t)precision)))
2765906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
2766906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  /* Use scientific notation */
2767906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  flags |= FLAGS_FLOAT_E;
2768906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
2769906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      else if (number < 1.0)
2770906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
2771906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  /*
2772906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * Use normal notation. If the integer part of the number is
2773906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * zero, then adjust the precision to include leading fractional
2774906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * zeros.
2775906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   */
2776b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  workNumber = TrioLogarithm(number, base);
2777b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  workNumber = TRIO_FABS(workNumber);
2778b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (workNumber - floorl(workNumber) < 0.001)
2779906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    workNumber--;
2780b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  zeroes = (int)floorl(workNumber);
2781906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
278292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
278392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
278492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_FLOAT_E)
278592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
278692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Scale the number */
2787b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      workNumber = TrioLogarithm(number, base);
2788450296070e14629141738fbb34b9a0ad13af1f02Bjorn Reese      if (trio_isinf(workNumber) == -1)
278992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
279092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  exponent = 0;
279192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Undo setting */
279292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (flags & FLAGS_FLOAT_G)
279392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    flags &= ~FLAGS_FLOAT_E;
279492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
279592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else
279692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
2797b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  exponent = (int)floorl(workNumber);
2798b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  number /= powl(dblBase, (trio_long_double_t)exponent);
279992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  isExponentNegative = (exponent < 0);
280092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  uExponent = (isExponentNegative) ? -exponent : exponent;
2801a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  if (isHex)
2802a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	    uExponent *= 4; /* log16(2) */
280392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* No thousand separators */
280492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  flags &= ~FLAGS_QUOTE;
280592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
280692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
280792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
2808b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  integerNumber = floorl(number);
2809b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  fractionNumber = number - integerNumber;
2810f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
281192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /*
281292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * Truncated number.
281392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   *
2814b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard   * Precision is number of significant digits for FLOAT_G
2815b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard   * and number of fractional digits for others.
281692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
2817b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  integerDigits = (integerNumber > epsilon)
2818b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    ? 1 + (int)TrioLogarithm(integerNumber, base)
281992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    : 1;
2820906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0))
282192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    ? precision - integerDigits
2822906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    : zeroes + precision;
2823b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
2824b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  dblFractionBase = TrioPower(base, fractionDigits);
2825f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2826b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  workNumber = number + 0.5 / dblFractionBase;
2827b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (floorl(number) != floorl(workNumber))
282892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2829906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (flags & FLAGS_FLOAT_E)
2830906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
2831906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */
2832b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  exponent++;
2833b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  isExponentNegative = (exponent < 0);
2834b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  uExponent = (isExponentNegative) ? -exponent : exponent;
2835a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  if (isHex)
2836a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	    uExponent *= 4; /* log16(2) */
2837b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  workNumber = (number + 0.5 / dblFractionBase) / dblBase;
2838b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  integerNumber = floorl(workNumber);
2839b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionNumber = workNumber - integerNumber;
2840906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
2841906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      else
2842906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
2843906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  /* Adjust if number was rounded up one digit (ie. 99 to 100) */
2844b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  integerNumber = floorl(number + 0.5);
2845b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionNumber = 0.0;
2846b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  integerDigits = (integerNumber > epsilon)
2847b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    ? 1 + (int)TrioLogarithm(integerNumber, base)
2848b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    : 1;
2849906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
285092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
2851b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
2852b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* Estimate accuracy */
2853b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  integerAdjust = fractionAdjust = 0.5;
2854b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (flags & FLAGS_ROUNDING)
285592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2856b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (integerDigits > baseDigits)
285792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
2858b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  integerThreshold = baseDigits;
2859b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionDigits = 0;
2860b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  dblFractionBase = 1.0;
2861b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionThreshold = 0;
2862b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  precision = 0; /* Disable decimal-point */
2863b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  integerAdjust = TrioPower(base, integerDigits - integerThreshold - 1);
2864b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionAdjust = 0.0;
286592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
2866b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
286792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
2868b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  integerThreshold = integerDigits;
2869b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionThreshold = fractionDigits - integerThreshold;
2870b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionAdjust = 1.0;
287192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
287292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
2873b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
287492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
2875b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      integerThreshold = INT_MAX;
2876b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      fractionThreshold = INT_MAX;
287792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
2878f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
287970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
288070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese   * Calculate expected width.
288192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   *  sign + integer part + thousands separators + decimal point
288292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   *  + fraction + exponent
288392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
2884b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  fractionAdjust /= dblFractionBase;
2885b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  hasOnlyZeroes = (floorl((fractionNumber + fractionAdjust) * dblFractionBase) < epsilon);
2886b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) ||
2887b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		       !((precision == 0) ||
2888b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard			 (!keepTrailingZeroes && hasOnlyZeroes)) );
2889b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (flags & FLAGS_FLOAT_E)
2890b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
2891b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      exponentDigits = (uExponent == 0)
2892b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	? 1
2893a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	: (int)ceil(TrioLogarithm((double)(uExponent + 1),
2894a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard				  (isHex) ? 10.0 : base));
2895b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
2896b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
2897b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    exponentDigits = 0;
2898b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  requireTwoDigitExponent = ((base == BASE_DECIMAL) && (exponentDigits == 1));
2899b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
2900b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  expectedWidth = integerDigits + fractionDigits
2901b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    + (keepDecimalPoint
2902b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard       ? internalDecimalPointLength
2903b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard       : 0)
2904b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    + ((flags & FLAGS_QUOTE)
2905b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard       ? TrioCalcThousandSeparatorLength(integerDigits)
2906b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard       : 0);
2907b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
290892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    expectedWidth += sizeof("-") - 1;
290992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (exponentDigits > 0)
2910906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    expectedWidth += exponentDigits +
2911b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      ((requireTwoDigitExponent ? sizeof("E+0") : sizeof("E+")) - 1);
291292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (isHex)
291392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    expectedWidth += sizeof("0X") - 1;
2914f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
291592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Output prefixing */
291692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_NILPADDING)
291792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
291892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Leading zeros must be after sign */
291992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (isNegative)
292092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, '-');
292192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else if (flags & FLAGS_SHOWSIGN)
292292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, '+');
2923b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else if (flags & FLAGS_SPACE)
2924b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	self->OutStream(self, ' ');
292592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (isHex)
292692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
292792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, '0');
292892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
292992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
293092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (!(flags & FLAGS_LEFTADJUST))
293192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
293292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  for (i = expectedWidth; i < width; i++)
293392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
293492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      self->OutStream(self, '0');
293592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
293692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
293792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
293892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else
293992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
294092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Leading spaces must be before sign */
294192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (!(flags & FLAGS_LEFTADJUST))
294292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
294392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  for (i = expectedWidth; i < width; i++)
294492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
294592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      self->OutStream(self, CHAR_ADJUST);
294692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
294792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
294892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (isNegative)
294992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, '-');
295092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else if (flags & FLAGS_SHOWSIGN)
295192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	self->OutStream(self, '+');
2952b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else if (flags & FLAGS_SPACE)
2953b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	self->OutStream(self, ' ');
295492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (isHex)
295592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
295692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, '0');
295792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
295892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
295992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
2960f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2961b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* Output the integer part and thousand separators */
2962b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  dblIntegerBase = 1.0 / TrioPower(base, integerDigits - 1);
2963b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  for (i = 0; i < integerDigits; i++)
2964b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
2965b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      workNumber = floorl(((integerNumber + integerAdjust) * dblIntegerBase));
2966b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (i > integerThreshold)
2967b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
2968b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Beyond accuracy */
2969b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  self->OutStream(self, digits[0]);
2970b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
2971b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
2972b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
2973b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  self->OutStream(self, digits[(int)fmodl(workNumber, dblBase)]);
2974b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
2975b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      dblIntegerBase *= dblBase;
2976f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2977b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE)
2978b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  && TrioFollowedBySeparator(integerDigits - i))
2979b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
2980b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  for (groupingPointer = internalThousandSeparator;
2981b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	       *groupingPointer != NIL;
2982b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	       groupingPointer++)
2983b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
2984b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      self->OutStream(self, *groupingPointer);
2985b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
2986b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
2987b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
2988f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
2989b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* Insert decimal point and build the fraction part */
2990b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trailingZeroes = 0;
2991b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
2992b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (keepDecimalPoint)
2993b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
2994b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (internalDecimalPoint)
2995b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
2996b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  self->OutStream(self, internalDecimalPoint);
2997b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
2998b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
2999b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
3000b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  for (i = 0; i < internalDecimalPointLength; i++)
3001b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
3002b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      self->OutStream(self, internalDecimalPointString[i]);
3003b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
3004b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
3005b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
3006b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3007b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  for (i = 0; i < fractionDigits; i++)
3008b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
3009b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if ((integerDigits > integerThreshold) || (i > fractionThreshold))
3010b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
3011b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /* Beyond accuracy */
3012b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  trailingZeroes++;
3013b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
3014b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
3015b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
3016b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionNumber *= dblBase;
3017b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionAdjust *= dblBase;
3018b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  workNumber = floorl(fractionNumber + fractionAdjust);
3019b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  fractionNumber -= workNumber;
3020b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  index = (int)fmodl(workNumber, dblBase);
3021b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (index == 0)
3022b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
3023b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      trailingZeroes++;
3024b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
3025b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  else
3026b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
3027b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      while (trailingZeroes > 0)
3028b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		{
3029b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  /* Not trailing zeroes after all */
3030b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  self->OutStream(self, digits[0]);
3031b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  trailingZeroes--;
3032b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		}
3033b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      self->OutStream(self, digits[index]);
3034b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
3035b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
3036b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
3037f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3038b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (keepTrailingZeroes)
303992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
3040b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      while (trailingZeroes > 0)
3041b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
3042b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  self->OutStream(self, digits[0]);
3043b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  trailingZeroes--;
3044b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
304592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
3046f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
304792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Output exponent */
304892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (exponentDigits > 0)
304992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
305092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->OutStream(self,
305192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      isHex
305292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      ? ((flags & FLAGS_UPPER) ? 'P' : 'p')
305392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      : ((flags & FLAGS_UPPER) ? 'E' : 'e'));
305492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->OutStream(self, (isExponentNegative) ? '-' : '+');
3055906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
3056906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      /* The exponent must contain at least two digits */
3057b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (requireTwoDigitExponent)
3058906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese        self->OutStream(self, '0');
3059906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
3060a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      if (isHex)
3061a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	base = 10.0;
3062b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      exponentBase = (int)TrioPower(base, exponentDigits - 1);
306392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      for (i = 0; i < exponentDigits; i++)
306492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
3065b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  self->OutStream(self, digits[(uExponent / exponentBase) % base]);
3066b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  exponentBase /= base;
306792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
306892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
306992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Output trailing spaces */
307092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_LEFTADJUST)
307192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
307292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      for (i = expectedWidth; i < width; i++)
307392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
307492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->OutStream(self, CHAR_ADJUST);
307592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
307692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
307792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
307892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
307992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
3080026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioFormatProcess
3081026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese *
3082026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * Description:
3083026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese *  This is the main engine for formatting output
308492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
3085026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
3086b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioFormatProcess
3087b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((data, format, parameters),
3088b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *data,
3089b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3090b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_parameter_t *parameters)
309192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
3092906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
309392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int charlen;
309492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
309592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i;
3096026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  TRIO_CONST char *string;
3097b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_pointer_t pointer;
3098a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  trio_flags_t flags;
309992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int width;
310092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int precision;
310192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int base;
310292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int index;
3103f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
310492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  index = 0;
310592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  i = 0;
3106906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
3107b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  (void)mblen(NULL, 0);
310892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
3109f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
311092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  while (format[index])
311192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
3112906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
311392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (! isascii(format[index]))
311492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
311592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  charlen = mblen(&format[index], MB_LEN_MAX);
3116b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  /*
3117b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   * Only valid multibyte characters are handled here. Invalid
3118b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   * multibyte characters (charlen == -1) are handled as normal
3119b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   * characters.
3120b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   */
3121b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (charlen != -1)
312292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
3123b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      while (charlen-- > 0)
3124b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		{
3125b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  data->OutStream(data, format[index++]);
3126b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		}
3127b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      continue; /* while characters left in formatting string */
312892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
312992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
3130906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
313192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (CHAR_IDENTIFIER == format[index])
313292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
313392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (CHAR_IDENTIFIER == format[index + 1])
313492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
313570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      data->OutStream(data, CHAR_IDENTIFIER);
313692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      index += 2;
313792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
313892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else
313992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
314092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Skip the parameter entries */
314192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      while (parameters[i].type == FORMAT_PARAMETER)
314292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		i++;
3143f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
314492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      flags = parameters[i].flags;
314592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
314692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Find width */
314792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      width = parameters[i].width;
314892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (flags & FLAGS_WIDTH_PARAMETER)
314992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
315092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* Get width from parameter list */
315170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  width = (int)parameters[width].data.number.as_signed;
3152a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		  if (width < 0)
3153a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		    {
3154a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		      /*
3155a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		       * A negative width is the same as the - flag and
3156a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		       * a positive width.
3157a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		       */
3158a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		      flags |= FLAGS_LEFTADJUST;
3159a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		      flags &= ~FLAGS_NILPADDING;
3160a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		      width = -width;
3161a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		    }
316292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
3163f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
316492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Find precision */
316592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (flags & FLAGS_PRECISION)
316692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
316792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  precision = parameters[i].precision;
316892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_PRECISION_PARAMETER)
316992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
317092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      /* Get precision from parameter list */
317170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      precision = (int)parameters[precision].data.number.as_signed;
3172a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		      if (precision < 0)
3173a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			{
3174a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			  /*
3175a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			   * A negative precision is the same as no
3176a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			   * precision
3177a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			   */
3178a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			  precision = NO_PRECISION;
3179a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			}
318092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
318192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
318292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
318392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
318492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  precision = NO_PRECISION;
318592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
318692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
318792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Find base */
318892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      base = parameters[i].base;
318992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (flags & FLAGS_BASE_PARAMETER)
319092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
319192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* Get base from parameter list */
319270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  base = (int)parameters[base].data.number.as_signed;
319392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
3194f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
319592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      switch (parameters[i].type)
319692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
319792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_CHAR:
319892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_QUOTE)
319970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    data->OutStream(data, CHAR_QUOTE);
320092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (! (flags & FLAGS_LEFTADJUST))
320192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
320292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      while (--width > 0)
320370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			data->OutStream(data, CHAR_ADJUST);
320492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
3205906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
3206906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (flags & FLAGS_WIDECHAR)
3207906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
3208906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      TrioWriteWideStringCharacter(data,
3209b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard						   (trio_wchar_t)parameters[i].data.number.as_signed,
3210906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese						   flags,
3211906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese						   NO_WIDTH);
3212906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
3213906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else
3214906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
3215026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		    {
3216026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		      TrioWriteStringCharacter(data,
3217026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese					       (int)parameters[i].data.number.as_signed,
3218026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese					       flags);
3219026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		    }
322092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
322192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_LEFTADJUST)
322292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
322392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      while(--width > 0)
322470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			data->OutStream(data, CHAR_ADJUST);
322592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
322692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_QUOTE)
322770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    data->OutStream(data, CHAR_QUOTE);
322892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
322992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_CHAR */
323092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
323192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_INT:
323292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  TrioWriteNumber(data,
3233b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard				  parameters[i].data.number.as_unsigned,
323492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  flags,
323592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  width,
323692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  precision,
323792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  base);
323892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
323992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_INT */
324092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
324192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_DOUBLE:
324292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  TrioWriteDouble(data,
324392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  parameters[i].data.longdoubleNumber,
324492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  flags,
324592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  width,
324692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  precision,
324792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				  base);
324892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_DOUBLE */
324992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
325092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_STRING:
3251906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
3252906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (flags & FLAGS_WIDECHAR)
3253906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
3254906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      TrioWriteWideString(data,
3255906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  parameters[i].data.wstring,
3256906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  flags,
3257906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  width,
3258906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  precision);
3259906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
3260906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else
3261906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
3262906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    {
3263906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      TrioWriteString(data,
3264906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      parameters[i].data.string,
3265906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      flags,
3266906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      width,
3267906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      precision);
3268906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    }
326992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_STRING */
327092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
327192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_POINTER:
327270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  {
3273026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		    trio_reference_t reference;
3274f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
327570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    reference.data = data;
327670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    reference.parameter = &parameters[i];
327770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    trio_print_pointer(&reference, parameters[i].data.pointer);
327870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  }
327992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_POINTER */
328092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
328192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_COUNT:
328292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  pointer = parameters[i].data.pointer;
328392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (NULL != pointer)
328492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
328570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      /*
328670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		       * C99 paragraph 7.19.6.1.8 says "the number of
328792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		       * characters written to the output stream so far by
328892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		       * this call", which is data->committed
328992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		       */
329092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
329192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (flags & FLAGS_SIZE_T)
329292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			*(size_t *)pointer = (size_t)data->committed;
329392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else
329492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
329592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_PTRDIFF_T)
329692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (flags & FLAGS_PTRDIFF_T)
329792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			*(ptrdiff_t *)pointer = (ptrdiff_t)data->committed;
329892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else
329992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
330092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_INTMAX_T)
330192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (flags & FLAGS_INTMAX_T)
3302906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			*(trio_intmax_t *)pointer = (trio_intmax_t)data->committed;
330392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else
330492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
330592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      if (flags & FLAGS_QUAD)
330692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
3307906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			  *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->committed;
330892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
330992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else if (flags & FLAGS_LONG)
331092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
331192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  *(long int *)pointer = (long int)data->committed;
331292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
331392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else if (flags & FLAGS_SHORT)
331492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
331592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  *(short int *)pointer = (short int)data->committed;
331692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
331792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      else
331892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			{
331992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  *(int *)pointer = (int)data->committed;
332092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			}
332192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
332292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_COUNT */
332392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
332492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_PARAMETER:
332592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_PARAMETER */
332692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
332792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(FORMAT_ERRNO)
332892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		case FORMAT_ERRNO:
3329026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		  string = trio_error(parameters[i].data.errorNumber);
333092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (string)
333192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
333292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      TrioWriteString(data,
333392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      string,
333492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      flags,
333592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      width,
333692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      precision);
333792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
333892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
333992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
334070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      data->OutStream(data, '#');
334192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      TrioWriteNumber(data,
3342b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard				      (trio_uintmax_t)parameters[i].data.errorNumber,
334392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      flags,
334492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      width,
334592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      precision,
334692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				      BASE_DECIMAL);
334792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
334892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break; /* FORMAT_ERRNO */
334970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif /* defined(FORMAT_ERRNO) */
335092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
335170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#if defined(FORMAT_USER_DEFINED)
335270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		case FORMAT_USER_DEFINED:
335370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  {
3354026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		    trio_reference_t reference;
3355026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese		    trio_userdef_t *def = NULL;
335670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
335770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    if (parameters[i].user_name[0] == NIL)
335870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      {
335970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			/* Use handle */
336070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			if ((i > 0) ||
336170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			    (parameters[i - 1].type == FORMAT_PARAMETER))
3362026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			  def = (trio_userdef_t *)parameters[i - 1].data.pointer;
336370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      }
336470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    else
336570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      {
336670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			/* Look up namespace */
336770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese			def = TrioFindNamespace(parameters[i].user_name, NULL);
336870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      }
336970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    if (def) {
337070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      reference.data = data;
337170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      reference.parameter = &parameters[i];
337270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      def->callback(&reference);
337370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		    }
337470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  }
337570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  break;
337670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif /* defined(FORMAT_USER_DEFINED) */
3377f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
337892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		default:
337992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  break;
338092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		} /* switch parameter type */
338192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
338292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Prepare for next */
338392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      index = parameters[i].indexAfterSpecifier;
338492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      i++;
338592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
338692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
338792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else /* not identifier */
338892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
338970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  data->OutStream(data, format[index++]);
339092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
339192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
339292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return data->processed;
339392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
339492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
339592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
3396026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioFormatRef
339792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
3398026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
3399b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioFormatRef
3400b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((reference, format, arglist, argarray),
3401b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_reference_t *reference,
3402b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
34030f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat	   TRIO_VA_LIST_PTR arglist,
3404b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *argarray)
340592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
340670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
3407026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_parameter_t parameters[MAX_PARAMETERS];
340892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
3409026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray);
341070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (status < 0)
341170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    return status;
341292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
3413026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioFormatProcess(reference->data, format, parameters);
3414026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (reference->data->error != 0)
3415026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
3416026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      status = reference->data->error;
3417026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
3418026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return status;
341992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
342092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
342192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
3422026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioFormat
342392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
3424026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
3425b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioFormat
3426b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray),
3427b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t destination,
342870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	   size_t destinationSize,
3429b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   void (*OutStream) TRIO_PROTO((trio_class_t *, int)),
3430026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	   TRIO_CONST char *format,
34310f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat	   TRIO_VA_LIST_PTR arglist,
3432b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *argarray)
343392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
343470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
3435026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_class_t data;
3436026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_parameter_t parameters[MAX_PARAMETERS];
343792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
343870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(OutStream));
343970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
344092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
344170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  memset(&data, 0, sizeof(data));
344270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  data.OutStream = OutStream;
344370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  data.location = destination;
344470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  data.max = destinationSize;
3445026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  data.error = 0;
344670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
344770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#if defined(USE_LOCALE)
344870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (NULL == internalLocaleValues)
344970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    {
345070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      TrioSetLocale();
345170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    }
345270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese#endif
345370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3454026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray);
345570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (status < 0)
345670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    return status;
345770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3458026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioFormatProcess(&data, format, parameters);
3459026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (data.error != 0)
3460026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
3461026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      status = data.error;
3462026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
3463026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return status;
346470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
346570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
346670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
3467026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioOutStreamFile
346870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
3469026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
3470b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioOutStreamFile
3471b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, output),
3472b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
3473b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int output)
347470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
3475b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  FILE *file;
347670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
347770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(self));
3478b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(self->location));
347970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3480b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  file = (FILE *)self->location;
348170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  self->processed++;
3482026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (fputc(output, file) == EOF)
3483026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
3484026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->error = TRIO_ERROR_RETURN(TRIO_EOF, 0);
3485026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
3486026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  else
3487026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
3488026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->committed++;
3489026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
349070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
349170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
349270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
3493026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioOutStreamFileDescriptor
349470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
3495026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
3496b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioOutStreamFileDescriptor
3497b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, output),
3498b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
3499b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int output)
350070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
3501b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int fd;
350270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  char ch;
350370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
350470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(self));
350570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3506b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  fd = *((int *)self->location);
350770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  ch = (char)output;
350892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  self->processed++;
3509026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (write(fd, &ch, sizeof(char)) == -1)
3510026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
3511026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);
3512026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
3513026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  else
3514026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
3515026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->committed++;
3516026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
351792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
351892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
351992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
3520b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * TrioOutStreamCustom
3521b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
3522b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE void
3523b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioOutStreamCustom
3524b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, output),
3525b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
3526b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int output)
3527b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
3528b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int status;
3529b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t *data;
3530b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3531b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(self));
3532b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(self->location));
3533b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3534b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data = (trio_custom_t *)self->location;
3535b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (data->stream.out)
3536b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
3537b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      status = (data->stream.out)(data->closure, output);
3538b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (status >= 0)
3539b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
3540b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  self->committed++;
3541b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
3542b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      else
3543b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
3544b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (self->error == 0)
3545b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
3546b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      self->error = TRIO_ERROR_RETURN(TRIO_ECUSTOM, -status);
3547b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
3548b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
3549b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
3550b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  self->processed++;
3551b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
3552b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3553b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
3554026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioOutStreamString
355592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
3556026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
3557b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioOutStreamString
3558b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, output),
3559b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
3560b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int output)
356192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
3562b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  char **buffer;
356392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
356492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
3565b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(self->location));
356692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
3567b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  buffer = (char **)self->location;
356892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  **buffer = (char)output;
356992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  (*buffer)++;
357092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  self->processed++;
357192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  self->committed++;
357292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
357392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
357492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
3575026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioOutStreamStringMax
357692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
3577026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
3578b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioOutStreamStringMax
3579b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, output),
3580b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
3581b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int output)
358292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
358392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char **buffer;
358492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
358592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
3586b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(self->location));
3587f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
358892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  buffer = (char **)self->location;
358992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
359092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (self->processed < self->max)
359192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
359292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      **buffer = (char)output;
359392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      (*buffer)++;
359492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->committed++;
359592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
359692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  self->processed++;
359792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
359892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
359992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
3600026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioOutStreamStringDynamic
360192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
3602026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
3603b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioOutStreamStringDynamic
3604b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, output),
3605b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
3606b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int output)
360792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
360892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
360992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self->location));
361092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
3611026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (self->error == 0)
361292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
3613026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_xstring_append_char((trio_string_t *)self->location,
3614026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			       (char)output);
3615026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->committed++;
361692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
3617026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  /* The processed variable must always be increased */
361892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  self->processed++;
361992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
362092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
362192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
3622026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese *
3623026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * Formatted printing functions
3624026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese *
3625026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese ************************************************************************/
3626026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3627026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(TRIO_DOCUMENTATION)
3628026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese# include "doc/doc_printf.h"
3629026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif
3630026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/** @addtogroup Printf
3631026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    @{
3632026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese*/
3633026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3634026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/*************************************************************************
363570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * printf
363670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
3637026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3638026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3639026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to standard output stream.
3640026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3641026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3642026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param ... Arguments.
3643026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3644026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3645026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3646b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_printf
3647b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS2((format, va_alist),
3648b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
3649b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
365070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
365170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
365270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
365370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
365470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3655f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3656b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
36570f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioFormat(stdout, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL);
3658b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
365970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
366070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
366170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3662026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3663026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to standard output stream.
3664026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3665026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3666026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3667026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3668026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3669026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3670b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vprintf
3671b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((format, args),
3672b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3673b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
367470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
367570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
367670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
36770f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  return TrioFormat(stdout, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL);
367870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
367970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3680026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3681026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to standard output stream.
3682026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3683026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3684026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3685026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3686026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3687026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3688b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_printfv
3689b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((format, args),
3690b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3691b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t * args)
369270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
369370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
369470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3695b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioFormat(stdout, 0, TrioOutStreamFile, format, NULL, args);
369670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
369770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
369870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
369970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * fprintf
370070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
3701026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3702026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3703026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to file.
3704026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3705026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param file File pointer.
3706026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3707026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param ... Arguments.
3708026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3709026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3710026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3711b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_fprintf
3712b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((file, format, va_alist),
3713b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    FILE *file,
3714b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
3715b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
371670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
371770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
371870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
371970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
372070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(file));
372170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3722f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3723b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
37240f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioFormat(file, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL);
3725b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
372670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
372770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
372870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3729026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3730026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to file.
3731026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3732026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param file File pointer.
3733026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3734026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3735026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3736026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3737026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3738b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vfprintf
3739b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((file, format, args),
3740b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   FILE *file,
3741b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3742b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
374370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
374470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(file));
374570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3746f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
37470f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  return TrioFormat(file, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL);
374870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
374970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3750026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3751026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to file.
3752026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3753026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param file File pointer.
3754026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3755026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3756026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3757026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3758026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3759b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_fprintfv
3760b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((file, format, args),
3761b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   FILE *file,
3762b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3763b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t * args)
376470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
376570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(file));
376670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3767f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3768b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args);
376970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
377070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
377170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
377270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * dprintf
377370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
3774026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3775026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3776026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to file descriptor.
3777026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3778026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param fd File descriptor.
3779026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3780026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param ... Arguments.
3781026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3782026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3783026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3784b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_dprintf
3785b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((fd, format, va_alist),
3786b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    int fd,
3787b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
3788b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
378970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
379070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
379170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
379270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
379370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3794f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3795b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
37960f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, TRIO_VA_LIST_ADDR(args), NULL);
3797b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
379870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
379970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
380070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3801026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3802026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to file descriptor.
3803026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3804026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param fd File descriptor.
3805026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3806026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3807026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3808026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3809026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3810b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vdprintf
3811b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((fd, format, args),
3812b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int fd,
3813b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3814b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
381570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
381670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3817f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
38180f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, TRIO_VA_LIST_ADDR(args), NULL);
381970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
382070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3821026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3822026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to file descriptor.
3823026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3824026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param fd File descriptor.
3825026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3826026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3827026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3828026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3829026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3830b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_dprintfv
3831b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((fd, format, args),
3832b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int fd,
3833b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3834b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
383570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
383670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3837f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3838b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args);
3839b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
3840b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3841b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
3842b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * cprintf
3843b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
3844b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC int
3845b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_cprintf
3846b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS4((stream, closure, format, va_alist),
3847b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    trio_outstream_t stream,
3848b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    trio_pointer_t closure,
3849b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
3850b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
3851b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
3852b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int status;
3853b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  va_list args;
3854b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t data;
3855b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3856b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(stream));
3857b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
3858b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3859b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
3860b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.stream.out = stream;
3861b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.closure = closure;
38620f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioFormat(&data, 0, TrioOutStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL);
3863b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
3864b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return status;
3865b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
3866b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3867b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC int
3868b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vcprintf
3869b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((stream, closure, format, args),
3870b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_outstream_t stream,
3871b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t closure,
3872b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3873b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
3874b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
3875b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t data;
3876b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3877b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(stream));
3878b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
3879b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3880b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.stream.out = stream;
3881b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.closure = closure;
38820f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  return TrioFormat(&data, 0, TrioOutStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL);
3883b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
3884b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3885b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC int
3886b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_cprintfv
3887b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((stream, closure, format, args),
3888b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_outstream_t stream,
3889b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t closure,
3890b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3891b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   void **args)
3892b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
3893b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t data;
3894b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3895b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(stream));
3896b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
3897b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
3898b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.stream.out = stream;
3899b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.closure = closure;
3900b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioFormat(&data, 0, TrioOutStreamCustom, format, NULL, args);
390170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
390270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
390370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
390470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * sprintf
390570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
3906026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3907026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3908026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to string.
3909026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3910026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param buffer Output string.
3911026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3912026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param ... Arguments.
3913026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3914026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3915026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3916b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_sprintf
3917b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((buffer, format, va_alist),
3918b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    char *buffer,
3919b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
3920b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
392170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
392270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
392370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
392470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
392570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
392670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
3927f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3928b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
39290f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, TRIO_VA_LIST_ADDR(args), NULL);
393070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  *buffer = NIL; /* Terminate with NIL character */
3931b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
393270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
393370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
393470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3935026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3936026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to string.
3937026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3938026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param buffer Output string.
3939026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3940026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3941026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3942026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3943026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3944b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vsprintf
3945b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((buffer, format, args),
3946b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *buffer,
3947b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3948b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
394970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
395070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
395170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
395270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
395370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
395470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
39550f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, TRIO_VA_LIST_ADDR(args), NULL);
395670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  *buffer = NIL;
395770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
395870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
395970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3960026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3961026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print to string.
3962026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3963026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param buffer Output string.
3964026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3965026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
3966026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3967026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3968026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3969b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_sprintfv
3970b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((buffer, format, args),
3971b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *buffer,
3972b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
3973b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
397470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
397570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
397670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
397770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
397870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
397970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
3980b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, NULL, args);
398170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  *buffer = NIL;
398270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
398370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
398470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
398570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
398670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * snprintf
398770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
3988026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3989026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
3990026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print at most @p max characters to string.
3991026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
3992026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param buffer Output string.
3993026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param max Maximum number of characters to print.
3994026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
3995026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param ... Arguments.
3996026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
3997026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
3998026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
3999b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_snprintf
4000b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS4((buffer, max, format, va_alist),
4001b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    char *buffer,
4002b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    size_t max,
4003b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
4004b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
400570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
400670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
400770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
400870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
400970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
401070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
401170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4012b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
4013026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
40140f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		      TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL);
4015026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (max > 0)
401670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    *buffer = NIL;
4017b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
401870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
401970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
402070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4021026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
4022026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print at most @p max characters to string.
4023026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
4024026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param buffer Output string.
4025026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param max Maximum number of characters to print.
4026026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
4027026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
4028026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
4029026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
4030026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
4031b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vsnprintf
4032b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((buffer, max, format, args),
4033b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *buffer,
4034b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   size_t max,
4035b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
4036b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
403770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
403870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
403970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
404070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
404170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
404270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4043026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
40440f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		      TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL);
4045026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (max > 0)
404670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    *buffer = NIL;
404770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
404870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
404970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4050026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
4051026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Print at most @p max characters to string.
4052026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
4053026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param buffer Output string.
4054026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param max Maximum number of characters to print.
4055026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
4056026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param args Arguments.
4057026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of printed characters.
4058026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
4059026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
4060b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_snprintfv
4061b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((buffer, max, format, args),
4062b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *buffer,
4063b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   size_t max,
4064b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
4065b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
406670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
406770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
406870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
406970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
407070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
407170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4072026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
4073b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      TrioOutStreamStringMax, format, NULL, args);
4074026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (max > 0)
407570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    *buffer = NIL;
407670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
407770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
407870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
407970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
408070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * snprintfcat
408170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * Appends the new string to the buffer string overwriting the '\0'
408270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * character at the end of buffer.
408370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
4084026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
4085b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_snprintfcat
4086b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS4((buffer, max, format, va_alist),
4087b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    char *buffer,
4088b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    size_t max,
4089b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
4090b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
409170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
409270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
409370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
409470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  size_t buf_len;
409570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4096b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
409770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
409870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
409970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
410070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4101026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  buf_len = trio_length(buffer);
410270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  buffer = &buffer[buf_len];
410370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4104026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioFormat(&buffer, max - 1 - buf_len,
41050f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		      TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL);
4106b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
410770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  *buffer = NIL;
410870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
410970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
411070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4111026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
4112b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vsnprintfcat
4113b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((buffer, max, format, args),
4114b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *buffer,
4115b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   size_t max,
4116b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
4117b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
411870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
411970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
412070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  size_t buf_len;
4121f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
412270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
412370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
412470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4125026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  buf_len = trio_length(buffer);
412670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  buffer = &buffer[buf_len];
4127026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioFormat(&buffer, max - 1 - buf_len,
41280f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		      TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL);
412970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  *buffer = NIL;
413070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
413170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
413270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
413370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
413470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_aprintf
413570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
413670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
413770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/* Deprecated */
4138026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC char *
4139b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_aprintf
4140b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS2((format, va_alist),
4141b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
4142b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
414370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
414470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
4145026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_string_t *info;
4146026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  char *result = NULL;
414770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
414870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
4149f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4150026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  info = trio_xstring_duplicate("");
4151026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (info)
4152026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
4153b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      TRIO_VA_START(args, format);
4154026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
41550f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		       format, TRIO_VA_LIST_ADDR(args), NULL);
4156b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      TRIO_VA_END(args);
4157026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
4158026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_string_terminate(info);
4159026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      result = trio_string_extract(info);
4160026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_string_destroy(info);
4161026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
4162026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return result;
416370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
416470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
416570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/* Deprecated */
4166026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC char *
4167b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vaprintf
4168b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((format, args),
4169b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
4170b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
417170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4172026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_string_t *info;
4173026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  char *result = NULL;
4174f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
417570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
4176f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4177026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  info = trio_xstring_duplicate("");
4178026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (info)
4179026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
4180026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
41810f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		       format, TRIO_VA_LIST_ADDR(args), NULL);
4182026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_string_terminate(info);
4183026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      result = trio_string_extract(info);
4184026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_string_destroy(info);
4185026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
4186026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return result;
418770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
418870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4189026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
4190b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_asprintf
4191b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((result, format, va_alist),
4192b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    char **result,
4193b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
4194b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
419570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
419670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
419770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
4198026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_string_t *info;
419970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
420070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
420170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4202026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  *result = NULL;
4203f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4204026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  info = trio_xstring_duplicate("");
4205026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (info == NULL)
4206026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
4207026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
4208026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
4209026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  else
4210026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
4211b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      TRIO_VA_START(args, format);
4212026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
42130f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat			  format, TRIO_VA_LIST_ADDR(args), NULL);
4214b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      TRIO_VA_END(args);
4215026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      if (status >= 0)
4216026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	{
4217026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  trio_string_terminate(info);
4218026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  *result = trio_string_extract(info);
4219026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	}
4220026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_string_destroy(info);
4221026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
422270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
422370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
422470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4225026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
4226b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vasprintf
4227b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((result, format, args),
4228b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char **result,
4229b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
4230b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
423170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
423270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
4233026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_string_t *info;
4234f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
423570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
423670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4237026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  *result = NULL;
4238f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4239026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  info = trio_xstring_duplicate("");
4240026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (info == NULL)
4241026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
4242026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
4243026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
4244026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  else
4245026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
4246026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
42470f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat			  format, TRIO_VA_LIST_ADDR(args), NULL);
4248026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      if (status >= 0)
4249026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	{
4250026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  trio_string_terminate(info);
4251026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  *result = trio_string_extract(info);
4252026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	}
4253026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_string_destroy(info);
4254026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
425570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
425670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
425770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4258026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/** @} End of Printf documentation module */
425970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
426070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
426170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese *
4262026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * CALLBACK
426370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese *
426470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese ************************************************************************/
426570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4266026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(TRIO_DOCUMENTATION)
4267026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese# include "doc/doc_register.h"
4268026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif
4269026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
4270026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @addtogroup UserDefined
4271026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @{
4272026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese*/
4273026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
4274b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if TRIO_EXTENSION
4275b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
427670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
4277026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * trio_register
427870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
4279026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
4280026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
4281026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Register new user-defined specifier.
4282026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
4283026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param callback
4284026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param name
4285026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Handle.
4286026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
4287f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel VeillardTRIO_PUBLIC trio_pointer_t
4288b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_register
4289b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((callback, name),
4290b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_callback_t callback,
4291b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *name)
429270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4293026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_userdef_t *def;
4294026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_userdef_t *prev = NULL;
429570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
429670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (callback == NULL)
429770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    return NULL;
429870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
429970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (name)
430070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    {
4301906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      /* Handle built-in namespaces */
4302906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (name[0] == ':')
4303906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
4304026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  if (trio_equal(name, ":enter"))
4305906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    {
4306906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      internalEnterCriticalRegion = callback;
4307906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    }
4308026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  else if (trio_equal(name, ":leave"))
4309906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    {
4310906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      internalLeaveCriticalRegion = callback;
4311906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    }
4312906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  return NULL;
4313906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
4314f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
431570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /* Bail out if namespace is too long */
4316026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      if (trio_length(name) >= MAX_USER_NAME)
431770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	return NULL;
4318f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
431970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /* Bail out if namespace already is registered */
432070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      def = TrioFindNamespace(name, &prev);
432170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      if (def)
432270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	return NULL;
432370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    }
4324f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4325026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t));
432670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (def)
432770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    {
4328906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (internalEnterCriticalRegion)
4329906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	(void)internalEnterCriticalRegion(NULL);
4330f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
433170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      if (name)
433270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	{
433370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  /* Link into internal list */
433470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  if (prev == NULL)
433570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    internalUserDef = def;
433670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  else
433770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    prev->next = def;
433870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	}
433970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /* Initialize */
434070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      def->callback = callback;
434170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      def->name = (name == NULL)
434270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	? NULL
4343026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	: trio_duplicate(name);
434470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      def->next = NULL;
4345906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
4346906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (internalLeaveCriticalRegion)
4347906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	(void)internalLeaveCriticalRegion(NULL);
434870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    }
4349b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return (trio_pointer_t)def;
435070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
435170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
4352b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/**
4353b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard   Unregister an existing user-defined specifier.
4354b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
4355b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard   @param handle
435670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
435770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4358b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_unregister
4359b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((handle),
4360b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t handle)
436170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4362026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_userdef_t *self = (trio_userdef_t *)handle;
4363026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_userdef_t *def;
4364026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_userdef_t *prev = NULL;
436570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
436670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(self));
436770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
436870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (self->name)
436970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    {
437070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      def = TrioFindNamespace(self->name, &prev);
437170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      if (def)
437270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	{
4373906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  if (internalEnterCriticalRegion)
4374906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    (void)internalEnterCriticalRegion(NULL);
4375f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
437670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  if (prev == NULL)
437770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    internalUserDef = NULL;
437870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  else
437970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    prev->next = def->next;
4380f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4381906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  if (internalLeaveCriticalRegion)
4382906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    (void)internalLeaveCriticalRegion(NULL);
438370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	}
4384026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      trio_destroy(self->name);
438570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    }
4386906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  TRIO_FREE(self);
438770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
438870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
438970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
439070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_format [public]
439170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
4392026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_CONST char *
4393b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_format
4394b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4395b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
439670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4397b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(FORMAT_USER_DEFINED)
4398026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
4399b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
4400f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4401026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return (((trio_reference_t *)ref)->parameter->user_data);
440270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
440370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
440470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
440570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_argument [public]
440670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
4407f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillardtrio_pointer_t
4408b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_argument
4409b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4410b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
441170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4412b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(FORMAT_USER_DEFINED)
4413026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
4414b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
4415f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4416026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return ((trio_reference_t *)ref)->parameter->data.pointer;
441770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
441870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
441970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
442070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_width / trio_set_width [public]
442170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
442270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4423b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_width
4424b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4425b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
442670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4427026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return ((trio_reference_t *)ref)->parameter->width;
442870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
442970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
443070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4431b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_width
4432b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, width),
4433b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4434b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
443570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4436026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  ((trio_reference_t *)ref)->parameter->width = width;
443770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
443870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
443970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
444070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_precision / trio_set_precision [public]
444170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
444270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4443b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_precision
4444b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4445b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
444670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4447026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return (((trio_reference_t *)ref)->parameter->precision);
444870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
444970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
445070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4451b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_precision
4452b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, precision),
4453b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4454b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int precision)
445570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4456026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  ((trio_reference_t *)ref)->parameter->precision = precision;
445770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
445870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
445970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
446070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_base / trio_set_base [public]
446170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
446270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4463b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_base
4464b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4465b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
446670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4467026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return (((trio_reference_t *)ref)->parameter->base);
446870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
446970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
447070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4471b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_base
4472b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, base),
4473b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4474b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int base)
447570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4476026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  ((trio_reference_t *)ref)->parameter->base = base;
447770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
447870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
447970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
448070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_long / trio_set_long [public]
448170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
448270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4483b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_long
4484b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4485b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
448670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4487a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONG)
4488a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4489a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
449070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
449170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
449270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4493b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_long
4494b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_long),
4495b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4496b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_long)
449770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
449870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_long)
4499026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONG;
450070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4501026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONG;
450270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
450370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
450470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
450570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_longlong / trio_set_longlong [public]
450670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
450770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4508b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_longlong
4509b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4510b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
451170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4512a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUAD)
4513a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4514a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
451570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
451670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
451770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4518b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_longlong
4519b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_longlong),
4520b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4521b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_longlong)
452270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
452370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_longlong)
4524026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUAD;
452570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4526026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUAD;
452770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
452870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
452970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
453070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_longdouble / trio_set_longdouble [public]
453170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
453270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4533b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_longdouble
4534b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4535b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
453670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4537a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONGDOUBLE)
4538a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4539a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
454070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
454170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
454270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4543b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_longdouble
4544b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_longdouble),
4545b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4546b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_longdouble)
454770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
454870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_longdouble)
4549026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONGDOUBLE;
455070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4551026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE;
455270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
455370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
455470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
455570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_short / trio_set_short [public]
455670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
455770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4558b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_short
4559b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4560b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
456170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4562a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORT)
4563a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4564a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
456570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
456670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
456770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4568b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_short
4569b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_short),
4570b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4571b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_short)
457270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
457370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_short)
4574026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORT;
457570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4576026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORT;
457770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
457870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
457970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
458070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_shortshort / trio_set_shortshort [public]
458170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
458270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4583b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_shortshort
4584b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4585b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
458670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4587a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORTSHORT)
4588a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4589a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
459070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
459170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
459270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4593b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_shortshort
4594b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_shortshort),
4595b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4596b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_shortshort)
459770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
459870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_shortshort)
4599026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORTSHORT;
460070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4601026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT;
460270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
460370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
460470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
460570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_alternative / trio_set_alternative [public]
460670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
460770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4608b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_alternative
4609b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4610b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
461170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4612a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_ALTERNATIVE)
4613a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4614a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
461570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
461670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
461770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4618b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_alternative
4619b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_alternative),
4620b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4621b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_alternative)
462270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
462370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_alternative)
4624026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_ALTERNATIVE;
462570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4626026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE;
462770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
462870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
462970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
463070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_alignment / trio_set_alignment [public]
463170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
463270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4633b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_alignment
4634b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4635b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
463670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4637a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LEFTADJUST)
4638a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4639a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
464070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
464170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
464270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4643b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_alignment
4644b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_leftaligned),
4645b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4646b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_leftaligned)
464770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
464870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_leftaligned)
4649026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LEFTADJUST;
465070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4651026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST;
465270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
465370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
465470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
465570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_spacing /trio_set_spacing [public]
465670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
465770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4658b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_spacing
4659b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4660b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
466170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4662a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SPACE)
4663a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4664a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
466570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
466670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
466770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4668b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_spacing
4669b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_space),
4670b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4671b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_space)
467270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
467370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_space)
4674026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SPACE;
467570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4676026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SPACE;
467770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
467870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
467970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
468070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_sign / trio_set_sign [public]
468170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
468270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4683b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_sign
4684b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4685b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
468670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4687a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHOWSIGN)
4688a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4689a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
469070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
469170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
469270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4693b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_sign
4694b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_sign),
4695b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4696b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_sign)
469770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
469870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_sign)
4699026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHOWSIGN;
470070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4701026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN;
470270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
470370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
470470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
470570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_padding / trio_set_padding [public]
470670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
470770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4708b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_padding
4709b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4710b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
471170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4712a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_NILPADDING)
4713a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4714a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
471570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
471670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
471770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4718b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_padding
4719b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_padding),
4720b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4721b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_padding)
472270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
472370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_padding)
4724026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_NILPADDING;
472570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4726026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_NILPADDING;
472770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
472870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
472970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
473070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_quote / trio_set_quote [public]
473170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
473270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reeseint
4733b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_quote
4734b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4735b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
473670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4737a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUOTE)
4738a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4739a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
474070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
474170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
474270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4743b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_quote
4744b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_quote),
4745b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4746b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_quote)
474770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
474870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_quote)
4749026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUOTE;
475070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4751026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUOTE;
475270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
475370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
475470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
475570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_upper / trio_set_upper [public]
475692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
475792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillardint
4758b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_upper
4759b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4760b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
476192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
4762a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_UPPER)
4763a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4764a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
476570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
476692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
476770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4768b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_upper
4769b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_upper),
4770b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4771b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_upper)
477270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
477370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_upper)
4774026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_UPPER;
477570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4776026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_UPPER;
477792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
477892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
477992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
478070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_largest / trio_set_largest [public]
478192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
4782906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_C99
478392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillardint
4784b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_largest
4785b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4786b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
478792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
4788a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_INTMAX_T)
4789a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4790a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
479170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
479292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
479370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4794b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_largest
4795b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_largest),
4796b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4797b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_largest)
479870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
479970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_largest)
4800026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_INTMAX_T;
480170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4802026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_INTMAX_T;
480392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
480492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
480592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
480692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
480770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_ptrdiff / trio_set_ptrdiff [public]
480892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
480992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillardint
4810b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_ptrdiff
4811b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4812b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
481392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
4814a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_PTRDIFF_T)
4815a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4816a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
481770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
481870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
481970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4820b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_ptrdiff
4821b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_ptrdiff),
4822b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4823b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_ptrdiff)
482470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
482570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_ptrdiff)
4826026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_PTRDIFF_T;
482770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4828026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T;
482992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
483092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
483192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
483270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_get_size / trio_set_size [public]
483392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
4834906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_C99
483592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillardint
4836b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_get_size
4837b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((ref),
4838b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref)
483992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
4840a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SIZE_T)
4841a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    ? TRUE
4842a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard    : FALSE;
484370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
484492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
484570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4846b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_set_size
4847b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, is_size),
4848b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4849b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int is_size)
485070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
485170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (is_size)
4852026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SIZE_T;
485370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
4854026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SIZE_T;
485592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
485692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
485792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
485892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
485970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_print_int [public]
486092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
486170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4862b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_print_int
4863b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, number),
4864b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4865b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int number)
486692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
4867026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_reference_t *self = (trio_reference_t *)ref;
486870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
486970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  TrioWriteNumber(self->data,
4870b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  (trio_uintmax_t)number,
487170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->flags,
487270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->width,
487370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->precision,
487470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->base);
487570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
487692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
487770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
487870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_print_uint [public]
487970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
488070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4881b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_print_uint
4882b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, number),
4883b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4884b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   unsigned int number)
488570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4886026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_reference_t *self = (trio_reference_t *)ref;
488770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
488870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  TrioWriteNumber(self->data,
4889b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  (trio_uintmax_t)number,
489070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->flags | FLAGS_UNSIGNED,
489170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->width,
489270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->precision,
489370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->base);
489470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
489592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
489670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
489770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_print_double [public]
489870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
489970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4900b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_print_double
4901b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, number),
4902b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4903b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   double number)
490470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4905026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_reference_t *self = (trio_reference_t *)ref;
490670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
490770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  TrioWriteDouble(self->data,
490870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  number,
490970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->flags,
491070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->width,
491170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->precision,
491270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->base);
491370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
491470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
491570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
491670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_print_string [public]
491770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
491870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4919b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_print_string
4920b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, string),
4921b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4922b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *string)
492370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4924026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_reference_t *self = (trio_reference_t *)ref;
492570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
492670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  TrioWriteString(self->data,
492770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  string,
492870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->flags,
492970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->width,
493070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		  self->parameter->precision);
493170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
493270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
493370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
4934b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * trio_print_ref [public]
4935b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
4936b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardint
4937b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_print_ref
4938b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((ref, format, va_alist),
4939b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    trio_pointer_t ref,
4940b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
4941b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
4942b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
4943b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int status;
4944b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  va_list arglist;
4945b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
4946b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
4947f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4948b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(arglist, format);
49490f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioFormatRef((trio_reference_t *)ref, format, TRIO_VA_LIST_ADDR(arglist), NULL);
4950b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(arglist);
4951b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return status;
4952b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
4953b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
4954b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
4955b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * trio_vprint_ref [public]
4956b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
4957b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardint
4958b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vprint_ref
4959b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((ref, format, arglist),
4960b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4961b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
4962b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list arglist)
4963b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
4964b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
4965f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
49660f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  return TrioFormatRef((trio_reference_t *)ref, format, TRIO_VA_LIST_ADDR(arglist), NULL);
4967b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
4968b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
4969b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
4970b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * trio_printv_ref [public]
4971b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
4972b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardint
4973b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_printv_ref
4974b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((ref, format, argarray),
4975b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4976b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
4977b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *argarray)
4978b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
4979b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
4980f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4981b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioFormatRef((trio_reference_t *)ref, format, NULL, argarray);
4982b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
4983b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
4984b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif /* TRIO_EXTENSION */
4985b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
4986b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
498770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * trio_print_pointer [public]
498870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
498970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reesevoid
4990b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_print_pointer
4991b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((ref, pointer),
4992b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t ref,
4993b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t pointer)
499470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
4995026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_reference_t *self = (trio_reference_t *)ref;
4996a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  trio_flags_t flags;
4997906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  trio_uintmax_t number;
499870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
499970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if (NULL == pointer)
500070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    {
5001026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      TRIO_CONST char *string = internalNullString;
500270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      while (*string)
500370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	self->data->OutStream(self->data, *string++);
500470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    }
500570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  else
500670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    {
500770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /*
500870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * The subtraction of the null pointer is a workaround
500970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * to avoid a compiler warning. The performance overhead
501070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * is negligible (and likely to be removed by an
5011b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard       * optimizing compiler). The (char *) casting is done
501270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * to please ANSI C++.
501370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       */
5014906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      number = (trio_uintmax_t)((char *)pointer - (char *)0);
501570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /* Shrink to size of pointer */
5016906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      number &= (trio_uintmax_t)-1;
501770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      flags = self->parameter->flags;
501870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE |
501970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	        FLAGS_NILPADDING);
502070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      TrioWriteNumber(self->data,
5021b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      number,
502270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      flags,
502370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      POINTER_WIDTH,
502470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      NO_PRECISION,
502570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		      BASE_HEX);
502670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese    }
502792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
502892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
5029b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/** @} End of UserDefined documentation module */
5030b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
503192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5032b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
5033b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * LOCALES
5034b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
5035b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard ************************************************************************/
5036b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
5037b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
5038b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * trio_locale_set_decimal_point
5039b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
5040b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Decimal point can only be one character. The input argument is a
5041b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * string to enable multibyte characters. At most MB_LEN_MAX characters
5042b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * will be used.
504392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5044b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC void
5045b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_locale_set_decimal_point
5046b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((decimalPoint),
5047b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *decimalPoint)
504892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
5049b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(USE_LOCALE)
5050b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (NULL == internalLocaleValues)
5051b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
5052b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      TrioSetLocale();
5053b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
5054b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
5055b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  internalDecimalPointLength = trio_length(decimalPoint);
5056b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (internalDecimalPointLength == 1)
5057b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
5058b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      internalDecimalPoint = *decimalPoint;
5059b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
5060b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
5061b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
5062b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      internalDecimalPoint = NIL;
5063b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      trio_copy_max(internalDecimalPointString,
5064b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    sizeof(internalDecimalPointString),
5065b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    decimalPoint);
5066b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
506792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
506892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
506992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5070b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * trio_locale_set_thousand_separator
5071b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
5072b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * See trio_locale_set_decimal_point
507392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5074b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC void
5075b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_locale_set_thousand_separator
5076b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((thousandSeparator),
5077b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *thousandSeparator)
507892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
5079b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(USE_LOCALE)
5080b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (NULL == internalLocaleValues)
5081b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
5082b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      TrioSetLocale();
5083b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
5084b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
5085b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_copy_max(internalThousandSeparator,
5086b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		sizeof(internalThousandSeparator),
5087b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		thousandSeparator);
5088b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  internalThousandSeparatorLength = trio_length(internalThousandSeparator);
508970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
509092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
509170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
5092b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * trio_locale_set_grouping
5093b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
5094b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Array of bytes. Reversed order.
5095b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
5096b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  CHAR_MAX : No further grouping
5097b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  0        : Repeat last group for the remaining digits (not necessary
5098b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *             as C strings are zero-terminated)
5099b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  n        : Set current group to n
5100b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *
5101b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * Same order as the grouping attribute in LC_NUMERIC.
510270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
5103b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC void
5104b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_locale_set_grouping
5105b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((grouping),
5106b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *grouping)
510770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
5108b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#if defined(USE_LOCALE)
5109b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (NULL == internalLocaleValues)
5110b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
5111b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      TrioSetLocale();
5112b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
5113b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard#endif
5114b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_copy_max(internalGrouping,
5115b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		sizeof(internalGrouping),
5116b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		grouping);
511792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
511870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
511992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
512092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
512192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
5122026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * SCANNING
512392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
512492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard ************************************************************************/
512592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
512692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5127026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioSkipWhitespaces
512892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5129026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
5130b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioSkipWhitespaces
5131b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((self),
5132b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self)
513392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
513492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int ch;
513592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
513692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  ch = self->current;
513792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  while (isspace(ch))
513892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
513992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->InStream(self, &ch);
514092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
514192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return ch;
514292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
514392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
514492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5145026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioGetCollation
5146906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
5147906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_EXTENSION
5148026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
5149b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioGetCollation(TRIO_NOARGS)
5150906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese{
5151906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int i;
5152906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int j;
5153906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int k;
5154906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  char first[2];
5155906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  char second[2];
5156906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5157a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  /* This is computationally expensive */
5158906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  first[1] = NIL;
5159906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  second[1] = NIL;
5160906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5161906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
5162906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      k = 0;
5163906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      first[0] = (char)i;
5164906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      for (j = 0; j < MAX_CHARACTER_CLASS; j++)
5165906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
5166906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  second[0] = (char)j;
5167026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  if (trio_equal_locale(first, second))
5168906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    internalCollationArray[i][k++] = (char)j;
5169906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
5170906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      internalCollationArray[i][k] = NIL;
5171906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
5172906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese}
5173906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
5174906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5175906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
5176026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioGetCharacterClass
517792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
517892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * FIXME:
517992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  multibyte
518092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5181026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
5182b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioGetCharacterClass
5183b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((format, indexPointer, flagsPointer, characterclass),
5184b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
5185b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *indexPointer,
5186a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t *flagsPointer,
5187b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *characterclass)
518892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
518992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int index = *indexPointer;
519092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i;
519192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char ch;
519292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char range_begin;
519392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  char range_end;
519492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
519592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  *flagsPointer &= ~FLAGS_EXCLUDE;
519692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
519792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (format[index] == QUALIFIER_CIRCUMFLEX)
519892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
519992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      *flagsPointer |= FLAGS_EXCLUDE;
520092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      index++;
520192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
520270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
520370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese   * If the ungroup character is at the beginning of the scanlist,
520492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * it will be part of the class, and a second ungroup character
520592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * must follow to end the group.
520692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
520792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (format[index] == SPECIFIER_UNGROUP)
520892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
520992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      characterclass[(int)SPECIFIER_UNGROUP]++;
521092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      index++;
521192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
521270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
521370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese   * Minus is used to specify ranges. To include minus in the class,
521492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * it must be at the beginning of the list
521592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
521692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (format[index] == QUALIFIER_MINUS)
521792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
521892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      characterclass[(int)QUALIFIER_MINUS]++;
521992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      index++;
522092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
522192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Collect characters */
522292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  for (ch = format[index];
5223906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       (ch != SPECIFIER_UNGROUP) && (ch != NIL);
522492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       ch = format[++index])
522592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
522692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      switch (ch)
522792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
522892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case QUALIFIER_MINUS: /* Scanlist ranges */
5229f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
523070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  /*
523170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	   * Both C99 and UNIX98 describes ranges as implementation-
523292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * defined.
523392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   *
523492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * We support the following behaviour (although this may
523592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * change as we become wiser)
523692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * - only increasing ranges, ie. [a-b] but not [b-a]
523792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * - transitive ranges, ie. [a-b-c] == [a-c]
523892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * - trailing minus, ie. [a-] is interpreted as an 'a'
523992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   *   and a '-'
524092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   * - duplicates (although we can easily convert these
524192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   *   into errors)
524292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   */
524392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  range_begin = format[index - 1];
524492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  range_end = format[++index];
524592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (range_end == SPECIFIER_UNGROUP)
524692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
524792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Trailing minus is included */
524892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      characterclass[(int)ch]++;
524992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      ch = range_end;
525092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* for */
525192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
525292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (range_end == NIL)
525392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
525492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (range_begin > range_end)
525592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    return TRIO_ERROR_RETURN(TRIO_ERANGE, index);
5256f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
525792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  for (i = (int)range_begin; i <= (int)range_end; i++)
525892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    characterclass[i]++;
5259f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
526092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  ch = range_end;
526192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
5262f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5263906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_EXTENSION
526492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
5265906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	case SPECIFIER_GROUP:
5266f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5267906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  switch (format[index + 1])
526892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
5269906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case QUALIFIER_DOT: /* Collating symbol */
5270906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      /*
5271906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	       * FIXME: This will be easier to implement when multibyte
5272906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	       * characters have been implemented. Until now, we ignore
5273906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	       * this feature.
5274906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	       */
5275906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      for (i = index + 2; ; i++)
5276906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5277906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (format[i] == NIL)
5278906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    /* Error in syntax */
5279906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return -1;
5280906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  else if (format[i] == QUALIFIER_DOT)
5281906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    break; /* for */
5282906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5283906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      if (format[++i] != SPECIFIER_UNGROUP)
5284906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		return -1;
5285f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5286906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      index = i;
5287906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      break;
5288f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5289906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case QUALIFIER_EQUAL: /* Equivalence class expressions */
5290906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      {
5291906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		unsigned int j;
5292906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		unsigned int k;
5293f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5294906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		if (internalCollationUnconverted)
5295906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  {
5296b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    /* Lazy evaluation of collation array */
5297906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    TrioGetCollation();
5298906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    internalCollationUnconverted = FALSE;
5299906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  }
5300906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		for (i = index + 2; ; i++)
5301906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  {
5302906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (format[i] == NIL)
5303906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      /* Error in syntax */
5304906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      return -1;
5305906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    else if (format[i] == QUALIFIER_EQUAL)
5306906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      break; /* for */
5307906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    else
5308906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      {
5309906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			/* Mark any equivalent character */
5310906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			k = (unsigned int)format[i];
5311906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			for (j = 0; internalCollationArray[k][j] != NIL; j++)
5312906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese			  characterclass[(int)internalCollationArray[k][j]]++;
5313906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      }
5314906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  }
5315906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		if (format[++i] != SPECIFIER_UNGROUP)
5316906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  return -1;
5317f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5318906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		index = i;
5319906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      }
5320906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      break;
5321f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5322906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case QUALIFIER_COLON: /* Character class expressions */
5323f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5324026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1,
5325026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				 &format[index]))
5326906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5327906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5328906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isalnum(i))
5329906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5330906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_ALNUM) - 1;
5331906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5332026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1,
5333026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5334906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5335906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5336906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isalpha(i))
5337906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5338906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_ALPHA) - 1;
5339906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5340026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1,
5341026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5342906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5343906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5344906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (iscntrl(i))
5345906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5346906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_CNTRL) - 1;
5347906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5348026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1,
5349026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5350906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5351906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5352906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isdigit(i))
5353906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5354906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_DIGIT) - 1;
5355906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5356026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1,
5357026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5358906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5359906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5360906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isgraph(i))
5361906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5362906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_GRAPH) - 1;
5363906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5364026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_LOWER, sizeof(CLASS_LOWER) - 1,
5365026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5366906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5367906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5368906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (islower(i))
5369906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5370906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_LOWER) - 1;
5371906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5372026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_PRINT, sizeof(CLASS_PRINT) - 1,
5373026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5374906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5375906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5376906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isprint(i))
5377906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5378906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_PRINT) - 1;
5379906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5380026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1,
5381026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5382906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5383906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5384906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (ispunct(i))
5385906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5386906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_PUNCT) - 1;
5387906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5388026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_SPACE, sizeof(CLASS_SPACE) - 1,
5389026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5390906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5391906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5392906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isspace(i))
5393906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5394906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_SPACE) - 1;
5395906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5396026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_UPPER, sizeof(CLASS_UPPER) - 1,
5397026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5398906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5399906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5400906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isupper(i))
5401906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5402906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_UPPER) - 1;
5403906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5404026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	      else if (trio_equal_max(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1,
5405026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese				      &format[index]))
5406906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5407906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5408906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    if (isxdigit(i))
5409906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      characterclass[i]++;
5410906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  index += sizeof(CLASS_XDIGIT) - 1;
5411906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5412906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      else
5413906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
5414906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  characterclass[(int)ch]++;
5415906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
5416906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      break;
5417906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5418906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    default:
541992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      characterclass[(int)ch]++;
5420906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      break;
542192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
542292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
5423f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5424906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_EXTENSION */
5425f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
542692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	default:
542792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  characterclass[(int)ch]++;
542892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
542992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
543092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
543192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return 0;
543292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
543392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
543492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5435026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadNumber
543692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
543792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * We implement our own number conversion in preference of strtol and
543892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * strtoul, because we must handle 'long long' and thousand separators.
543992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5440026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE BOOLEAN_T
5441b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadNumber
5442b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS5((self, target, flags, width, base),
5443b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
5444b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_uintmax_t *target,
5445a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
5446b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width,
5447b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int base)
544892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
5449906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  trio_uintmax_t number = 0;
545092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int digit;
545192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int count;
545292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  BOOLEAN_T isNegative = FALSE;
5453b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  BOOLEAN_T gotNumber = FALSE;
545492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int j;
545592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
545692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
545792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self->InStream));
545892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE));
545992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
5460906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (internalDigitsUnconverted)
5461906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
5462906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      /* Lazy evaluation of digits array */
5463906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      memset(internalDigitArray, -1, sizeof(internalDigitArray));
5464906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++)
5465906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
5466906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  internalDigitArray[(int)internalDigitsLower[j]] = j;
5467906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  internalDigitArray[(int)internalDigitsUpper[j]] = j;
5468906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
5469906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      internalDigitsUnconverted = FALSE;
5470906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
5471f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
547292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  TrioSkipWhitespaces(self);
5473f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
547492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (!(flags & FLAGS_UNSIGNED))
547592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
547692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Leading sign */
547792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (self->current == '+')
547892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
547992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->InStream(self, NULL);
548092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
548192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else if (self->current == '-')
548292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
548392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->InStream(self, NULL);
548492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  isNegative = TRUE;
548592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
548692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
5487f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
548892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  count = self->processed;
5489f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
549092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_ALTERNATIVE)
549192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
549292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      switch (base)
549392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
549492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case NO_BASE:
549592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_OCTAL:
549692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_HEX:
549792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	case BASE_BINARY:
549892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (self->current == '0')
549992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
550092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      self->InStream(self, NULL);
550192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (self->current)
550292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
550392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if ((base == BASE_HEX) &&
5504a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard		      (trio_to_upper(self->current) == 'X'))
550592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
550692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      self->InStream(self, NULL);
550792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
550892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if ((base == BASE_BINARY) &&
5509a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard			   (trio_to_upper(self->current) == 'B'))
551092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
551192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      self->InStream(self, NULL);
551292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
551392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
551492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
551592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else
551692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    return FALSE;
551792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
551892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	default:
551992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  break;
552092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
552192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
552292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
552392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  while (((width == NO_WIDTH) || (self->processed - count < width)) &&
552492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	 (! ((self->current == EOF) || isspace(self->current))))
552592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
552692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (isascii(self->current))
552792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
552870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  digit = internalDigitArray[self->current];
552992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Abort if digit is not allowed in the specified base */
553092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if ((digit == -1) || (digit >= base))
553192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    break;
553292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
553392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else if (flags & FLAGS_QUOTE)
553492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
553592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Compare with thousands separator */
553670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  for (j = 0; internalThousandSeparator[j] && self->current; j++)
553792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
553870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      if (internalThousandSeparator[j] != self->current)
553992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		break;
554092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
554192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      self->InStream(self, NULL);
554292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
554370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  if (internalThousandSeparator[j])
554492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    break; /* Mismatch */
554592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else
554692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    continue; /* Match */
554792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
554892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else
554992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	break;
5550f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
555192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      number *= base;
555292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      number += digit;
5553b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      gotNumber = TRUE; /* we need at least one digit */
555492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
555592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->InStream(self, NULL);
555692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
555792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
555892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  /* Was anything read at all? */
5559b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (!gotNumber)
556092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    return FALSE;
5561f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
556292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (target)
5563b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    *target = (isNegative) ? -((trio_intmax_t)number) : number;
556492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return TRUE;
556592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
556692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
556792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5568026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadChar
556992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5570026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
5571b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadChar
5572b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((self, target, flags, width),
5573b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
5574b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *target,
5575a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
5576b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
557792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
557892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i;
5579906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  char ch;
5580906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  trio_uintmax_t number;
5581f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
558292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
558392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self->InStream));
558492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
558592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  for (i = 0;
558692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       (self->current != EOF) && (i < width);
558792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       i++)
558892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
5589906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      ch = (char)self->current;
559092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->InStream(self, NULL);
559192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH))
559292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
559392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  switch (self->current)
559492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
559570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case '\\': ch = '\\'; break;
5596906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    case 'a': ch = '\007'; break;
559770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case 'b': ch = '\b'; break;
559870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case 'f': ch = '\f'; break;
559970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case 'n': ch = '\n'; break;
560070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case 'r': ch = '\r'; break;
560170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case 't': ch = '\t'; break;
560270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    case 'v': ch = '\v'; break;
560392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    default:
560492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (isdigit(self->current))
560592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
560692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* Read octal number */
560792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL))
5608906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return 0;
560992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  ch = (char)number;
561092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
5611a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	      else if (trio_to_upper(self->current) == 'X')
561292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
561392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  /* Read hexadecimal number */
561492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  self->InStream(self, NULL);
561592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX))
5616906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return 0;
561792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  ch = (char)number;
561892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
561992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
562092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
5621906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  ch = (char)self->current;
562292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
562392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break;
562492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
562592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
5626f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
562792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (target)
562892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	target[i] = ch;
5629906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
5630906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  return i + 1;
5631906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese}
5632906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5633906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
5634026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadString
5635906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
5636026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE BOOLEAN_T
5637b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadString
5638b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((self, target, flags, width),
5639b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
5640b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *target,
5641a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
5642b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
5643906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese{
5644906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int i;
5645f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5646906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self));
5647906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self->InStream));
5648906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5649906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  TrioSkipWhitespaces(self);
5650f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5651906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  /*
5652906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese   * Continue until end of string is reached, a whitespace is encountered,
5653906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese   * or width is exceeded
5654906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese   */
5655906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  for (i = 0;
5656906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       ((width == NO_WIDTH) || (i < width)) &&
5657906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       (! ((self->current == EOF) || isspace(self->current)));
5658906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       i++)
5659906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
5660b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0)
5661906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	break; /* for */
566292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
566392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (target)
566492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    target[i] = NIL;
566592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return TRUE;
566692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
566792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
566892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5669026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadWideChar
5670906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
5671906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
5672026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
5673b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadWideChar
5674b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((self, target, flags, width),
5675b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
5676b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_wchar_t *target,
5677a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
5678b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
5679906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese{
5680906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int i;
5681906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int j;
5682906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int size;
5683906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int amount = 0;
5684b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_wchar_t wch;
5685906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  char buffer[MB_LEN_MAX + 1];
5686f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5687906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self));
5688906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self->InStream));
5689906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5690906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  for (i = 0;
5691906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       (self->current != EOF) && (i < width);
5692906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       i++)
5693906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
5694906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (isascii(self->current))
5695906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
5696906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  if (TrioReadChar(self, buffer, flags, 1) == 0)
5697906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    return 0;
5698906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  buffer[1] = NIL;
5699906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
5700906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      else
5701906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
5702906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  /*
5703906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * Collect a multibyte character, by enlarging buffer until
5704906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * it contains a fully legal multibyte character, or the
5705906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   * buffer is full.
5706906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	   */
5707906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  j = 0;
5708906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  do
5709906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    {
5710906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      buffer[j++] = (char)self->current;
5711906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      buffer[j] = NIL;
5712906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      self->InStream(self, NULL);
5713906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    }
5714906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j));
5715906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
5716906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (target)
5717906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
5718906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  size = mbtowc(&wch, buffer, sizeof(buffer));
5719906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  if (size > 0)
5720906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	    target[i] = wch;
5721906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
5722906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      amount += size;
5723906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      self->InStream(self, NULL);
5724906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
5725906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  return amount;
5726906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese}
5727906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_WIDECHAR */
5728906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5729906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
5730026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadWideString
5731906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese */
5732906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
5733026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE BOOLEAN_T
5734b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadWideString
5735b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((self, target, flags, width),
5736b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
5737b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_wchar_t *target,
5738a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
5739b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
5740906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese{
5741906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int i;
5742906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  int size;
5743f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5744906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self));
5745906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  assert(VALID(self->InStream));
5746906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5747906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  TrioSkipWhitespaces(self);
5748906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5749906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
5750b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  (void)mblen(NULL, 0);
5751906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
5752f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5753906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  /*
5754906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese   * Continue until end of string is reached, a whitespace is encountered,
5755906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese   * or width is exceeded
5756906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese   */
5757906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  for (i = 0;
5758906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       ((width == NO_WIDTH) || (i < width)) &&
5759906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       (! ((self->current == EOF) || isspace(self->current)));
5760906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese       )
5761906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    {
5762906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      size = TrioReadWideChar(self, &target[i], flags, 1);
5763906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (size == 0)
5764906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	break; /* for */
5765906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5766906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      i += size;
5767906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
5768906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  if (target)
5769026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    target[i] = WCONST('\0');
5770906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  return TRUE;
5771906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese}
5772906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_WIDECHAR */
5773906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
5774906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese/*************************************************************************
5775026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadGroup
577692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
577792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * FIXME: characterclass does not work with multibyte characters
577892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5779026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE BOOLEAN_T
5780b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadGroup
5781b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS5((self, target, characterclass, flags, width),
5782b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
5783b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   char *target,
5784b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *characterclass,
5785a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
5786b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
578792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
578870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int ch;
578992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i;
5790f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
579192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
579292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self->InStream));
579392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
579492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  ch = self->current;
579592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  for (i = 0;
579692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       ((width == NO_WIDTH) || (i < width)) &&
579792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       (! ((ch == EOF) ||
579892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	   (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0))));
579992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard       i++)
580092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
580192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (target)
580292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	target[i] = (char)ch;
580392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->InStream(self, &ch);
580492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
5805f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
580692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (target)
580792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    target[i] = NIL;
580892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return TRUE;
580992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
581092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
581192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
5812026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadDouble
581392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *
581492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard * FIXME:
581592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard *  add long double
5816b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard *  handle base
581792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
5818026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE BOOLEAN_T
5819b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadDouble
5820b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((self, target, flags, width),
5821b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
5822b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t target,
5823a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags,
5824b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int width)
582592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
582692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int ch;
5827b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  char doubleString[512];
582892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int index = 0;
582992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int start;
583070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int j;
5831906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  BOOLEAN_T isHex = FALSE;
583292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
5833b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  doubleString[0] = 0;
5834f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
583570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1))
583692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    width = sizeof(doubleString) - 1;
5837f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
583892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  TrioSkipWhitespaces(self);
5839f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
584070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  /*
5841026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * Read entire double number from stream. trio_to_double requires
5842026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   * a string as input, but InStream can be anything, so we have to
584392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   * collect all characters.
584492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard   */
584592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  ch = self->current;
584692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if ((ch == '+') || (ch == '-'))
584792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
5848906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      doubleString[index++] = (char)ch;
584992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->InStream(self, &ch);
585092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      width--;
585192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
585292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
585392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  start = index;
585492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  switch (ch)
585592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
585692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case 'n':
585792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case 'N':
585892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Not-a-number */
585992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (index != 0)
586092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	break;
586192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* FALLTHROUGH */
586292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case 'i':
586392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    case 'I':
586492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Infinity */
586592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      while (isalpha(ch) && (index - start < width))
586692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
5867906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  doubleString[index++] = (char)ch;
586892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->InStream(self, &ch);
586992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
587092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      doubleString[index] = NIL;
587192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
587292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Case insensitive string comparison */
5873026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      if (trio_equal(&doubleString[start], INFINITE_UPPER) ||
5874026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  trio_equal(&doubleString[start], LONG_INFINITE_UPPER))
587592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
5876b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (flags & FLAGS_LONGDOUBLE)
5877b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
5878b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if ((start == 1) && (doubleString[0] == '-'))
5879b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		{
5880b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  *((trio_long_double_t *)target) = trio_ninf();
5881b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		}
5882b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      else
5883b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		{
5884b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  *((trio_long_double_t *)target) = trio_pinf();
5885b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		}
5886b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
5887b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  else
5888b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
5889b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if ((start == 1) && (doubleString[0] == '-'))
5890b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		{
5891b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  *((double *)target) = trio_ninf();
5892b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		}
5893b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      else
5894b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		{
5895b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  *((double *)target) = trio_pinf();
5896b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		}
5897b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
589892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  return TRUE;
589992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
5900026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      if (trio_equal(doubleString, NAN_UPPER))
590192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
5902026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	  /* NaN must not have a preceeding + nor - */
5903b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (flags & FLAGS_LONGDOUBLE)
5904b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
5905b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      *((trio_long_double_t *)target) = trio_nan();
5906b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
5907b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  else
5908b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    {
5909b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      *((double *)target) = trio_nan();
5910b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    }
591192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  return TRUE;
591292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
591392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      return FALSE;
5914b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
5915b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case '0':
5916906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      doubleString[index++] = (char)ch;
5917906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      self->InStream(self, &ch);
5918a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      if (trio_to_upper(ch) == 'X')
5919906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	{
5920906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  isHex = TRUE;
5921906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  doubleString[index++] = (char)ch;
5922906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  self->InStream(self, &ch);
5923906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	}
5924b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      break;
5925f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5926b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    default:
5927b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      break;
5928906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese    }
5929f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
593070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  while ((ch != EOF) && (index - start < width))
593192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
593292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Integer part */
5933906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      if (isHex ? isxdigit(ch) : isdigit(ch))
593470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	{
5935906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  doubleString[index++] = (char)ch;
593670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  self->InStream(self, &ch);
593770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	}
593870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      else if (flags & FLAGS_QUOTE)
593970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	{
594070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  /* Compare with thousands separator */
594170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  for (j = 0; internalThousandSeparator[j] && self->current; j++)
594270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    {
594370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      if (internalThousandSeparator[j] != self->current)
594470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese		break;
594570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
594670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      self->InStream(self, &ch);
594770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    }
594870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  if (internalThousandSeparator[j])
594970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    break; /* Mismatch */
595070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	  else
595170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	    continue; /* Match */
595270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	}
595370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      else
595470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	break; /* while */
595592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
595692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (ch == '.')
595792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
595892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      /* Decimal part */
5959906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      doubleString[index++] = (char)ch;
596092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      self->InStream(self, &ch);
5961906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese      while ((isHex ? isxdigit(ch) : isdigit(ch)) &&
5962906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	     (index - start < width))
596392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
5964906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  doubleString[index++] = (char)ch;
596592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->InStream(self, &ch);
596692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
5967a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard      if (isHex ? (trio_to_upper(ch) == 'P') : (trio_to_upper(ch) == 'E'))
596892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
596992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Exponent */
5970906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	  doubleString[index++] = (char)ch;
597192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  self->InStream(self, &ch);
597292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if ((ch == '+') || (ch == '-'))
597392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
5974906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      doubleString[index++] = (char)ch;
597592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      self->InStream(self, &ch);
597692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
5977a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	  while (isdigit(ch) && (index - start < width))
597892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
5979906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      doubleString[index++] = (char)ch;
598092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      self->InStream(self, &ch);
598192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
598292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
598392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
598492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
598592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if ((index == start) || (*doubleString == NIL))
598692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    return FALSE;
5987b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
5988b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  doubleString[index] = 0;
5989f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
599092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (flags & FLAGS_LONGDOUBLE)
5991b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
5992b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL);
5993b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
599492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else
599592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
5996b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      *((double *)target) = trio_to_double(doubleString, NULL);
599792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
599892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return TRUE;
599992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
600092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
600192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
6002026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioReadPointer
600392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
6004026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE BOOLEAN_T
6005b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioReadPointer
6006b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((self, target, flags),
6007b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
6008b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *target,
6009a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard	   trio_flags_t flags)
601092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
6011906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese  trio_uintmax_t number;
6012026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  char buffer[sizeof(internalNullString)];
601392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
601492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING);
6015f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
601692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (TrioReadNumber(self,
601792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		     &number,
601892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		     flags,
601992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		     POINTER_WIDTH,
602092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		     BASE_HEX))
602192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
602270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese      /*
602370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * The strange assignment of number is a workaround for a compiler
602470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       * warning
602570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese       */
602692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (target)
602770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	*target = (char *)0 + number;
602892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      return TRUE;
602992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
603092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  else if (TrioReadString(self,
603192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  (flags & FLAGS_IGNORE)
603292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  ? NULL
603392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  : buffer,
603492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard			  0,
6035026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese			  sizeof(internalNullString) - 1))
6036f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    {
6037026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      if (trio_equal_case(buffer, internalNullString))
603892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
603992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (target)
604092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    *target = NULL;
604192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  return TRUE;
604292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
604392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
604492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return FALSE;
604592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
604692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
604792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
6048026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioScanProcess
604992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
6050026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
6051b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioScanProcess
6052b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((data, format, parameters),
6053b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *data,
6054b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6055b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_parameter_t *parameters)
605692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
6057906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
605892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int charlen;
6059026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  int cnt;
606092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
606192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int assignment;
606292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int ch;
606392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int index; /* Index of format string */
606492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int i; /* Index of current parameter */
6065a48ed3d6de02b6a78e08ff1321eed720dea117e7Daniel Veillard  trio_flags_t flags;
606692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int width;
606792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int base;
6068b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_pointer_t pointer;
606992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
607092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assignment = 0;
607192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  i = 0;
607292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  index = 0;
607392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  data->InStream(data, &ch);
607492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
6075906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
6076b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  (void)mblen(NULL, 0);
607792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
607892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
607992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  while (format[index])
608092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
6081906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
608292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (! isascii(format[index]))
608392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
608492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  charlen = mblen(&format[index], MB_LEN_MAX);
6085b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  if (charlen != -1)
608692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
6087b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      /* Compare multibyte characters in format string */
6088b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      for (cnt = 0; cnt < charlen - 1; cnt++)
608992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
6090b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  if (ch != format[index + cnt])
6091b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    {
6092b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
6093b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    }
6094b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  data->InStream(data, &ch);
609592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
6096b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      continue; /* while characters left in formatting string */
609792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
609892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
6099906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
6100f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6101b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT))
6102b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	{
6103b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	  return (assignment > 0) ? assignment : EOF;
6104b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	}
6105f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
610692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      if (CHAR_IDENTIFIER == format[index])
610792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
610892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (CHAR_IDENTIFIER == format[index + 1])
610992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
611092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Two % in format matches one % in input stream */
611192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (CHAR_IDENTIFIER == ch)
611292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
611392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  data->InStream(data, &ch);
611492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  index += 2;
611592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  continue; /* while format chars left */
611692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
611792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      else
611892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
611992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
612092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
612192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Skip the parameter entries */
612292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  while (parameters[i].type == FORMAT_PARAMETER)
612392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    i++;
6124f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
612592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  flags = parameters[i].flags;
612692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Find width */
612792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  width = parameters[i].width;
612892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (flags & FLAGS_WIDTH_PARAMETER)
612992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
613092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Get width from parameter list */
613170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      width = (int)parameters[width].data.number.as_signed;
613292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
613392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  /* Find base */
613492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  base = parameters[i].base;
613592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (flags & FLAGS_BASE_PARAMETER)
613692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
613792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Get base from parameter list */
613870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese	      base = (int)parameters[base].data.number.as_signed;
613992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
6140f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
614192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  switch (parameters[i].type)
614292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
614392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_INT:
614492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      {
6145906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		trio_uintmax_t number;
614692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
614792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		if (0 == base)
614892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  base = BASE_DECIMAL;
614992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
615092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		if (!TrioReadNumber(data,
615192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				    &number,
615292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				    flags,
615392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				    width,
615492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				    base))
615592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  return assignment;
6156b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
615792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		if (!(flags & FLAGS_IGNORE))
615892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  {
6159b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    assignment++;
6160b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
616192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    pointer = parameters[i].data.pointer;
616292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
616392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    if (flags & FLAGS_SIZE_T)
616492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      *(size_t *)pointer = (size_t)number;
616592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    else
616692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
616792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_PTRDIFF_T)
616892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    if (flags & FLAGS_PTRDIFF_T)
616992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      *(ptrdiff_t *)pointer = (ptrdiff_t)number;
617092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    else
617192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
617292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_INTMAX_T)
617392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    if (flags & FLAGS_INTMAX_T)
6174906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      *(trio_intmax_t *)pointer = (trio_intmax_t)number;
617592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    else
617692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
617792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    if (flags & FLAGS_QUAD)
6178906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		      *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number;
617992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    else if (flags & FLAGS_LONG)
618092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      *(long int *)pointer = (long int)number;
618192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    else if (flags & FLAGS_SHORT)
618292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      *(short int *)pointer = (short int)number;
618392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    else
618492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		      *(int *)pointer = (int)number;
618592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  }
618692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      }
618792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* FORMAT_INT */
6188f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
618992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_STRING:
6190906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
6191906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      if (flags & FLAGS_WIDECHAR)
6192906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
6193906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (!TrioReadWideString(data,
6194906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  (flags & FLAGS_IGNORE)
6195906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  ? NULL
6196906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  : parameters[i].data.wstring,
6197906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  flags,
6198906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					  width))
6199906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return assignment;
6200906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
6201906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      else
6202906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
6203906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
6204906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (!TrioReadString(data,
6205906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      (flags & FLAGS_IGNORE)
6206906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      ? NULL
6207906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      : parameters[i].data.string,
6208906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      flags,
6209906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				      width))
6210906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return assignment;
6211906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
6212b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if (!(flags & FLAGS_IGNORE))
6213b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		assignment++;
621492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* FORMAT_STRING */
6215b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
621692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_DOUBLE:
6217b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      {
6218b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		trio_pointer_t pointer;
621992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
6220b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		if (flags & FLAGS_IGNORE)
6221b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  {
6222b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    pointer = NULL;
6223b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  }
6224b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		else
6225b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  {
6226b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    pointer = (flags & FLAGS_LONGDOUBLE)
6227b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      ? (trio_pointer_t)parameters[i].data.longdoublePointer
6228b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      : (trio_pointer_t)parameters[i].data.doublePointer;
6229b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  }
6230b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		if (!TrioReadDouble(data, pointer, flags, width))
6231b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  {
6232b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    return assignment;
6233b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  }
6234b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		if (!(flags & FLAGS_IGNORE))
6235b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  {
6236b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    assignment++;
6237b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  }
6238b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		break; /* FORMAT_DOUBLE */
6239b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      }
624092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_GROUP:
624192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      {
624292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		int characterclass[MAX_CHARACTER_CLASS + 1];
624392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		int rc;
6244906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
6245906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		/* Skip over modifiers */
6246906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		while (format[index] != SPECIFIER_GROUP)
6247906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  {
6248906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    index++;
6249906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  }
6250906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		/* Skip over group specifier */
6251906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		index++;
6252f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
625392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		memset(characterclass, 0, sizeof(characterclass));
6254906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		rc = TrioGetCharacterClass(format,
6255906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					   &index,
6256906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese					   &flags,
625792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard					   characterclass);
625892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		if (rc < 0)
625992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  return rc;
626092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
626192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		if (!TrioReadGroup(data,
626292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   (flags & FLAGS_IGNORE)
626392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   ? NULL
626492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   : parameters[i].data.string,
626592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   characterclass,
626692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   flags,
626792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   parameters[i].width))
626892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  return assignment;
6269b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		if (!(flags & FLAGS_IGNORE))
6270b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  assignment++;
627192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      }
627292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* FORMAT_GROUP */
6273b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
627492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_COUNT:
627592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      pointer = parameters[i].data.pointer;
627692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (NULL != pointer)
627792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		{
6278b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  int count = data->committed;
6279b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  if (ch != EOF)
6280b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    count--; /* a character is read, but is not consumed yet */
628192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
628292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_SIZE_T)
6283b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    *(size_t *)pointer = (size_t)count;
628492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
628592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
628692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_PTRDIFF_T)
628792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_PTRDIFF_T)
6288b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    *(ptrdiff_t *)pointer = (ptrdiff_t)count;
628992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
629092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
629192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#if defined(QUALIFIER_INTMAX_T)
629292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_INTMAX_T)
6293b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    *(trio_intmax_t *)pointer = (trio_intmax_t)count;
629492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
629592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard#endif
629692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  if (flags & FLAGS_QUAD)
629792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
6298b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)count;
629992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
630092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (flags & FLAGS_LONG)
630192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
6302b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      *(long int *)pointer = (long int)count;
630392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
630492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else if (flags & FLAGS_SHORT)
630592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
6306b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      *(short int *)pointer = (short int)count;
630792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
630892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		  else
630992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    {
6310b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		      *(int *)pointer = (int)count;
631192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		    }
631292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		}
631392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* FORMAT_COUNT */
6314f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
631592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_CHAR:
6316906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#if TRIO_WIDECHAR
6317906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      if (flags & FLAGS_WIDECHAR)
6318906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
6319906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (TrioReadWideChar(data,
6320906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				       (flags & FLAGS_IGNORE)
6321906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				       ? NULL
6322906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				       : parameters[i].data.wstring,
6323906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				       flags,
6324b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard				       (width == NO_WIDTH) ? 1 : width) == 0)
6325906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return assignment;
6326906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
6327906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese	      else
6328906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese#endif
6329906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		{
6330906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		  if (TrioReadChar(data,
6331906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				   (flags & FLAGS_IGNORE)
6332906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				   ? NULL
6333906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				   : parameters[i].data.string,
6334906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese				   flags,
6335b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard				   (width == NO_WIDTH) ? 1 : width) == 0)
6336906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		    return assignment;
6337906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese		}
6338b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if (!(flags & FLAGS_IGNORE))
6339b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		assignment++;
634092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* FORMAT_CHAR */
6341b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
634292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_POINTER:
634392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      if (!TrioReadPointer(data,
634492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   (flags & FLAGS_IGNORE)
634592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   ? NULL
6346b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard				   : (trio_pointer_t *)parameters[i].data.pointer,
634792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard				   flags))
634892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard		return assignment;
6349b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	      if (!(flags & FLAGS_IGNORE))
6350b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		assignment++;
635192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* FORMAT_POINTER */
6352b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
635392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    case FORMAT_PARAMETER:
635492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      break; /* FORMAT_PARAMETER */
6355b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
635692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    default:
635792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
635892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
635992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  ch = data->current;
636092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  index = parameters[i].indexAfterSpecifier;
636192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  i++;
636292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
636392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      else /* Not an % identifier */
636492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	{
636592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  if (isspace((int)format[index]))
636692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
636792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      /* Whitespaces may match any amount of whitespaces */
636892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      ch = TrioSkipWhitespaces(data);
636992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
637092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else if (ch == format[index])
637192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    {
637292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	      data->InStream(data, &ch);
637392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	    }
637492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  else
6375026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	    return assignment;
6376f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
637792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	  index++;
637892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard	}
637992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
638092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return assignment;
638192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
638292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
638392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
6384026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioScan
6385026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
6386026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE int
6387b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioScan
6388b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray),
6389b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t source,
6390b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   size_t sourceSize,
6391b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   void (*InStream) TRIO_PROTO((trio_class_t *, int *)),
6392b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
63930f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat	   TRIO_VA_LIST_PTR arglist,
6394b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *argarray)
6395026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese{
6396026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  int status;
6397026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_parameter_t parameters[MAX_PARAMETERS];
6398026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  trio_class_t data;
6399026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6400026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  assert(VALID(InStream));
6401026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  assert(VALID(format));
6402026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6403026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  memset(&data, 0, sizeof(data));
6404026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  data.InStream = InStream;
6405b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.location = (trio_pointer_t)source;
6406026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  data.max = sourceSize;
6407026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  data.error = 0;
6408026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6409026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(USE_LOCALE)
6410026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (NULL == internalLocaleValues)
6411026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
6412026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      TrioSetLocale();
6413026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
6414026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif
6415f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6416026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray);
6417026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (status < 0)
6418026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    return status;
6419026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6420026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  status = TrioScanProcess(&data, format, parameters);
6421026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (data.error != 0)
6422026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
6423026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      status = data.error;
6424026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
6425026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  return status;
6426026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese}
6427026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6428026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/*************************************************************************
6429026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioInStreamFile
643092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
6431026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
6432b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioInStreamFile
6433b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, intPointer),
6434b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
6435b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *intPointer)
643692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
6437e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta  FILE *file;
643892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
643992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
6440e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta  assert(VALID(self->location));
644192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(file));
644292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
6443e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta  file = (FILE *)self->location;
6444e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta
644592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  self->current = fgetc(file);
6446026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (self->current == EOF)
6447026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
6448026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->error = (ferror(file))
6449026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	? TRIO_ERROR_RETURN(TRIO_ERRNO, 0)
6450026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	: TRIO_ERROR_RETURN(TRIO_EOF, 0);
6451026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
6452b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
6453b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6454b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->processed++;
6455b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->committed++;
6456b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6457f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
645892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (VALID(intPointer))
645992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
646092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      *intPointer = self->current;
646192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
646292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
646392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
646492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
6465026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioInStreamFileDescriptor
646692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
6467026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
6468b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioInStreamFileDescriptor
6469b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, intPointer),
6470b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
6471b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *intPointer)
647292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
6473e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta  int fd;
647492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int size;
647592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  unsigned char input;
647692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
647792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
6478e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta  assert(VALID(self->location));
6479e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta
6480e036cb3160378d7c46f99434de07c065ebb05bc9Gaurav Gupta  fd = *((int *)self->location);
648192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
648292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  size = read(fd, &input, sizeof(char));
6483026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  if (size == -1)
6484026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
6485026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);
6486026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->current = EOF;
6487026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
6488026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese  else
6489026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    {
6490026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese      self->current = (size == 0) ? EOF : input;
6491026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    }
6492b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (self->current != EOF)
6493b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6494b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->committed++;
6495b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->processed++;
6496b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6497f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6498b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (VALID(intPointer))
6499b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6500b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      *intPointer = self->current;
6501b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6502b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
6503b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6504b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
6505b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * TrioInStreamCustom
6506b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
6507b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PRIVATE void
6508b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioInStreamCustom
6509b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, intPointer),
6510b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
6511b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *intPointer)
6512b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
6513b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t *data;
6514f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6515b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(self));
6516b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(self->location));
6517b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6518b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data = (trio_custom_t *)self->location;
6519b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6520b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  self->current = (data->stream.in == NULL)
6521b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    ? NIL
6522b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    : (data->stream.in)(data->closure);
6523f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6524b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  if (self->current == NIL)
6525b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6526b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->current = EOF;
6527b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6528b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
6529b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6530b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->processed++;
6531b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->committed++;
6532b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6533f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
653492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (VALID(intPointer))
653592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
653692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      *intPointer = self->current;
653792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
653892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
653992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
654092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
6541026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * TrioInStreamString
654292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
6543026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PRIVATE void
6544b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTrioInStreamString
6545b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((self, intPointer),
6546b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_class_t *self,
6547b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int *intPointer)
654892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
654992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  unsigned char **buffer;
655092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
655192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self));
655292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(self->location));
655392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
655492ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  buffer = (unsigned char **)self->location;
655592ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  self->current = (*buffer)[0];
655692ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (self->current == NIL)
6557b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6558b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->current = EOF;
6559b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6560b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  else
6561b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6562b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      (*buffer)++;
6563b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->processed++;
6564b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      self->committed++;
6565b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6566f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
656792ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  if (VALID(intPointer))
656892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    {
656992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard      *intPointer = self->current;
657092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard    }
657192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
657292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
657392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard/*************************************************************************
6574026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese *
6575026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese * Formatted scanning functions
6576026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese *
6577026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese ************************************************************************/
6578026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6579026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#if defined(TRIO_DOCUMENTATION)
6580026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese# include "doc/doc_scanf.h"
6581026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese#endif
6582026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/** @addtogroup Scanf
6583026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese    @{
6584026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese*/
6585026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6586026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/*************************************************************************
658770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * scanf
658870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
6589026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6590026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/**
6591026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   Scan characters from standard input stream.
6592026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese
6593026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param format Formatting string.
6594026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @param ... Arguments.
6595026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese   @return Number of scanned characters.
6596026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese */
6597026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6598b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_scanf
6599b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS2((format, va_alist),
6600b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
6601b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
660270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
660370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
660470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
660570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
660670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6607f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6608b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
6609b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  status = TrioScan((trio_pointer_t)stdin, 0,
6610b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    TrioInStreamFile,
66110f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		    format, TRIO_VA_LIST_ADDR(args), NULL);
6612b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
661370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
661470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
661570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
6616026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6617b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vscanf
6618b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((format, args),
6619b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6620b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
662170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
662270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6623f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6624b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)stdin, 0,
6625b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamFile,
66260f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  format, TRIO_VA_LIST_ADDR(args), NULL);
662770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
662870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
6629026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6630b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_scanfv
6631b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS2((format, args),
6632b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6633b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
663470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
663570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6636f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6637b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)stdin, 0,
6638b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamFile,
6639b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  format, NULL, args);
664070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
664170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
664270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
664370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * fscanf
664470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
6645026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6646b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_fscanf
6647b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((file, format, va_alist),
6648b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    FILE *file,
6649026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	    TRIO_CONST char *format,
6650b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
665170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
665270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
665370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
665470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
665570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(file));
665670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6657f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6658b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
6659b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  status = TrioScan((trio_pointer_t)file, 0,
6660b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    TrioInStreamFile,
66610f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		    format, TRIO_VA_LIST_ADDR(args), NULL);
6662b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
666370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
666470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
666570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
6666026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6667b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vfscanf
6668b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((file, format, args),
6669b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   FILE *file,
6670b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6671b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
667270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
667370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(file));
667470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6675f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6676b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)file, 0,
6677b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamFile,
66780f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  format, TRIO_VA_LIST_ADDR(args), NULL);
667970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
668070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
6681026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6682b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_fscanfv
6683b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((file, format, args),
6684b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   FILE *file,
6685b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6686b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
668770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
668870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(file));
668970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6690f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6691b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)file, 0,
6692b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamFile,
6693b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  format, NULL, args);
669470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
669570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
669670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
669770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * dscanf
669870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese */
6699026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6700b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_dscanf
6701b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((fd, format, va_alist),
6702b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    int fd,
6703026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	    TRIO_CONST char *format,
6704b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
670570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
670670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  int status;
670770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  va_list args;
670870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
670970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6710f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6711b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
6712b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  status = TrioScan((trio_pointer_t)&fd, 0,
6713b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    TrioInStreamFileDescriptor,
67140f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		    format, TRIO_VA_LIST_ADDR(args), NULL);
6715b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
671670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  return status;
671770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
671870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
6719026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6720b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vdscanf
6721b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((fd, format, args),
6722b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int fd,
6723b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6724b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
6725b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
6726b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
6727f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6728b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)&fd, 0,
6729b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamFileDescriptor,
67300f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  format, TRIO_VA_LIST_ADDR(args), NULL);
6731b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
6732b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6733b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC int
6734b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_dscanfv
6735b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((fd, format, args),
6736b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int fd,
6737b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6738b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
6739b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
6740b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
6741f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6742b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)&fd, 0,
6743b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamFileDescriptor,
6744b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  format, NULL, args);
6745b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
6746b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6747b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
6748b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * cscanf
6749b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
6750b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC int
6751b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_cscanf
6752b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS4((stream, closure, format, va_alist),
6753b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    trio_instream_t stream,
6754b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    trio_pointer_t closure,
6755b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *format,
6756b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
675770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
6758b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  int status;
6759b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  va_list args;
6760b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t data;
6761b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6762b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(stream));
676370a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6764f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6765b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
6766b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.stream.in = stream;
6767b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.closure = closure;
67680f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  status = TrioScan(&data, 0, TrioInStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL);
6769b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
6770b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return status;
677170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
677270a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
6773026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6774b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vcscanf
6775b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((stream, closure, format, args),
6776b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_instream_t stream,
6777b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t closure,
6778b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6779b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
678070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
6781b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t data;
6782f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6783b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(stream));
678470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6785b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6786b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.stream.in = stream;
6787b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.closure = closure;
67880f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat  return TrioScan(&data, 0, TrioInStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL);
6789b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
6790b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6791b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC int
6792b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_cscanfv
6793b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS4((stream, closure, format, args),
6794b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_instream_t stream,
6795b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t closure,
6796b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6797b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
6798b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
6799b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  trio_custom_t data;
6800f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6801b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(stream));
6802b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  assert(VALID(format));
6803b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6804b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.stream.in = stream;
6805b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  data.closure = closure;
6806b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args);
680770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
680870a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
680970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese/*************************************************************************
681070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese * sscanf
681192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard */
6812026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6813b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_sscanf
6814b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_VARGS3((buffer, format, va_alist),
6815b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_CONST char *buffer,
6816026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese	    TRIO_CONST char *format,
6817b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	    TRIO_VA_DECL)
681892ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard{
681992ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  int status;
682092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  va_list args;
682192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
682292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(buffer));
682392ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  assert(VALID(format));
6824f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6825b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_START(args, format);
6826b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  status = TrioScan((trio_pointer_t)&buffer, 0,
6827b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		    TrioInStreamString,
68280f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		    format, TRIO_VA_LIST_ADDR(args), NULL);
6829b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  TRIO_VA_END(args);
683092ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard  return status;
683192ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard}
683292ad210417f318c8f0142fd0aee8d2893d83b8e8Daniel Veillard
6833026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6834b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_vsscanf
6835b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((buffer, format, args),
6836b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *buffer,
6837b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6838b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   va_list args)
683970a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
684070a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
684170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6842f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6843b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)&buffer, 0,
6844b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamString,
68450f7a26d8442b87fb7d576e759c9148e8feff9e20Patrick Monnerat		  format, TRIO_VA_LIST_ADDR(args), NULL);
684670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
684770a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese
6848026d29f41e252619bcc5655865c9548642cd93f7Bjorn ReeseTRIO_PUBLIC int
6849b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_sscanfv
6850b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS3((buffer, format, args),
6851b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *buffer,
6852b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   TRIO_CONST char *format,
6853b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   trio_pointer_t *args)
685470a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese{
685570a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(buffer));
685670a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese  assert(VALID(format));
6857f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
6858b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  return TrioScan((trio_pointer_t)&buffer, 0,
6859b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  TrioInStreamString,
6860b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard		  format, NULL, args);
686170a9da54eb200cd5c5ceafb72aff72c39021c94cBjorn Reese}
6862906ec8a0cadacfc0711b9ebeba0025f1848cea55Bjorn Reese
6863026d29f41e252619bcc5655865c9548642cd93f7Bjorn Reese/** @} End of Scanf documentation module */
6864b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard
6865b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard/*************************************************************************
6866b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard * trio_strerror
6867b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard */
6868b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_PUBLIC TRIO_CONST char *
6869b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillardtrio_strerror
6870b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel VeillardTRIO_ARGS1((errorcode),
6871b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard	   int errorcode)
6872b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard{
6873b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  /* Textual versions of the error codes */
6874b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard  switch (TRIO_ERROR_CODE(errorcode))
6875b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    {
6876b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_EOF:
6877b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "End of file";
6878b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_EINVAL:
6879b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Invalid argument";
6880b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_ETOOMANY:
6881b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Too many arguments";
6882b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_EDBLREF:
6883b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Double reference";
6884b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_EGAP:
6885b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Reference gap";
6886b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_ENOMEM:
6887b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Out of memory";
6888b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_ERANGE:
6889b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Invalid range";
6890b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    case TRIO_ECUSTOM:
6891b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Custom error";
6892b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    default:
6893b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard      return "Unknown";
6894b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard    }
6895b7c29c38f507ac62cc85df9b897762fc84f05a68Daniel Veillard}
6896