1a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
3a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * $Id: trio.c 3600 2007-04-17 12:44:58Z veillard $
4a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.
6a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
7a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Permission to use, copy, modify, and distribute this software for any
8a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * purpose with or without fee is hereby granted, provided that the above
9a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * copyright notice and this permission notice appear in all copies.
10a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
11a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
12a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
13a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
14a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
15a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
16a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *************************************************************************
17a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
18a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * A note to trio contributors:
19a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
20a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Avoid heap allocation at all costs to ensure that the trio functions
21a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * are async-safe. The exceptions are the printf/fprintf functions, which
22a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * uses fputc, and the asprintf functions and the <alloc> modifier, which
23a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * by design are required to allocate form the heap.
24a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
25a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
26a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
27a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*
28a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TODO:
29a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - Scan is probably too permissive about its modifiers.
30a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - C escapes in %#[] ?
31a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - Multibyte characters (done for format parsing, except scan groups)
32a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - Complex numbers? (C99 _Complex)
33a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - Boolean values? (C99 _Bool)
34a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - C99 NaN(n-char-sequence) missing. The n-char-sequence can be used
35a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    to print the mantissa, e.g. NaN(0xc000000000000000)
36a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - Should we support the GNU %a alloc modifier? GNU has an ugly hack
37a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    for %a, because C99 used %a for other purposes. If specified as
38a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    %as or %a[ it is interpreted as the alloc modifier, otherwise as
39a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    the C99 hex-float. This means that you cannot scan %as as a hex-float
40a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    immediately followed by an 's'.
41a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  - Scanning of collating symbols.
42a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
43a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
44a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
45a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Trio include files
46a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
47a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include "triodef.h"
48a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include "trio.h"
49a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include "triop.h"
50a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include "trionan.h"
51a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if !defined(TRIO_MINIMAL)
52a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include "triostr.h"
53a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
54a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
55a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**************************************************************************
56a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
57a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Definitions
58a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
59a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *************************************************************************/
60a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
61a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <math.h>
62a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <limits.h>
63a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <float.h>
64a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
65a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if (defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) \
66a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang     || defined(USE_MULTIBYTE) || TRIO_WIDECHAR) \
67a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    && !defined(_WIN32_WCE)
68a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define TRIO_COMPILER_SUPPORTS_MULTIBYTE
69a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if !defined(MB_LEN_MAX)
70a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define MB_LEN_MAX 6
71a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
72a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
73a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
74a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if (defined(TRIO_COMPILER_MSVC) && (_MSC_VER >= 1100)) || defined(TRIO_COMPILER_BCB)
75a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define TRIO_COMPILER_SUPPORTS_MSVC_INT
76a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
77a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
78a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(_WIN32_WCE)
79a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <wincecompat.h>
80a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
81a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
82a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
83a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Generic definitions
84a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
85a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
86a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if !(defined(DEBUG) || defined(NDEBUG))
87a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define NDEBUG
88a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
89a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
90a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <assert.h>
91a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <ctype.h>
92a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if !defined(TRIO_COMPILER_SUPPORTS_C99)
93a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define isblank(x) (((x)==32) || ((x)==9))
94a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
95a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_ANCIENT)
96a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <varargs.h>
97a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
98a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <stdarg.h>
99a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
100a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <stddef.h>
101a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
102a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#ifdef HAVE_ERRNO_H
103a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#include <errno.h>
104a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
105a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
106a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#ifndef NULL
107a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define NULL 0
108a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
109a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define NIL ((char)0)
110a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#ifndef FALSE
111a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define FALSE (1 == 0)
112a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define TRUE (! FALSE)
113a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
114a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define BOOLEAN_T int
115a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
116a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* mincore() can be used for debugging purposes */
117a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define VALID(x) (NULL != (x))
118a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
119a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_ERRORS
120a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
121a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Encode the error code and the position. This is decoded
122a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION.
123a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
124a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8)))
125a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
126a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define TRIO_ERROR_RETURN(x,y) (-1)
127a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
128a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
129a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef unsigned long trio_flags_t;
130a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
131a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
132a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
133a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Platform specific definitions
134a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
135a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_PLATFORM_UNIX)
136a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <unistd.h>
137a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <signal.h>
138a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <locale.h>
139a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define USE_LOCALE
140a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_PLATFORM_UNIX */
141a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_PLATFORM_VMS)
142a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <unistd.h>
143a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
144a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_PLATFORM_WIN32)
145a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if defined(_WIN32_WCE)
146a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  include <wincecompat.h>
147a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# else
148a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  include <io.h>
149a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define read _read
150a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define write _write
151a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
152a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_PLATFORM_WIN32 */
153a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
154a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
155a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if defined(TRIO_COMPILER_SUPPORTS_ISO94)
156a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  include <wchar.h>
157a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  include <wctype.h>
158a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef wchar_t trio_wchar_t;
159a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef wint_t trio_wint_t;
160a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# else
161a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef char trio_wchar_t;
162a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int trio_wint_t;
163a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define WCONST(x) L ## x
164a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define WEOF EOF
165a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswalnum(x) isalnum(x)
166a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswalpha(x) isalpha(x)
167a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswblank(x) isblank(x)
168a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswcntrl(x) iscntrl(x)
169a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswdigit(x) isdigit(x)
170a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswgraph(x) isgraph(x)
171a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswlower(x) islower(x)
172a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswprint(x) isprint(x)
173a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswpunct(x) ispunct(x)
174a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswspace(x) isspace(x)
175a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswupper(x) isupper(x)
176a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  define iswxdigit(x) isxdigit(x)
177a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
178a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
179a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
180a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
181a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
182a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Compiler dependent definitions
183a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
184a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
185a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Support for long long */
186a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#ifndef __cplusplus
187a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if !defined(USE_LONGLONG)
188a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  if defined(TRIO_COMPILER_GCC) && !defined(__STRICT_ANSI__)
189a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#   define USE_LONGLONG
190a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  elif defined(TRIO_COMPILER_SUNPRO)
191a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#   define USE_LONGLONG
192a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  elif defined(_LONG_LONG) || defined(_LONGLONG)
193a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#   define USE_LONGLONG
194a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#  endif
195a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
196a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
197a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
198a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* The extra long numbers */
199a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LONGLONG)
200a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef signed long long int trio_longlong_t;
201a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef unsigned long long int trio_ulonglong_t;
202a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
203a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef signed __int64 trio_longlong_t;
204a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef unsigned __int64 trio_ulonglong_t;
205a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
206a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_SIGNED long int trio_longlong_t;
207a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef unsigned long int trio_ulonglong_t;
208a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
209a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
210a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Maximal and fixed integer types */
211a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_C99)
212a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <stdint.h>
213a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef intmax_t trio_intmax_t;
214a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef uintmax_t trio_uintmax_t;
215a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int8_t trio_int8_t;
216a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int16_t trio_int16_t;
217a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int32_t trio_int32_t;
218a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int64_t trio_int64_t;
219a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98)
220a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include <inttypes.h>
221a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef intmax_t trio_intmax_t;
222a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef uintmax_t trio_uintmax_t;
223a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int8_t trio_int8_t;
224a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int16_t trio_int16_t;
225a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int32_t trio_int32_t;
226a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef int64_t trio_int64_t;
227a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
228a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef trio_longlong_t trio_intmax_t;
229a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef trio_ulonglong_t trio_uintmax_t;
230a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef __int8 trio_int8_t;
231a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef __int16 trio_int16_t;
232a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef __int32 trio_int32_t;
233a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef __int64 trio_int64_t;
234a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
235a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef trio_longlong_t trio_intmax_t;
236a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef trio_ulonglong_t trio_uintmax_t;
237a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if defined(TRIO_INT8_T)
238a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_INT8_T trio_int8_t;
239a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# else
240a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_SIGNED char trio_int8_t;
241a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
242a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if defined(TRIO_INT16_T)
243a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_INT16_T trio_int16_t;
244a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# else
245a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_SIGNED short trio_int16_t;
246a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
247a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if defined(TRIO_INT32_T)
248a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_INT32_T trio_int32_t;
249a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# else
250a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_SIGNED int trio_int32_t;
251a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
252a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if defined(TRIO_INT64_T)
253a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef TRIO_INT64_T trio_int64_t;
254a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# else
255a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef trio_longlong_t trio_int64_t;
256a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
257a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
258a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
259a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if (!(defined(TRIO_COMPILER_SUPPORTS_C99) \
260a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang || defined(TRIO_COMPILER_SUPPORTS_UNIX01))) \
261a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang && !defined(_WIN32_WCE)
262a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define floorl(x) floor((double)(x))
263a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define fmodl(x,y) fmod((double)(x),(double)(y))
264a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define powl(x,y) pow((double)(x),(double)(y))
265a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
266a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
267a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define TRIO_FABS(x) (((x) < 0.0) ? -(x) : (x))
268a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
269a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
270a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Internal Definitions
271a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
272a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
273a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#ifndef DECIMAL_DIG
274a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define DECIMAL_DIG DBL_DIG
275a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
276a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
277a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Long double sizes */
278a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#ifdef LDBL_DIG
279a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define MAX_MANTISSA_DIGITS LDBL_DIG
280a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define MAX_EXPONENT_DIGITS 4
281a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define MAX_DOUBLE_DIGITS LDBL_MAX_10_EXP
282a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
283a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define MAX_MANTISSA_DIGITS DECIMAL_DIG
284a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define MAX_EXPONENT_DIGITS 3
285a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define MAX_DOUBLE_DIGITS DBL_MAX_10_EXP
286a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
287a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
288a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_ANCIENT) || !defined(LDBL_DIG)
289a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# undef LDBL_DIG
290a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# undef LDBL_MANT_DIG
291a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# undef LDBL_EPSILON
292a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define LDBL_DIG DBL_DIG
293a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define LDBL_MANT_DIG DBL_MANT_DIG
294a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define LDBL_EPSILON DBL_EPSILON
295a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
296a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
297a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* The maximal number of digits is for base 2 */
298a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT)
299a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* The width of a pointer. The number of bits in a hex digit is 4 */
300a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4)
301a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
302a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Infinite and Not-A-Number for floating-point */
303a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define INFINITE_LOWER "inf"
304a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define INFINITE_UPPER "INF"
305a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define LONG_INFINITE_LOWER "infinite"
306a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define LONG_INFINITE_UPPER "INFINITE"
307a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define NAN_LOWER "nan"
308a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define NAN_UPPER "NAN"
309a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
310a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Various constants */
311a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangenum {
312a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TYPE_PRINT = 1,
313a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TYPE_SCAN  = 2,
314a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
315a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Flags. FLAGS_LAST must be less than ULONG_MAX */
316a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_NEW                 = 0,
317a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_STICKY              = 1,
318a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_SPACE               = 2 * FLAGS_STICKY,
319a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_SHOWSIGN            = 2 * FLAGS_SPACE,
320a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_LEFTADJUST          = 2 * FLAGS_SHOWSIGN,
321a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_ALTERNATIVE         = 2 * FLAGS_LEFTADJUST,
322a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_SHORT               = 2 * FLAGS_ALTERNATIVE,
323a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_SHORTSHORT          = 2 * FLAGS_SHORT,
324a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_LONG                = 2 * FLAGS_SHORTSHORT,
325a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_QUAD                = 2 * FLAGS_LONG,
326a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_LONGDOUBLE          = 2 * FLAGS_QUAD,
327a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_SIZE_T              = 2 * FLAGS_LONGDOUBLE,
328a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_PTRDIFF_T           = 2 * FLAGS_SIZE_T,
329a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_INTMAX_T            = 2 * FLAGS_PTRDIFF_T,
330a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_NILPADDING          = 2 * FLAGS_INTMAX_T,
331a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_UNSIGNED            = 2 * FLAGS_NILPADDING,
332a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_UPPER               = 2 * FLAGS_UNSIGNED,
333a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_WIDTH               = 2 * FLAGS_UPPER,
334a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_WIDTH_PARAMETER     = 2 * FLAGS_WIDTH,
335a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_PRECISION           = 2 * FLAGS_WIDTH_PARAMETER,
336a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION,
337a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_BASE                = 2 * FLAGS_PRECISION_PARAMETER,
338a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_BASE_PARAMETER      = 2 * FLAGS_BASE,
339a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_FLOAT_E             = 2 * FLAGS_BASE_PARAMETER,
340a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_FLOAT_G             = 2 * FLAGS_FLOAT_E,
341a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_QUOTE               = 2 * FLAGS_FLOAT_G,
342a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_WIDECHAR            = 2 * FLAGS_QUOTE,
343a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_ALLOC               = 2 * FLAGS_WIDECHAR,
344a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_IGNORE              = 2 * FLAGS_ALLOC,
345a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_IGNORE_PARAMETER    = 2 * FLAGS_IGNORE,
346a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_VARSIZE_PARAMETER   = 2 * FLAGS_IGNORE_PARAMETER,
347a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_FIXED_SIZE          = 2 * FLAGS_VARSIZE_PARAMETER,
348a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_LAST                = FLAGS_FIXED_SIZE,
349a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Reused flags */
350a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_EXCLUDE             = FLAGS_SHORT,
351a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_USER_DEFINED        = FLAGS_IGNORE,
352a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_ROUNDING            = FLAGS_INTMAX_T,
353a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Compounded flags */
354a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_ALL_VARSIZES        = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T,
355a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FLAGS_ALL_SIZES           = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT,
356a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
357a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  NO_POSITION  = -1,
358a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  NO_WIDTH     =  0,
359a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  NO_PRECISION = -1,
360a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  NO_SIZE      = -1,
361a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
362a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Do not change these */
363a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  NO_BASE      = -1,
364a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MIN_BASE     =  2,
365a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MAX_BASE     = 36,
366a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BASE_BINARY  =  2,
367a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BASE_OCTAL   =  8,
368a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BASE_DECIMAL = 10,
369a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BASE_HEX     = 16,
370a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
371a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Maximal number of allowed parameters */
372a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MAX_PARAMETERS = 64,
373a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Maximal number of characters in class */
374a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MAX_CHARACTER_CLASS = UCHAR_MAX + 1,
375a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
376a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Maximal string lengths for user-defined specifiers */
377a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MAX_USER_NAME = 64,
378a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MAX_USER_DATA = 256,
379a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
380a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Maximal length of locale separator strings */
381a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX,
382a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Maximal number of integers in grouping */
383a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  MAX_LOCALE_GROUPS = 64,
384a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
385a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Initial size of asprintf buffer */
386a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  DYNAMIC_START_SIZE = 32
387a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang};
388a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
389a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define NO_GROUPING ((int)CHAR_MAX)
390a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
391a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Fundamental formatting parameter types */
392a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_UNKNOWN   0
393a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_INT       1
394a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_DOUBLE    2
395a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_CHAR      3
396a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_STRING    4
397a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_POINTER   5
398a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_COUNT     6
399a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_PARAMETER 7
400a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define FORMAT_GROUP     8
401a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_GNU
402a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define FORMAT_ERRNO    9
403a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
404a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
405a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define FORMAT_USER_DEFINED 10
406a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
407a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
408a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Character constants */
409a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CHAR_IDENTIFIER '%'
410a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CHAR_BACKSLASH '\\'
411a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CHAR_QUOTE '\"'
412a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CHAR_ADJUST ' '
413a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
414a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Character class expressions */
415a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_ALNUM "[:alnum:]"
416a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_ALPHA "[:alpha:]"
417a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_BLANK "[:blank:]"
418a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_CNTRL "[:cntrl:]"
419a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_DIGIT "[:digit:]"
420a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_GRAPH "[:graph:]"
421a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_LOWER "[:lower:]"
422a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_PRINT "[:print:]"
423a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_PUNCT "[:punct:]"
424a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_SPACE "[:space:]"
425a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_UPPER "[:upper:]"
426a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define CLASS_XDIGIT "[:xdigit:]"
427a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
428a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*
429a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * SPECIFIERS:
430a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
431a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
432a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * a  Hex-float
433a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * A  Hex-float
434a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * c  Character
435a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * C  Widechar character (wint_t)
436a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * d  Decimal
437a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * e  Float
438a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * E  Float
439a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * F  Float
440a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * F  Float
441a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * g  Float
442a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * G  Float
443a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * i  Integer
444a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * m  Error message
445a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * n  Count
446a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * o  Octal
447a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * p  Pointer
448a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * s  String
449a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * S  Widechar string (wchar_t *)
450a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * u  Unsigned
451a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * x  Hex
452a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * X  Hex
453a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * [] Group
454a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * <> User-defined
455a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
456a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Reserved:
457a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
458a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * D  Binary Coded Decimal %D(length,precision) (OS/390)
459a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
460a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_CHAR 'c'
461a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_STRING 's'
462a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_DECIMAL 'd'
463a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_INTEGER 'i'
464a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_UNSIGNED 'u'
465a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_OCTAL 'o'
466a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_HEX 'x'
467a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_HEX_UPPER 'X'
468a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_FLOAT_E 'e'
469a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_FLOAT_E_UPPER 'E'
470a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_FLOAT_F 'f'
471a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_FLOAT_F_UPPER 'F'
472a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_FLOAT_G 'g'
473a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_FLOAT_G_UPPER 'G'
474a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_POINTER 'p'
475a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_GROUP '['
476a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_UNGROUP ']'
477a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define SPECIFIER_COUNT 'n'
478a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_UNIX98
479a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_CHAR_UPPER 'C'
480a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_STRING_UPPER 'S'
481a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
482a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_C99
483a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_HEXFLOAT 'a'
484a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_HEXFLOAT_UPPER 'A'
485a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
486a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_GNU
487a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_ERRNO 'm'
488a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
489a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
490a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_BINARY 'b'
491a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_BINARY_UPPER 'B'
492a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_USER_DEFINED_BEGIN '<'
493a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_USER_DEFINED_END '>'
494a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define SPECIFIER_USER_DEFINED_SEPARATOR ':'
495a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
496a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
497a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*
498a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * QUALIFIERS:
499a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
500a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
501a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Numbers = d,i,o,u,x,X
502a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Float = a,A,e,E,f,F,g,G
503a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * String = s
504a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Char = c
505a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
506a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
507a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * 9$ Position
508a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      Use the 9th parameter. 9 can be any number between 1 and
509a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      the maximal argument
510a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
511a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * 9 Width
512a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      Set width to 9. 9 can be any number, but must not be postfixed
513a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      by '$'
514a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
515a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * h  Short
516a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Numbers:
517a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      (unsigned) short int
518a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
519a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * hh Short short
520a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Numbers:
521a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      (unsigned) char
522a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
523a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * l  Long
524a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Numbers:
525a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      (unsigned) long int
526a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    String:
527a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      as the S specifier
528a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Char:
529a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      as the C specifier
530a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
531a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * ll Long Long
532a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Numbers:
533a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      (unsigned) long long int
534a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
535a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * L  Long Double
536a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Float
537a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      long double
538a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
539a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * #  Alternative
540a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Float:
541a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      Decimal-point is always present
542a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    String:
543a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      non-printable characters are handled as \number
544a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
545a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Spacing
546a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
547a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * +  Sign
548a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
549a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * -  Alignment
550a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
551a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * .  Precision
552a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
553a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * *  Parameter
554a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    print: use parameter
555a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    scan: no parameter (ignore)
556a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
557a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * q  Quad
558a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
559a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Z  size_t
560a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
561a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * w  Widechar
562a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
563a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * '  Thousands/quote
564a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Numbers:
565a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      Integer part grouped in thousands
566a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Binary numbers:
567a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      Number grouped in nibbles (4 bits)
568a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    String:
569a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      Quoted string
570a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
571a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * j  intmax_t
572a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * t  prtdiff_t
573a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * z  size_t
574a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
575a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * !  Sticky
576a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * @  Parameter (for both print and scan)
577a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
578a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * I  n-bit Integer
579a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *    Numbers:
580a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *      The following options exists
581a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *        I8  = 8-bit integer
582a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *        I16 = 16-bit integer
583a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *        I32 = 32-bit integer
584a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *        I64 = 64-bit integer
585a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
586a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_POSITION '$'
587a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_SHORT 'h'
588a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_LONG 'l'
589a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_LONG_UPPER 'L'
590a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_ALTERNATIVE '#'
591a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_SPACE ' '
592a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_PLUS '+'
593a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_MINUS '-'
594a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_DOT '.'
595a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_STAR '*'
596a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#define QUALIFIER_CIRCUMFLEX '^' /* For scanlists */
597a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_C99
598a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_SIZE_T 'z'
599a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_PTRDIFF_T 't'
600a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_INTMAX_T 'j'
601a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
602a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_BSD || TRIO_GNU
603a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_QUAD 'q'
604a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
605a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_GNU
606a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_SIZE_T_UPPER 'Z'
607a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
608a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_MISC
609a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_WIDECHAR 'w'
610a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
611a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_MICROSOFT
612a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_FIXED_SIZE 'I'
613a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
614a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
615a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_QUOTE '\''
616a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_STICKY '!'
617a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_VARSIZE '&' /* This should remain undocumented */
618a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_PARAM '@' /* Experimental */
619a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_COLON ':' /* For scanlists */
620a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_EQUAL '=' /* For scanlists */
621a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define QUALIFIER_ROUNDING_UPPER 'R'
622a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
623a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
624a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
625a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
626a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
627a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Internal Structures
628a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
629a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *************************************************************************/
630a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
631a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Parameters */
632a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef struct {
633a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* An indication of which entry in the data union is used */
634a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int type;
635a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The flags */
636a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_flags_t flags;
637a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The width qualifier */
638a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int width;
639a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The precision qualifier */
640a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int precision;
641a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The base qualifier */
642a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int base;
643a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The size for the variable size qualifier */
644a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int varsize;
645a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The marker of the end of the specifier */
646a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int indexAfterSpecifier;
647a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The data from the argument list */
648a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  union {
649a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    char *string;
650a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
651a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    trio_wchar_t *wstring;
652a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
653a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    trio_pointer_t pointer;
654a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    union {
655a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_intmax_t as_signed;
656a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_uintmax_t as_unsigned;
657a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    } number;
658a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    double doubleNumber;
659a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    double *doublePointer;
660a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    trio_long_double_t longdoubleNumber;
661a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    trio_long_double_t *longdoublePointer;
662a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    int errorNumber;
663a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  } data;
664a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* For the user-defined specifier */
665a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char user_name[MAX_USER_NAME];
666a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char user_data[MAX_USER_DATA];
667a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang} trio_parameter_t;
668a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
669a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Container for customized functions */
670a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef struct {
671a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  union {
672a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    trio_outstream_t out;
673a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    trio_instream_t in;
674a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  } stream;
675a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_pointer_t closure;
676a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang} trio_custom_t;
677a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
678a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* General trio "class" */
679a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef struct _trio_class_t {
680a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
681a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The function to write characters to a stream.
682a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
683a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  void (*OutStream) TRIO_PROTO((struct _trio_class_t *, int));
684a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
685a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The function to read characters from a stream.
686a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
687a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  void (*InStream) TRIO_PROTO((struct _trio_class_t *, int *));
688a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
689a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The current location in the stream.
690a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
691a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_pointer_t location;
692a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
693a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The character currently being processed.
694a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
695a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int current;
696a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
697a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The number of characters that would have been written/read
698a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * if there had been sufficient space.
699a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
700a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int processed;
701a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
702a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The number of characters that are actually written/read.
703a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Processed and committed will only differ for the *nprintf
704a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * and *nscanf functions.
705a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
706a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int committed;
707a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
708a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The upper limit of characters that may be written/read.
709a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
710a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int max;
711a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
712a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The last output error that was detected.
713a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
714a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int error;
715a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang} trio_class_t;
716a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
717a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* References (for user-defined callbacks) */
718a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef struct _trio_reference_t {
719a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_class_t *data;
720a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_parameter_t *parameter;
721a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang} trio_reference_t;
722a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
723a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Registered entries (for user-defined callbacks) */
724a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtypedef struct _trio_userdef_t {
725a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  struct _trio_userdef_t *next;
726a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_callback_t callback;
727a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *name;
728a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang} trio_userdef_t;
729a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
730a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
731a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
732a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Internal Variables
733a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
734a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *************************************************************************/
735a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
736a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic TRIO_CONST char rcsid[] = "@(#)$Id: trio.c 3600 2007-04-17 12:44:58Z veillard $";
737a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
738a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*
739a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Need this to workaround a parser bug in HP C/iX compiler that fails
740a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * to resolves macro definitions that includes type 'long double',
741a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * e.g: va_arg(arg_ptr, long double)
742a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
743a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_PLATFORM_MPEIX)
744a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic TRIO_CONST trio_long_double_t ___dummy_long_double = 0;
745a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
746a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
747a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic TRIO_CONST char internalNullString[] = "(nil)";
748a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
749a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LOCALE)
750a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic struct lconv *internalLocaleValues = NULL;
751a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
752a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
753a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*
754a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * UNIX98 says "in a locale where the radix character is not defined,
755a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * the radix character defaults to a period (.)"
756a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
757a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic int internalDecimalPointLength = 1;
758a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic int internalThousandSeparatorLength = 1;
759a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic char internalDecimalPoint = '.';
760a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic char internalDecimalPointString[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ".";
761a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ",";
762a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING };
763a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
764a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic TRIO_CONST char internalDigitsLower[] = "0123456789abcdefghijklmnopqrstuvwxyz";
765a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic TRIO_CONST char internalDigitsUpper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
766a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic BOOLEAN_T internalDigitsUnconverted = TRUE;
767a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic int internalDigitArray[128];
768a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
769a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic BOOLEAN_T internalCollationUnconverted = TRUE;
770a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS];
771a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
772a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
773a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
774a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic TRIO_VOLATILE trio_callback_t internalEnterCriticalRegion = NULL;
775a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic TRIO_VOLATILE trio_callback_t internalLeaveCriticalRegion = NULL;
776a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangstatic trio_userdef_t *internalUserDef = NULL;
777a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
778a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
779a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
780a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
781a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
782a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Internal Functions
783a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
784a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
785a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
786a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_MINIMAL)
787a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# define TRIO_STRING_PUBLIC static
788a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include "triostr.c"
789a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* defined(TRIO_MINIMAL) */
790a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
791a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
792a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioIsQualifier
793a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
794a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
795a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Remember to add all new qualifiers to this function.
796a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  QUALIFIER_POSITION must not be added.
797a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
798a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
799a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioIsQualifier
800a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((character),
801a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char character)
802a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
803a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* QUALIFIER_POSITION is not included */
804a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  switch (character)
805a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
806a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case '0': case '1': case '2': case '3': case '4':
807a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case '5': case '6': case '7': case '8': case '9':
808a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_PLUS:
809a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_MINUS:
810a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_SPACE:
811a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_DOT:
812a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_STAR:
813a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_ALTERNATIVE:
814a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_SHORT:
815a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_LONG:
816a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_LONG_UPPER:
817a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_CIRCUMFLEX:
818a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T)
819a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_SIZE_T:
820a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
821a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PTRDIFF_T)
822a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_PTRDIFF_T:
823a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
824a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_INTMAX_T)
825a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_INTMAX_T:
826a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
827a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_QUAD)
828a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_QUAD:
829a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
830a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T_UPPER)
831a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_SIZE_T_UPPER:
832a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
833a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_WIDECHAR)
834a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_WIDECHAR:
835a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
836a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_QUOTE)
837a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_QUOTE:
838a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
839a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_STICKY)
840a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_STICKY:
841a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
842a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_VARSIZE)
843a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_VARSIZE:
844a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
845a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PARAM)
846a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_PARAM:
847a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
848a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_FIXED_SIZE)
849a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_FIXED_SIZE:
850a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
851a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_ROUNDING_UPPER)
852a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case QUALIFIER_ROUNDING_UPPER:
853a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
854a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return TRUE;
855a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    default:
856a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return FALSE;
857a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
858a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
859a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
860a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
861a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioSetLocale
862a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
863a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LOCALE)
864a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
865a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioSetLocale(TRIO_NOARGS)
866a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
867a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  internalLocaleValues = (struct lconv *)localeconv();
868a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (internalLocaleValues)
869a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
870a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((internalLocaleValues->decimal_point) &&
871a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  (internalLocaleValues->decimal_point[0] != NIL))
872a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
873a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  internalDecimalPointLength = trio_length(internalLocaleValues->decimal_point);
874a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (internalDecimalPointLength == 1)
875a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
876a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      internalDecimalPoint = internalLocaleValues->decimal_point[0];
877a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
878a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
879a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
880a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      internalDecimalPoint = NIL;
881a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      trio_copy_max(internalDecimalPointString,
882a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    sizeof(internalDecimalPointString),
883a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    internalLocaleValues->decimal_point);
884a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
885a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
886a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((internalLocaleValues->thousands_sep) &&
887a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  (internalLocaleValues->thousands_sep[0] != NIL))
888a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
889a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  trio_copy_max(internalThousandSeparator,
890a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			sizeof(internalThousandSeparator),
891a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			internalLocaleValues->thousands_sep);
892a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  internalThousandSeparatorLength = trio_length(internalThousandSeparator);
893a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
894a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((internalLocaleValues->grouping) &&
895a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  (internalLocaleValues->grouping[0] != NIL))
896a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
897a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  trio_copy_max(internalGrouping,
898a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			sizeof(internalGrouping),
899a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			internalLocaleValues->grouping);
900a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
901a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
902a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
903a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* defined(USE_LOCALE) */
904a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
905a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
906a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioCalcThousandSeparatorLength
907a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((digits),
908a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int digits)
909a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
910a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
911a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int count = 0;
912a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int step = NO_GROUPING;
913a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *groupingPointer = internalGrouping;
914a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
915a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (digits > 0)
916a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
917a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (*groupingPointer == CHAR_MAX)
918a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
919a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Disable grouping */
920a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break; /* while */
921a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
922a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (*groupingPointer == 0)
923a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
924a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Repeat last group */
925a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (step == NO_GROUPING)
926a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
927a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Error in locale */
928a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* while */
929a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
930a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
931a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
932a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
933a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  step = *groupingPointer++;
934a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
935a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (digits > step)
936a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	count += internalThousandSeparatorLength;
937a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      digits -= step;
938a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
939a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return count;
940a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
941a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return 0;
942a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
943a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
944a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
945a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
946a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioFollowedBySeparator
947a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((position),
948a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int position)
949a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
950a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
951a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int step = 0;
952a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *groupingPointer = internalGrouping;
953a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
954a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  position--;
955a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (position == 0)
956a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return FALSE;
957a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (position > 0)
958a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
959a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (*groupingPointer == CHAR_MAX)
960a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
961a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Disable grouping */
962a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break; /* while */
963a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
964a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (*groupingPointer != 0)
965a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
966a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  step = *groupingPointer++;
967a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
968a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (step == 0)
969a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break;
970a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      position -= step;
971a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
972a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (position == 0);
973a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
974a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return FALSE;
975a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
976a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
977a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
978a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
979a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioGetPosition
980a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
981a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Get the %n$ position.
982a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
983a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
984a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioGetPosition
985a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((format, indexPointer),
986a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
987a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *indexPointer)
988a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
989a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_UNIX98
990a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *tmpformat;
991a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int number = 0;
992a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int index = *indexPointer;
993a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
994a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  number = (int)trio_to_long(&format[index], &tmpformat, BASE_DECIMAL);
995a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  index = (int)(tmpformat - format);
996a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((number != 0) && (QUALIFIER_POSITION == format[index++]))
997a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
998a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *indexPointer = index;
999a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /*
1000a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * number is decreased by 1, because n$ starts from 1, whereas
1001a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * the array it is indexing starts from 0.
1002a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       */
1003a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return number - 1;
1004a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
1005a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1006a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return NO_POSITION;
1007a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
1008a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1009a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
1010a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
1011a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioFindNamespace
1012a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
1013a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Find registered user-defined specifier.
1014a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * The prev argument is used for optimization only.
1015a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
1016a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE trio_userdef_t *
1017a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioFindNamespace
1018a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((name, prev),
1019a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *name,
1020a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_userdef_t **prev)
1021a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
1022a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_userdef_t *def;
1023a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1024a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (internalEnterCriticalRegion)
1025a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    (void)internalEnterCriticalRegion(NULL);
1026a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1027a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (def = internalUserDef; def; def = def->next)
1028a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1029a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Case-sensitive string comparison */
1030a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (trio_equal_case(def->name, name))
1031a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break;
1032a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1033a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (prev)
1034a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	*prev = def;
1035a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
1036a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1037a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (internalLeaveCriticalRegion)
1038a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    (void)internalLeaveCriticalRegion(NULL);
1039a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1040a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return def;
1041a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
1042a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1043a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1044a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
1045a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioPower
1046a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
1047a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
1048a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Calculate pow(base, exponent), where number and exponent are integers.
1049a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
1050a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE trio_long_double_t
1051a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioPower
1052a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((number, exponent),
1053a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int number,
1054a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int exponent)
1055a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
1056a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t result;
1057a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1058a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (number == 10)
1059a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1060a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      switch (exponent)
1061a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
1062a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Speed up calculation of common cases */
1063a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 0:
1064a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E-1);
1065a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1066a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 1:
1067a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+0);
1068a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1069a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 2:
1070a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+1);
1071a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1072a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 3:
1073a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+2);
1074a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1075a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 4:
1076a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+3);
1077a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1078a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 5:
1079a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+4);
1080a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1081a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 6:
1082a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+5);
1083a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1084a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 7:
1085a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+6);
1086a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1087a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 8:
1088a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+7);
1089a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1090a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case 9:
1091a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+8);
1092a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1093a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	default:
1094a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = powl((trio_long_double_t)number,
1095a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			(trio_long_double_t)exponent);
1096a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1097a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
1098a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
1099a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
1100a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1101a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return powl((trio_long_double_t)number, (trio_long_double_t)exponent);
1102a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
1103a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return result;
1104a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
1105a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1106a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
1107a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioLogarithm
1108a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
1109a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE double
1110a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioLogarithm
1111a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((number, base),
1112a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   double number,
1113a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int base)
1114a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
1115a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  double result;
1116a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1117a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (number <= 0.0)
1118a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1119a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* xlC crashes on log(0) */
1120a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      result = (number == 0.0) ? trio_ninf() : trio_nan();
1121a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
1122a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
1123a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1124a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (base == 10)
1125a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
1126a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = log10(number);
1127a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
1128a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
1129a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
1130a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  result = log10(number) / log10((double)base);
1131a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
1132a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
1133a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return result;
1134a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
1135a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1136a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
1137a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioLogarithmBase
1138a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
1139a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE double
1140a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioLogarithmBase
1141a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((base),
1142a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int base)
1143a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
1144a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  switch (base)
1145a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1146a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case BASE_BINARY : return 1.0;
1147a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case BASE_OCTAL  : return 3.0;
1148a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case BASE_DECIMAL: return 3.321928094887362345;
1149a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case BASE_HEX    : return 4.0;
1150a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    default          : return TrioLogarithm((double)base, 2);
1151a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
1152a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
1153a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1154a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
1155a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioParse
1156a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
1157a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
1158a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Parse the format string
1159a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
1160a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
1161a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioParse
1162a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS5((type, format, parameters, arglist, argarray),
1163a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int type,
1164a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
1165a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_parameter_t *parameters,
1166a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list *arglist,
1167a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *argarray)
1168a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
1169a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Count the number of times a parameter is referenced */
1170a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  unsigned short usedEntries[MAX_PARAMETERS];
1171a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Parameter counters */
1172a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int parameterPosition;
1173a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int currentParam;
1174a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int maxParam = -1;
1175a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Utility variables */
1176a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_flags_t flags;
1177a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int width;
1178a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int precision;
1179a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int varsize;
1180a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int base;
1181a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int index;  /* Index into formatting string */
1182a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int dots;  /* Count number of dots in modifier part */
1183a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T positional;  /* Does the specifier have a positional? */
1184a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T gotSticky = FALSE;  /* Are there any sticky modifiers at all? */
1185a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
1186a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * indices specifies the order in which the parameters must be
1187a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * read from the va_args (this is necessary to handle positionals)
1188a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
1189a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int indices[MAX_PARAMETERS];
1190a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int pos = 0;
1191a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Various variables */
1192a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char ch;
1193a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
1194a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int charlen;
1195a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1196a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int save_errno;
1197a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i = -1;
1198a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int num;
1199a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *tmpformat;
1200a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1201a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* One and only one of arglist and argarray must be used */
1202a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert((arglist != NULL) ^ (argarray != NULL));
1203a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1204a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
1205a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * The 'parameters' array is not initialized, but we need to
1206a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * know which entries we have used.
1207a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
1208a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  memset(usedEntries, 0, sizeof(usedEntries));
1209a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1210a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  save_errno = errno;
1211a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  index = 0;
1212a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  parameterPosition = 0;
1213a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
1214a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  (void)mblen(NULL, 0);
1215a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1216a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1217a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (format[index])
1218a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1219a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
1220a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (! isascii(format[index]))
1221a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
1222a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
1223a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * Multibyte characters cannot be legal specifiers or
1224a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * modifiers, so we skip over them.
1225a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
1226a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  charlen = mblen(&format[index], MB_LEN_MAX);
1227a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  index += (charlen > 0) ? charlen : 1;
1228a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  continue; /* while */
1229a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
1230a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
1231a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (CHAR_IDENTIFIER == format[index++])
1232a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
1233a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (CHAR_IDENTIFIER == format[index])
1234a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1235a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      index++;
1236a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      continue; /* while */
1237a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1238a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1239a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  flags = FLAGS_NEW;
1240a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  dots = 0;
1241a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  currentParam = TrioGetPosition(format, &index);
1242a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  positional = (NO_POSITION != currentParam);
1243a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (!positional)
1244a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1245a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* We have no positional, get the next counter */
1246a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      currentParam = parameterPosition;
1247a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1248a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang          if(currentParam >= MAX_PARAMETERS)
1249a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1250a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Bail out completely to make the error more obvious */
1251a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      return TRIO_ERROR_RETURN(TRIO_ETOOMANY, index);
1252a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1253a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1254a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (currentParam > maxParam)
1255a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    maxParam = currentParam;
1256a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1257a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Default values */
1258a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  width = NO_WIDTH;
1259a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  precision = NO_PRECISION;
1260a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  base = NO_BASE;
1261a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  varsize = NO_SIZE;
1262a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1263a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  while (TrioIsQualifier(format[index]))
1264a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1265a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      ch = format[index++];
1266a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1267a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      switch (ch)
1268a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
1269a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_SPACE:
1270a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_SPACE;
1271a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1272a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1273a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_PLUS:
1274a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_SHOWSIGN;
1275a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1276a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1277a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_MINUS:
1278a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_LEFTADJUST;
1279a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags &= ~FLAGS_NILPADDING;
1280a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1281a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1282a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_ALTERNATIVE:
1283a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_ALTERNATIVE;
1284a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1285a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1286a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_DOT:
1287a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (dots == 0) /* Precision */
1288a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1289a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      dots++;
1290a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1291a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* Skip if no precision */
1292a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (QUALIFIER_DOT == format[index])
1293a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			break;
1294a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1295a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* After the first dot we have the precision */
1296a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags |= FLAGS_PRECISION;
1297a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if ((QUALIFIER_STAR == format[index])
1298a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PARAM)
1299a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  || (QUALIFIER_PARAM == format[index])
1300a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1301a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  )
1302a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1303a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  index++;
1304a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  flags |= FLAGS_PRECISION_PARAMETER;
1305a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1306a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  precision = TrioGetPosition(format, &index);
1307a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (precision == NO_POSITION)
1308a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    {
1309a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      parameterPosition++;
1310a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      if (positional)
1311a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				precision = parameterPosition;
1312a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      else
1313a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				{
1314a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  precision = currentParam;
1315a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  currentParam = precision + 1;
1316a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				}
1317a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    }
1318a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  else
1319a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    {
1320a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      if (! positional)
1321a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				currentParam = precision + 1;
1322a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      if (width > maxParam)
1323a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				maxParam = precision;
1324a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    }
1325a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (currentParam > maxParam)
1326a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    maxParam = currentParam;
1327a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1328a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
1329a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1330a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  precision = trio_to_long(&format[index],
1331a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang						   &tmpformat,
1332a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang						   BASE_DECIMAL);
1333a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  index = (int)(tmpformat - format);
1334a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1335a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1336a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (dots == 1) /* Base */
1337a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1338a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      dots++;
1339a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1340a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* After the second dot we have the base */
1341a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags |= FLAGS_BASE;
1342a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if ((QUALIFIER_STAR == format[index])
1343a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PARAM)
1344a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  || (QUALIFIER_PARAM == format[index])
1345a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1346a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  )
1347a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1348a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  index++;
1349a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  flags |= FLAGS_BASE_PARAMETER;
1350a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  base = TrioGetPosition(format, &index);
1351a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (base == NO_POSITION)
1352a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    {
1353a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      parameterPosition++;
1354a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      if (positional)
1355a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				base = parameterPosition;
1356a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      else
1357a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				{
1358a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  base = currentParam;
1359a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  currentParam = base + 1;
1360a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				}
1361a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    }
1362a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  else
1363a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    {
1364a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      if (! positional)
1365a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				currentParam = base + 1;
1366a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      if (base > maxParam)
1367a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				maxParam = base;
1368a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    }
1369a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (currentParam > maxParam)
1370a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    maxParam = currentParam;
1371a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1372a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
1373a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1374a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  base = trio_to_long(&format[index],
1375a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					      &tmpformat,
1376a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					      BASE_DECIMAL);
1377a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (base > MAX_BASE)
1378a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1379a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  index = (int)(tmpformat - format);
1380a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1381a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1382a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
1383a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1384a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1385a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1386a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* QUALIFIER_DOT */
1387a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1388a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PARAM)
1389a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_PARAM:
1390a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  type = TYPE_PRINT;
1391a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* FALLTHROUGH */
1392a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1393a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_STAR:
1394a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* This has different meanings for print and scan */
1395a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (TYPE_PRINT == type)
1396a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1397a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* Read with from parameter */
1398a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER);
1399a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      width = TrioGetPosition(format, &index);
1400a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (width == NO_POSITION)
1401a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1402a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  parameterPosition++;
1403a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (positional)
1404a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    width = parameterPosition;
1405a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  else
1406a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    {
1407a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      width = currentParam;
1408a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      currentParam = width + 1;
1409a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    }
1410a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1411a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
1412a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1413a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (! positional)
1414a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    currentParam = width + 1;
1415a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (width > maxParam)
1416a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    maxParam = width;
1417a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1418a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (currentParam > maxParam)
1419a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			maxParam = currentParam;
1420a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1421a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
1422a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1423a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* Scan, but do not store result */
1424a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags |= FLAGS_IGNORE;
1425a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1426a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1427a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* QUALIFIER_STAR */
1428a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1429a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case '0':
1430a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (! (flags & FLAGS_LEFTADJUST))
1431a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_NILPADDING;
1432a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* FALLTHROUGH */
1433a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case '1': case '2': case '3': case '4':
1434a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case '5': case '6': case '7': case '8': case '9':
1435a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_WIDTH;
1436a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* &format[index - 1] is used to "rewind" the read
1437a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		   * character from format
1438a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		   */
1439a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  width = trio_to_long(&format[index - 1],
1440a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				       &tmpformat,
1441a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				       BASE_DECIMAL);
1442a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index = (int)(tmpformat - format);
1443a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1444a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1445a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_SHORT:
1446a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_SHORTSHORT)
1447a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1448a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (flags & FLAGS_SHORT)
1449a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_SHORTSHORT;
1450a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
1451a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_SHORT;
1452a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1453a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1454a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_LONG:
1455a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_QUAD)
1456a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1457a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (flags & FLAGS_LONG)
1458a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_QUAD;
1459a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
1460a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_LONG;
1461a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1462a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1463a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_LONG_UPPER:
1464a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_LONGDOUBLE;
1465a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1466a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1467a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T)
1468a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_SIZE_T:
1469a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_SIZE_T;
1470a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Modify flags for later truncation of number */
1471a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (sizeof(size_t) == sizeof(trio_ulonglong_t))
1472a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_QUAD;
1473a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (sizeof(size_t) == sizeof(long))
1474a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_LONG;
1475a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1476a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1477a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1478a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PTRDIFF_T)
1479a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_PTRDIFF_T:
1480a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_PTRDIFF_T;
1481a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t))
1482a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_QUAD;
1483a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (sizeof(ptrdiff_t) == sizeof(long))
1484a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_LONG;
1485a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1486a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1487a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1488a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_INTMAX_T)
1489a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_INTMAX_T:
1490a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_INTMAX_T;
1491a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t))
1492a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_QUAD;
1493a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (sizeof(trio_intmax_t) == sizeof(long))
1494a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    flags |= FLAGS_LONG;
1495a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1496a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1497a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1498a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_QUAD)
1499a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_QUAD:
1500a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_QUAD;
1501a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1502a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1503a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1504a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_FIXED_SIZE)
1505a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_FIXED_SIZE:
1506a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_FIXED_SIZE)
1507a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1508a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1509a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & (FLAGS_ALL_SIZES | FLAGS_LONGDOUBLE |
1510a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			       FLAGS_WIDECHAR | FLAGS_VARSIZE_PARAMETER))
1511a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1512a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1513a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if ((format[index] == '6') &&
1514a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      (format[index + 1] == '4'))
1515a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1516a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      varsize = sizeof(trio_int64_t);
1517a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      index += 2;
1518a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1519a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if ((format[index] == '3') &&
1520a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			   (format[index + 1] == '2'))
1521a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1522a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      varsize = sizeof(trio_int32_t);
1523a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      index += 2;
1524a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1525a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if ((format[index] == '1') &&
1526a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			   (format[index + 1] == '6'))
1527a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1528a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      varsize = sizeof(trio_int16_t);
1529a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      index += 2;
1530a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1531a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (format[index] == '8')
1532a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1533a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      varsize = sizeof(trio_int8_t);
1534a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      index++;
1535a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1536a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
1537a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1538a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1539a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_FIXED_SIZE;
1540a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1541a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1542a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1543a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_WIDECHAR)
1544a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_WIDECHAR:
1545a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_WIDECHAR;
1546a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1547a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1548a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1549a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T_UPPER)
1550a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_SIZE_T_UPPER:
1551a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1552a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1553a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1554a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_QUOTE)
1555a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_QUOTE:
1556a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_QUOTE;
1557a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1558a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1559a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1560a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_STICKY)
1561a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_STICKY:
1562a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_STICKY;
1563a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  gotSticky = TRUE;
1564a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1565a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1566a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1567a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_VARSIZE)
1568a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_VARSIZE:
1569a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_VARSIZE_PARAMETER;
1570a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  parameterPosition++;
1571a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (positional)
1572a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    varsize = parameterPosition;
1573a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
1574a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1575a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      varsize = currentParam;
1576a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      currentParam = varsize + 1;
1577a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1578a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (currentParam > maxParam)
1579a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    maxParam = currentParam;
1580a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1581a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1582a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1583a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_ROUNDING_UPPER)
1584a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case QUALIFIER_ROUNDING_UPPER:
1585a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  flags |= FLAGS_ROUNDING;
1586a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
1587a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1588a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1589a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		default:
1590a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Bail out completely to make the error more obvious */
1591a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                  return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1592a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
1593a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    } /* while qualifier */
1594a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1595a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
1596a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * Parameters only need the type and value. The value is
1597a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * read later.
1598a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
1599a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_WIDTH_PARAMETER)
1600a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1601a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      usedEntries[width] += 1;
1602a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_PARAMETER;
1603a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].flags = 0;
1604a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      indices[width] = pos;
1605a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      width = pos++;
1606a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1607a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_PRECISION_PARAMETER)
1608a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1609a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      usedEntries[precision] += 1;
1610a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_PARAMETER;
1611a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].flags = 0;
1612a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      indices[precision] = pos;
1613a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      precision = pos++;
1614a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1615a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_BASE_PARAMETER)
1616a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1617a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      usedEntries[base] += 1;
1618a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_PARAMETER;
1619a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].flags = 0;
1620a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      indices[base] = pos;
1621a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = pos++;
1622a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1623a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_VARSIZE_PARAMETER)
1624a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1625a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      usedEntries[varsize] += 1;
1626a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_PARAMETER;
1627a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].flags = 0;
1628a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      indices[varsize] = pos;
1629a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      varsize = pos++;
1630a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1631a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1632a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  indices[currentParam] = pos;
1633a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1634a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  switch (format[index++])
1635a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1636a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(SPECIFIER_CHAR_UPPER)
1637a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_CHAR_UPPER:
1638a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_WIDECHAR;
1639a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1640a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1641a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_CHAR:
1642a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (flags & FLAGS_LONG)
1643a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		flags |= FLAGS_WIDECHAR;
1644a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (flags & FLAGS_SHORT)
1645a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		flags &= ~FLAGS_WIDECHAR;
1646a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_CHAR;
1647a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1648a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1649a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(SPECIFIER_STRING_UPPER)
1650a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_STRING_UPPER:
1651a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_WIDECHAR;
1652a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1653a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1654a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_STRING:
1655a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (flags & FLAGS_LONG)
1656a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		flags |= FLAGS_WIDECHAR;
1657a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (flags & FLAGS_SHORT)
1658a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		flags &= ~FLAGS_WIDECHAR;
1659a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_STRING;
1660a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1661a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1662a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_GROUP:
1663a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (TYPE_SCAN == type)
1664a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
1665a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  int depth = 1;
1666a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  parameters[pos].type = FORMAT_GROUP;
1667a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (format[index] == QUALIFIER_CIRCUMFLEX)
1668a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    index++;
1669a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (format[index] == SPECIFIER_UNGROUP)
1670a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    index++;
1671a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (format[index] == QUALIFIER_MINUS)
1672a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    index++;
1673a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Skip nested brackets */
1674a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  while (format[index] != NIL)
1675a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1676a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (format[index] == SPECIFIER_GROUP)
1677a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1678a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  depth++;
1679a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1680a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else if (format[index] == SPECIFIER_UNGROUP)
1681a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
1682a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  if (--depth <= 0)
1683a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    {
1684a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      index++;
1685a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      break;
1686a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    }
1687a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
1688a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      index++;
1689a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1690a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
1691a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1692a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1693a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_INTEGER:
1694a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_INT;
1695a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1696a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1697a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_UNSIGNED:
1698a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UNSIGNED;
1699a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_INT;
1700a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1701a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1702a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_DECIMAL:
1703a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Disable base modifier */
1704a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags &= ~FLAGS_BASE_PARAMETER;
1705a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = BASE_DECIMAL;
1706a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_INT;
1707a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1708a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1709a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_OCTAL:
1710a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UNSIGNED;
1711a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags &= ~FLAGS_BASE_PARAMETER;
1712a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = BASE_OCTAL;
1713a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_INT;
1714a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1715a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1716a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(SPECIFIER_BINARY)
1717a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_BINARY_UPPER:
1718a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UPPER;
1719a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1720a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_BINARY:
1721a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_NILPADDING;
1722a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags &= ~FLAGS_BASE_PARAMETER;
1723a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = BASE_BINARY;
1724a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_INT;
1725a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1726a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1727a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1728a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_HEX_UPPER:
1729a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UPPER;
1730a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1731a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_HEX:
1732a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UNSIGNED;
1733a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags &= ~FLAGS_BASE_PARAMETER;
1734a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = BASE_HEX;
1735a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_INT;
1736a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1737a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1738a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_FLOAT_E_UPPER:
1739a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UPPER;
1740a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1741a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_FLOAT_E:
1742a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_FLOAT_E;
1743a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_DOUBLE;
1744a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1745a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1746a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_FLOAT_G_UPPER:
1747a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UPPER;
1748a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1749a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_FLOAT_G:
1750a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_FLOAT_G;
1751a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_DOUBLE;
1752a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1753a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1754a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_FLOAT_F_UPPER:
1755a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UPPER;
1756a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1757a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_FLOAT_F:
1758a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_DOUBLE;
1759a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1760a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1761a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_POINTER:
1762a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (sizeof(trio_pointer_t) == sizeof(trio_ulonglong_t))
1763a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		flags |= FLAGS_QUAD;
1764a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (sizeof(trio_pointer_t) == sizeof(long))
1765a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		flags |= FLAGS_LONG;
1766a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_POINTER;
1767a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1768a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1769a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_COUNT:
1770a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_COUNT;
1771a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1772a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1773a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(SPECIFIER_HEXFLOAT)
1774a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# if defined(SPECIFIER_HEXFLOAT_UPPER)
1775a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_HEXFLOAT_UPPER:
1776a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags |= FLAGS_UPPER;
1777a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* FALLTHROUGH */
1778a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# endif
1779a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_HEXFLOAT:
1780a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = BASE_HEX;
1781a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_DOUBLE;
1782a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1783a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1784a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1785a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(FORMAT_ERRNO)
1786a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_ERRNO:
1787a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[pos].type = FORMAT_ERRNO;
1788a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1789a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1790a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1791a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(SPECIFIER_USER_DEFINED_BEGIN)
1792a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case SPECIFIER_USER_DEFINED_BEGIN:
1793a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      {
1794a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		unsigned int max;
1795a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		int without_namespace = TRUE;
1796a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1797a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[pos].type = FORMAT_USER_DEFINED;
1798a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[pos].user_name[0] = NIL;
1799a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		tmpformat = (char *)&format[index];
1800a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1801a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		while ((ch = format[index]))
1802a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
1803a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    index++;
1804a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (ch == SPECIFIER_USER_DEFINED_END)
1805a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      {
1806a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			if (without_namespace)
1807a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  {
1808a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    /* We must get the handle first */
1809a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    parameters[pos].type = FORMAT_PARAMETER;
1810a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    parameters[pos].indexAfterSpecifier = index;
1811a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    parameters[pos].flags = FLAGS_USER_DEFINED;
1812a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    /* Adjust parameters for insertion of new one */
1813a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    pos++;
1814a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    usedEntries[currentParam] += 1;
1815a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    parameters[pos].type = FORMAT_USER_DEFINED;
1816a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    currentParam++;
1817a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    indices[currentParam] = pos;
1818a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    if (currentParam > maxParam)
1819a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      maxParam = currentParam;
1820a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  }
1821a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			/* Copy the user data */
1822a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			max = (unsigned int)(&format[index] - tmpformat);
1823a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			if (max > MAX_USER_DATA)
1824a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  max = MAX_USER_DATA;
1825a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			trio_copy_max(parameters[pos].user_data,
1826a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      max,
1827a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      tmpformat);
1828a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			break; /* while */
1829a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      }
1830a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (ch == SPECIFIER_USER_DEFINED_SEPARATOR)
1831a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      {
1832a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			without_namespace = FALSE;
1833a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			/* Copy the namespace for later looking-up */
1834a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			max = (int)(&format[index] - tmpformat);
1835a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			if (max > MAX_USER_NAME)
1836a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  max = MAX_USER_NAME;
1837a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			trio_copy_max(parameters[pos].user_name,
1838a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      max,
1839a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      tmpformat);
1840a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			tmpformat = (char *)&format[index];
1841a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      }
1842a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
1843a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (ch != SPECIFIER_USER_DEFINED_END)
1844a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1845a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      }
1846a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
1847a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */
1848a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1849a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    default:
1850a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Bail out completely to make the error more obvious */
1851a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang              return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1852a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1853a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1854a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*  Count the number of times this entry has been used */
1855a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  usedEntries[currentParam] += 1;
1856a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1857a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Find last sticky parameters */
1858a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (gotSticky && !(flags & FLAGS_STICKY))
1859a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1860a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      for (i = pos - 1; i >= 0; i--)
1861a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
1862a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (parameters[i].type == FORMAT_PARAMETER)
1863a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    continue;
1864a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if ((parameters[i].flags & FLAGS_STICKY) &&
1865a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      (parameters[i].type == parameters[pos].type))
1866a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1867a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* Do not overwrite current qualifiers */
1868a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY);
1869a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (width == NO_WIDTH)
1870a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			width = parameters[i].width;
1871a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (precision == NO_PRECISION)
1872a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			precision = parameters[i].precision;
1873a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (base == NO_BASE)
1874a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			base = parameters[i].base;
1875a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      break;
1876a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
1877a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
1878a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1879a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1880a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[pos].indexAfterSpecifier = index;
1881a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[pos].flags = flags;
1882a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[pos].width = width;
1883a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[pos].precision = precision;
1884a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base;
1885a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[pos].varsize = varsize;
1886a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  pos++;
1887a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1888a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (! positional)
1889a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    parameterPosition++;
1890a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1891a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	} /* if identifier */
1892a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1893a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    } /* while format characters left */
1894a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1895a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (num = 0; num <= maxParam; num++)
1896a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
1897a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (usedEntries[num] != 1)
1898a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
1899a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (usedEntries[num] == 0) /* gap detected */
1900a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    return TRIO_ERROR_RETURN(TRIO_EGAP, num);
1901a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else /* double references detected */
1902a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    return TRIO_ERROR_RETURN(TRIO_EDBLREF, num);
1903a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
1904a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1905a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      i = indices[num];
1906a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1907a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /*
1908a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * FORMAT_PARAMETERS are only present if they must be read,
1909a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * so it makes no sense to check the ignore flag (besides,
1910a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * the flags variable is not set for that particular type)
1911a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       */
1912a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((parameters[i].type != FORMAT_PARAMETER) &&
1913a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  (parameters[i].flags & FLAGS_IGNORE))
1914a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	continue; /* for all arguments */
1915a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1916a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /*
1917a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * The stack arguments are read according to ANSI C89
1918a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * default argument promotions:
1919a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *
1920a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  char           = int
1921a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  short          = int
1922a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  unsigned char  = unsigned int
1923a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  unsigned short = unsigned int
1924a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  float          = double
1925a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *
1926a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * In addition to the ANSI C89 these types are read (the
1927a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * default argument promotions of C99 has not been
1928a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * considered yet)
1929a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *
1930a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  long long
1931a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  long double
1932a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  size_t
1933a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  ptrdiff_t
1934a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       *  intmax_t
1935a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       */
1936a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      switch (parameters[i].type)
1937a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
1938a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_GROUP:
1939a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_STRING:
1940a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
1941a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_WIDECHAR)
1942a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1943a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[i].data.wstring = (argarray == NULL)
1944a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		? va_arg(*arglist, trio_wchar_t *)
1945a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		: (trio_wchar_t *)(argarray[num]);
1946a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1947a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
1948a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1949a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1950a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      parameters[i].data.string = (argarray == NULL)
1951a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		? va_arg(*arglist, char *)
1952a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		: (char *)(argarray[num]);
1953a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1954a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1955a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1956a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(FORMAT_USER_DEFINED)
1957a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_USER_DEFINED:
1958a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
1959a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_POINTER:
1960a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_COUNT:
1961a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_UNKNOWN:
1962a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[i].data.pointer = (argarray == NULL)
1963a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    ? va_arg(*arglist, trio_pointer_t )
1964a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    : argarray[num];
1965a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
1966a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
1967a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_CHAR:
1968a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_INT:
1969a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (TYPE_SCAN == type)
1970a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1971a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang              if (argarray == NULL)
1972a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                parameters[i].data.pointer =
1973a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                  (trio_pointer_t)va_arg(*arglist, trio_pointer_t);
1974a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang              else
1975a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                {
1976a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                  if (parameters[i].type == FORMAT_CHAR)
1977a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                    parameters[i].data.pointer =
1978a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                      (trio_pointer_t)((char *)argarray[num]);
1979a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                  else if (parameters[i].flags & FLAGS_SHORT)
1980a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                    parameters[i].data.pointer =
1981a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                      (trio_pointer_t)((short *)argarray[num]);
1982a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                  else
1983a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                    parameters[i].data.pointer =
1984a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                      (trio_pointer_t)((int *)argarray[num]);
1985a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                }
1986a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
1987a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
1988a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
1989a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_VARSIZE) || defined(QUALIFIER_FIXED_SIZE)
1990a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (parameters[i].flags
1991a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  & (FLAGS_VARSIZE_PARAMETER | FLAGS_FIXED_SIZE))
1992a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
1993a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER)
1994a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
1995a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /*
1996a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * Variable sizes are mapped onto the fixed sizes, in
1997a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * accordance with integer promotion.
1998a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       *
1999a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * Please note that this may not be portable, as we
2000a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * only guess the size, not the layout of the numbers.
2001a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * For example, if int is little-endian, and long is
2002a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * big-endian, then this will fail.
2003a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       */
2004a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned;
2005a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
2006a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
2007a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
2008a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* Used for the I<bits> modifiers */
2009a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      varsize = parameters[i].varsize;
2010a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
2011a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  parameters[i].flags &= ~FLAGS_ALL_VARSIZES;
2012a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2013a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (varsize <= (int)sizeof(int))
2014a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    ;
2015a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (varsize <= (int)sizeof(long))
2016a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].flags |= FLAGS_LONG;
2017a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_INTMAX_T)
2018a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (varsize <= (int)sizeof(trio_longlong_t))
2019a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].flags |= FLAGS_QUAD;
2020a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
2021a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].flags |= FLAGS_INTMAX_T;
2022a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#else
2023a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
2024a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].flags |= FLAGS_QUAD;
2025a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
2026a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
2027a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* defined(QUALIFIER_VARSIZE) */
2028a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
2029a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (parameters[i].flags & FLAGS_SIZE_T)
2030a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[i].data.number.as_unsigned = (argarray == NULL)
2031a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ? (trio_uintmax_t)va_arg(*arglist, size_t)
2032a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  : (trio_uintmax_t)(*((size_t *)argarray[num]));
2033a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
2034a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
2035a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PTRDIFF_T)
2036a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (parameters[i].flags & FLAGS_PTRDIFF_T)
2037a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[i].data.number.as_unsigned = (argarray == NULL)
2038a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ? (trio_uintmax_t)va_arg(*arglist, ptrdiff_t)
2039a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num]));
2040a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
2041a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
2042a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_INTMAX_T)
2043a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (parameters[i].flags & FLAGS_INTMAX_T)
2044a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[i].data.number.as_unsigned = (argarray == NULL)
2045a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ? (trio_uintmax_t)va_arg(*arglist, trio_intmax_t)
2046a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num]));
2047a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
2048a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
2049a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (parameters[i].flags & FLAGS_QUAD)
2050a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[i].data.number.as_unsigned = (argarray == NULL)
2051a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ? (trio_uintmax_t)va_arg(*arglist, trio_ulonglong_t)
2052a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num]));
2053a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (parameters[i].flags & FLAGS_LONG)
2054a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[i].data.number.as_unsigned = (argarray == NULL)
2055a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ? (trio_uintmax_t)va_arg(*arglist, long)
2056a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  : (trio_uintmax_t)(*((long *)argarray[num]));
2057a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
2058a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
2059a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (argarray == NULL)
2060a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(*arglist, int);
2061a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
2062a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
2063a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (parameters[i].type == FORMAT_CHAR)
2064a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((char *)argarray[num]));
2065a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else if (parameters[i].flags & FLAGS_SHORT)
2066a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((short *)argarray[num]));
2067a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
2068a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((int *)argarray[num]));
2069a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
2070a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
2071a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2072a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2073a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2074a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_PARAMETER:
2075a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
2076a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * The parameter for the user-defined specifier is a pointer,
2077a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * whereas the rest (width, precision, base) uses an integer.
2078a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
2079a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (parameters[i].flags & FLAGS_USER_DEFINED)
2080a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    parameters[i].data.pointer = (argarray == NULL)
2081a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      ? va_arg(*arglist, trio_pointer_t )
2082a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      : argarray[num];
2083a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
2084a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    parameters[i].data.number.as_unsigned = (argarray == NULL)
2085a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      ? (trio_uintmax_t)va_arg(*arglist, int)
2086a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      : (trio_uintmax_t)(*((int *)argarray[num]));
2087a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2088a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2089a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_DOUBLE:
2090a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (TYPE_SCAN == type)
2091a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2092a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (parameters[i].flags & FLAGS_LONGDOUBLE)
2093a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[i].data.longdoublePointer = (argarray == NULL)
2094a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ? va_arg(*arglist, trio_long_double_t *)
2095a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  : (trio_long_double_t *)argarray[num];
2096a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
2097a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                {
2098a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (parameters[i].flags & FLAGS_LONG)
2099a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].data.doublePointer = (argarray == NULL)
2100a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      ? va_arg(*arglist, double *)
2101a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      : (double *)argarray[num];
2102a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
2103a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].data.doublePointer = (argarray == NULL)
2104a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      ? (double *)va_arg(*arglist, float *)
2105a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      : (double *)((float *)argarray[num]);
2106a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang                }
2107a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2108a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
2109a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2110a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (parameters[i].flags & FLAGS_LONGDOUBLE)
2111a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		parameters[i].data.longdoubleNumber = (argarray == NULL)
2112a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ? va_arg(*arglist, trio_long_double_t)
2113a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  : (trio_long_double_t)(*((trio_long_double_t *)argarray[num]));
2114a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
2115a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
2116a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (argarray == NULL)
2117a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    parameters[i].data.longdoubleNumber =
2118a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      (trio_long_double_t)va_arg(*arglist, double);
2119a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
2120a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
2121a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (parameters[i].flags & FLAGS_SHORT)
2122a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			parameters[i].data.longdoubleNumber =
2123a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  (trio_long_double_t)(*((float *)argarray[num]));
2124a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
2125a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			parameters[i].data.longdoubleNumber =
2126a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  (trio_long_double_t)(*((double *)argarray[num]));
2127a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
2128a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
2129a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2130a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2131a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2132a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(FORMAT_ERRNO)
2133a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case FORMAT_ERRNO:
2134a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  parameters[i].data.errorNumber = save_errno;
2135a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2136a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
2137a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2138a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	default:
2139a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2140a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2141a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    } /* for all specifiers */
2142a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return num;
2143a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
2144a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2145a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2146a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2147a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2148a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * FORMATTING
2149a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2150a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
2151a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2152a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2153a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2154a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioWriteNumber
2155a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2156a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
2157a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Output a number.
2158a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  The complexity of this function is a result of the complexity
2159a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  of the dependencies of the flags.
2160a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
2161a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
2162a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioWriteNumber
2163a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS6((self, number, flags, width, precision, base),
2164a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
2165a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_uintmax_t number,
2166a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
2167a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width,
2168a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int precision,
2169a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int base)
2170a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
2171a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isNegative;
2172a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isNumberZero;
2173a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isPrecisionZero;
2174a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T ignoreNumber;
2175a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1];
2176a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *bufferend;
2177a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *pointer;
2178a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_CONST char *digits;
2179a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
2180a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int length;
2181a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *p;
2182a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int count;
2183a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2184a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
2185a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->OutStream));
2186a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));
2187a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2188a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;
2189a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (base == NO_BASE)
2190a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    base = BASE_DECIMAL;
2191a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2192a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  isNumberZero = (number == 0);
2193a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  isPrecisionZero = (precision == 0);
2194a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ignoreNumber = (isNumberZero
2195a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  && isPrecisionZero
2196a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  && !((flags & FLAGS_ALTERNATIVE) && (base == BASE_OCTAL)));
2197a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2198a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_UNSIGNED)
2199a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2200a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      isNegative = FALSE;
2201a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      flags &= ~FLAGS_SHOWSIGN;
2202a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2203a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2204a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2205a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      isNegative = ((trio_intmax_t)number < 0);
2206a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isNegative)
2207a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	number = -((trio_intmax_t)number);
2208a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2209a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2210a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_QUAD)
2211a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    number &= (trio_ulonglong_t)-1;
2212a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else if (flags & FLAGS_LONG)
2213a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    number &= (unsigned long)-1;
2214a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2215a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    number &= (unsigned int)-1;
2216a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2217a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Build number */
2218a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  pointer = bufferend = &buffer[sizeof(buffer) - 1];
2219a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *pointer-- = NIL;
2220a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 1; i < (int)sizeof(buffer); i++)
2221a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2222a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *pointer-- = digits[number % base];
2223a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      number /= base;
2224a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (number == 0)
2225a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break;
2226a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2227a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((flags & FLAGS_QUOTE) && TrioFollowedBySeparator(i + 1))
2228a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2229a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
2230a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * We are building the number from the least significant
2231a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * to the most significant digit, so we have to copy the
2232a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * thousand separator backwards
2233a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
2234a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  length = internalThousandSeparatorLength;
2235a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (((int)(pointer - buffer) - length) > 0)
2236a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2237a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      p = &internalThousandSeparator[length - 1];
2238a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      while (length-- > 0)
2239a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		*pointer-- = *p--;
2240a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2241a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2242a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2243a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2244a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (! ignoreNumber)
2245a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2246a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Adjust width */
2247a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      width -= (bufferend - pointer) - 1;
2248a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2249a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2250a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Adjust precision */
2251a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NO_PRECISION != precision)
2252a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2253a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      precision -= (bufferend - pointer) - 1;
2254a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (precision < 0)
2255a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	precision = 0;
2256a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      flags |= FLAGS_NILPADDING;
2257a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2258a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2259a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Calculate padding */
2260a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION)))
2261a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? precision
2262a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : 0;
2263a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2264a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Adjust width further */
2265a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
2266a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    width--;
2267a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)
2268a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2269a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      switch (base)
2270a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2271a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_BINARY:
2272a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_HEX:
2273a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  width -= 2;
2274a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2275a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_OCTAL:
2276a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (!(flags & FLAGS_NILPADDING) || (count == 0))
2277a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    width--;
2278a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2279a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	default:
2280a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2281a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2282a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2283a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2284a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Output prefixes spaces if needed */
2285a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (! ((flags & FLAGS_LEFTADJUST) ||
2286a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	 ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION))))
2287a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2288a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (width-- > count)
2289a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, CHAR_ADJUST);
2290a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2291a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2292a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* width has been adjusted for signs and alternatives */
2293a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (isNegative)
2294a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    self->OutStream(self, '-');
2295a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else if (flags & FLAGS_SHOWSIGN)
2296a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    self->OutStream(self, '+');
2297a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else if (flags & FLAGS_SPACE)
2298a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    self->OutStream(self, ' ');
2299a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2300a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Prefix is not written when the value is zero */
2301a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)
2302a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2303a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      switch (base)
2304a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2305a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_BINARY:
2306a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, '0');
2307a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b');
2308a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2309a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2310a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_OCTAL:
2311a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (!(flags & FLAGS_NILPADDING) || (count == 0))
2312a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    self->OutStream(self, '0');
2313a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2314a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2315a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_HEX:
2316a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, '0');
2317a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
2318a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2319a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2320a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	default:
2321a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
2322a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	} /* switch base */
2323a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2324a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2325a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Output prefixed zero padding if needed */
2326a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_NILPADDING)
2327a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2328a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (precision == NO_PRECISION)
2329a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	precision = width;
2330a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (precision-- > 0)
2331a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2332a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, '0');
2333a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  width--;
2334a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2335a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2336a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2337a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (! ignoreNumber)
2338a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2339a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Output the number itself */
2340a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (*(++pointer))
2341a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2342a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, *pointer);
2343a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2344a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2345a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2346a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Output trailing spaces if needed */
2347a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_LEFTADJUST)
2348a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2349a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (width-- > 0)
2350a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, CHAR_ADJUST);
2351a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2352a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
2353a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2354a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2355a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioWriteStringCharacter
2356a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2357a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
2358a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Output a single character of a string
2359a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
2360a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
2361a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioWriteStringCharacter
2362a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((self, ch, flags),
2363a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
2364a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int ch,
2365a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags)
2366a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
2367a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_ALTERNATIVE)
2368a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2369a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (! isprint(ch))
2370a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2371a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
2372a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * Non-printable characters are converted to C escapes or
2373a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * \number, if no C escape exists.
2374a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
2375a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, CHAR_BACKSLASH);
2376a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  switch (ch)
2377a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2378a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\007': self->OutStream(self, 'a'); break;
2379a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\b': self->OutStream(self, 'b'); break;
2380a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\f': self->OutStream(self, 'f'); break;
2381a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\n': self->OutStream(self, 'n'); break;
2382a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\r': self->OutStream(self, 'r'); break;
2383a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\t': self->OutStream(self, 't'); break;
2384a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\v': self->OutStream(self, 'v'); break;
2385a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\\': self->OutStream(self, '\\'); break;
2386a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    default:
2387a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->OutStream(self, 'x');
2388a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      TrioWriteNumber(self, (trio_uintmax_t)ch,
2389a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      FLAGS_UNSIGNED | FLAGS_NILPADDING,
2390a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			      2, 2, BASE_HEX);
2391a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
2392a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2393a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2394a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (ch == CHAR_BACKSLASH)
2395a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2396a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, CHAR_BACKSLASH);
2397a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, CHAR_BACKSLASH);
2398a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2399a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2400a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2401a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, ch);
2402a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2403a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2404a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2405a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2406a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->OutStream(self, ch);
2407a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2408a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
2409a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2410a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2411a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioWriteString
2412a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2413a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
2414a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Output a string
2415a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
2416a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
2417a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioWriteString
2418a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS5((self, string, flags, width, precision),
2419a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
2420a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *string,
2421a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
2422a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width,
2423a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int precision)
2424a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
2425a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int length;
2426a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int ch;
2427a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2428a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
2429a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->OutStream));
2430a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2431a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (string == NULL)
2432a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2433a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      string = internalNullString;
2434a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      length = sizeof(internalNullString) - 1;
2435a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Disable quoting for the null pointer */
2436a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      flags &= (~FLAGS_QUOTE);
2437a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      width = 0;
2438a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2439a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2440a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2441a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      length = trio_length(string);
2442a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2443a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((NO_PRECISION != precision) &&
2444a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      (precision < length))
2445a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2446a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      length = precision;
2447a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2448a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  width -= length;
2449a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2450a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_QUOTE)
2451a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    self->OutStream(self, CHAR_QUOTE);
2452a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2453a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (! (flags & FLAGS_LEFTADJUST))
2454a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2455a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (width-- > 0)
2456a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, CHAR_ADJUST);
2457a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2458a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2459a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (length-- > 0)
2460a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2461a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* The ctype parameters must be an unsigned char (or EOF) */
2462a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      ch = (int)((unsigned char)(*string++));
2463a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioWriteStringCharacter(self, ch, flags);
2464a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2465a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2466a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_LEFTADJUST)
2467a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2468a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (width-- > 0)
2469a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, CHAR_ADJUST);
2470a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2471a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_QUOTE)
2472a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    self->OutStream(self, CHAR_QUOTE);
2473a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
2474a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2475a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2476a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioWriteWideStringCharacter
2477a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2478a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
2479a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Output a wide string as a multi-byte sequence
2480a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
2481a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
2482a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
2483a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioWriteWideStringCharacter
2484a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((self, wch, flags, width),
2485a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
2486a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_wchar_t wch,
2487a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
2488a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
2489a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
2490a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int size;
2491a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
2492a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int ch;
2493a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *string;
2494a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char buffer[MB_LEN_MAX + 1];
2495a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2496a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (width == NO_WIDTH)
2497a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    width = sizeof(buffer);
2498a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2499a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  size = wctomb(buffer, wch);
2500a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((size <= 0) || (size > width) || (buffer[0] == NIL))
2501a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return 0;
2502a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2503a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  string = buffer;
2504a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  i = size;
2505a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while ((width >= i) && (width-- > 0) && (i-- > 0))
2506a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2507a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* The ctype parameters must be an unsigned char (or EOF) */
2508a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      ch = (int)((unsigned char)(*string++));
2509a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioWriteStringCharacter(self, ch, flags);
2510a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2511a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return size;
2512a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
2513a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_WIDECHAR */
2514a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2515a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2516a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioWriteWideString
2517a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2518a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
2519a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  Output a wide character string as a multi-byte string
2520a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
2521a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
2522a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
2523a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioWriteWideString
2524a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS5((self, wstring, flags, width, precision),
2525a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
2526a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST trio_wchar_t *wstring,
2527a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
2528a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width,
2529a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int precision)
2530a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
2531a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int length;
2532a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int size;
2533a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2534a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
2535a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->OutStream));
2536a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2537a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
2538a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  (void)mblen(NULL, 0);
2539a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
2540a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2541a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (wstring == NULL)
2542a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2543a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioWriteString(self, NULL, flags, width, precision);
2544a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return;
2545a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2546a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2547a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NO_PRECISION == precision)
2548a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2549a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      length = INT_MAX;
2550a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2551a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2552a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2553a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      length = precision;
2554a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      width -= length;
2555a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2556a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2557a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_QUOTE)
2558a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    self->OutStream(self, CHAR_QUOTE);
2559a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2560a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (! (flags & FLAGS_LEFTADJUST))
2561a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2562a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (width-- > 0)
2563a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, CHAR_ADJUST);
2564a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2565a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2566a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (length > 0)
2567a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2568a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      size = TrioWriteWideStringCharacter(self, *wstring++, flags, length);
2569a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (size == 0)
2570a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break; /* while */
2571a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      length -= size;
2572a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2573a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2574a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_LEFTADJUST)
2575a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2576a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (width-- > 0)
2577a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, CHAR_ADJUST);
2578a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2579a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_QUOTE)
2580a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    self->OutStream(self, CHAR_QUOTE);
2581a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
2582a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_WIDECHAR */
2583a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2584a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
2585a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioWriteDouble
2586a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2587a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_211.htm
2588a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2589a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * "5.2.4.2.2 paragraph #4
2590a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
2591a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  The accuracy [...] is implementation defined, as is the accuracy
2592a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  of the conversion between floating-point internal representations
2593a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  and string representations performed by the libray routine in
2594a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  <stdio.h>"
2595a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
2596a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* FIXME: handle all instances of constant long-double number (L)
2597a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *   and *l() math functions.
2598a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
2599a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
2600a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioWriteDouble
2601a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS6((self, number, flags, width, precision, base),
2602a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
2603a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_long_double_t number,
2604a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
2605a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width,
2606a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int precision,
2607a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int base)
2608a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
2609a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t integerNumber;
2610a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t fractionNumber;
2611a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t workNumber;
2612a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int integerDigits;
2613a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int fractionDigits;
2614a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int exponentDigits;
2615a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int baseDigits;
2616a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int integerThreshold;
2617a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int fractionThreshold;
2618a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int expectedWidth;
2619a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int exponent = 0;
2620a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  unsigned int uExponent = 0;
2621a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int exponentBase;
2622a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t dblBase;
2623a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t dblIntegerBase;
2624a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t dblFractionBase;
2625a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t integerAdjust;
2626a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t fractionAdjust;
2627a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isNegative;
2628a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isExponentNegative = FALSE;
2629a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T requireTwoDigitExponent;
2630a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isHex;
2631a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_CONST char *digits;
2632a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *groupingPointer;
2633a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
2634a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int index;
2635a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T hasOnlyZeroes;
2636a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int zeroes = 0;
2637a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  register int trailingZeroes;
2638a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T keepTrailingZeroes;
2639a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T keepDecimalPoint;
2640a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_long_double_t epsilon;
2641a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2642a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
2643a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->OutStream));
2644a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));
2645a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2646a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Determine sign and look for special quantities */
2647a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  switch (trio_fpclassify_and_signbit(number, &isNegative))
2648a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2649a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_FP_NAN:
2650a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioWriteString(self,
2651a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      (flags & FLAGS_UPPER)
2652a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      ? NAN_UPPER
2653a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      : NAN_LOWER,
2654a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags, width, precision);
2655a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return;
2656a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2657a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_FP_INFINITE:
2658a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isNegative)
2659a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2660a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Negative infinity */
2661a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  TrioWriteString(self,
2662a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  (flags & FLAGS_UPPER)
2663a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  ? "-" INFINITE_UPPER
2664a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  : "-" INFINITE_LOWER,
2665a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  flags, width, precision);
2666a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  return;
2667a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2668a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2669a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2670a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Positive infinity */
2671a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  TrioWriteString(self,
2672a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  (flags & FLAGS_UPPER)
2673a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  ? INFINITE_UPPER
2674a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  : INFINITE_LOWER,
2675a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  flags, width, precision);
2676a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  return;
2677a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2678a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2679a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    default:
2680a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Finitude */
2681a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      break;
2682a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2683a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2684a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Normal numbers */
2685a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_LONGDOUBLE)
2686a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2687a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      baseDigits = (base == 10)
2688a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	? LDBL_DIG
2689a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	: (int)floor(LDBL_MANT_DIG / TrioLogarithmBase(base));
2690a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      epsilon = LDBL_EPSILON;
2691a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2692a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else if (flags & FLAGS_SHORT)
2693a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2694a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      baseDigits = (base == BASE_DECIMAL)
2695a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	? FLT_DIG
2696a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	: (int)floor(FLT_MANT_DIG / TrioLogarithmBase(base));
2697a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      epsilon = FLT_EPSILON;
2698a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2699a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2700a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2701a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      baseDigits = (base == BASE_DECIMAL)
2702a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	? DBL_DIG
2703a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	: (int)floor(DBL_MANT_DIG / TrioLogarithmBase(base));
2704a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      epsilon = DBL_EPSILON;
2705a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2706a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2707a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower;
2708a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  isHex = (base == BASE_HEX);
2709a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (base == NO_BASE)
2710a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    base = BASE_DECIMAL;
2711a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  dblBase = (trio_long_double_t)base;
2712a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  keepTrailingZeroes = !( (flags & FLAGS_ROUNDING) ||
2713a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  ( (flags & FLAGS_FLOAT_G) &&
2714a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    !(flags & FLAGS_ALTERNATIVE) ) );
2715a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2716a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_ROUNDING)
2717a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    precision = baseDigits;
2718a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2719a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (precision == NO_PRECISION)
2720a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2721a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isHex)
2722a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2723a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  keepTrailingZeroes = FALSE;
2724a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  precision = FLT_MANT_DIG;
2725a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2726a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2727a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2728a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  precision = FLT_DIG;
2729a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2730a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2731a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2732a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (isNegative)
2733a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    number = -number;
2734a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2735a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (isHex)
2736a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    flags |= FLAGS_FLOAT_E;
2737a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2738a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_FLOAT_G)
2739a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2740a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (precision == 0)
2741a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	precision = 1;
2742a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2743a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((number < 1.0E-4) || (number > powl(base,
2744a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					      (trio_long_double_t)precision)))
2745a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2746a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Use scientific notation */
2747a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  flags |= FLAGS_FLOAT_E;
2748a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2749a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (number < 1.0)
2750a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2751a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
2752a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * Use normal notation. If the integer part of the number is
2753a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * zero, then adjust the precision to include leading fractional
2754a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * zeros.
2755a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
2756a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  workNumber = TrioLogarithm(number, base);
2757a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  workNumber = TRIO_FABS(workNumber);
2758a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (workNumber - floorl(workNumber) < 0.001)
2759a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    workNumber--;
2760a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  zeroes = (int)floorl(workNumber);
2761a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2762a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2763a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2764a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_FLOAT_E)
2765a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2766a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Scale the number */
2767a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      workNumber = TrioLogarithm(number, base);
2768a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (trio_isinf(workNumber) == -1)
2769a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2770a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  exponent = 0;
2771a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Undo setting */
2772a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_FLOAT_G)
2773a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    flags &= ~FLAGS_FLOAT_E;
2774a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2775a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2776a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2777a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  exponent = (int)floorl(workNumber);
2778a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  number /= powl(dblBase, (trio_long_double_t)exponent);
2779a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  isExponentNegative = (exponent < 0);
2780a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  uExponent = (isExponentNegative) ? -exponent : exponent;
2781a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (isHex)
2782a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    uExponent *= 4; /* log16(2) */
2783a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* No thousand separators */
2784a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  flags &= ~FLAGS_QUOTE;
2785a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2786a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2787a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2788a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  integerNumber = floorl(number);
2789a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  fractionNumber = number - integerNumber;
2790a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2791a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
2792a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Truncated number.
2793a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   *
2794a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Precision is number of significant digits for FLOAT_G
2795a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * and number of fractional digits for others.
2796a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
2797a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  integerDigits = (integerNumber > epsilon)
2798a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? 1 + (int)TrioLogarithm(integerNumber, base)
2799a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : 1;
2800a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0))
2801a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? precision - integerDigits
2802a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : zeroes + precision;
2803a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2804a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  dblFractionBase = TrioPower(base, fractionDigits);
2805a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2806a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  workNumber = number + 0.5 / dblFractionBase;
2807a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (floorl(number) != floorl(workNumber))
2808a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2809a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (flags & FLAGS_FLOAT_E)
2810a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2811a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */
2812a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  exponent++;
2813a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  isExponentNegative = (exponent < 0);
2814a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  uExponent = (isExponentNegative) ? -exponent : exponent;
2815a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (isHex)
2816a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    uExponent *= 4; /* log16(2) */
2817a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  workNumber = (number + 0.5 / dblFractionBase) / dblBase;
2818a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  integerNumber = floorl(workNumber);
2819a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionNumber = workNumber - integerNumber;
2820a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2821a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2822a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2823a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Adjust if number was rounded up one digit (ie. 99 to 100) */
2824a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  integerNumber = floorl(number + 0.5);
2825a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionNumber = 0.0;
2826a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  integerDigits = (integerNumber > epsilon)
2827a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    ? 1 + (int)TrioLogarithm(integerNumber, base)
2828a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    : 1;
2829a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2830a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2831a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2832a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Estimate accuracy */
2833a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  integerAdjust = fractionAdjust = 0.5;
2834a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_ROUNDING)
2835a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2836a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (integerDigits > baseDigits)
2837a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2838a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  integerThreshold = baseDigits;
2839a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionDigits = 0;
2840a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  dblFractionBase = 1.0;
2841a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionThreshold = 0;
2842a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  precision = 0; /* Disable decimal-point */
2843a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  integerAdjust = TrioPower(base, integerDigits - integerThreshold - 1);
2844a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionAdjust = 0.0;
2845a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2846a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2847a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2848a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  integerThreshold = integerDigits;
2849a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionThreshold = fractionDigits - integerThreshold;
2850a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionAdjust = 1.0;
2851a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2852a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2853a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2854a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2855a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      integerThreshold = INT_MAX;
2856a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      fractionThreshold = INT_MAX;
2857a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2858a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2859a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
2860a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Calculate expected width.
2861a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   *  sign + integer part + thousands separators + decimal point
2862a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   *  + fraction + exponent
2863a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
2864a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  fractionAdjust /= dblFractionBase;
2865a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  hasOnlyZeroes = (floorl((fractionNumber + fractionAdjust) * dblFractionBase) < epsilon);
2866a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) ||
2867a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       !((precision == 0) ||
2868a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			 (!keepTrailingZeroes && hasOnlyZeroes)) );
2869a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_FLOAT_E)
2870a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2871a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      exponentDigits = (uExponent == 0)
2872a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	? 1
2873a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	: (int)ceil(TrioLogarithm((double)(uExponent + 1),
2874a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  (isHex) ? 10.0 : base));
2875a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2876a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2877a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    exponentDigits = 0;
2878a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  requireTwoDigitExponent = ((base == BASE_DECIMAL) && (exponentDigits == 1));
2879a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2880a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  expectedWidth = integerDigits + fractionDigits
2881a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    + (keepDecimalPoint
2882a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       ? internalDecimalPointLength
2883a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       : 0)
2884a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    + ((flags & FLAGS_QUOTE)
2885a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       ? TrioCalcThousandSeparatorLength(integerDigits)
2886a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       : 0);
2887a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
2888a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    expectedWidth += sizeof("-") - 1;
2889a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (exponentDigits > 0)
2890a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    expectedWidth += exponentDigits +
2891a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      ((requireTwoDigitExponent ? sizeof("E+0") : sizeof("E+")) - 1);
2892a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (isHex)
2893a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    expectedWidth += sizeof("0X") - 1;
2894a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2895a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Output prefixing */
2896a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_NILPADDING)
2897a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2898a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Leading zeros must be after sign */
2899a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isNegative)
2900a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, '-');
2901a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (flags & FLAGS_SHOWSIGN)
2902a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, '+');
2903a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (flags & FLAGS_SPACE)
2904a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, ' ');
2905a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isHex)
2906a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2907a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, '0');
2908a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
2909a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2910a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (!(flags & FLAGS_LEFTADJUST))
2911a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2912a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  for (i = expectedWidth; i < width; i++)
2913a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2914a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->OutStream(self, '0');
2915a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2916a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2917a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2918a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
2919a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2920a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Leading spaces must be before sign */
2921a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (!(flags & FLAGS_LEFTADJUST))
2922a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2923a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  for (i = expectedWidth; i < width; i++)
2924a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2925a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->OutStream(self, CHAR_ADJUST);
2926a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2927a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2928a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isNegative)
2929a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, '-');
2930a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (flags & FLAGS_SHOWSIGN)
2931a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, '+');
2932a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (flags & FLAGS_SPACE)
2933a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->OutStream(self, ' ');
2934a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isHex)
2935a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2936a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, '0');
2937a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
2938a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2939a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2940a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2941a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Output the integer part and thousand separators */
2942a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  dblIntegerBase = 1.0 / TrioPower(base, integerDigits - 1);
2943a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0; i < integerDigits; i++)
2944a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2945a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      workNumber = floorl(((integerNumber + integerAdjust) * dblIntegerBase));
2946a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (i > integerThreshold)
2947a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2948a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Beyond accuracy */
2949a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, digits[0]);
2950a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2951a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2952a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2953a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, digits[(int)fmodl(workNumber, dblBase)]);
2954a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2955a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      dblIntegerBase *= dblBase;
2956a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2957a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE)
2958a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  && TrioFollowedBySeparator(integerDigits - i))
2959a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2960a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  for (groupingPointer = internalThousandSeparator;
2961a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	       *groupingPointer != NIL;
2962a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	       groupingPointer++)
2963a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2964a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->OutStream(self, *groupingPointer);
2965a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2966a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2967a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2968a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2969a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Insert decimal point and build the fraction part */
2970a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trailingZeroes = 0;
2971a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2972a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (keepDecimalPoint)
2973a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2974a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (internalDecimalPoint)
2975a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2976a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, internalDecimalPoint);
2977a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2978a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2979a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2980a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  for (i = 0; i < internalDecimalPointLength; i++)
2981a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
2982a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->OutStream(self, internalDecimalPointString[i]);
2983a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
2984a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2985a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
2986a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
2987a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0; i < fractionDigits; i++)
2988a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
2989a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((integerDigits > integerThreshold) || (i > fractionThreshold))
2990a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2991a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Beyond accuracy */
2992a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  trailingZeroes++;
2993a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
2994a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
2995a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
2996a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionNumber *= dblBase;
2997a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionAdjust *= dblBase;
2998a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  workNumber = floorl(fractionNumber + fractionAdjust);
2999a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  fractionNumber -= workNumber;
3000a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  index = (int)fmodl(workNumber, dblBase);
3001a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (index == 0)
3002a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
3003a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      trailingZeroes++;
3004a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
3005a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
3006a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
3007a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      while (trailingZeroes > 0)
3008a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
3009a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Not trailing zeroes after all */
3010a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->OutStream(self, digits[0]);
3011a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  trailingZeroes--;
3012a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
3013a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->OutStream(self, digits[index]);
3014a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
3015a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3016a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3017a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3018a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (keepTrailingZeroes)
3019a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3020a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (trailingZeroes > 0)
3021a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3022a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, digits[0]);
3023a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  trailingZeroes--;
3024a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3025a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3026a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3027a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Output exponent */
3028a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (exponentDigits > 0)
3029a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3030a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->OutStream(self,
3031a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      isHex
3032a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      ? ((flags & FLAGS_UPPER) ? 'P' : 'p')
3033a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      : ((flags & FLAGS_UPPER) ? 'E' : 'e'));
3034a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->OutStream(self, (isExponentNegative) ? '-' : '+');
3035a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3036a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* The exponent must contain at least two digits */
3037a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (requireTwoDigitExponent)
3038a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang        self->OutStream(self, '0');
3039a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3040a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isHex)
3041a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	base = 10.0;
3042a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      exponentBase = (int)TrioPower(base, exponentDigits - 1);
3043a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      for (i = 0; i < exponentDigits; i++)
3044a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3045a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, digits[(uExponent / exponentBase) % base]);
3046a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  exponentBase /= base;
3047a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3048a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3049a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Output trailing spaces */
3050a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_LEFTADJUST)
3051a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3052a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      for (i = expectedWidth; i < width; i++)
3053a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3054a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->OutStream(self, CHAR_ADJUST);
3055a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3056a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3057a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3058a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3059a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3060a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioFormatProcess
3061a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
3062a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Description:
3063a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  This is the main engine for formatting output
3064a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3065a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
3066a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioFormatProcess
3067a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((data, format, parameters),
3068a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *data,
3069a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3070a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_parameter_t *parameters)
3071a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3072a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
3073a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int charlen;
3074a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3075a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
3076a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_CONST char *string;
3077a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_pointer_t pointer;
3078a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_flags_t flags;
3079a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int width;
3080a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int precision;
3081a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int base;
3082a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int index;
3083a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3084a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  index = 0;
3085a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  i = 0;
3086a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
3087a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  (void)mblen(NULL, 0);
3088a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3089a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3090a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (format[index])
3091a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3092a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
3093a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (! isascii(format[index]))
3094a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3095a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  charlen = mblen(&format[index], MB_LEN_MAX);
3096a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
3097a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * Only valid multibyte characters are handled here. Invalid
3098a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * multibyte characters (charlen == -1) are handled as normal
3099a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * characters.
3100a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
3101a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (charlen != -1)
3102a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
3103a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      while (charlen-- > 0)
3104a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
3105a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  data->OutStream(data, format[index++]);
3106a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
3107a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      continue; /* while characters left in formatting string */
3108a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
3109a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3110a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
3111a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (CHAR_IDENTIFIER == format[index])
3112a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3113a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (CHAR_IDENTIFIER == format[index + 1])
3114a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
3115a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      data->OutStream(data, CHAR_IDENTIFIER);
3116a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      index += 2;
3117a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
3118a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
3119a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
3120a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Skip the parameter entries */
3121a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      while (parameters[i].type == FORMAT_PARAMETER)
3122a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		i++;
3123a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3124a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      flags = parameters[i].flags;
3125a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3126a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Find width */
3127a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      width = parameters[i].width;
3128a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (flags & FLAGS_WIDTH_PARAMETER)
3129a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
3130a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Get width from parameter list */
3131a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  width = (int)parameters[width].data.number.as_signed;
3132a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (width < 0)
3133a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3134a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /*
3135a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * A negative width is the same as the - flag and
3136a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * a positive width.
3137a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       */
3138a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags |= FLAGS_LEFTADJUST;
3139a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags &= ~FLAGS_NILPADDING;
3140a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      width = -width;
3141a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3142a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
3143a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3144a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Find precision */
3145a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (flags & FLAGS_PRECISION)
3146a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
3147a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  precision = parameters[i].precision;
3148a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_PRECISION_PARAMETER)
3149a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3150a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* Get precision from parameter list */
3151a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      precision = (int)parameters[precision].data.number.as_signed;
3152a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (precision < 0)
3153a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
3154a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  /*
3155a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			   * A negative precision is the same as no
3156a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			   * precision
3157a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			   */
3158a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  precision = NO_PRECISION;
3159a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
3160a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3161a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
3162a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
3163a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
3164a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  precision = NO_PRECISION;
3165a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
3166a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3167a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Find base */
3168a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = parameters[i].base;
3169a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (flags & FLAGS_BASE_PARAMETER)
3170a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
3171a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Get base from parameter list */
3172a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  base = (int)parameters[base].data.number.as_signed;
3173a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
3174a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3175a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      switch (parameters[i].type)
3176a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
3177a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_CHAR:
3178a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_QUOTE)
3179a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    data->OutStream(data, CHAR_QUOTE);
3180a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (! (flags & FLAGS_LEFTADJUST))
3181a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3182a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      while (--width > 0)
3183a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			data->OutStream(data, CHAR_ADJUST);
3184a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3185a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
3186a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_WIDECHAR)
3187a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3188a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioWriteWideStringCharacter(data,
3189a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang						   (trio_wchar_t)parameters[i].data.number.as_signed,
3190a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang						   flags,
3191a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang						   NO_WIDTH);
3192a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3193a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
3194a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3195a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3196a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioWriteStringCharacter(data,
3197a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					       (int)parameters[i].data.number.as_signed,
3198a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					       flags);
3199a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3200a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3201a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_LEFTADJUST)
3202a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3203a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      while(--width > 0)
3204a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			data->OutStream(data, CHAR_ADJUST);
3205a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3206a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_QUOTE)
3207a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    data->OutStream(data, CHAR_QUOTE);
3208a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3209a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_CHAR */
3210a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3211a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_INT:
3212a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioWriteNumber(data,
3213a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  parameters[i].data.number.as_unsigned,
3214a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  flags,
3215a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  width,
3216a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  precision,
3217a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  base);
3218a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3219a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_INT */
3220a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3221a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_DOUBLE:
3222a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioWriteDouble(data,
3223a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  parameters[i].data.longdoubleNumber,
3224a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  flags,
3225a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  width,
3226a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  precision,
3227a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				  base);
3228a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_DOUBLE */
3229a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3230a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_STRING:
3231a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
3232a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_WIDECHAR)
3233a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3234a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioWriteWideString(data,
3235a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  parameters[i].data.wstring,
3236a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  flags,
3237a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  width,
3238a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  precision);
3239a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3240a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
3241a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3242a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3243a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioWriteString(data,
3244a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      parameters[i].data.string,
3245a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      flags,
3246a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      width,
3247a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      precision);
3248a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3249a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_STRING */
3250a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3251a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_POINTER:
3252a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
3253a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    trio_reference_t reference;
3254a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3255a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    reference.data = data;
3256a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    reference.parameter = &parameters[i];
3257a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    trio_print_pointer(&reference, parameters[i].data.pointer);
3258a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
3259a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_POINTER */
3260a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3261a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_COUNT:
3262a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  pointer = parameters[i].data.pointer;
3263a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (NULL != pointer)
3264a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3265a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /*
3266a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * C99 paragraph 7.19.6.1.8 says "the number of
3267a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * characters written to the output stream so far by
3268a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       * this call", which is data->committed
3269a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       */
3270a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
3271a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (flags & FLAGS_SIZE_T)
3272a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			*(size_t *)pointer = (size_t)data->committed;
3273a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
3274a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3275a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PTRDIFF_T)
3276a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (flags & FLAGS_PTRDIFF_T)
3277a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			*(ptrdiff_t *)pointer = (ptrdiff_t)data->committed;
3278a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
3279a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3280a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_INTMAX_T)
3281a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (flags & FLAGS_INTMAX_T)
3282a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			*(trio_intmax_t *)pointer = (trio_intmax_t)data->committed;
3283a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
3284a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3285a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      if (flags & FLAGS_QUAD)
3286a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
3287a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->committed;
3288a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
3289a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else if (flags & FLAGS_LONG)
3290a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
3291a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  *(long int *)pointer = (long int)data->committed;
3292a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
3293a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else if (flags & FLAGS_SHORT)
3294a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
3295a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  *(short int *)pointer = (short int)data->committed;
3296a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
3297a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      else
3298a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			{
3299a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  *(int *)pointer = (int)data->committed;
3300a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			}
3301a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3302a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_COUNT */
3303a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3304a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_PARAMETER:
3305a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_PARAMETER */
3306a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3307a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(FORMAT_ERRNO)
3308a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_ERRNO:
3309a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  string = trio_error(parameters[i].data.errorNumber);
3310a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (string)
3311a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3312a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioWriteString(data,
3313a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      string,
3314a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      flags,
3315a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      width,
3316a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      precision);
3317a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3318a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
3319a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
3320a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      data->OutStream(data, '#');
3321a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioWriteNumber(data,
3322a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      (trio_uintmax_t)parameters[i].data.errorNumber,
3323a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      flags,
3324a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      width,
3325a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      precision,
3326a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      BASE_DECIMAL);
3327a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3328a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break; /* FORMAT_ERRNO */
3329a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* defined(FORMAT_ERRNO) */
3330a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3331a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(FORMAT_USER_DEFINED)
3332a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		case FORMAT_USER_DEFINED:
3333a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
3334a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    trio_reference_t reference;
3335a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    trio_userdef_t *def = NULL;
3336a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3337a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (parameters[i].user_name[0] == NIL)
3338a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      {
3339a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			/* Use handle */
3340a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			if ((i > 0) ||
3341a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			    (parameters[i - 1].type == FORMAT_PARAMETER))
3342a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  def = (trio_userdef_t *)parameters[i - 1].data.pointer;
3343a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      }
3344a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else
3345a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      {
3346a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			/* Look up namespace */
3347a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			def = TrioFindNamespace(parameters[i].user_name, NULL);
3348a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      }
3349a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (def) {
3350a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      reference.data = data;
3351a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      reference.parameter = &parameters[i];
3352a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      def->callback(&reference);
3353a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
3354a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
3355a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
3356a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* defined(FORMAT_USER_DEFINED) */
3357a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3358a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		default:
3359a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  break;
3360a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		} /* switch parameter type */
3361a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3362a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Prepare for next */
3363a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      index = parameters[i].indexAfterSpecifier;
3364a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      i++;
3365a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
3366a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3367a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else /* not identifier */
3368a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3369a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  data->OutStream(data, format[index++]);
3370a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3371a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3372a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return data->processed;
3373a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3374a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3375a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3376a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioFormatRef
3377a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3378a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
3379a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioFormatRef
3380a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((reference, format, arglist, argarray),
3381a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_reference_t *reference,
3382a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3383a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list *arglist,
3384a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *argarray)
3385a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3386a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3387a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_parameter_t parameters[MAX_PARAMETERS];
3388a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3389a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray);
3390a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (status < 0)
3391a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return status;
3392a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3393a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormatProcess(reference->data, format, parameters);
3394a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (reference->data->error != 0)
3395a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3396a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = reference->data->error;
3397a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3398a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3399a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3400a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3401a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3402a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioFormat
3403a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3404a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
3405a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioFormat
3406a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray),
3407a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t destination,
3408a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   size_t destinationSize,
3409a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   void (*OutStream) TRIO_PROTO((trio_class_t *, int)),
3410a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3411a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list *arglist,
3412a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *argarray)
3413a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3414a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3415a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_class_t data;
3416a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_parameter_t parameters[MAX_PARAMETERS];
3417a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3418a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(OutStream));
3419a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3420a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3421a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  memset(&data, 0, sizeof(data));
3422a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.OutStream = OutStream;
3423a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.location = destination;
3424a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.max = destinationSize;
3425a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.error = 0;
3426a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3427a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LOCALE)
3428a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NULL == internalLocaleValues)
3429a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3430a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioSetLocale();
3431a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3432a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3433a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3434a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray);
3435a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (status < 0)
3436a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return status;
3437a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3438a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormatProcess(&data, format, parameters);
3439a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (data.error != 0)
3440a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3441a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = data.error;
3442a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3443a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3444a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3445a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3446a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3447a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioOutStreamFile
3448a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3449a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
3450a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioOutStreamFile
3451a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, output),
3452a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
3453a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int output)
3454a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3455a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FILE *file;
3456a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3457a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
3458a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->location));
3459a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3460a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  file = (FILE *)self->location;
3461a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->processed++;
3462a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (fputc(output, file) == EOF)
3463a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3464a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->error = TRIO_ERROR_RETURN(TRIO_EOF, 0);
3465a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3466a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
3467a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3468a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
3469a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3470a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3471a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3472a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3473a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioOutStreamFileDescriptor
3474a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3475a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
3476a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioOutStreamFileDescriptor
3477a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, output),
3478a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
3479a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int output)
3480a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3481a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int fd;
3482a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char ch;
3483a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3484a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
3485a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3486a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  fd = *((int *)self->location);
3487a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ch = (char)output;
3488a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->processed++;
3489a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (write(fd, &ch, sizeof(char)) == -1)
3490a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3491a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);
3492a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3493a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
3494a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3495a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
3496a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3497a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3498a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3499a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3500a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioOutStreamCustom
3501a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3502a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
3503a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioOutStreamCustom
3504a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, output),
3505a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
3506a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int output)
3507a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3508a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3509a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t *data;
3510a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3511a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
3512a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->location));
3513a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3514a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data = (trio_custom_t *)self->location;
3515a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (data->stream.out)
3516a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3517a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = (data->stream.out)(data->closure, output);
3518a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (status >= 0)
3519a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3520a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->committed++;
3521a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3522a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
3523a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
3524a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (self->error == 0)
3525a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
3526a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->error = TRIO_ERROR_RETURN(TRIO_ECUSTOM, -status);
3527a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
3528a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
3529a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3530a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->processed++;
3531a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3532a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3533a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3534a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioOutStreamString
3535a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3536a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
3537a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioOutStreamString
3538a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, output),
3539a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
3540a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int output)
3541a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3542a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char **buffer;
3543a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3544a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
3545a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->location));
3546a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3547a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  buffer = (char **)self->location;
3548a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  **buffer = (char)output;
3549a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  (*buffer)++;
3550a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->processed++;
3551a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->committed++;
3552a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3553a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3554a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3555a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioOutStreamStringMax
3556a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3557a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
3558a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioOutStreamStringMax
3559a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, output),
3560a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
3561a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int output)
3562a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3563a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char **buffer;
3564a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3565a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
3566a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->location));
3567a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3568a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  buffer = (char **)self->location;
3569a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3570a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (self->processed < self->max)
3571a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3572a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      **buffer = (char)output;
3573a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      (*buffer)++;
3574a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
3575a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3576a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->processed++;
3577a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3578a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3579a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3580a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioOutStreamStringDynamic
3581a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3582a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
3583a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioOutStreamStringDynamic
3584a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, output),
3585a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
3586a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int output)
3587a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3588a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
3589a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->location));
3590a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3591a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (self->error == 0)
3592a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
3593a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_xstring_append_char((trio_string_t *)self->location,
3594a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			       (char)output);
3595a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
3596a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
3597a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* The processed variable must always be increased */
3598a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->processed++;
3599a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3600a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3601a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3602a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
3603a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Formatted printing functions
3604a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
3605a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
3606a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3607a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_DOCUMENTATION)
3608a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include "doc/doc_printf.h"
3609a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
3610a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/** @addtogroup Printf
3611a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    @{
3612a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang*/
3613a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3614a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3615a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * printf
3616a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3617a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3618a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3619a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to standard output stream.
3620a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3621a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3622a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param ... Arguments.
3623a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3624a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3625a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3626a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_printf
3627a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS2((format, va_alist),
3628a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
3629a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
3630a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3631a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3632a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
3633a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3634a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3635a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3636a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
3637a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL);
3638a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
3639a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3640a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3641a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3642a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3643a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to standard output stream.
3644a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3645a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3646a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3647a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3648a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3649a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3650a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vprintf
3651a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((format, args),
3652a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3653a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
3654a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3655a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3656a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3657a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL);
3658a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3659a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3660a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3661a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to standard output stream.
3662a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3663a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3664a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3665a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3666a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3667a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3668a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_printfv
3669a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((format, args),
3670a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3671a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t * args)
3672a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3673a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3674a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3675a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(stdout, 0, TrioOutStreamFile, format, NULL, args);
3676a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3677a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3678a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3679a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * fprintf
3680a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3681a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3682a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3683a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to file.
3684a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3685a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param file File pointer.
3686a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3687a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param ... Arguments.
3688a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3689a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3690a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3691a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_fprintf
3692a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((file, format, va_alist),
3693a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    FILE *file,
3694a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
3695a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
3696a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3697a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3698a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
3699a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3700a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(file));
3701a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3702a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3703a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
3704a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL);
3705a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
3706a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3707a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3708a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3709a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3710a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to file.
3711a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3712a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param file File pointer.
3713a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3714a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3715a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3716a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3717a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3718a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vfprintf
3719a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((file, format, args),
3720a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   FILE *file,
3721a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3722a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
3723a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3724a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(file));
3725a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3726a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3727a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL);
3728a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3729a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3730a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3731a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to file.
3732a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3733a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param file File pointer.
3734a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3735a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3736a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3737a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3738a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3739a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_fprintfv
3740a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((file, format, args),
3741a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   FILE *file,
3742a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3743a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t * args)
3744a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3745a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(file));
3746a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3747a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3748a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args);
3749a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3750a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3751a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3752a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * dprintf
3753a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3754a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3755a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3756a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to file descriptor.
3757a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3758a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param fd File descriptor.
3759a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3760a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param ... Arguments.
3761a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3762a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3763a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3764a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_dprintf
3765a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((fd, format, va_alist),
3766a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    int fd,
3767a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
3768a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
3769a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3770a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3771a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
3772a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3773a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3774a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3775a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
3776a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL);
3777a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
3778a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3779a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3780a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3781a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3782a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to file descriptor.
3783a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3784a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param fd File descriptor.
3785a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3786a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3787a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3788a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3789a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3790a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vdprintf
3791a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((fd, format, args),
3792a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int fd,
3793a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3794a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
3795a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3796a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3797a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3798a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL);
3799a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3800a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3801a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3802a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to file descriptor.
3803a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3804a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param fd File descriptor.
3805a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3806a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3807a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3808a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3809a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3810a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_dprintfv
3811a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((fd, format, args),
3812a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int fd,
3813a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3814a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
3815a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3816a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3817a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3818a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args);
3819a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3820a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3821a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3822a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * cprintf
3823a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3824a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3825a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_cprintf
3826a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS4((stream, closure, format, va_alist),
3827a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    trio_outstream_t stream,
3828a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    trio_pointer_t closure,
3829a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
3830a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
3831a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3832a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3833a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
3834a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t data;
3835a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3836a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(stream));
3837a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3838a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3839a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
3840a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.stream.out = stream;
3841a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.closure = closure;
3842a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL);
3843a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
3844a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3845a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3846a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3847a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3848a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vcprintf
3849a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((stream, closure, format, args),
3850a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_outstream_t stream,
3851a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t closure,
3852a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3853a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
3854a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3855a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t data;
3856a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3857a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(stream));
3858a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3859a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3860a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.stream.out = stream;
3861a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.closure = closure;
3862a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL);
3863a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3864a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3865a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3866a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_cprintfv
3867a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((stream, closure, format, args),
3868a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_outstream_t stream,
3869a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t closure,
3870a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3871a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   void **args)
3872a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3873a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t data;
3874a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3875a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(stream));
3876a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3877a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3878a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.stream.out = stream;
3879a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.closure = closure;
3880a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormat(&data, 0, TrioOutStreamCustom, format, NULL, args);
3881a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3882a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3883a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3884a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * sprintf
3885a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3886a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3887a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3888a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to string.
3889a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3890a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param buffer Output string.
3891a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3892a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param ... Arguments.
3893a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3894a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3895a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3896a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_sprintf
3897a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((buffer, format, va_alist),
3898a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    char *buffer,
3899a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
3900a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
3901a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3902a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3903a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
3904a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3905a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
3906a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3907a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3908a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
3909a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL);
3910a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *buffer = NIL; /* Terminate with NIL character */
3911a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
3912a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3913a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3914a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3915a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3916a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to string.
3917a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3918a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param buffer Output string.
3919a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3920a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3921a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3922a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3923a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3924a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vsprintf
3925a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((buffer, format, args),
3926a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *buffer,
3927a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3928a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
3929a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3930a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3931a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3932a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
3933a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3934a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3935a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL);
3936a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *buffer = NIL;
3937a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3938a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3939a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3940a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3941a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print to string.
3942a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3943a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param buffer Output string.
3944a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3945a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
3946a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3947a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3948a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3949a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_sprintfv
3950a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((buffer, format, args),
3951a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *buffer,
3952a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
3953a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
3954a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3955a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3956a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3957a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
3958a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3959a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3960a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, 0, TrioOutStreamString, format, NULL, args);
3961a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *buffer = NIL;
3962a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3963a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
3964a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3965a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
3966a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * snprintf
3967a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3968a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3969a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
3970a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print at most @p max characters to string.
3971a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3972a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param buffer Output string.
3973a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param max Maximum number of characters to print.
3974a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
3975a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param ... Arguments.
3976a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
3977a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
3978a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
3979a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_snprintf
3980a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS4((buffer, max, format, va_alist),
3981a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    char *buffer,
3982a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    size_t max,
3983a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
3984a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
3985a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
3986a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
3987a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
3988a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3989a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
3990a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
3991a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
3992a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
3993a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
3994a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioOutStreamStringMax, format, &args, NULL);
3995a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (max > 0)
3996a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    *buffer = NIL;
3997a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
3998a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
3999a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4000a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4001a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
4002a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print at most @p max characters to string.
4003a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4004a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param buffer Output string.
4005a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param max Maximum number of characters to print.
4006a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
4007a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
4008a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
4009a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4010a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
4011a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vsnprintf
4012a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((buffer, max, format, args),
4013a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *buffer,
4014a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   size_t max,
4015a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
4016a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
4017a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4018a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
4019a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4020a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
4021a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4022a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4023a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
4024a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioOutStreamStringMax, format, &args, NULL);
4025a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (max > 0)
4026a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    *buffer = NIL;
4027a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
4028a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4029a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4030a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
4031a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Print at most @p max characters to string.
4032a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4033a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param buffer Output string.
4034a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param max Maximum number of characters to print.
4035a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
4036a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param args Arguments.
4037a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of printed characters.
4038a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4039a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
4040a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_snprintfv
4041a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((buffer, max, format, args),
4042a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *buffer,
4043a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   size_t max,
4044a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
4045a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
4046a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4047a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
4048a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4049a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
4050a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4051a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4052a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
4053a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioOutStreamStringMax, format, NULL, args);
4054a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (max > 0)
4055a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    *buffer = NIL;
4056a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
4057a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4058a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4059a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4060a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * snprintfcat
4061a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Appends the new string to the buffer string overwriting the '\0'
4062a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * character at the end of buffer.
4063a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4064a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
4065a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_snprintfcat
4066a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS4((buffer, max, format, va_alist),
4067a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    char *buffer,
4068a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    size_t max,
4069a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
4070a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
4071a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4072a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
4073a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
4074a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  size_t buf_len;
4075a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4076a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
4077a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4078a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
4079a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4080a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4081a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  buf_len = trio_length(buffer);
4082a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  buffer = &buffer[buf_len];
4083a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4084a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, max - 1 - buf_len,
4085a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioOutStreamStringMax, format, &args, NULL);
4086a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
4087a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *buffer = NIL;
4088a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
4089a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4090a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4091a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
4092a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vsnprintfcat
4093a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((buffer, max, format, args),
4094a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *buffer,
4095a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   size_t max,
4096a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
4097a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
4098a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4099a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
4100a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  size_t buf_len;
4101a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4102a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
4103a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4104a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4105a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  buf_len = trio_length(buffer);
4106a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  buffer = &buffer[buf_len];
4107a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormat(&buffer, max - 1 - buf_len,
4108a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      TrioOutStreamStringMax, format, &args, NULL);
4109a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *buffer = NIL;
4110a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
4111a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4112a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4113a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4114a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_aprintf
4115a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4116a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4117a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Deprecated */
4118a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC char *
4119a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_aprintf
4120a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS2((format, va_alist),
4121a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
4122a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
4123a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4124a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
4125a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_string_t *info;
4126a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *result = NULL;
4127a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4128a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4129a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4130a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  info = trio_xstring_duplicate("");
4131a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (info)
4132a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4133a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TRIO_VA_START(args, format);
4134a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
4135a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       format, &args, NULL);
4136a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TRIO_VA_END(args);
4137a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4138a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_string_terminate(info);
4139a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      result = trio_string_extract(info);
4140a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_string_destroy(info);
4141a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4142a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return result;
4143a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4144a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4145a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/* Deprecated */
4146a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC char *
4147a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vaprintf
4148a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((format, args),
4149a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
4150a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
4151a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4152a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_string_t *info;
4153a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char *result = NULL;
4154a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4155a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4156a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4157a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  info = trio_xstring_duplicate("");
4158a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (info)
4159a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4160a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
4161a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		       format, &args, NULL);
4162a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_string_terminate(info);
4163a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      result = trio_string_extract(info);
4164a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_string_destroy(info);
4165a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4166a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return result;
4167a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4168a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4169a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
4170a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_asprintf
4171a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((result, format, va_alist),
4172a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    char **result,
4173a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
4174a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
4175a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4176a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
4177a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
4178a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_string_t *info;
4179a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4180a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4181a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4182a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *result = NULL;
4183a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4184a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  info = trio_xstring_duplicate("");
4185a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (info == NULL)
4186a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4187a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
4188a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4189a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4190a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4191a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TRIO_VA_START(args, format);
4192a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
4193a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  format, &args, NULL);
4194a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TRIO_VA_END(args);
4195a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (status >= 0)
4196a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
4197a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  trio_string_terminate(info);
4198a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  *result = trio_string_extract(info);
4199a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
4200a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_string_destroy(info);
4201a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4202a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
4203a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4204a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4205a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
4206a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vasprintf
4207a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((result, format, args),
4208a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char **result,
4209a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
4210a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
4211a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4212a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
4213a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_string_t *info;
4214a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4215a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4216a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4217a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *result = NULL;
4218a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4219a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  info = trio_xstring_duplicate("");
4220a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (info == NULL)
4221a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4222a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
4223a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4224a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4225a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4226a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
4227a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  format, &args, NULL);
4228a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (status >= 0)
4229a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
4230a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  trio_string_terminate(info);
4231a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  *result = trio_string_extract(info);
4232a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
4233a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_string_destroy(info);
4234a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4235a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
4236a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4237a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4238a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/** @} End of Printf documentation module */
4239a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4240a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4241a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
4242a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * CALLBACK
4243a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
4244a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
4245a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4246a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_DOCUMENTATION)
4247a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include "doc/doc_register.h"
4248a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
4249a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
4250a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @addtogroup UserDefined
4251a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @{
4252a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang*/
4253a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4254a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
4255a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4256a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4257a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_register
4258a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4259a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4260a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
4261a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Register new user-defined specifier.
4262a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4263a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param callback
4264a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param name
4265a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Handle.
4266a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4267a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC trio_pointer_t
4268a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_register
4269a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((callback, name),
4270a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_callback_t callback,
4271a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *name)
4272a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4273a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_userdef_t *def;
4274a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_userdef_t *prev = NULL;
4275a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4276a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (callback == NULL)
4277a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return NULL;
4278a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4279a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (name)
4280a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4281a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Handle built-in namespaces */
4282a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (name[0] == ':')
4283a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
4284a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (trio_equal(name, ":enter"))
4285a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
4286a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      internalEnterCriticalRegion = callback;
4287a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
4288a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else if (trio_equal(name, ":leave"))
4289a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
4290a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      internalLeaveCriticalRegion = callback;
4291a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
4292a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  return NULL;
4293a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
4294a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4295a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Bail out if namespace is too long */
4296a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (trio_length(name) >= MAX_USER_NAME)
4297a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	return NULL;
4298a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4299a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Bail out if namespace already is registered */
4300a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      def = TrioFindNamespace(name, &prev);
4301a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (def)
4302a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	return NULL;
4303a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4304a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4305a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t));
4306a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (def)
4307a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4308a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (internalEnterCriticalRegion)
4309a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	(void)internalEnterCriticalRegion(NULL);
4310a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4311a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (name)
4312a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
4313a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Link into internal list */
4314a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (prev == NULL)
4315a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    internalUserDef = def;
4316a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
4317a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    prev->next = def;
4318a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
4319a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Initialize */
4320a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      def->callback = callback;
4321a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      def->name = (name == NULL)
4322a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	? NULL
4323a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	: trio_duplicate(name);
4324a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      def->next = NULL;
4325a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4326a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (internalLeaveCriticalRegion)
4327a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	(void)internalLeaveCriticalRegion(NULL);
4328a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4329a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (trio_pointer_t)def;
4330a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4331a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4332a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
4333a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Unregister an existing user-defined specifier.
4334a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4335a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param handle
4336a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4337a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4338a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_unregister
4339a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((handle),
4340a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t handle)
4341a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4342a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_userdef_t *self = (trio_userdef_t *)handle;
4343a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_userdef_t *def;
4344a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_userdef_t *prev = NULL;
4345a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4346a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
4347a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4348a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (self->name)
4349a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4350a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      def = TrioFindNamespace(self->name, &prev);
4351a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (def)
4352a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
4353a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (internalEnterCriticalRegion)
4354a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    (void)internalEnterCriticalRegion(NULL);
4355a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4356a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (prev == NULL)
4357a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    internalUserDef = NULL;
4358a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
4359a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    prev->next = def->next;
4360a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4361a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (internalLeaveCriticalRegion)
4362a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    (void)internalLeaveCriticalRegion(NULL);
4363a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
4364a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_destroy(self->name);
4365a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4366a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_FREE(self);
4367a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4368a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4369a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4370a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_format [public]
4371a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4372a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_CONST char *
4373a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_format
4374a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4375a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4376a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4377a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(FORMAT_USER_DEFINED)
4378a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
4379a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
4380a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4381a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->user_data);
4382a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4383a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4384a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4385a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_argument [public]
4386a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4387a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_pointer_t
4388a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_argument
4389a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4390a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4391a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4392a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(FORMAT_USER_DEFINED)
4393a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
4394a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
4395a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4396a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return ((trio_reference_t *)ref)->parameter->data.pointer;
4397a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4398a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4399a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4400a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_width / trio_set_width [public]
4401a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4402a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4403a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_width
4404a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4405a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4406a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4407a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return ((trio_reference_t *)ref)->parameter->width;
4408a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4409a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4410a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4411a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_width
4412a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, width),
4413a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4414a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
4415a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4416a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ((trio_reference_t *)ref)->parameter->width = width;
4417a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4418a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4419a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4420a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_precision / trio_set_precision [public]
4421a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4422a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4423a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_precision
4424a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4425a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4426a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4427a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->precision);
4428a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4429a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4430a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4431a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_precision
4432a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, precision),
4433a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4434a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int precision)
4435a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4436a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ((trio_reference_t *)ref)->parameter->precision = precision;
4437a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4438a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4439a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4440a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_base / trio_set_base [public]
4441a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4442a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4443a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_base
4444a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4445a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4446a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4447a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->base);
4448a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4449a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4450a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4451a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_base
4452a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, base),
4453a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4454a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int base)
4455a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4456a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ((trio_reference_t *)ref)->parameter->base = base;
4457a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4458a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4459a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4460a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_long / trio_set_long [public]
4461a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4462a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4463a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_long
4464a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4465a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4466a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4467a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONG)
4468a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4469a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4470a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4471a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4472a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4473a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_long
4474a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_long),
4475a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4476a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_long)
4477a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4478a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_long)
4479a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONG;
4480a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4481a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONG;
4482a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4483a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4484a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4485a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_longlong / trio_set_longlong [public]
4486a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4487a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4488a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_longlong
4489a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4490a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4491a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4492a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUAD)
4493a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4494a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4495a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4496a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4497a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4498a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_longlong
4499a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_longlong),
4500a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4501a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_longlong)
4502a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4503a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_longlong)
4504a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUAD;
4505a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4506a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUAD;
4507a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4508a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4509a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4510a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_longdouble / trio_set_longdouble [public]
4511a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4512a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4513a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_longdouble
4514a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4515a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4516a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4517a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONGDOUBLE)
4518a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4519a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4520a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4521a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4522a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4523a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_longdouble
4524a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_longdouble),
4525a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4526a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_longdouble)
4527a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4528a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_longdouble)
4529a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONGDOUBLE;
4530a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4531a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE;
4532a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4533a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4534a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4535a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_short / trio_set_short [public]
4536a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4537a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4538a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_short
4539a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4540a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4541a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4542a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORT)
4543a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4544a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4545a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4546a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4547a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4548a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_short
4549a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_short),
4550a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4551a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_short)
4552a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4553a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_short)
4554a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORT;
4555a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4556a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORT;
4557a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4558a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4559a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4560a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_shortshort / trio_set_shortshort [public]
4561a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4562a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4563a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_shortshort
4564a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4565a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4566a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4567a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORTSHORT)
4568a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4569a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4570a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4571a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4572a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4573a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_shortshort
4574a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_shortshort),
4575a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4576a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_shortshort)
4577a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4578a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_shortshort)
4579a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORTSHORT;
4580a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4581a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT;
4582a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4583a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4584a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4585a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_alternative / trio_set_alternative [public]
4586a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4587a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4588a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_alternative
4589a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4590a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4591a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4592a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_ALTERNATIVE)
4593a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4594a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4595a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4596a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4597a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4598a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_alternative
4599a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_alternative),
4600a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4601a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_alternative)
4602a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4603a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_alternative)
4604a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_ALTERNATIVE;
4605a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4606a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE;
4607a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4608a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4609a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4610a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_alignment / trio_set_alignment [public]
4611a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4612a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4613a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_alignment
4614a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4615a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4616a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4617a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LEFTADJUST)
4618a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4619a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4620a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4621a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4622a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4623a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_alignment
4624a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_leftaligned),
4625a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4626a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_leftaligned)
4627a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4628a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_leftaligned)
4629a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LEFTADJUST;
4630a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4631a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST;
4632a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4633a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4634a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4635a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_spacing /trio_set_spacing [public]
4636a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4637a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4638a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_spacing
4639a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4640a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4641a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4642a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SPACE)
4643a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4644a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4645a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4646a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4647a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4648a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_spacing
4649a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_space),
4650a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4651a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_space)
4652a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4653a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_space)
4654a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SPACE;
4655a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4656a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SPACE;
4657a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4658a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4659a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4660a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_sign / trio_set_sign [public]
4661a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4662a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4663a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_sign
4664a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4665a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4666a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4667a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHOWSIGN)
4668a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4669a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4670a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4671a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4672a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4673a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_sign
4674a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_sign),
4675a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4676a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_sign)
4677a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4678a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_sign)
4679a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHOWSIGN;
4680a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4681a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN;
4682a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4683a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4684a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4685a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_padding / trio_set_padding [public]
4686a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4687a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4688a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_padding
4689a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4690a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4691a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4692a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_NILPADDING)
4693a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4694a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4695a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4696a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4697a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4698a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_padding
4699a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_padding),
4700a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4701a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_padding)
4702a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4703a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_padding)
4704a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_NILPADDING;
4705a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4706a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_NILPADDING;
4707a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4708a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4709a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4710a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_quote / trio_set_quote [public]
4711a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4712a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4713a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_quote
4714a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4715a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4716a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4717a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUOTE)
4718a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4719a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4720a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4721a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4722a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4723a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_quote
4724a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_quote),
4725a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4726a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_quote)
4727a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4728a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_quote)
4729a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUOTE;
4730a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4731a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUOTE;
4732a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4733a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4734a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4735a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_upper / trio_set_upper [public]
4736a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4737a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4738a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_upper
4739a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4740a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4741a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4742a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_UPPER)
4743a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4744a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4745a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4746a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4747a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4748a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_upper
4749a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_upper),
4750a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4751a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_upper)
4752a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4753a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_upper)
4754a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_UPPER;
4755a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4756a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_UPPER;
4757a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4758a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4759a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4760a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_largest / trio_set_largest [public]
4761a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4762a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_C99
4763a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4764a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_largest
4765a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4766a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4767a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4768a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_INTMAX_T)
4769a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4770a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4771a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4772a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4773a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4774a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_largest
4775a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_largest),
4776a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4777a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_largest)
4778a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4779a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_largest)
4780a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_INTMAX_T;
4781a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4782a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_INTMAX_T;
4783a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4784a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
4785a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4786a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4787a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_ptrdiff / trio_set_ptrdiff [public]
4788a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4789a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4790a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_ptrdiff
4791a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4792a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4793a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4794a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_PTRDIFF_T)
4795a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4796a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4797a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4798a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4799a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4800a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_ptrdiff
4801a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_ptrdiff),
4802a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4803a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_ptrdiff)
4804a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4805a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_ptrdiff)
4806a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_PTRDIFF_T;
4807a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4808a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T;
4809a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4810a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4811a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4812a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_get_size / trio_set_size [public]
4813a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4814a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_C99
4815a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4816a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_get_size
4817a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((ref),
4818a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref)
4819a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4820a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SIZE_T)
4821a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? TRUE
4822a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : FALSE;
4823a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4824a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4825a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4826a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_set_size
4827a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, is_size),
4828a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4829a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int is_size)
4830a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4831a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (is_size)
4832a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SIZE_T;
4833a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4834a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SIZE_T;
4835a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4836a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
4837a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4838a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4839a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_print_int [public]
4840a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4841a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4842a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_print_int
4843a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, number),
4844a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4845a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int number)
4846a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4847a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_reference_t *self = (trio_reference_t *)ref;
4848a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4849a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioWriteNumber(self->data,
4850a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  (trio_uintmax_t)number,
4851a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->flags,
4852a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->width,
4853a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->precision,
4854a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->base);
4855a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4856a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4857a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4858a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_print_uint [public]
4859a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4860a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4861a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_print_uint
4862a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, number),
4863a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4864a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   unsigned int number)
4865a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4866a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_reference_t *self = (trio_reference_t *)ref;
4867a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4868a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioWriteNumber(self->data,
4869a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  (trio_uintmax_t)number,
4870a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->flags | FLAGS_UNSIGNED,
4871a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->width,
4872a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->precision,
4873a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->base);
4874a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4875a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4876a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4877a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_print_double [public]
4878a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4879a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4880a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_print_double
4881a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, number),
4882a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4883a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   double number)
4884a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4885a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_reference_t *self = (trio_reference_t *)ref;
4886a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4887a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioWriteDouble(self->data,
4888a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  number,
4889a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->flags,
4890a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->width,
4891a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->precision,
4892a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->base);
4893a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4894a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4895a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4896a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_print_string [public]
4897a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4898a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4899a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_print_string
4900a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, string),
4901a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4902a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *string)
4903a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4904a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_reference_t *self = (trio_reference_t *)ref;
4905a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4906a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioWriteString(self->data,
4907a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  string,
4908a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->flags,
4909a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->width,
4910a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->parameter->precision);
4911a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4912a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4913a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4914a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_print_ref [public]
4915a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4916a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4917a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_print_ref
4918a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((ref, format, va_alist),
4919a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    trio_pointer_t ref,
4920a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
4921a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
4922a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4923a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
4924a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list arglist;
4925a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4926a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4927a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4928a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(arglist, format);
4929a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL);
4930a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(arglist);
4931a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
4932a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4933a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4934a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4935a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_vprint_ref [public]
4936a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4937a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4938a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vprint_ref
4939a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((ref, format, arglist),
4940a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4941a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
4942a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list arglist)
4943a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4944a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4945a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4946a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL);
4947a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4948a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4949a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4950a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_printv_ref [public]
4951a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4952a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangint
4953a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_printv_ref
4954a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((ref, format, argarray),
4955a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4956a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
4957a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *argarray)
4958a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4959a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
4960a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4961a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioFormatRef((trio_reference_t *)ref, format, NULL, argarray);
4962a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
4963a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4964a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_EXTENSION */
4965a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4966a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
4967a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_print_pointer [public]
4968a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
4969a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangvoid
4970a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_print_pointer
4971a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((ref, pointer),
4972a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t ref,
4973a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t pointer)
4974a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
4975a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_reference_t *self = (trio_reference_t *)ref;
4976a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_flags_t flags;
4977a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_uintmax_t number;
4978a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
4979a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NULL == pointer)
4980a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4981a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TRIO_CONST char *string = internalNullString;
4982a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (*string)
4983a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	self->data->OutStream(self->data, *string++);
4984a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
4985a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
4986a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
4987a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /*
4988a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * The subtraction of the null pointer is a workaround
4989a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * to avoid a compiler warning. The performance overhead
4990a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * is negligible (and likely to be removed by an
4991a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * optimizing compiler). The (char *) casting is done
4992a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * to please ANSI C++.
4993a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       */
4994a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      number = (trio_uintmax_t)((char *)pointer - (char *)0);
4995a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Shrink to size of pointer */
4996a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      number &= (trio_uintmax_t)-1;
4997a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      flags = self->parameter->flags;
4998a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE |
4999a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	        FLAGS_NILPADDING);
5000a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioWriteNumber(self->data,
5001a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      number,
5002a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      flags,
5003a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      POINTER_WIDTH,
5004a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      NO_PRECISION,
5005a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      BASE_HEX);
5006a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5007a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5008a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5009a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/** @} End of UserDefined documentation module */
5010a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5011a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5012a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5013a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * LOCALES
5014a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5015a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
5016a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5017a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5018a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_locale_set_decimal_point
5019a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5020a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Decimal point can only be one character. The input argument is a
5021a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * string to enable multibyte characters. At most MB_LEN_MAX characters
5022a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * will be used.
5023a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5024a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC void
5025a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_locale_set_decimal_point
5026a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((decimalPoint),
5027a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *decimalPoint)
5028a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5029a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LOCALE)
5030a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NULL == internalLocaleValues)
5031a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5032a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioSetLocale();
5033a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5034a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
5035a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  internalDecimalPointLength = trio_length(decimalPoint);
5036a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (internalDecimalPointLength == 1)
5037a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5038a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      internalDecimalPoint = *decimalPoint;
5039a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5040a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
5041a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5042a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      internalDecimalPoint = NIL;
5043a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      trio_copy_max(internalDecimalPointString,
5044a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    sizeof(internalDecimalPointString),
5045a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    decimalPoint);
5046a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5047a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5048a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5049a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5050a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_locale_set_thousand_separator
5051a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5052a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * See trio_locale_set_decimal_point
5053a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5054a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC void
5055a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_locale_set_thousand_separator
5056a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((thousandSeparator),
5057a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *thousandSeparator)
5058a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5059a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LOCALE)
5060a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NULL == internalLocaleValues)
5061a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5062a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioSetLocale();
5063a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5064a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
5065a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_copy_max(internalThousandSeparator,
5066a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		sizeof(internalThousandSeparator),
5067a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		thousandSeparator);
5068a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  internalThousandSeparatorLength = trio_length(internalThousandSeparator);
5069a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5070a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5071a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5072a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_locale_set_grouping
5073a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5074a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Array of bytes. Reversed order.
5075a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5076a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  CHAR_MAX : No further grouping
5077a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  0        : Repeat last group for the remaining digits (not necessary
5078a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *             as C strings are zero-terminated)
5079a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  n        : Set current group to n
5080a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5081a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Same order as the grouping attribute in LC_NUMERIC.
5082a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5083a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC void
5084a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_locale_set_grouping
5085a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((grouping),
5086a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *grouping)
5087a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5088a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LOCALE)
5089a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NULL == internalLocaleValues)
5090a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5091a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioSetLocale();
5092a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5093a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
5094a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_copy_max(internalGrouping,
5095a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		sizeof(internalGrouping),
5096a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		grouping);
5097a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5098a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5099a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5100a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5101a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5102a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * SCANNING
5103a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5104a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
5105a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5106a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5107a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioSkipWhitespaces
5108a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5109a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
5110a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioSkipWhitespaces
5111a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((self),
5112a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self)
5113a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5114a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int ch;
5115a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5116a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ch = self->current;
5117a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (isspace(ch))
5118a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5119a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, &ch);
5120a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5121a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return ch;
5122a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5123a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5124a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5125a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioGetCollation
5126a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5127a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
5128a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
5129a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioGetCollation(TRIO_NOARGS)
5130a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5131a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
5132a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int j;
5133a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int k;
5134a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char first[2];
5135a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char second[2];
5136a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5137a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* This is computationally expensive */
5138a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  first[1] = NIL;
5139a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  second[1] = NIL;
5140a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5141a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5142a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      k = 0;
5143a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      first[0] = (char)i;
5144a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      for (j = 0; j < MAX_CHARACTER_CLASS; j++)
5145a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5146a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  second[0] = (char)j;
5147a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (trio_equal_locale(first, second))
5148a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    internalCollationArray[i][k++] = (char)j;
5149a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5150a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      internalCollationArray[i][k] = NIL;
5151a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5152a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5153a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
5154a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5155a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5156a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioGetCharacterClass
5157a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5158a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * FIXME:
5159a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  multibyte
5160a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5161a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
5162a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioGetCharacterClass
5163a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((format, indexPointer, flagsPointer, characterclass),
5164a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
5165a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *indexPointer,
5166a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t *flagsPointer,
5167a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *characterclass)
5168a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5169a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int index = *indexPointer;
5170a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
5171a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char ch;
5172a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char range_begin;
5173a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char range_end;
5174a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5175a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  *flagsPointer &= ~FLAGS_EXCLUDE;
5176a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5177a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (format[index] == QUALIFIER_CIRCUMFLEX)
5178a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5179a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *flagsPointer |= FLAGS_EXCLUDE;
5180a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      index++;
5181a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5182a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
5183a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * If the ungroup character is at the beginning of the scanlist,
5184a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * it will be part of the class, and a second ungroup character
5185a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * must follow to end the group.
5186a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
5187a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (format[index] == SPECIFIER_UNGROUP)
5188a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5189a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      characterclass[(int)SPECIFIER_UNGROUP]++;
5190a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      index++;
5191a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5192a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
5193a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Minus is used to specify ranges. To include minus in the class,
5194a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * it must be at the beginning of the list
5195a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
5196a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (format[index] == QUALIFIER_MINUS)
5197a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5198a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      characterclass[(int)QUALIFIER_MINUS]++;
5199a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      index++;
5200a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5201a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Collect characters */
5202a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (ch = format[index];
5203a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       (ch != SPECIFIER_UNGROUP) && (ch != NIL);
5204a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       ch = format[++index])
5205a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5206a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      switch (ch)
5207a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5208a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case QUALIFIER_MINUS: /* Scanlist ranges */
5209a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5210a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
5211a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * Both C99 and UNIX98 describes ranges as implementation-
5212a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * defined.
5213a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   *
5214a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * We support the following behaviour (although this may
5215a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * change as we become wiser)
5216a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * - only increasing ranges, ie. [a-b] but not [b-a]
5217a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * - transitive ranges, ie. [a-b-c] == [a-c]
5218a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * - trailing minus, ie. [a-] is interpreted as an 'a'
5219a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   *   and a '-'
5220a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * - duplicates (although we can easily convert these
5221a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   *   into errors)
5222a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
5223a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  range_begin = format[index - 1];
5224a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  range_end = format[++index];
5225a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (range_end == SPECIFIER_UNGROUP)
5226a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5227a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Trailing minus is included */
5228a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      characterclass[(int)ch]++;
5229a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      ch = range_end;
5230a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* for */
5231a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5232a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (range_end == NIL)
5233a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
5234a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (range_begin > range_end)
5235a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    return TRIO_ERROR_RETURN(TRIO_ERANGE, index);
5236a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5237a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  for (i = (int)range_begin; i <= (int)range_end; i++)
5238a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    characterclass[i]++;
5239a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5240a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  ch = range_end;
5241a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
5242a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5243a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_EXTENSION
5244a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5245a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case SPECIFIER_GROUP:
5246a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5247a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  switch (format[index + 1])
5248a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5249a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case QUALIFIER_DOT: /* Collating symbol */
5250a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /*
5251a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	       * FIXME: This will be easier to implement when multibyte
5252a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	       * characters have been implemented. Until now, we ignore
5253a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	       * this feature.
5254a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	       */
5255a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      for (i = index + 2; ; i++)
5256a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5257a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (format[i] == NIL)
5258a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    /* Error in syntax */
5259a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return -1;
5260a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (format[i] == QUALIFIER_DOT)
5261a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    break; /* for */
5262a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5263a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (format[++i] != SPECIFIER_UNGROUP)
5264a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		return -1;
5265a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5266a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      index = i;
5267a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
5268a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5269a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case QUALIFIER_EQUAL: /* Equivalence class expressions */
5270a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      {
5271a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		unsigned int j;
5272a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		unsigned int k;
5273a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5274a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (internalCollationUnconverted)
5275a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
5276a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    /* Lazy evaluation of collation array */
5277a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    TrioGetCollation();
5278a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    internalCollationUnconverted = FALSE;
5279a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
5280a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		for (i = index + 2; ; i++)
5281a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
5282a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (format[i] == NIL)
5283a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      /* Error in syntax */
5284a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      return -1;
5285a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else if (format[i] == QUALIFIER_EQUAL)
5286a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      break; /* for */
5287a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else
5288a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      {
5289a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			/* Mark any equivalent character */
5290a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			k = (unsigned int)format[i];
5291a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			for (j = 0; internalCollationArray[k][j] != NIL; j++)
5292a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  characterclass[(int)internalCollationArray[k][j]]++;
5293a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      }
5294a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
5295a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (format[++i] != SPECIFIER_UNGROUP)
5296a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  return -1;
5297a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5298a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		index = i;
5299a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      }
5300a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
5301a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5302a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case QUALIFIER_COLON: /* Character class expressions */
5303a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5304a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1,
5305a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				 &format[index]))
5306a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5307a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5308a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isalnum(i))
5309a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5310a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_ALNUM) - 1;
5311a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5312a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1,
5313a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5314a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5315a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5316a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isalpha(i))
5317a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5318a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_ALPHA) - 1;
5319a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5320a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1,
5321a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5322a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5323a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5324a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (iscntrl(i))
5325a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5326a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_CNTRL) - 1;
5327a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5328a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1,
5329a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5330a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5331a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5332a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isdigit(i))
5333a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5334a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_DIGIT) - 1;
5335a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5336a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1,
5337a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5338a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5339a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5340a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isgraph(i))
5341a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5342a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_GRAPH) - 1;
5343a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5344a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_LOWER, sizeof(CLASS_LOWER) - 1,
5345a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5346a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5347a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5348a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (islower(i))
5349a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5350a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_LOWER) - 1;
5351a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5352a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_PRINT, sizeof(CLASS_PRINT) - 1,
5353a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5354a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5355a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5356a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isprint(i))
5357a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5358a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_PRINT) - 1;
5359a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5360a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1,
5361a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5362a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5363a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5364a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (ispunct(i))
5365a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5366a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_PUNCT) - 1;
5367a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5368a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_SPACE, sizeof(CLASS_SPACE) - 1,
5369a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5370a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5371a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5372a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isspace(i))
5373a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5374a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_SPACE) - 1;
5375a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5376a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_UPPER, sizeof(CLASS_UPPER) - 1,
5377a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5378a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5379a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5380a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isupper(i))
5381a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5382a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_UPPER) - 1;
5383a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5384a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_equal_max(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1,
5385a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      &format[index]))
5386a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5387a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5388a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (isxdigit(i))
5389a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      characterclass[i]++;
5390a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += sizeof(CLASS_XDIGIT) - 1;
5391a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5392a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
5393a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5394a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  characterclass[(int)ch]++;
5395a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5396a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
5397a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5398a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    default:
5399a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      characterclass[(int)ch]++;
5400a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
5401a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5402a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
5403a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5404a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_EXTENSION */
5405a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5406a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	default:
5407a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  characterclass[(int)ch]++;
5408a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
5409a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5410a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5411a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return 0;
5412a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5413a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5414a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5415a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadNumber
5416a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5417a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * We implement our own number conversion in preference of strtol and
5418a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * strtoul, because we must handle 'long long' and thousand separators.
5419a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5420a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
5421a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadNumber
5422a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS5((self, target, flags, width, base),
5423a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5424a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_uintmax_t *target,
5425a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
5426a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width,
5427a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int base)
5428a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5429a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_uintmax_t number = 0;
5430a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int digit;
5431a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int count;
5432a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isNegative = FALSE;
5433a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T gotNumber = FALSE;
5434a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int j;
5435a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5436a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
5437a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->InStream));
5438a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE));
5439a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5440a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (internalDigitsUnconverted)
5441a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5442a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Lazy evaluation of digits array */
5443a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      memset(internalDigitArray, -1, sizeof(internalDigitArray));
5444a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++)
5445a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5446a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  internalDigitArray[(int)internalDigitsLower[j]] = j;
5447a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  internalDigitArray[(int)internalDigitsUpper[j]] = j;
5448a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5449a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      internalDigitsUnconverted = FALSE;
5450a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5451a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5452a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioSkipWhitespaces(self);
5453a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5454a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (!(flags & FLAGS_UNSIGNED))
5455a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5456a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Leading sign */
5457a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (self->current == '+')
5458a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5459a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->InStream(self, NULL);
5460a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5461a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (self->current == '-')
5462a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5463a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->InStream(self, NULL);
5464a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  isNegative = TRUE;
5465a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5466a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5467a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5468a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  count = self->processed;
5469a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5470a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_ALTERNATIVE)
5471a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5472a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      switch (base)
5473a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5474a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case NO_BASE:
5475a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_OCTAL:
5476a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_HEX:
5477a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	case BASE_BINARY:
5478a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (self->current == '0')
5479a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5480a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->InStream(self, NULL);
5481a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (self->current)
5482a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5483a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if ((base == BASE_HEX) &&
5484a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      (trio_to_upper(self->current) == 'X'))
5485a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
5486a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      self->InStream(self, NULL);
5487a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
5488a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if ((base == BASE_BINARY) &&
5489a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			   (trio_to_upper(self->current) == 'B'))
5490a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
5491a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      self->InStream(self, NULL);
5492a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
5493a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5494a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5495a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
5496a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    return FALSE;
5497a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
5498a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	default:
5499a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  break;
5500a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5501a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5502a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5503a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (((width == NO_WIDTH) || (self->processed - count < width)) &&
5504a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	 (! ((self->current == EOF) || isspace(self->current))))
5505a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5506a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isascii(self->current))
5507a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5508a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  digit = internalDigitArray[self->current];
5509a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Abort if digit is not allowed in the specified base */
5510a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if ((digit == -1) || (digit >= base))
5511a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    break;
5512a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5513a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (flags & FLAGS_QUOTE)
5514a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5515a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Compare with thousands separator */
5516a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  for (j = 0; internalThousandSeparator[j] && self->current; j++)
5517a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5518a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (internalThousandSeparator[j] != self->current)
5519a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		break;
5520a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5521a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->InStream(self, NULL);
5522a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5523a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (internalThousandSeparator[j])
5524a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    break; /* Mismatch */
5525a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
5526a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    continue; /* Match */
5527a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5528a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
5529a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break;
5530a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5531a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      number *= base;
5532a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      number += digit;
5533a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      gotNumber = TRUE; /* we need at least one digit */
5534a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5535a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, NULL);
5536a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5537a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5538a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Was anything read at all? */
5539a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (!gotNumber)
5540a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return FALSE;
5541a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5542a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (target)
5543a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    *target = (isNegative) ? -((trio_intmax_t)number) : number;
5544a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TRUE;
5545a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5546a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5547a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5548a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadChar
5549a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5550a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
5551a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadChar
5552a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((self, target, flags, width),
5553a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5554a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *target,
5555a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
5556a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
5557a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5558a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
5559a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char ch;
5560a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_uintmax_t number;
5561a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5562a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
5563a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->InStream));
5564a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5565a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0;
5566a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       (self->current != EOF) && (i < width);
5567a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       i++)
5568a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5569a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      ch = (char)self->current;
5570a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, NULL);
5571a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH))
5572a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5573a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  switch (self->current)
5574a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5575a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case '\\': ch = '\\'; break;
5576a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case 'a': ch = '\007'; break;
5577a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case 'b': ch = '\b'; break;
5578a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case 'f': ch = '\f'; break;
5579a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case 'n': ch = '\n'; break;
5580a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case 'r': ch = '\r'; break;
5581a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case 't': ch = '\t'; break;
5582a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case 'v': ch = '\v'; break;
5583a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    default:
5584a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (isdigit(self->current))
5585a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5586a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Read octal number */
5587a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL))
5588a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return 0;
5589a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ch = (char)number;
5590a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5591a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else if (trio_to_upper(self->current) == 'X')
5592a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5593a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  /* Read hexadecimal number */
5594a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  self->InStream(self, NULL);
5595a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX))
5596a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return 0;
5597a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ch = (char)number;
5598a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5599a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
5600a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5601a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  ch = (char)self->current;
5602a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5603a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break;
5604a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5605a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5606a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5607a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (target)
5608a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	target[i] = ch;
5609a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5610a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return i + 1;
5611a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5612a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5613a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5614a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadString
5615a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5616a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
5617a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadString
5618a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((self, target, flags, width),
5619a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5620a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *target,
5621a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
5622a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
5623a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5624a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
5625a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5626a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
5627a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->InStream));
5628a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5629a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioSkipWhitespaces(self);
5630a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5631a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
5632a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Continue until end of string is reached, a whitespace is encountered,
5633a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * or width is exceeded
5634a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
5635a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0;
5636a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       ((width == NO_WIDTH) || (i < width)) &&
5637a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       (! ((self->current == EOF) || isspace(self->current)));
5638a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       i++)
5639a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5640a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0)
5641a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break; /* for */
5642a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5643a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (target)
5644a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    target[i] = NIL;
5645a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TRUE;
5646a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5647a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5648a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5649a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadWideChar
5650a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5651a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
5652a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
5653a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadWideChar
5654a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((self, target, flags, width),
5655a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5656a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_wchar_t *target,
5657a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
5658a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
5659a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5660a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
5661a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int j;
5662a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int size;
5663a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int amount = 0;
5664a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_wchar_t wch;
5665a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char buffer[MB_LEN_MAX + 1];
5666a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5667a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
5668a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->InStream));
5669a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5670a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0;
5671a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       (self->current != EOF) && (i < width);
5672a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       i++)
5673a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5674a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isascii(self->current))
5675a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5676a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (TrioReadChar(self, buffer, flags, 1) == 0)
5677a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    return 0;
5678a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  buffer[1] = NIL;
5679a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5680a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
5681a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5682a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /*
5683a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * Collect a multibyte character, by enlarging buffer until
5684a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * it contains a fully legal multibyte character, or the
5685a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   * buffer is full.
5686a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   */
5687a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  j = 0;
5688a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  do
5689a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5690a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      buffer[j++] = (char)self->current;
5691a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      buffer[j] = NIL;
5692a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->InStream(self, NULL);
5693a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5694a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j));
5695a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5696a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (target)
5697a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5698a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  size = mbtowc(&wch, buffer, sizeof(buffer));
5699a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (size > 0)
5700a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    target[i] = wch;
5701a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5702a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      amount += size;
5703a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, NULL);
5704a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5705a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return amount;
5706a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5707a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_WIDECHAR */
5708a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5709a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5710a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadWideString
5711a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5712a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
5713a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
5714a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadWideString
5715a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((self, target, flags, width),
5716a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5717a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_wchar_t *target,
5718a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
5719a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
5720a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5721a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
5722a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int size;
5723a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5724a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
5725a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->InStream));
5726a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5727a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioSkipWhitespaces(self);
5728a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5729a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
5730a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  (void)mblen(NULL, 0);
5731a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
5732a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5733a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
5734a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Continue until end of string is reached, a whitespace is encountered,
5735a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * or width is exceeded
5736a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
5737a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0;
5738a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       ((width == NO_WIDTH) || (i < width)) &&
5739a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       (! ((self->current == EOF) || isspace(self->current)));
5740a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       )
5741a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5742a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      size = TrioReadWideChar(self, &target[i], flags, 1);
5743a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (size == 0)
5744a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break; /* for */
5745a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5746a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      i += size;
5747a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5748a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (target)
5749a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    target[i] = WCONST('\0');
5750a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TRUE;
5751a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5752a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_WIDECHAR */
5753a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5754a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5755a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadGroup
5756a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5757a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * FIXME: characterclass does not work with multibyte characters
5758a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5759a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
5760a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadGroup
5761a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS5((self, target, characterclass, flags, width),
5762a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5763a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   char *target,
5764a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *characterclass,
5765a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
5766a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
5767a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5768a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int ch;
5769a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i;
5770a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5771a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
5772a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->InStream));
5773a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5774a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ch = self->current;
5775a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  for (i = 0;
5776a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       ((width == NO_WIDTH) || (i < width)) &&
5777a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       (! ((ch == EOF) ||
5778a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0))));
5779a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       i++)
5780a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5781a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (target)
5782a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	target[i] = (char)ch;
5783a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, &ch);
5784a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5785a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5786a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (target)
5787a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    target[i] = NIL;
5788a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TRUE;
5789a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5790a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5791a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5792a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadDouble
5793a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
5794a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * FIXME:
5795a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  add long double
5796a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *  handle base
5797a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5798a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
5799a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadDouble
5800a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((self, target, flags, width),
5801a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5802a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t target,
5803a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags,
5804a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int width)
5805a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5806a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int ch;
5807a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char doubleString[512];
5808a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int index = 0;
5809a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int start;
5810a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int j;
5811a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  BOOLEAN_T isHex = FALSE;
5812a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5813a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  doubleString[0] = 0;
5814a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5815a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1))
5816a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    width = sizeof(doubleString) - 1;
5817a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5818a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TrioSkipWhitespaces(self);
5819a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5820a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /*
5821a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * Read entire double number from stream. trio_to_double requires
5822a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * a string as input, but InStream can be anything, so we have to
5823a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   * collect all characters.
5824a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   */
5825a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  ch = self->current;
5826a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((ch == '+') || (ch == '-'))
5827a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5828a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      doubleString[index++] = (char)ch;
5829a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, &ch);
5830a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      width--;
5831a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5832a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5833a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  start = index;
5834a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  switch (ch)
5835a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5836a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case 'n':
5837a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case 'N':
5838a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Not-a-number */
5839a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (index != 0)
5840a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break;
5841a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* FALLTHROUGH */
5842a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case 'i':
5843a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case 'I':
5844a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Infinity */
5845a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while (isalpha(ch) && (index - start < width))
5846a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5847a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  doubleString[index++] = (char)ch;
5848a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->InStream(self, &ch);
5849a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5850a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      doubleString[index] = NIL;
5851a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5852a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Case insensitive string comparison */
5853a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (trio_equal(&doubleString[start], INFINITE_UPPER) ||
5854a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  trio_equal(&doubleString[start], LONG_INFINITE_UPPER))
5855a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5856a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_LONGDOUBLE)
5857a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5858a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if ((start == 1) && (doubleString[0] == '-'))
5859a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5860a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  *((trio_long_double_t *)target) = trio_ninf();
5861a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5862a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
5863a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5864a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  *((trio_long_double_t *)target) = trio_pinf();
5865a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5866a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5867a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
5868a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5869a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if ((start == 1) && (doubleString[0] == '-'))
5870a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5871a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  *((double *)target) = trio_ninf();
5872a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5873a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
5874a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
5875a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  *((double *)target) = trio_pinf();
5876a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
5877a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5878a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  return TRUE;
5879a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5880a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (trio_equal(doubleString, NAN_UPPER))
5881a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5882a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* NaN must not have a preceeding + nor - */
5883a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_LONGDOUBLE)
5884a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5885a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      *((trio_long_double_t *)target) = trio_nan();
5886a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5887a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
5888a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5889a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      *((double *)target) = trio_nan();
5890a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5891a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  return TRUE;
5892a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5893a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return FALSE;
5894a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5895a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case '0':
5896a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      doubleString[index++] = (char)ch;
5897a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, &ch);
5898a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (trio_to_upper(ch) == 'X')
5899a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5900a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  isHex = TRUE;
5901a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  doubleString[index++] = (char)ch;
5902a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->InStream(self, &ch);
5903a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5904a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      break;
5905a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5906a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    default:
5907a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      break;
5908a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5909a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5910a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while ((ch != EOF) && (index - start < width))
5911a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5912a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Integer part */
5913a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isHex ? isxdigit(ch) : isdigit(ch))
5914a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5915a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  doubleString[index++] = (char)ch;
5916a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->InStream(self, &ch);
5917a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5918a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else if (flags & FLAGS_QUOTE)
5919a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5920a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Compare with thousands separator */
5921a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  for (j = 0; internalThousandSeparator[j] && self->current; j++)
5922a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5923a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (internalThousandSeparator[j] != self->current)
5924a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		break;
5925a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5926a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->InStream(self, &ch);
5927a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5928a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (internalThousandSeparator[j])
5929a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    break; /* Mismatch */
5930a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
5931a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    continue; /* Match */
5932a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5933a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else
5934a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	break; /* while */
5935a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5936a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (ch == '.')
5937a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5938a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /* Decimal part */
5939a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      doubleString[index++] = (char)ch;
5940a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->InStream(self, &ch);
5941a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      while ((isHex ? isxdigit(ch) : isdigit(ch)) &&
5942a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	     (index - start < width))
5943a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5944a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  doubleString[index++] = (char)ch;
5945a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->InStream(self, &ch);
5946a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5947a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (isHex ? (trio_to_upper(ch) == 'P') : (trio_to_upper(ch) == 'E'))
5948a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
5949a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Exponent */
5950a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  doubleString[index++] = (char)ch;
5951a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  self->InStream(self, &ch);
5952a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if ((ch == '+') || (ch == '-'))
5953a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5954a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      doubleString[index++] = (char)ch;
5955a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->InStream(self, &ch);
5956a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5957a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  while (isdigit(ch) && (index - start < width))
5958a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
5959a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      doubleString[index++] = (char)ch;
5960a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      self->InStream(self, &ch);
5961a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
5962a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
5963a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5964a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5965a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if ((index == start) || (*doubleString == NIL))
5966a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return FALSE;
5967a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5968a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  doubleString[index] = 0;
5969a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5970a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (flags & FLAGS_LONGDOUBLE)
5971a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5972a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL);
5973a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5974a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
5975a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
5976a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *((double *)target) = trio_to_double(doubleString, NULL);
5977a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
5978a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TRUE;
5979a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
5980a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5981a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
5982a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioReadPointer
5983a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
5984a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE BOOLEAN_T
5985a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioReadPointer
5986a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((self, target, flags),
5987a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
5988a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *target,
5989a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_flags_t flags)
5990a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
5991a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_uintmax_t number;
5992a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  char buffer[sizeof(internalNullString)];
5993a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5994a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING);
5995a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
5996a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (TrioReadNumber(self,
5997a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		     &number,
5998a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		     flags,
5999a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		     POINTER_WIDTH,
6000a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		     BASE_HEX))
6001a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6002a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      /*
6003a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * The strange assignment of number is a workaround for a compiler
6004a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       * warning
6005a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang       */
6006a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (target)
6007a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	*target = (char *)0 + number;
6008a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return TRUE;
6009a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6010a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else if (TrioReadString(self,
6011a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  (flags & FLAGS_IGNORE)
6012a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  ? NULL
6013a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  : buffer,
6014a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  0,
6015a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang			  sizeof(internalNullString) - 1))
6016a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6017a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (trio_equal_case(buffer, internalNullString))
6018a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
6019a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (target)
6020a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    *target = NULL;
6021a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  return TRUE;
6022a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
6023a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6024a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return FALSE;
6025a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6026a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6027a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6028a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioScanProcess
6029a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6030a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
6031a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioScanProcess
6032a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((data, format, parameters),
6033a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *data,
6034a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6035a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_parameter_t *parameters)
6036a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6037a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
6038a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int charlen;
6039a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int cnt;
6040a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6041a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int assignment;
6042a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int ch;
6043a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int index; /* Index of format string */
6044a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int i; /* Index of current parameter */
6045a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_flags_t flags;
6046a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int width;
6047a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int base;
6048a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_pointer_t pointer;
6049a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6050a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assignment = 0;
6051a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  i = 0;
6052a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  index = 0;
6053a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data->InStream(data, &ch);
6054a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6055a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
6056a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  (void)mblen(NULL, 0);
6057a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6058a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6059a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  while (format[index])
6060a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6061a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
6062a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (! isascii(format[index]))
6063a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
6064a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  charlen = mblen(&format[index], MB_LEN_MAX);
6065a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (charlen != -1)
6066a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
6067a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Compare multibyte characters in format string */
6068a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      for (cnt = 0; cnt < charlen - 1; cnt++)
6069a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
6070a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (ch != format[index + cnt])
6071a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
6072a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
6073a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
6074a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  data->InStream(data, &ch);
6075a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
6076a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      continue; /* while characters left in formatting string */
6077a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
6078a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
6079a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
6080a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6081a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT))
6082a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
6083a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  return (assignment > 0) ? assignment : EOF;
6084a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
6085a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6086a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      if (CHAR_IDENTIFIER == format[index])
6087a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
6088a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (CHAR_IDENTIFIER == format[index + 1])
6089a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
6090a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Two % in format matches one % in input stream */
6091a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (CHAR_IDENTIFIER == ch)
6092a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
6093a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  data->InStream(data, &ch);
6094a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  index += 2;
6095a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  continue; /* while format chars left */
6096a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
6097a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
6098a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
6099a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
6100a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6101a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Skip the parameter entries */
6102a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  while (parameters[i].type == FORMAT_PARAMETER)
6103a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    i++;
6104a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6105a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  flags = parameters[i].flags;
6106a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Find width */
6107a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  width = parameters[i].width;
6108a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_WIDTH_PARAMETER)
6109a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
6110a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Get width from parameter list */
6111a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      width = (int)parameters[width].data.number.as_signed;
6112a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
6113a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  /* Find base */
6114a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  base = parameters[i].base;
6115a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (flags & FLAGS_BASE_PARAMETER)
6116a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
6117a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Get base from parameter list */
6118a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      base = (int)parameters[base].data.number.as_signed;
6119a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
6120a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6121a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  switch (parameters[i].type)
6122a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
6123a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_INT:
6124a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      {
6125a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		trio_uintmax_t number;
6126a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6127a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (0 == base)
6128a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  base = BASE_DECIMAL;
6129a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6130a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (!TrioReadNumber(data,
6131a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				    &number,
6132a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				    flags,
6133a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				    width,
6134a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				    base))
6135a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  return assignment;
6136a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6137a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (!(flags & FLAGS_IGNORE))
6138a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
6139a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    assignment++;
6140a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6141a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    pointer = parameters[i].data.pointer;
6142a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
6143a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (flags & FLAGS_SIZE_T)
6144a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(size_t *)pointer = (size_t)number;
6145a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else
6146a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6147a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PTRDIFF_T)
6148a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (flags & FLAGS_PTRDIFF_T)
6149a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(ptrdiff_t *)pointer = (ptrdiff_t)number;
6150a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else
6151a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6152a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_INTMAX_T)
6153a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (flags & FLAGS_INTMAX_T)
6154a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(trio_intmax_t *)pointer = (trio_intmax_t)number;
6155a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else
6156a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6157a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    if (flags & FLAGS_QUAD)
6158a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number;
6159a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else if (flags & FLAGS_LONG)
6160a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(long int *)pointer = (long int)number;
6161a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else if (flags & FLAGS_SHORT)
6162a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(short int *)pointer = (short int)number;
6163a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    else
6164a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(int *)pointer = (int)number;
6165a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
6166a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      }
6167a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* FORMAT_INT */
6168a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6169a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_STRING:
6170a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
6171a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (flags & FLAGS_WIDECHAR)
6172a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
6173a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (!TrioReadWideString(data,
6174a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  (flags & FLAGS_IGNORE)
6175a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  ? NULL
6176a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  : parameters[i].data.wstring,
6177a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  flags,
6178a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					  width))
6179a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return assignment;
6180a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
6181a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
6182a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6183a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
6184a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (!TrioReadString(data,
6185a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      (flags & FLAGS_IGNORE)
6186a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      ? NULL
6187a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      : parameters[i].data.string,
6188a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      flags,
6189a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				      width))
6190a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return assignment;
6191a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
6192a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (!(flags & FLAGS_IGNORE))
6193a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		assignment++;
6194a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* FORMAT_STRING */
6195a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6196a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_DOUBLE:
6197a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      {
6198a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		trio_pointer_t pointer;
6199a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6200a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (flags & FLAGS_IGNORE)
6201a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
6202a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    pointer = NULL;
6203a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
6204a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		else
6205a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
6206a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    pointer = (flags & FLAGS_LONGDOUBLE)
6207a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      ? (trio_pointer_t)parameters[i].data.longdoublePointer
6208a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      : (trio_pointer_t)parameters[i].data.doublePointer;
6209a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
6210a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (!TrioReadDouble(data, pointer, flags, width))
6211a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
6212a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return assignment;
6213a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
6214a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (!(flags & FLAGS_IGNORE))
6215a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
6216a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    assignment++;
6217a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
6218a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		break; /* FORMAT_DOUBLE */
6219a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      }
6220a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_GROUP:
6221a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      {
6222a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		int characterclass[MAX_CHARACTER_CLASS + 1];
6223a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		int rc;
6224a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6225a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		/* Skip over modifiers */
6226a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		while (format[index] != SPECIFIER_GROUP)
6227a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  {
6228a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    index++;
6229a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  }
6230a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		/* Skip over group specifier */
6231a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		index++;
6232a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6233a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		memset(characterclass, 0, sizeof(characterclass));
6234a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		rc = TrioGetCharacterClass(format,
6235a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					   &index,
6236a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					   &flags,
6237a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang					   characterclass);
6238a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (rc < 0)
6239a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  return rc;
6240a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6241a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (!TrioReadGroup(data,
6242a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   (flags & FLAGS_IGNORE)
6243a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   ? NULL
6244a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   : parameters[i].data.string,
6245a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   characterclass,
6246a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   flags,
6247a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   parameters[i].width))
6248a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  return assignment;
6249a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		if (!(flags & FLAGS_IGNORE))
6250a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  assignment++;
6251a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      }
6252a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* FORMAT_GROUP */
6253a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6254a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_COUNT:
6255a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      pointer = parameters[i].data.pointer;
6256a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (NULL != pointer)
6257a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
6258a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  int count = data->committed;
6259a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (ch != EOF)
6260a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    count--; /* a character is read, but is not consumed yet */
6261a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
6262a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_SIZE_T)
6263a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    *(size_t *)pointer = (size_t)count;
6264a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
6265a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6266a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_PTRDIFF_T)
6267a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_PTRDIFF_T)
6268a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    *(ptrdiff_t *)pointer = (ptrdiff_t)count;
6269a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
6270a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6271a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(QUALIFIER_INTMAX_T)
6272a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_INTMAX_T)
6273a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    *(trio_intmax_t *)pointer = (trio_intmax_t)count;
6274a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
6275a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6276a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (flags & FLAGS_QUAD)
6277a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
6278a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)count;
6279a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
6280a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (flags & FLAGS_LONG)
6281a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
6282a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(long int *)pointer = (long int)count;
6283a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
6284a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else if (flags & FLAGS_SHORT)
6285a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
6286a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(short int *)pointer = (short int)count;
6287a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
6288a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  else
6289a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    {
6290a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		      *(int *)pointer = (int)count;
6291a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    }
6292a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
6293a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* FORMAT_COUNT */
6294a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6295a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_CHAR:
6296a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if TRIO_WIDECHAR
6297a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (flags & FLAGS_WIDECHAR)
6298a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
6299a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (TrioReadWideChar(data,
6300a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				       (flags & FLAGS_IGNORE)
6301a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				       ? NULL
6302a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				       : parameters[i].data.wstring,
6303a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				       flags,
6304a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				       (width == NO_WIDTH) ? 1 : width) == 0)
6305a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return assignment;
6306a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
6307a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      else
6308a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6309a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		{
6310a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  if (TrioReadChar(data,
6311a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   (flags & FLAGS_IGNORE)
6312a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   ? NULL
6313a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   : parameters[i].data.string,
6314a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   flags,
6315a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   (width == NO_WIDTH) ? 1 : width) == 0)
6316a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    return assignment;
6317a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		}
6318a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (!(flags & FLAGS_IGNORE))
6319a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		assignment++;
6320a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* FORMAT_CHAR */
6321a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6322a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_POINTER:
6323a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (!TrioReadPointer(data,
6324a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   (flags & FLAGS_IGNORE)
6325a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   ? NULL
6326a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   : (trio_pointer_t *)parameters[i].data.pointer,
6327a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang				   flags))
6328a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		return assignment;
6329a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      if (!(flags & FLAGS_IGNORE))
6330a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		assignment++;
6331a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* FORMAT_POINTER */
6332a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6333a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    case FORMAT_PARAMETER:
6334a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      break; /* FORMAT_PARAMETER */
6335a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6336a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    default:
6337a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
6338a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
6339a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  ch = data->current;
6340a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  index = parameters[i].indexAfterSpecifier;
6341a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  i++;
6342a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
6343a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      else /* Not an % identifier */
6344a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	{
6345a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  if (isspace((int)format[index]))
6346a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
6347a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      /* Whitespaces may match any amount of whitespaces */
6348a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      ch = TrioSkipWhitespaces(data);
6349a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
6350a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else if (ch == format[index])
6351a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    {
6352a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	      data->InStream(data, &ch);
6353a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    }
6354a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  else
6355a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    return assignment;
6356a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6357a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	  index++;
6358a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	}
6359a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6360a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return assignment;
6361a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6362a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6363a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6364a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioScan
6365a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6366a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE int
6367a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioScan
6368a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray),
6369a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t source,
6370a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   size_t sourceSize,
6371a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   void (*InStream) TRIO_PROTO((trio_class_t *, int *)),
6372a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6373a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list *arglist,
6374a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *argarray)
6375a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6376a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
6377a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_parameter_t parameters[MAX_PARAMETERS];
6378a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_class_t data;
6379a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6380a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(InStream));
6381a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6382a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6383a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  memset(&data, 0, sizeof(data));
6384a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.InStream = InStream;
6385a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.location = (trio_pointer_t)source;
6386a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.max = sourceSize;
6387a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.error = 0;
6388a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6389a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(USE_LOCALE)
6390a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (NULL == internalLocaleValues)
6391a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6392a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      TrioSetLocale();
6393a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6394a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6395a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6396a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray);
6397a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (status < 0)
6398a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    return status;
6399a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6400a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioScanProcess(&data, format, parameters);
6401a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (data.error != 0)
6402a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6403a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      status = data.error;
6404a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6405a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
6406a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6407a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6408a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6409a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioInStreamFile
6410a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6411a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
6412a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioInStreamFile
6413a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, intPointer),
6414a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
6415a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *intPointer)
6416a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6417a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  FILE *file = (FILE *)self->location;
6418a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6419a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
6420a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(file));
6421a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6422a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->current = fgetc(file);
6423a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (self->current == EOF)
6424a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6425a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->error = (ferror(file))
6426a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	? TRIO_ERROR_RETURN(TRIO_ERRNO, 0)
6427a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	: TRIO_ERROR_RETURN(TRIO_EOF, 0);
6428a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6429a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
6430a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6431a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->processed++;
6432a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
6433a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6434a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6435a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (VALID(intPointer))
6436a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6437a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *intPointer = self->current;
6438a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6439a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6440a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6441a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6442a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioInStreamFileDescriptor
6443a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6444a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
6445a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioInStreamFileDescriptor
6446a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, intPointer),
6447a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
6448a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *intPointer)
6449a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6450a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int fd = *((int *)self->location);
6451a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int size;
6452a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  unsigned char input;
6453a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6454a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
6455a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6456a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  size = read(fd, &input, sizeof(char));
6457a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (size == -1)
6458a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6459a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);
6460a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->current = EOF;
6461a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6462a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
6463a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6464a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->current = (size == 0) ? EOF : input;
6465a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6466a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (self->current != EOF)
6467a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6468a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
6469a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->processed++;
6470a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6471a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6472a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (VALID(intPointer))
6473a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6474a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *intPointer = self->current;
6475a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6476a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6477a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6478a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6479a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioInStreamCustom
6480a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6481a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
6482a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioInStreamCustom
6483a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, intPointer),
6484a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
6485a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *intPointer)
6486a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6487a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t *data;
6488a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6489a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
6490a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->location));
6491a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6492a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data = (trio_custom_t *)self->location;
6493a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6494a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->current = (data->stream.in == NULL)
6495a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    ? NIL
6496a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    : (data->stream.in)(data->closure);
6497a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6498a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (self->current == NIL)
6499a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6500a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->current = EOF;
6501a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6502a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
6503a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6504a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->processed++;
6505a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
6506a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6507a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6508a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (VALID(intPointer))
6509a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6510a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *intPointer = self->current;
6511a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6512a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6513a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6514a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6515a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * TrioInStreamString
6516a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6517a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PRIVATE void
6518a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTrioInStreamString
6519a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((self, intPointer),
6520a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_class_t *self,
6521a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int *intPointer)
6522a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6523a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  unsigned char **buffer;
6524a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6525a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self));
6526a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(self->location));
6527a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6528a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  buffer = (unsigned char **)self->location;
6529a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  self->current = (*buffer)[0];
6530a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (self->current == NIL)
6531a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6532a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->current = EOF;
6533a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6534a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  else
6535a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6536a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      (*buffer)++;
6537a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->processed++;
6538a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      self->committed++;
6539a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6540a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6541a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  if (VALID(intPointer))
6542a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6543a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      *intPointer = self->current;
6544a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6545a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6546a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6547a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6548a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
6549a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * Formatted scanning functions
6550a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang *
6551a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang ************************************************************************/
6552a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6553a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#if defined(TRIO_DOCUMENTATION)
6554a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang# include "doc/doc_scanf.h"
6555a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang#endif
6556a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/** @addtogroup Scanf
6557a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    @{
6558a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang*/
6559a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6560a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6561a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * scanf
6562a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6563a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6564a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/**
6565a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   Scan characters from standard input stream.
6566a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6567a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param format Formatting string.
6568a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @param ... Arguments.
6569a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang   @return Number of scanned characters.
6570a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6571a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6572a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_scanf
6573a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS2((format, va_alist),
6574a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
6575a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
6576a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6577a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
6578a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
6579a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6580a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6581a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6582a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
6583a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioScan((trio_pointer_t)stdin, 0,
6584a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    TrioInStreamFile,
6585a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    format, &args, NULL);
6586a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
6587a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
6588a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6589a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6590a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6591a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vscanf
6592a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((format, args),
6593a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6594a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
6595a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6596a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6597a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6598a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)stdin, 0,
6599a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamFile,
6600a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, &args, NULL);
6601a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6602a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6603a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6604a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_scanfv
6605a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS2((format, args),
6606a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6607a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
6608a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6609a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6610a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6611a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)stdin, 0,
6612a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamFile,
6613a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, NULL, args);
6614a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6615a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6616a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6617a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * fscanf
6618a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6619a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6620a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_fscanf
6621a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((file, format, va_alist),
6622a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    FILE *file,
6623a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
6624a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
6625a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6626a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
6627a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
6628a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6629a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(file));
6630a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6631a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6632a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
6633a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioScan((trio_pointer_t)file, 0,
6634a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    TrioInStreamFile,
6635a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    format, &args, NULL);
6636a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
6637a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
6638a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6639a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6640a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6641a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vfscanf
6642a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((file, format, args),
6643a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   FILE *file,
6644a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6645a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
6646a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6647a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(file));
6648a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6649a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6650a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)file, 0,
6651a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamFile,
6652a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, &args, NULL);
6653a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6654a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6655a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6656a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_fscanfv
6657a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((file, format, args),
6658a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   FILE *file,
6659a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6660a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
6661a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6662a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(file));
6663a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6664a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6665a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)file, 0,
6666a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamFile,
6667a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, NULL, args);
6668a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6669a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6670a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6671a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * dscanf
6672a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6673a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6674a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_dscanf
6675a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((fd, format, va_alist),
6676a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    int fd,
6677a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
6678a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
6679a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6680a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
6681a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
6682a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6683a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6684a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6685a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
6686a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioScan((trio_pointer_t)&fd, 0,
6687a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    TrioInStreamFileDescriptor,
6688a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    format, &args, NULL);
6689a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
6690a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
6691a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6692a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6693a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6694a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vdscanf
6695a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((fd, format, args),
6696a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int fd,
6697a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6698a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
6699a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6700a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6701a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6702a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)&fd, 0,
6703a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamFileDescriptor,
6704a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, &args, NULL);
6705a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6706a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6707a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6708a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_dscanfv
6709a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((fd, format, args),
6710a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int fd,
6711a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6712a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
6713a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6714a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6715a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6716a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)&fd, 0,
6717a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamFileDescriptor,
6718a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, NULL, args);
6719a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6720a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6721a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6722a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * cscanf
6723a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6724a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6725a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_cscanf
6726a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS4((stream, closure, format, va_alist),
6727a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    trio_instream_t stream,
6728a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    trio_pointer_t closure,
6729a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
6730a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
6731a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6732a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
6733a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
6734a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t data;
6735a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6736a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(stream));
6737a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6738a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6739a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
6740a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.stream.in = stream;
6741a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.closure = closure;
6742a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL);
6743a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
6744a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
6745a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6746a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6747a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6748a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vcscanf
6749a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((stream, closure, format, args),
6750a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_instream_t stream,
6751a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t closure,
6752a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6753a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
6754a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6755a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t data;
6756a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6757a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(stream));
6758a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6759a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6760a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.stream.in = stream;
6761a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.closure = closure;
6762a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL);
6763a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6764a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6765a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6766a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_cscanfv
6767a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS4((stream, closure, format, args),
6768a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_instream_t stream,
6769a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t closure,
6770a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6771a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
6772a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6773a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  trio_custom_t data;
6774a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6775a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(stream));
6776a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6777a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6778a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.stream.in = stream;
6779a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  data.closure = closure;
6780a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args);
6781a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6782a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6783a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6784a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * sscanf
6785a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6786a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6787a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_sscanf
6788a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_VARGS3((buffer, format, va_alist),
6789a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *buffer,
6790a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_CONST char *format,
6791a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	    TRIO_VA_DECL)
6792a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6793a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  int status;
6794a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  va_list args;
6795a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6796a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
6797a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6798a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6799a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_START(args, format);
6800a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  status = TrioScan((trio_pointer_t)&buffer, 0,
6801a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    TrioInStreamString,
6802a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		    format, &args, NULL);
6803a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  TRIO_VA_END(args);
6804a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return status;
6805a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6806a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6807a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6808a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_vsscanf
6809a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((buffer, format, args),
6810a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *buffer,
6811a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6812a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   va_list args)
6813a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6814a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
6815a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6816a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6817a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)&buffer, 0,
6818a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamString,
6819a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, &args, NULL);
6820a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6821a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6822a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC int
6823a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_sscanfv
6824a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS3((buffer, format, args),
6825a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *buffer,
6826a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   TRIO_CONST char *format,
6827a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   trio_pointer_t *args)
6828a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6829a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(buffer));
6830a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  assert(VALID(format));
6831a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6832a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  return TrioScan((trio_pointer_t)&buffer, 0,
6833a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  TrioInStreamString,
6834a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang		  format, NULL, args);
6835a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6836a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6837a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/** @} End of Scanf documentation module */
6838a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang
6839a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang/*************************************************************************
6840a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang * trio_strerror
6841a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang */
6842a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_PUBLIC TRIO_CONST char *
6843a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wangtrio_strerror
6844a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) WangTRIO_ARGS1((errorcode),
6845a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang	   int errorcode)
6846a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang{
6847a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  /* Textual versions of the error codes */
6848a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang  switch (TRIO_ERROR_CODE(errorcode))
6849a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    {
6850a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_EOF:
6851a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "End of file";
6852a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_EINVAL:
6853a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Invalid argument";
6854a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_ETOOMANY:
6855a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Too many arguments";
6856a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_EDBLREF:
6857a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Double reference";
6858a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_EGAP:
6859a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Reference gap";
6860a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_ENOMEM:
6861a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Out of memory";
6862a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_ERANGE:
6863a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Invalid range";
6864a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    case TRIO_ECUSTOM:
6865a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Custom error";
6866a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    default:
6867a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang      return "Unknown";
6868a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang    }
6869a66dd5f0b030e773d3af602682150eebdc9f2bddShimeng (Simon) Wang}
6870