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 = ¶meters[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 = ¶meters[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