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