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