Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: third_party/libxml/src/trio.c

Issue 1193533007: Upgrade to libxml 2.9.2 and libxslt 1.1.28 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no iconv Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libxml/src/trio.h ('k') | third_party/libxml/src/triodef.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /************************************************************************* 1 /*************************************************************************
2 * 2 *
3 * $Id$ 3 * $Id$
4 * 4 *
5 * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. 5 * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.
6 * 6 *
7 * Permission to use, copy, modify, and distribute this software for any 7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above 8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies. 9 * copyright notice and this permission notice appear in all copies.
10 * 10 *
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 #if !defined(TRIO_COMPILER_SUPPORTS_C99) 92 #if !defined(TRIO_COMPILER_SUPPORTS_C99)
93 # define isblank(x) (((x)==32) || ((x)==9)) 93 # define isblank(x) (((x)==32) || ((x)==9))
94 #endif 94 #endif
95 #if defined(TRIO_COMPILER_ANCIENT) 95 #if defined(TRIO_COMPILER_ANCIENT)
96 # include <varargs.h> 96 # include <varargs.h>
97 #else 97 #else
98 # include <stdarg.h> 98 # include <stdarg.h>
99 #endif 99 #endif
100 #include <stddef.h> 100 #include <stddef.h>
101 101
102 #ifdef HAVE_ERRNO_H 102 #if defined( HAVE_ERRNO_H ) || defined( __VMS )
103 #include <errno.h> 103 #include <errno.h>
104 #endif 104 #endif
105 105
106 #ifndef NULL 106 #ifndef NULL
107 # define NULL 0 107 # define NULL 0
108 #endif 108 #endif
109 #define NIL ((char)0) 109 #define NIL ((char)0)
110 #ifndef FALSE 110 #ifndef FALSE
111 # define FALSE (1 == 0) 111 # define FALSE (1 == 0)
112 # define TRUE (! FALSE) 112 # define TRUE (! FALSE)
113 #endif 113 #endif
114 #define BOOLEAN_T int 114 #define BOOLEAN_T int
115 115
116 /* mincore() can be used for debugging purposes */ 116 /* mincore() can be used for debugging purposes */
117 #define VALID(x) (NULL != (x)) 117 #define VALID(x) (NULL != (x))
118 118
119 #if TRIO_ERRORS 119 #if TRIO_ERRORS
120 /* 120 /*
121 * Encode the error code and the position. This is decoded 121 * Encode the error code and the position. This is decoded
122 * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION. 122 * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION.
123 */ 123 */
124 # define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8))) 124 # define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8)))
125 #else 125 #else
126 # define TRIO_ERROR_RETURN(x,y) (-1) 126 # define TRIO_ERROR_RETURN(x,y) (-1)
127 #endif 127 #endif
128 128
129 #ifndef VA_LIST_IS_ARRAY
130 #define TRIO_VA_LIST_PTR va_list *
131 #define TRIO_VA_LIST_ADDR(l) (&(l))
132 #define TRIO_VA_LIST_DEREF(l) (*(l))
133 #else
134 #define TRIO_VA_LIST_PTR va_list
135 #define TRIO_VA_LIST_ADDR(l) (l)
136 #define TRIO_VA_LIST_DEREF(l) (l)
137 #endif
138
129 typedef unsigned long trio_flags_t; 139 typedef unsigned long trio_flags_t;
130 140
131 141
132 /************************************************************************* 142 /*************************************************************************
133 * Platform specific definitions 143 * Platform specific definitions
134 */ 144 */
135 #if defined(TRIO_PLATFORM_UNIX) 145 #if defined(TRIO_PLATFORM_UNIX) || defined(TRIO_PLATFORM_OS400)
136 # include <unistd.h> 146 # include <unistd.h>
137 # include <signal.h> 147 # include <signal.h>
138 # include <locale.h> 148 # include <locale.h>
139 # define USE_LOCALE 149 # define USE_LOCALE
140 #endif /* TRIO_PLATFORM_UNIX */ 150 #endif /* TRIO_PLATFORM_UNIX */
141 #if defined(TRIO_PLATFORM_VMS) 151 #if defined(TRIO_PLATFORM_VMS)
142 # include <unistd.h> 152 # include <unistd.h>
143 #endif 153 #endif
144 #if defined(TRIO_PLATFORM_WIN32) 154 #if defined(TRIO_PLATFORM_WIN32)
145 # if defined(_WIN32_WCE) 155 # if defined(_WIN32_WCE)
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 typedef unsigned long long int trio_ulonglong_t; 211 typedef unsigned long long int trio_ulonglong_t;
202 #elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT) 212 #elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
203 typedef signed __int64 trio_longlong_t; 213 typedef signed __int64 trio_longlong_t;
204 typedef unsigned __int64 trio_ulonglong_t; 214 typedef unsigned __int64 trio_ulonglong_t;
205 #else 215 #else
206 typedef TRIO_SIGNED long int trio_longlong_t; 216 typedef TRIO_SIGNED long int trio_longlong_t;
207 typedef unsigned long int trio_ulonglong_t; 217 typedef unsigned long int trio_ulonglong_t;
208 #endif 218 #endif
209 219
210 /* Maximal and fixed integer types */ 220 /* Maximal and fixed integer types */
211 #if defined(TRIO_COMPILER_SUPPORTS_C99) 221 #if defined(TRIO_COMPILER_SUPPORTS_C99) && !defined( __VMS )
212 # include <stdint.h> 222 # include <stdint.h>
213 typedef intmax_t trio_intmax_t; 223 typedef intmax_t trio_intmax_t;
214 typedef uintmax_t trio_uintmax_t; 224 typedef uintmax_t trio_uintmax_t;
215 typedef int8_t trio_int8_t; 225 typedef int8_t trio_int8_t;
216 typedef int16_t trio_int16_t; 226 typedef int16_t trio_int16_t;
217 typedef int32_t trio_int32_t; 227 typedef int32_t trio_int32_t;
218 typedef int64_t trio_int64_t; 228 typedef int64_t trio_int64_t;
219 #elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) 229 #elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) || defined( __VMS )
220 # include <inttypes.h> 230 # include <inttypes.h>
231 #ifdef __VMS
232 typedef long long int intmax_t;
233 typedef unsigned long long int uintmax_t;
234 #endif
221 typedef intmax_t trio_intmax_t; 235 typedef intmax_t trio_intmax_t;
222 typedef uintmax_t trio_uintmax_t; 236 typedef uintmax_t trio_uintmax_t;
223 typedef int8_t trio_int8_t; 237 typedef int8_t trio_int8_t;
224 typedef int16_t trio_int16_t; 238 typedef int16_t trio_int16_t;
225 typedef int32_t trio_int32_t; 239 typedef int32_t trio_int32_t;
226 typedef int64_t trio_int64_t; 240 typedef int64_t trio_int64_t;
227 #elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT) 241 #elif defined(TRIO_COMPILER_SUPPORTS_MSVC_INT)
228 typedef trio_longlong_t trio_intmax_t; 242 typedef trio_longlong_t trio_intmax_t;
229 typedef trio_ulonglong_t trio_uintmax_t; 243 typedef trio_ulonglong_t trio_uintmax_t;
230 typedef __int8 trio_int8_t; 244 typedef __int8 trio_int8_t;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 #define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4) 314 #define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4)
301 315
302 /* Infinite and Not-A-Number for floating-point */ 316 /* Infinite and Not-A-Number for floating-point */
303 #define INFINITE_LOWER "inf" 317 #define INFINITE_LOWER "inf"
304 #define INFINITE_UPPER "INF" 318 #define INFINITE_UPPER "INF"
305 #define LONG_INFINITE_LOWER "infinite" 319 #define LONG_INFINITE_LOWER "infinite"
306 #define LONG_INFINITE_UPPER "INFINITE" 320 #define LONG_INFINITE_UPPER "INFINITE"
307 #define NAN_LOWER "nan" 321 #define NAN_LOWER "nan"
308 #define NAN_UPPER "NAN" 322 #define NAN_UPPER "NAN"
309 323
324 #if !defined(HAVE_ISASCII) && !defined(isascii)
325 #ifndef __VMS
326 # define isascii(x) ((unsigned int)(x) < 128)
327 #endif
328 #endif
329
310 /* Various constants */ 330 /* Various constants */
311 enum { 331 enum {
312 TYPE_PRINT = 1, 332 TYPE_PRINT = 1,
313 TYPE_SCAN = 2, 333 TYPE_SCAN = 2,
314 334
315 /* Flags. FLAGS_LAST must be less than ULONG_MAX */ 335 /* Flags. FLAGS_LAST must be less than ULONG_MAX */
316 FLAGS_NEW = 0, 336 FLAGS_NEW = 0,
317 FLAGS_STICKY = 1, 337 FLAGS_STICKY = 1,
318 FLAGS_SPACE = 2 * FLAGS_STICKY, 338 FLAGS_SPACE = 2 * FLAGS_STICKY,
319 FLAGS_SHOWSIGN = 2 * FLAGS_SPACE, 339 FLAGS_SHOWSIGN = 2 * FLAGS_SPACE,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 BASE_HEX = 16, 389 BASE_HEX = 16,
370 390
371 /* Maximal number of allowed parameters */ 391 /* Maximal number of allowed parameters */
372 MAX_PARAMETERS = 64, 392 MAX_PARAMETERS = 64,
373 /* Maximal number of characters in class */ 393 /* Maximal number of characters in class */
374 MAX_CHARACTER_CLASS = UCHAR_MAX + 1, 394 MAX_CHARACTER_CLASS = UCHAR_MAX + 1,
375 395
376 /* Maximal string lengths for user-defined specifiers */ 396 /* Maximal string lengths for user-defined specifiers */
377 MAX_USER_NAME = 64, 397 MAX_USER_NAME = 64,
378 MAX_USER_DATA = 256, 398 MAX_USER_DATA = 256,
379 399
380 /* Maximal length of locale separator strings */ 400 /* Maximal length of locale separator strings */
381 MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX, 401 MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX,
382 /* Maximal number of integers in grouping */ 402 /* Maximal number of integers in grouping */
383 MAX_LOCALE_GROUPS = 64, 403 MAX_LOCALE_GROUPS = 64,
384 404
385 /* Initial size of asprintf buffer */ 405 /* Initial size of asprintf buffer */
386 DYNAMIC_START_SIZE = 32 406 DYNAMIC_START_SIZE = 32
387 }; 407 };
388 408
389 #define NO_GROUPING ((int)CHAR_MAX) 409 #define NO_GROUPING ((int)CHAR_MAX)
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 * Find registered user-defined specifier. 1033 * Find registered user-defined specifier.
1014 * The prev argument is used for optimization only. 1034 * The prev argument is used for optimization only.
1015 */ 1035 */
1016 TRIO_PRIVATE trio_userdef_t * 1036 TRIO_PRIVATE trio_userdef_t *
1017 TrioFindNamespace 1037 TrioFindNamespace
1018 TRIO_ARGS2((name, prev), 1038 TRIO_ARGS2((name, prev),
1019 TRIO_CONST char *name, 1039 TRIO_CONST char *name,
1020 trio_userdef_t **prev) 1040 trio_userdef_t **prev)
1021 { 1041 {
1022 trio_userdef_t *def; 1042 trio_userdef_t *def;
1023 1043
1024 if (internalEnterCriticalRegion) 1044 if (internalEnterCriticalRegion)
1025 (void)internalEnterCriticalRegion(NULL); 1045 (void)internalEnterCriticalRegion(NULL);
1026 1046
1027 for (def = internalUserDef; def; def = def->next) 1047 for (def = internalUserDef; def; def = def->next)
1028 { 1048 {
1029 /* Case-sensitive string comparison */ 1049 /* Case-sensitive string comparison */
1030 if (trio_equal_case(def->name, name)) 1050 if (trio_equal_case(def->name, name))
1031 break; 1051 break;
1032 1052
1033 if (prev) 1053 if (prev)
1034 *prev = def; 1054 *prev = def;
1035 } 1055 }
1036 1056
1037 if (internalLeaveCriticalRegion) 1057 if (internalLeaveCriticalRegion)
1038 (void)internalLeaveCriticalRegion(NULL); 1058 (void)internalLeaveCriticalRegion(NULL);
1039 1059
1040 return def; 1060 return def;
1041 } 1061 }
1042 #endif 1062 #endif
1043 1063
1044 /************************************************************************* 1064 /*************************************************************************
1045 * TrioPower 1065 * TrioPower
1046 * 1066 *
1047 * Description: 1067 * Description:
1048 * Calculate pow(base, exponent), where number and exponent are integers. 1068 * Calculate pow(base, exponent), where number and exponent are integers.
1049 */ 1069 */
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 * 1176 *
1157 * Description: 1177 * Description:
1158 * Parse the format string 1178 * Parse the format string
1159 */ 1179 */
1160 TRIO_PRIVATE int 1180 TRIO_PRIVATE int
1161 TrioParse 1181 TrioParse
1162 TRIO_ARGS5((type, format, parameters, arglist, argarray), 1182 TRIO_ARGS5((type, format, parameters, arglist, argarray),
1163 int type, 1183 int type,
1164 TRIO_CONST char *format, 1184 TRIO_CONST char *format,
1165 trio_parameter_t *parameters, 1185 trio_parameter_t *parameters,
1166 » va_list *arglist, 1186 » TRIO_VA_LIST_PTR arglist,
1167 trio_pointer_t *argarray) 1187 trio_pointer_t *argarray)
1168 { 1188 {
1169 /* Count the number of times a parameter is referenced */ 1189 /* Count the number of times a parameter is referenced */
1170 unsigned short usedEntries[MAX_PARAMETERS]; 1190 unsigned short usedEntries[MAX_PARAMETERS];
1171 /* Parameter counters */ 1191 /* Parameter counters */
1172 int parameterPosition; 1192 int parameterPosition;
1173 int currentParam; 1193 int currentParam;
1174 int maxParam = -1; 1194 int maxParam = -1;
1175 /* Utility variables */ 1195 /* Utility variables */
1176 trio_flags_t flags; 1196 trio_flags_t flags;
(...skipping 16 matching lines...) Expand all
1193 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) 1213 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
1194 int charlen; 1214 int charlen;
1195 #endif 1215 #endif
1196 int save_errno; 1216 int save_errno;
1197 int i = -1; 1217 int i = -1;
1198 int num; 1218 int num;
1199 char *tmpformat; 1219 char *tmpformat;
1200 1220
1201 /* One and only one of arglist and argarray must be used */ 1221 /* One and only one of arglist and argarray must be used */
1202 assert((arglist != NULL) ^ (argarray != NULL)); 1222 assert((arglist != NULL) ^ (argarray != NULL));
1203 1223
1204 /* 1224 /*
1205 * The 'parameters' array is not initialized, but we need to 1225 * The 'parameters' array is not initialized, but we need to
1206 * know which entries we have used. 1226 * know which entries we have used.
1207 */ 1227 */
1208 memset(usedEntries, 0, sizeof(usedEntries)); 1228 memset(usedEntries, 0, sizeof(usedEntries));
1209 1229
1210 save_errno = errno; 1230 save_errno = errno;
1211 index = 0; 1231 index = 0;
1212 parameterPosition = 0; 1232 parameterPosition = 0;
1213 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) 1233 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
1214 (void)mblen(NULL, 0); 1234 (void)mblen(NULL, 0);
1215 #endif 1235 #endif
1216 1236
1217 while (format[index]) 1237 while (format[index])
1218 { 1238 {
1219 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) 1239 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
1220 if (! isascii(format[index])) 1240 if (! isascii(format[index]))
1221 { 1241 {
1222 /* 1242 /*
1223 * Multibyte characters cannot be legal specifiers or 1243 * Multibyte characters cannot be legal specifiers or
1224 * modifiers, so we skip over them. 1244 * modifiers, so we skip over them.
1225 */ 1245 */
1226 charlen = mblen(&format[index], MB_LEN_MAX); 1246 charlen = mblen(&format[index], MB_LEN_MAX);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 break; 1304 break;
1285 1305
1286 case QUALIFIER_DOT: 1306 case QUALIFIER_DOT:
1287 if (dots == 0) /* Precision */ 1307 if (dots == 0) /* Precision */
1288 { 1308 {
1289 dots++; 1309 dots++;
1290 1310
1291 /* Skip if no precision */ 1311 /* Skip if no precision */
1292 if (QUALIFIER_DOT == format[index]) 1312 if (QUALIFIER_DOT == format[index])
1293 break; 1313 break;
1294 » » 1314
1295 /* After the first dot we have the precision */ 1315 /* After the first dot we have the precision */
1296 flags |= FLAGS_PRECISION; 1316 flags |= FLAGS_PRECISION;
1297 if ((QUALIFIER_STAR == format[index]) 1317 if ((QUALIFIER_STAR == format[index])
1298 #if defined(QUALIFIER_PARAM) 1318 #if defined(QUALIFIER_PARAM)
1299 || (QUALIFIER_PARAM == format[index]) 1319 || (QUALIFIER_PARAM == format[index])
1300 #endif 1320 #endif
1301 ) 1321 )
1302 { 1322 {
1303 index++; 1323 index++;
1304 flags |= FLAGS_PRECISION_PARAMETER; 1324 flags |= FLAGS_PRECISION_PARAMETER;
(...skipping 24 matching lines...) Expand all
1329 { 1349 {
1330 precision = trio_to_long(&format[index], 1350 precision = trio_to_long(&format[index],
1331 &tmpformat, 1351 &tmpformat,
1332 BASE_DECIMAL); 1352 BASE_DECIMAL);
1333 index = (int)(tmpformat - format); 1353 index = (int)(tmpformat - format);
1334 } 1354 }
1335 } 1355 }
1336 else if (dots == 1) /* Base */ 1356 else if (dots == 1) /* Base */
1337 { 1357 {
1338 dots++; 1358 dots++;
1339 » » 1359
1340 /* After the second dot we have the base */ 1360 /* After the second dot we have the base */
1341 flags |= FLAGS_BASE; 1361 flags |= FLAGS_BASE;
1342 if ((QUALIFIER_STAR == format[index]) 1362 if ((QUALIFIER_STAR == format[index])
1343 #if defined(QUALIFIER_PARAM) 1363 #if defined(QUALIFIER_PARAM)
1344 || (QUALIFIER_PARAM == format[index]) 1364 || (QUALIFIER_PARAM == format[index])
1345 #endif 1365 #endif
1346 ) 1366 )
1347 { 1367 {
1348 index++; 1368 index++;
1349 flags |= FLAGS_BASE_PARAMETER; 1369 flags |= FLAGS_BASE_PARAMETER;
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 varsize = sizeof(trio_int16_t); 1548 varsize = sizeof(trio_int16_t);
1529 index += 2; 1549 index += 2;
1530 } 1550 }
1531 else if (format[index] == '8') 1551 else if (format[index] == '8')
1532 { 1552 {
1533 varsize = sizeof(trio_int8_t); 1553 varsize = sizeof(trio_int8_t);
1534 index++; 1554 index++;
1535 } 1555 }
1536 else 1556 else
1537 return TRIO_ERROR_RETURN(TRIO_EINVAL, index); 1557 return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1538 » » 1558
1539 flags |= FLAGS_FIXED_SIZE; 1559 flags |= FLAGS_FIXED_SIZE;
1540 break; 1560 break;
1541 #endif 1561 #endif
1542 1562
1543 #if defined(QUALIFIER_WIDECHAR) 1563 #if defined(QUALIFIER_WIDECHAR)
1544 case QUALIFIER_WIDECHAR: 1564 case QUALIFIER_WIDECHAR:
1545 flags |= FLAGS_WIDECHAR; 1565 flags |= FLAGS_WIDECHAR;
1546 break; 1566 break;
1547 #endif 1567 #endif
1548 1568
1549 #if defined(QUALIFIER_SIZE_T_UPPER) 1569 #if defined(QUALIFIER_SIZE_T_UPPER)
1550 case QUALIFIER_SIZE_T_UPPER: 1570 case QUALIFIER_SIZE_T_UPPER:
1551 break; 1571 break;
1552 #endif 1572 #endif
1553 1573
1554 #if defined(QUALIFIER_QUOTE) 1574 #if defined(QUALIFIER_QUOTE)
1555 case QUALIFIER_QUOTE: 1575 case QUALIFIER_QUOTE:
1556 flags |= FLAGS_QUOTE; 1576 flags |= FLAGS_QUOTE;
1557 break; 1577 break;
1558 #endif 1578 #endif
1559 1579
1560 #if defined(QUALIFIER_STICKY) 1580 #if defined(QUALIFIER_STICKY)
1561 case QUALIFIER_STICKY: 1581 case QUALIFIER_STICKY:
1562 flags |= FLAGS_STICKY; 1582 flags |= FLAGS_STICKY;
1563 gotSticky = TRUE; 1583 gotSticky = TRUE;
1564 break; 1584 break;
1565 #endif 1585 #endif
1566 » » 1586
1567 #if defined(QUALIFIER_VARSIZE) 1587 #if defined(QUALIFIER_VARSIZE)
1568 case QUALIFIER_VARSIZE: 1588 case QUALIFIER_VARSIZE:
1569 flags |= FLAGS_VARSIZE_PARAMETER; 1589 flags |= FLAGS_VARSIZE_PARAMETER;
1570 parameterPosition++; 1590 parameterPosition++;
1571 if (positional) 1591 if (positional)
1572 varsize = parameterPosition; 1592 varsize = parameterPosition;
1573 else 1593 else
1574 { 1594 {
1575 varsize = currentParam; 1595 varsize = currentParam;
1576 currentParam = varsize + 1; 1596 currentParam = varsize + 1;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 base = pos++; 1641 base = pos++;
1622 } 1642 }
1623 if (flags & FLAGS_VARSIZE_PARAMETER) 1643 if (flags & FLAGS_VARSIZE_PARAMETER)
1624 { 1644 {
1625 usedEntries[varsize] += 1; 1645 usedEntries[varsize] += 1;
1626 parameters[pos].type = FORMAT_PARAMETER; 1646 parameters[pos].type = FORMAT_PARAMETER;
1627 parameters[pos].flags = 0; 1647 parameters[pos].flags = 0;
1628 indices[varsize] = pos; 1648 indices[varsize] = pos;
1629 varsize = pos++; 1649 varsize = pos++;
1630 } 1650 }
1631 » 1651
1632 indices[currentParam] = pos; 1652 indices[currentParam] = pos;
1633 » 1653
1634 switch (format[index++]) 1654 switch (format[index++])
1635 { 1655 {
1636 #if defined(SPECIFIER_CHAR_UPPER) 1656 #if defined(SPECIFIER_CHAR_UPPER)
1637 case SPECIFIER_CHAR_UPPER: 1657 case SPECIFIER_CHAR_UPPER:
1638 flags |= FLAGS_WIDECHAR; 1658 flags |= FLAGS_WIDECHAR;
1639 /* FALLTHROUGH */ 1659 /* FALLTHROUGH */
1640 #endif 1660 #endif
1641 case SPECIFIER_CHAR: 1661 case SPECIFIER_CHAR:
1642 if (flags & FLAGS_LONG) 1662 if (flags & FLAGS_LONG)
1643 flags |= FLAGS_WIDECHAR; 1663 flags |= FLAGS_WIDECHAR;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1682 if (--depth <= 0) 1702 if (--depth <= 0)
1683 { 1703 {
1684 index++; 1704 index++;
1685 break; 1705 break;
1686 } 1706 }
1687 } 1707 }
1688 index++; 1708 index++;
1689 } 1709 }
1690 } 1710 }
1691 break; 1711 break;
1692 » 1712
1693 case SPECIFIER_INTEGER: 1713 case SPECIFIER_INTEGER:
1694 parameters[pos].type = FORMAT_INT; 1714 parameters[pos].type = FORMAT_INT;
1695 break; 1715 break;
1696 » 1716
1697 case SPECIFIER_UNSIGNED: 1717 case SPECIFIER_UNSIGNED:
1698 flags |= FLAGS_UNSIGNED; 1718 flags |= FLAGS_UNSIGNED;
1699 parameters[pos].type = FORMAT_INT; 1719 parameters[pos].type = FORMAT_INT;
1700 break; 1720 break;
1701 1721
1702 case SPECIFIER_DECIMAL: 1722 case SPECIFIER_DECIMAL:
1703 /* Disable base modifier */ 1723 /* Disable base modifier */
1704 flags &= ~FLAGS_BASE_PARAMETER; 1724 flags &= ~FLAGS_BASE_PARAMETER;
1705 base = BASE_DECIMAL; 1725 base = BASE_DECIMAL;
1706 parameters[pos].type = FORMAT_INT; 1726 parameters[pos].type = FORMAT_INT;
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1786 case SPECIFIER_ERRNO: 1806 case SPECIFIER_ERRNO:
1787 parameters[pos].type = FORMAT_ERRNO; 1807 parameters[pos].type = FORMAT_ERRNO;
1788 break; 1808 break;
1789 #endif 1809 #endif
1790 1810
1791 #if defined(SPECIFIER_USER_DEFINED_BEGIN) 1811 #if defined(SPECIFIER_USER_DEFINED_BEGIN)
1792 case SPECIFIER_USER_DEFINED_BEGIN: 1812 case SPECIFIER_USER_DEFINED_BEGIN:
1793 { 1813 {
1794 unsigned int max; 1814 unsigned int max;
1795 int without_namespace = TRUE; 1815 int without_namespace = TRUE;
1796 » » 1816
1797 parameters[pos].type = FORMAT_USER_DEFINED; 1817 parameters[pos].type = FORMAT_USER_DEFINED;
1798 parameters[pos].user_name[0] = NIL; 1818 parameters[pos].user_name[0] = NIL;
1799 tmpformat = (char *)&format[index]; 1819 tmpformat = (char *)&format[index];
1800 » 1820
1801 while ((ch = format[index])) 1821 while ((ch = format[index]))
1802 { 1822 {
1803 index++; 1823 index++;
1804 if (ch == SPECIFIER_USER_DEFINED_END) 1824 if (ch == SPECIFIER_USER_DEFINED_END)
1805 { 1825 {
1806 if (without_namespace) 1826 if (without_namespace)
1807 { 1827 {
1808 /* We must get the handle first */ 1828 /* We must get the handle first */
1809 parameters[pos].type = FORMAT_PARAMETER; 1829 parameters[pos].type = FORMAT_PARAMETER;
1810 parameters[pos].indexAfterSpecifier = index; 1830 parameters[pos].indexAfterSpecifier = index;
(...skipping 27 matching lines...) Expand all
1838 max, 1858 max,
1839 tmpformat); 1859 tmpformat);
1840 tmpformat = (char *)&format[index]; 1860 tmpformat = (char *)&format[index];
1841 } 1861 }
1842 } 1862 }
1843 if (ch != SPECIFIER_USER_DEFINED_END) 1863 if (ch != SPECIFIER_USER_DEFINED_END)
1844 return TRIO_ERROR_RETURN(TRIO_EINVAL, index); 1864 return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1845 } 1865 }
1846 break; 1866 break;
1847 #endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */ 1867 #endif /* defined(SPECIFIER_USER_DEFINED_BEGIN) */
1848 » 1868
1849 default: 1869 default:
1850 /* Bail out completely to make the error more obvious */ 1870 /* Bail out completely to make the error more obvious */
1851 return TRIO_ERROR_RETURN(TRIO_EINVAL, index); 1871 return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
1852 } 1872 }
1853 1873
1854 /* Count the number of times this entry has been used */ 1874 /* Count the number of times this entry has been used */
1855 usedEntries[currentParam] += 1; 1875 usedEntries[currentParam] += 1;
1856 » 1876
1857 /* Find last sticky parameters */ 1877 /* Find last sticky parameters */
1858 if (gotSticky && !(flags & FLAGS_STICKY)) 1878 if (gotSticky && !(flags & FLAGS_STICKY))
1859 { 1879 {
1860 for (i = pos - 1; i >= 0; i--) 1880 for (i = pos - 1; i >= 0; i--)
1861 { 1881 {
1862 if (parameters[i].type == FORMAT_PARAMETER) 1882 if (parameters[i].type == FORMAT_PARAMETER)
1863 continue; 1883 continue;
1864 if ((parameters[i].flags & FLAGS_STICKY) && 1884 if ((parameters[i].flags & FLAGS_STICKY) &&
1865 (parameters[i].type == parameters[pos].type)) 1885 (parameters[i].type == parameters[pos].type))
1866 { 1886 {
1867 /* Do not overwrite current qualifiers */ 1887 /* Do not overwrite current qualifiers */
1868 flags |= (parameters[i].flags & (unsigned long)~FLAGS_STIC KY); 1888 flags |= (parameters[i].flags & (unsigned long)~FLAGS_STIC KY);
1869 if (width == NO_WIDTH) 1889 if (width == NO_WIDTH)
1870 width = parameters[i].width; 1890 width = parameters[i].width;
1871 if (precision == NO_PRECISION) 1891 if (precision == NO_PRECISION)
1872 precision = parameters[i].precision; 1892 precision = parameters[i].precision;
1873 if (base == NO_BASE) 1893 if (base == NO_BASE)
1874 base = parameters[i].base; 1894 base = parameters[i].base;
1875 break; 1895 break;
1876 } 1896 }
1877 } 1897 }
1878 } 1898 }
1879 » 1899
1880 parameters[pos].indexAfterSpecifier = index; 1900 parameters[pos].indexAfterSpecifier = index;
1881 parameters[pos].flags = flags; 1901 parameters[pos].flags = flags;
1882 parameters[pos].width = width; 1902 parameters[pos].width = width;
1883 parameters[pos].precision = precision; 1903 parameters[pos].precision = precision;
1884 parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base; 1904 parameters[pos].base = (base == NO_BASE) ? BASE_DECIMAL : base;
1885 parameters[pos].varsize = varsize; 1905 parameters[pos].varsize = varsize;
1886 pos++; 1906 pos++;
1887 » 1907
1888 if (! positional) 1908 if (! positional)
1889 parameterPosition++; 1909 parameterPosition++;
1890 » 1910
1891 } /* if identifier */ 1911 } /* if identifier */
1892 1912
1893 } /* while format characters left */ 1913 } /* while format characters left */
1894 1914
1895 for (num = 0; num <= maxParam; num++) 1915 for (num = 0; num <= maxParam; num++)
1896 { 1916 {
1897 if (usedEntries[num] != 1) 1917 if (usedEntries[num] != 1)
1898 { 1918 {
1899 if (usedEntries[num] == 0) /* gap detected */ 1919 if (usedEntries[num] == 0) /* gap detected */
1900 return TRIO_ERROR_RETURN(TRIO_EGAP, num); 1920 return TRIO_ERROR_RETURN(TRIO_EGAP, num);
1901 else /* double references detected */ 1921 else /* double references detected */
1902 return TRIO_ERROR_RETURN(TRIO_EDBLREF, num); 1922 return TRIO_ERROR_RETURN(TRIO_EDBLREF, num);
1903 } 1923 }
1904 1924
1905 i = indices[num]; 1925 i = indices[num];
1906 1926
1907 /* 1927 /*
1908 * FORMAT_PARAMETERS are only present if they must be read, 1928 * FORMAT_PARAMETERS are only present if they must be read,
1909 * so it makes no sense to check the ignore flag (besides, 1929 * so it makes no sense to check the ignore flag (besides,
1910 * the flags variable is not set for that particular type) 1930 * the flags variable is not set for that particular type)
1911 */ 1931 */
1912 if ((parameters[i].type != FORMAT_PARAMETER) && 1932 if ((parameters[i].type != FORMAT_PARAMETER) &&
1913 (parameters[i].flags & FLAGS_IGNORE)) 1933 (parameters[i].flags & FLAGS_IGNORE))
1914 continue; /* for all arguments */ 1934 continue; /* for all arguments */
(...skipping 19 matching lines...) Expand all
1934 * intmax_t 1954 * intmax_t
1935 */ 1955 */
1936 switch (parameters[i].type) 1956 switch (parameters[i].type)
1937 { 1957 {
1938 case FORMAT_GROUP: 1958 case FORMAT_GROUP:
1939 case FORMAT_STRING: 1959 case FORMAT_STRING:
1940 #if TRIO_WIDECHAR 1960 #if TRIO_WIDECHAR
1941 if (flags & FLAGS_WIDECHAR) 1961 if (flags & FLAGS_WIDECHAR)
1942 { 1962 {
1943 parameters[i].data.wstring = (argarray == NULL) 1963 parameters[i].data.wstring = (argarray == NULL)
1944 » » ? va_arg(*arglist, trio_wchar_t *) 1964 » » ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_wchar_t *)
1945 : (trio_wchar_t *)(argarray[num]); 1965 : (trio_wchar_t *)(argarray[num]);
1946 } 1966 }
1947 else 1967 else
1948 #endif 1968 #endif
1949 { 1969 {
1950 parameters[i].data.string = (argarray == NULL) 1970 parameters[i].data.string = (argarray == NULL)
1951 » » ? va_arg(*arglist, char *) 1971 » » ? va_arg(TRIO_VA_LIST_DEREF(arglist), char *)
1952 : (char *)(argarray[num]); 1972 : (char *)(argarray[num]);
1953 } 1973 }
1954 break; 1974 break;
1955 1975
1956 #if defined(FORMAT_USER_DEFINED) 1976 #if defined(FORMAT_USER_DEFINED)
1957 case FORMAT_USER_DEFINED: 1977 case FORMAT_USER_DEFINED:
1958 #endif 1978 #endif
1959 case FORMAT_POINTER: 1979 case FORMAT_POINTER:
1960 case FORMAT_COUNT: 1980 case FORMAT_COUNT:
1961 case FORMAT_UNKNOWN: 1981 case FORMAT_UNKNOWN:
1962 parameters[i].data.pointer = (argarray == NULL) 1982 parameters[i].data.pointer = (argarray == NULL)
1963 » ? va_arg(*arglist, trio_pointer_t ) 1983 » ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t )
1964 : argarray[num]; 1984 : argarray[num];
1965 break; 1985 break;
1966 1986
1967 case FORMAT_CHAR: 1987 case FORMAT_CHAR:
1968 case FORMAT_INT: 1988 case FORMAT_INT:
1969 if (TYPE_SCAN == type) 1989 if (TYPE_SCAN == type)
1970 { 1990 {
1971 if (argarray == NULL) 1991 if (argarray == NULL)
1972 parameters[i].data.pointer = 1992 parameters[i].data.pointer =
1973 (trio_pointer_t)va_arg(*arglist, trio_pointer_t); 1993 (trio_pointer_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_point er_t);
1974 else 1994 else
1975 { 1995 {
1976 if (parameters[i].type == FORMAT_CHAR) 1996 if (parameters[i].type == FORMAT_CHAR)
1977 parameters[i].data.pointer = 1997 parameters[i].data.pointer =
1978 (trio_pointer_t)((char *)argarray[num]); 1998 (trio_pointer_t)((char *)argarray[num]);
1979 else if (parameters[i].flags & FLAGS_SHORT) 1999 else if (parameters[i].flags & FLAGS_SHORT)
1980 parameters[i].data.pointer = 2000 parameters[i].data.pointer =
1981 (trio_pointer_t)((short *)argarray[num]); 2001 (trio_pointer_t)((short *)argarray[num]);
1982 else 2002 else
1983 parameters[i].data.pointer = 2003 parameters[i].data.pointer =
(...skipping 18 matching lines...) Expand all
2002 * big-endian, then this will fail. 2022 * big-endian, then this will fail.
2003 */ 2023 */
2004 varsize = (int)parameters[parameters[i].varsize].data.numb er.as_unsigned; 2024 varsize = (int)parameters[parameters[i].varsize].data.numb er.as_unsigned;
2005 } 2025 }
2006 else 2026 else
2007 { 2027 {
2008 /* Used for the I<bits> modifiers */ 2028 /* Used for the I<bits> modifiers */
2009 varsize = parameters[i].varsize; 2029 varsize = parameters[i].varsize;
2010 } 2030 }
2011 parameters[i].flags &= ~FLAGS_ALL_VARSIZES; 2031 parameters[i].flags &= ~FLAGS_ALL_VARSIZES;
2012 » » 2032
2013 if (varsize <= (int)sizeof(int)) 2033 if (varsize <= (int)sizeof(int))
2014 ; 2034 ;
2015 else if (varsize <= (int)sizeof(long)) 2035 else if (varsize <= (int)sizeof(long))
2016 parameters[i].flags |= FLAGS_LONG; 2036 parameters[i].flags |= FLAGS_LONG;
2017 #if defined(QUALIFIER_INTMAX_T) 2037 #if defined(QUALIFIER_INTMAX_T)
2018 else if (varsize <= (int)sizeof(trio_longlong_t)) 2038 else if (varsize <= (int)sizeof(trio_longlong_t))
2019 parameters[i].flags |= FLAGS_QUAD; 2039 parameters[i].flags |= FLAGS_QUAD;
2020 else 2040 else
2021 parameters[i].flags |= FLAGS_INTMAX_T; 2041 parameters[i].flags |= FLAGS_INTMAX_T;
2022 #else 2042 #else
2023 else 2043 else
2024 parameters[i].flags |= FLAGS_QUAD; 2044 parameters[i].flags |= FLAGS_QUAD;
2025 #endif 2045 #endif
2026 } 2046 }
2027 #endif /* defined(QUALIFIER_VARSIZE) */ 2047 #endif /* defined(QUALIFIER_VARSIZE) */
2028 #if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) 2048 #if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER)
2029 if (parameters[i].flags & FLAGS_SIZE_T) 2049 if (parameters[i].flags & FLAGS_SIZE_T)
2030 parameters[i].data.number.as_unsigned = (argarray == NULL) 2050 parameters[i].data.number.as_unsigned = (argarray == NULL)
2031 » » ? (trio_uintmax_t)va_arg(*arglist, size_t) 2051 » » ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), size_t)
2032 : (trio_uintmax_t)(*((size_t *)argarray[num])); 2052 : (trio_uintmax_t)(*((size_t *)argarray[num]));
2033 else 2053 else
2034 #endif 2054 #endif
2035 #if defined(QUALIFIER_PTRDIFF_T) 2055 #if defined(QUALIFIER_PTRDIFF_T)
2036 if (parameters[i].flags & FLAGS_PTRDIFF_T) 2056 if (parameters[i].flags & FLAGS_PTRDIFF_T)
2037 parameters[i].data.number.as_unsigned = (argarray == NULL) 2057 parameters[i].data.number.as_unsigned = (argarray == NULL)
2038 » » ? (trio_uintmax_t)va_arg(*arglist, ptrdiff_t) 2058 » » ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), ptrdiff_ t)
2039 : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num])); 2059 : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num]));
2040 else 2060 else
2041 #endif 2061 #endif
2042 #if defined(QUALIFIER_INTMAX_T) 2062 #if defined(QUALIFIER_INTMAX_T)
2043 if (parameters[i].flags & FLAGS_INTMAX_T) 2063 if (parameters[i].flags & FLAGS_INTMAX_T)
2044 parameters[i].data.number.as_unsigned = (argarray == NULL) 2064 parameters[i].data.number.as_unsigned = (argarray == NULL)
2045 » » ? (trio_uintmax_t)va_arg(*arglist, trio_intmax_t) 2065 » » ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_int max_t)
2046 : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num])); 2066 : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num]));
2047 else 2067 else
2048 #endif 2068 #endif
2049 if (parameters[i].flags & FLAGS_QUAD) 2069 if (parameters[i].flags & FLAGS_QUAD)
2050 parameters[i].data.number.as_unsigned = (argarray == NULL) 2070 parameters[i].data.number.as_unsigned = (argarray == NULL)
2051 » » ? (trio_uintmax_t)va_arg(*arglist, trio_ulonglong_t) 2071 » » ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_ulo nglong_t)
2052 : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num])); 2072 : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num]));
2053 else if (parameters[i].flags & FLAGS_LONG) 2073 else if (parameters[i].flags & FLAGS_LONG)
2054 parameters[i].data.number.as_unsigned = (argarray == NULL) 2074 parameters[i].data.number.as_unsigned = (argarray == NULL)
2055 » » ? (trio_uintmax_t)va_arg(*arglist, long) 2075 » » ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), long)
2056 : (trio_uintmax_t)(*((long *)argarray[num])); 2076 : (trio_uintmax_t)(*((long *)argarray[num]));
2057 else 2077 else
2058 { 2078 {
2059 if (argarray == NULL) 2079 if (argarray == NULL)
2060 » » parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_a rg(*arglist, int); 2080 » » parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_a rg(TRIO_VA_LIST_DEREF(arglist), int);
2061 else 2081 else
2062 { 2082 {
2063 if (parameters[i].type == FORMAT_CHAR) 2083 if (parameters[i].type == FORMAT_CHAR)
2064 parameters[i].data.number.as_unsigned = (trio_uintmax_t) (*((char *)argarray[num])); 2084 parameters[i].data.number.as_unsigned = (trio_uintmax_t) (*((char *)argarray[num]));
2065 else if (parameters[i].flags & FLAGS_SHORT) 2085 else if (parameters[i].flags & FLAGS_SHORT)
2066 parameters[i].data.number.as_unsigned = (trio_uintmax_t) (*((short *)argarray[num])); 2086 parameters[i].data.number.as_unsigned = (trio_uintmax_t) (*((short *)argarray[num]));
2067 else 2087 else
2068 parameters[i].data.number.as_unsigned = (trio_uintmax_t) (*((int *)argarray[num])); 2088 parameters[i].data.number.as_unsigned = (trio_uintmax_t) (*((int *)argarray[num]));
2069 } 2089 }
2070 } 2090 }
2071 } 2091 }
2072 break; 2092 break;
2073 2093
2074 case FORMAT_PARAMETER: 2094 case FORMAT_PARAMETER:
2075 /* 2095 /*
2076 * The parameter for the user-defined specifier is a pointer, 2096 * The parameter for the user-defined specifier is a pointer,
2077 * whereas the rest (width, precision, base) uses an integer. 2097 * whereas the rest (width, precision, base) uses an integer.
2078 */ 2098 */
2079 if (parameters[i].flags & FLAGS_USER_DEFINED) 2099 if (parameters[i].flags & FLAGS_USER_DEFINED)
2080 parameters[i].data.pointer = (argarray == NULL) 2100 parameters[i].data.pointer = (argarray == NULL)
2081 » ? va_arg(*arglist, trio_pointer_t ) 2101 » ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t )
2082 : argarray[num]; 2102 : argarray[num];
2083 else 2103 else
2084 parameters[i].data.number.as_unsigned = (argarray == NULL) 2104 parameters[i].data.number.as_unsigned = (argarray == NULL)
2085 » ? (trio_uintmax_t)va_arg(*arglist, int) 2105 » ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), int)
2086 : (trio_uintmax_t)(*((int *)argarray[num])); 2106 : (trio_uintmax_t)(*((int *)argarray[num]));
2087 break; 2107 break;
2088 2108
2089 case FORMAT_DOUBLE: 2109 case FORMAT_DOUBLE:
2090 if (TYPE_SCAN == type) 2110 if (TYPE_SCAN == type)
2091 { 2111 {
2092 if (parameters[i].flags & FLAGS_LONGDOUBLE) 2112 if (parameters[i].flags & FLAGS_LONGDOUBLE)
2093 parameters[i].data.longdoublePointer = (argarray == NULL) 2113 parameters[i].data.longdoublePointer = (argarray == NULL)
2094 » » ? va_arg(*arglist, trio_long_double_t *) 2114 » » ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_long_double_t *)
2095 : (trio_long_double_t *)argarray[num]; 2115 : (trio_long_double_t *)argarray[num];
2096 else 2116 else
2097 { 2117 {
2098 if (parameters[i].flags & FLAGS_LONG) 2118 if (parameters[i].flags & FLAGS_LONG)
2099 parameters[i].data.doublePointer = (argarray == NULL) 2119 parameters[i].data.doublePointer = (argarray == NULL)
2100 » » ? va_arg(*arglist, double *) 2120 » » ? va_arg(TRIO_VA_LIST_DEREF(arglist), double *)
2101 : (double *)argarray[num]; 2121 : (double *)argarray[num];
2102 else 2122 else
2103 parameters[i].data.doublePointer = (argarray == NULL) 2123 parameters[i].data.doublePointer = (argarray == NULL)
2104 » » ? (double *)va_arg(*arglist, float *) 2124 » » ? (double *)va_arg(TRIO_VA_LIST_DEREF(arglist), float *)
2105 : (double *)((float *)argarray[num]); 2125 : (double *)((float *)argarray[num]);
2106 } 2126 }
2107 } 2127 }
2108 else 2128 else
2109 { 2129 {
2110 if (parameters[i].flags & FLAGS_LONGDOUBLE) 2130 if (parameters[i].flags & FLAGS_LONGDOUBLE)
2111 parameters[i].data.longdoubleNumber = (argarray == NULL) 2131 parameters[i].data.longdoubleNumber = (argarray == NULL)
2112 » » ? va_arg(*arglist, trio_long_double_t) 2132 » » ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_long_double_t)
2113 : (trio_long_double_t)(*((trio_long_double_t *)argarray[num])) ; 2133 : (trio_long_double_t)(*((trio_long_double_t *)argarray[num])) ;
2114 else 2134 else
2115 { 2135 {
2116 if (argarray == NULL) 2136 if (argarray == NULL)
2117 parameters[i].data.longdoubleNumber = 2137 parameters[i].data.longdoubleNumber =
2118 » » (trio_long_double_t)va_arg(*arglist, double); 2138 » » (trio_long_double_t)va_arg(TRIO_VA_LIST_DEREF(arglist), do uble);
2119 else 2139 else
2120 { 2140 {
2121 if (parameters[i].flags & FLAGS_SHORT) 2141 if (parameters[i].flags & FLAGS_SHORT)
2122 parameters[i].data.longdoubleNumber = 2142 parameters[i].data.longdoubleNumber =
2123 (trio_long_double_t)(*((float *)argarray[num])); 2143 (trio_long_double_t)(*((float *)argarray[num]));
2124 else 2144 else
2125 parameters[i].data.longdoubleNumber = 2145 parameters[i].data.longdoubleNumber =
2126 (trio_long_double_t)(*((double *)argarray[num])); 2146 (trio_long_double_t)(*((double *)argarray[num]));
2127 } 2147 }
2128 } 2148 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2206 if (isNegative) 2226 if (isNegative)
2207 number = -((trio_intmax_t)number); 2227 number = -((trio_intmax_t)number);
2208 } 2228 }
2209 2229
2210 if (flags & FLAGS_QUAD) 2230 if (flags & FLAGS_QUAD)
2211 number &= (trio_ulonglong_t)-1; 2231 number &= (trio_ulonglong_t)-1;
2212 else if (flags & FLAGS_LONG) 2232 else if (flags & FLAGS_LONG)
2213 number &= (unsigned long)-1; 2233 number &= (unsigned long)-1;
2214 else 2234 else
2215 number &= (unsigned int)-1; 2235 number &= (unsigned int)-1;
2216 2236
2217 /* Build number */ 2237 /* Build number */
2218 pointer = bufferend = &buffer[sizeof(buffer) - 1]; 2238 pointer = bufferend = &buffer[sizeof(buffer) - 1];
2219 *pointer-- = NIL; 2239 *pointer-- = NIL;
2220 for (i = 1; i < (int)sizeof(buffer); i++) 2240 for (i = 1; i < (int)sizeof(buffer); i++)
2221 { 2241 {
2222 *pointer-- = digits[number % base]; 2242 *pointer-- = digits[number % base];
2223 number /= base; 2243 number /= base;
2224 if (number == 0) 2244 if (number == 0)
2225 break; 2245 break;
2226 2246
(...skipping 26 matching lines...) Expand all
2253 precision -= (bufferend - pointer) - 1; 2273 precision -= (bufferend - pointer) - 1;
2254 if (precision < 0) 2274 if (precision < 0)
2255 precision = 0; 2275 precision = 0;
2256 flags |= FLAGS_NILPADDING; 2276 flags |= FLAGS_NILPADDING;
2257 } 2277 }
2258 2278
2259 /* Calculate padding */ 2279 /* Calculate padding */
2260 count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION))) 2280 count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION)))
2261 ? precision 2281 ? precision
2262 : 0; 2282 : 0;
2263 2283
2264 /* Adjust width further */ 2284 /* Adjust width further */
2265 if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) 2285 if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
2266 width--; 2286 width--;
2267 if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero) 2287 if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero)
2268 { 2288 {
2269 switch (base) 2289 switch (base)
2270 { 2290 {
2271 case BASE_BINARY: 2291 case BASE_BINARY:
2272 case BASE_HEX: 2292 case BASE_HEX:
2273 width -= 2; 2293 width -= 2;
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
2488 int width) 2508 int width)
2489 { 2509 {
2490 int size; 2510 int size;
2491 int i; 2511 int i;
2492 int ch; 2512 int ch;
2493 char *string; 2513 char *string;
2494 char buffer[MB_LEN_MAX + 1]; 2514 char buffer[MB_LEN_MAX + 1];
2495 2515
2496 if (width == NO_WIDTH) 2516 if (width == NO_WIDTH)
2497 width = sizeof(buffer); 2517 width = sizeof(buffer);
2498 2518
2499 size = wctomb(buffer, wch); 2519 size = wctomb(buffer, wch);
2500 if ((size <= 0) || (size > width) || (buffer[0] == NIL)) 2520 if ((size <= 0) || (size > width) || (buffer[0] == NIL))
2501 return 0; 2521 return 0;
2502 2522
2503 string = buffer; 2523 string = buffer;
2504 i = size; 2524 i = size;
2505 while ((width >= i) && (width-- > 0) && (i-- > 0)) 2525 while ((width >= i) && (width-- > 0) && (i-- > 0))
2506 { 2526 {
2507 /* The ctype parameters must be an unsigned char (or EOF) */ 2527 /* The ctype parameters must be an unsigned char (or EOF) */
2508 ch = (int)((unsigned char)(*string++)); 2528 ch = (int)((unsigned char)(*string++));
(...skipping 21 matching lines...) Expand all
2530 { 2550 {
2531 int length; 2551 int length;
2532 int size; 2552 int size;
2533 2553
2534 assert(VALID(self)); 2554 assert(VALID(self));
2535 assert(VALID(self->OutStream)); 2555 assert(VALID(self->OutStream));
2536 2556
2537 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) 2557 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
2538 (void)mblen(NULL, 0); 2558 (void)mblen(NULL, 0);
2539 #endif 2559 #endif
2540 2560
2541 if (wstring == NULL) 2561 if (wstring == NULL)
2542 { 2562 {
2543 TrioWriteString(self, NULL, flags, width, precision); 2563 TrioWriteString(self, NULL, flags, width, precision);
2544 return; 2564 return;
2545 } 2565 }
2546 2566
2547 if (NO_PRECISION == precision) 2567 if (NO_PRECISION == precision)
2548 { 2568 {
2549 length = INT_MAX; 2569 length = INT_MAX;
2550 } 2570 }
2551 else 2571 else
2552 { 2572 {
2553 length = precision; 2573 length = precision;
2554 width -= length; 2574 width -= length;
2555 } 2575 }
2556 2576
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2631 TRIO_CONST char *digits; 2651 TRIO_CONST char *digits;
2632 char *groupingPointer; 2652 char *groupingPointer;
2633 int i; 2653 int i;
2634 int index; 2654 int index;
2635 BOOLEAN_T hasOnlyZeroes; 2655 BOOLEAN_T hasOnlyZeroes;
2636 int zeroes = 0; 2656 int zeroes = 0;
2637 register int trailingZeroes; 2657 register int trailingZeroes;
2638 BOOLEAN_T keepTrailingZeroes; 2658 BOOLEAN_T keepTrailingZeroes;
2639 BOOLEAN_T keepDecimalPoint; 2659 BOOLEAN_T keepDecimalPoint;
2640 trio_long_double_t epsilon; 2660 trio_long_double_t epsilon;
2641 2661
2642 assert(VALID(self)); 2662 assert(VALID(self));
2643 assert(VALID(self->OutStream)); 2663 assert(VALID(self->OutStream));
2644 assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE)); 2664 assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE));
2645 2665
2646 /* Determine sign and look for special quantities */ 2666 /* Determine sign and look for special quantities */
2647 switch (trio_fpclassify_and_signbit(number, &isNegative)) 2667 switch (trio_fpclassify_and_signbit(number, &isNegative))
2648 { 2668 {
2649 case TRIO_FP_NAN: 2669 case TRIO_FP_NAN:
2650 TrioWriteString(self, 2670 TrioWriteString(self,
2651 (flags & FLAGS_UPPER) 2671 (flags & FLAGS_UPPER)
2652 ? NAN_UPPER 2672 ? NAN_UPPER
2653 : NAN_LOWER, 2673 : NAN_LOWER,
2654 flags, width, precision); 2674 flags, width, precision);
2655 return; 2675 return;
2656 2676
2657 case TRIO_FP_INFINITE: 2677 case TRIO_FP_INFINITE:
2658 if (isNegative) 2678 if (isNegative)
2659 { 2679 {
2660 /* Negative infinity */ 2680 /* Negative infinity */
2661 TrioWriteString(self, 2681 TrioWriteString(self,
2662 (flags & FLAGS_UPPER) 2682 (flags & FLAGS_UPPER)
2663 ? "-" INFINITE_UPPER 2683 ? "-" INFINITE_UPPER
2664 : "-" INFINITE_LOWER, 2684 : "-" INFINITE_LOWER,
2665 flags, width, precision); 2685 flags, width, precision);
2666 return; 2686 return;
2667 } 2687 }
2668 else 2688 else
2669 { 2689 {
2670 /* Positive infinity */ 2690 /* Positive infinity */
2671 TrioWriteString(self, 2691 TrioWriteString(self,
2672 (flags & FLAGS_UPPER) 2692 (flags & FLAGS_UPPER)
2673 ? INFINITE_UPPER 2693 ? INFINITE_UPPER
2674 : INFINITE_LOWER, 2694 : INFINITE_LOWER,
2675 flags, width, precision); 2695 flags, width, precision);
2676 return; 2696 return;
2677 } 2697 }
2678 2698
2679 default: 2699 default:
2680 /* Finitude */ 2700 /* Finitude */
2681 break; 2701 break;
2682 } 2702 }
2683 2703
2684 /* Normal numbers */ 2704 /* Normal numbers */
2685 if (flags & FLAGS_LONGDOUBLE) 2705 if (flags & FLAGS_LONGDOUBLE)
2686 { 2706 {
2687 baseDigits = (base == 10) 2707 baseDigits = (base == 10)
2688 ? LDBL_DIG 2708 ? LDBL_DIG
2689 : (int)floor(LDBL_MANT_DIG / TrioLogarithmBase(base)); 2709 : (int)floor(LDBL_MANT_DIG / TrioLogarithmBase(base));
2690 epsilon = LDBL_EPSILON; 2710 epsilon = LDBL_EPSILON;
2691 } 2711 }
2692 else if (flags & FLAGS_SHORT) 2712 else if (flags & FLAGS_SHORT)
2693 { 2713 {
(...skipping 27 matching lines...) Expand all
2721 if (isHex) 2741 if (isHex)
2722 { 2742 {
2723 keepTrailingZeroes = FALSE; 2743 keepTrailingZeroes = FALSE;
2724 precision = FLT_MANT_DIG; 2744 precision = FLT_MANT_DIG;
2725 } 2745 }
2726 else 2746 else
2727 { 2747 {
2728 precision = FLT_DIG; 2748 precision = FLT_DIG;
2729 } 2749 }
2730 } 2750 }
2731 2751
2732 if (isNegative) 2752 if (isNegative)
2733 number = -number; 2753 number = -number;
2734 2754
2735 if (isHex) 2755 if (isHex)
2736 flags |= FLAGS_FLOAT_E; 2756 flags |= FLAGS_FLOAT_E;
2737 2757
2738 if (flags & FLAGS_FLOAT_G) 2758 if (flags & FLAGS_FLOAT_G)
2739 { 2759 {
2740 if (precision == 0) 2760 if (precision == 0)
2741 precision = 1; 2761 precision = 1;
2742 2762
2743 if ((number < 1.0E-4) || (number > powl(base, 2763 if ((number < 1.0E-4) || (number > powl(base,
2744 (trio_long_double_t)precision))) 2764 (trio_long_double_t)precision)))
2745 { 2765 {
2746 /* Use scientific notation */ 2766 /* Use scientific notation */
2747 flags |= FLAGS_FLOAT_E; 2767 flags |= FLAGS_FLOAT_E;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2780 uExponent = (isExponentNegative) ? -exponent : exponent; 2800 uExponent = (isExponentNegative) ? -exponent : exponent;
2781 if (isHex) 2801 if (isHex)
2782 uExponent *= 4; /* log16(2) */ 2802 uExponent *= 4; /* log16(2) */
2783 /* No thousand separators */ 2803 /* No thousand separators */
2784 flags &= ~FLAGS_QUOTE; 2804 flags &= ~FLAGS_QUOTE;
2785 } 2805 }
2786 } 2806 }
2787 2807
2788 integerNumber = floorl(number); 2808 integerNumber = floorl(number);
2789 fractionNumber = number - integerNumber; 2809 fractionNumber = number - integerNumber;
2790 2810
2791 /* 2811 /*
2792 * Truncated number. 2812 * Truncated number.
2793 * 2813 *
2794 * Precision is number of significant digits for FLOAT_G 2814 * Precision is number of significant digits for FLOAT_G
2795 * and number of fractional digits for others. 2815 * and number of fractional digits for others.
2796 */ 2816 */
2797 integerDigits = (integerNumber > epsilon) 2817 integerDigits = (integerNumber > epsilon)
2798 ? 1 + (int)TrioLogarithm(integerNumber, base) 2818 ? 1 + (int)TrioLogarithm(integerNumber, base)
2799 : 1; 2819 : 1;
2800 fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0)) 2820 fractionDigits = ((flags & FLAGS_FLOAT_G) && (zeroes == 0))
2801 ? precision - integerDigits 2821 ? precision - integerDigits
2802 : zeroes + precision; 2822 : zeroes + precision;
2803 2823
2804 dblFractionBase = TrioPower(base, fractionDigits); 2824 dblFractionBase = TrioPower(base, fractionDigits);
2805 2825
2806 workNumber = number + 0.5 / dblFractionBase; 2826 workNumber = number + 0.5 / dblFractionBase;
2807 if (floorl(number) != floorl(workNumber)) 2827 if (floorl(number) != floorl(workNumber))
2808 { 2828 {
2809 if (flags & FLAGS_FLOAT_E) 2829 if (flags & FLAGS_FLOAT_E)
2810 { 2830 {
2811 /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */ 2831 /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */
2812 exponent++; 2832 exponent++;
2813 isExponentNegative = (exponent < 0); 2833 isExponentNegative = (exponent < 0);
2814 uExponent = (isExponentNegative) ? -exponent : exponent; 2834 uExponent = (isExponentNegative) ? -exponent : exponent;
2815 if (isHex) 2835 if (isHex)
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2848 integerThreshold = integerDigits; 2868 integerThreshold = integerDigits;
2849 fractionThreshold = fractionDigits - integerThreshold; 2869 fractionThreshold = fractionDigits - integerThreshold;
2850 fractionAdjust = 1.0; 2870 fractionAdjust = 1.0;
2851 } 2871 }
2852 } 2872 }
2853 else 2873 else
2854 { 2874 {
2855 integerThreshold = INT_MAX; 2875 integerThreshold = INT_MAX;
2856 fractionThreshold = INT_MAX; 2876 fractionThreshold = INT_MAX;
2857 } 2877 }
2858 2878
2859 /* 2879 /*
2860 * Calculate expected width. 2880 * Calculate expected width.
2861 * sign + integer part + thousands separators + decimal point 2881 * sign + integer part + thousands separators + decimal point
2862 * + fraction + exponent 2882 * + fraction + exponent
2863 */ 2883 */
2864 fractionAdjust /= dblFractionBase; 2884 fractionAdjust /= dblFractionBase;
2865 hasOnlyZeroes = (floorl((fractionNumber + fractionAdjust) * dblFractionBase) < epsilon); 2885 hasOnlyZeroes = (floorl((fractionNumber + fractionAdjust) * dblFractionBase) < epsilon);
2866 keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) || 2886 keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) ||
2867 !((precision == 0) || 2887 !((precision == 0) ||
2868 (!keepTrailingZeroes && hasOnlyZeroes)) ); 2888 (!keepTrailingZeroes && hasOnlyZeroes)) );
(...skipping 15 matching lines...) Expand all
2884 + ((flags & FLAGS_QUOTE) 2904 + ((flags & FLAGS_QUOTE)
2885 ? TrioCalcThousandSeparatorLength(integerDigits) 2905 ? TrioCalcThousandSeparatorLength(integerDigits)
2886 : 0); 2906 : 0);
2887 if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) 2907 if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE))
2888 expectedWidth += sizeof("-") - 1; 2908 expectedWidth += sizeof("-") - 1;
2889 if (exponentDigits > 0) 2909 if (exponentDigits > 0)
2890 expectedWidth += exponentDigits + 2910 expectedWidth += exponentDigits +
2891 ((requireTwoDigitExponent ? sizeof("E+0") : sizeof("E+")) - 1); 2911 ((requireTwoDigitExponent ? sizeof("E+0") : sizeof("E+")) - 1);
2892 if (isHex) 2912 if (isHex)
2893 expectedWidth += sizeof("0X") - 1; 2913 expectedWidth += sizeof("0X") - 1;
2894 2914
2895 /* Output prefixing */ 2915 /* Output prefixing */
2896 if (flags & FLAGS_NILPADDING) 2916 if (flags & FLAGS_NILPADDING)
2897 { 2917 {
2898 /* Leading zeros must be after sign */ 2918 /* Leading zeros must be after sign */
2899 if (isNegative) 2919 if (isNegative)
2900 self->OutStream(self, '-'); 2920 self->OutStream(self, '-');
2901 else if (flags & FLAGS_SHOWSIGN) 2921 else if (flags & FLAGS_SHOWSIGN)
2902 self->OutStream(self, '+'); 2922 self->OutStream(self, '+');
2903 else if (flags & FLAGS_SPACE) 2923 else if (flags & FLAGS_SPACE)
2904 self->OutStream(self, ' '); 2924 self->OutStream(self, ' ');
(...skipping 25 matching lines...) Expand all
2930 else if (flags & FLAGS_SHOWSIGN) 2950 else if (flags & FLAGS_SHOWSIGN)
2931 self->OutStream(self, '+'); 2951 self->OutStream(self, '+');
2932 else if (flags & FLAGS_SPACE) 2952 else if (flags & FLAGS_SPACE)
2933 self->OutStream(self, ' '); 2953 self->OutStream(self, ' ');
2934 if (isHex) 2954 if (isHex)
2935 { 2955 {
2936 self->OutStream(self, '0'); 2956 self->OutStream(self, '0');
2937 self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); 2957 self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x');
2938 } 2958 }
2939 } 2959 }
2940 2960
2941 /* Output the integer part and thousand separators */ 2961 /* Output the integer part and thousand separators */
2942 dblIntegerBase = 1.0 / TrioPower(base, integerDigits - 1); 2962 dblIntegerBase = 1.0 / TrioPower(base, integerDigits - 1);
2943 for (i = 0; i < integerDigits; i++) 2963 for (i = 0; i < integerDigits; i++)
2944 { 2964 {
2945 workNumber = floorl(((integerNumber + integerAdjust) * dblIntegerBase)); 2965 workNumber = floorl(((integerNumber + integerAdjust) * dblIntegerBase));
2946 if (i > integerThreshold) 2966 if (i > integerThreshold)
2947 { 2967 {
2948 /* Beyond accuracy */ 2968 /* Beyond accuracy */
2949 self->OutStream(self, digits[0]); 2969 self->OutStream(self, digits[0]);
2950 } 2970 }
2951 else 2971 else
2952 { 2972 {
2953 self->OutStream(self, digits[(int)fmodl(workNumber, dblBase)]); 2973 self->OutStream(self, digits[(int)fmodl(workNumber, dblBase)]);
2954 } 2974 }
2955 dblIntegerBase *= dblBase; 2975 dblIntegerBase *= dblBase;
2956 2976
2957 if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE) 2977 if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE)
2958 && TrioFollowedBySeparator(integerDigits - i)) 2978 && TrioFollowedBySeparator(integerDigits - i))
2959 { 2979 {
2960 for (groupingPointer = internalThousandSeparator; 2980 for (groupingPointer = internalThousandSeparator;
2961 *groupingPointer != NIL; 2981 *groupingPointer != NIL;
2962 groupingPointer++) 2982 groupingPointer++)
2963 { 2983 {
2964 self->OutStream(self, *groupingPointer); 2984 self->OutStream(self, *groupingPointer);
2965 } 2985 }
2966 } 2986 }
2967 } 2987 }
2968 2988
2969 /* Insert decimal point and build the fraction part */ 2989 /* Insert decimal point and build the fraction part */
2970 trailingZeroes = 0; 2990 trailingZeroes = 0;
2971 2991
2972 if (keepDecimalPoint) 2992 if (keepDecimalPoint)
2973 { 2993 {
2974 if (internalDecimalPoint) 2994 if (internalDecimalPoint)
2975 { 2995 {
2976 self->OutStream(self, internalDecimalPoint); 2996 self->OutStream(self, internalDecimalPoint);
2977 } 2997 }
2978 else 2998 else
(...skipping 28 matching lines...) Expand all
3007 while (trailingZeroes > 0) 3027 while (trailingZeroes > 0)
3008 { 3028 {
3009 /* Not trailing zeroes after all */ 3029 /* Not trailing zeroes after all */
3010 self->OutStream(self, digits[0]); 3030 self->OutStream(self, digits[0]);
3011 trailingZeroes--; 3031 trailingZeroes--;
3012 } 3032 }
3013 self->OutStream(self, digits[index]); 3033 self->OutStream(self, digits[index]);
3014 } 3034 }
3015 } 3035 }
3016 } 3036 }
3017 3037
3018 if (keepTrailingZeroes) 3038 if (keepTrailingZeroes)
3019 { 3039 {
3020 while (trailingZeroes > 0) 3040 while (trailingZeroes > 0)
3021 { 3041 {
3022 self->OutStream(self, digits[0]); 3042 self->OutStream(self, digits[0]);
3023 trailingZeroes--; 3043 trailingZeroes--;
3024 } 3044 }
3025 } 3045 }
3026 3046
3027 /* Output exponent */ 3047 /* Output exponent */
3028 if (exponentDigits > 0) 3048 if (exponentDigits > 0)
3029 { 3049 {
3030 self->OutStream(self, 3050 self->OutStream(self,
3031 isHex 3051 isHex
3032 ? ((flags & FLAGS_UPPER) ? 'P' : 'p') 3052 ? ((flags & FLAGS_UPPER) ? 'P' : 'p')
3033 : ((flags & FLAGS_UPPER) ? 'E' : 'e')); 3053 : ((flags & FLAGS_UPPER) ? 'E' : 'e'));
3034 self->OutStream(self, (isExponentNegative) ? '-' : '+'); 3054 self->OutStream(self, (isExponentNegative) ? '-' : '+');
3035 3055
3036 /* The exponent must contain at least two digits */ 3056 /* The exponent must contain at least two digits */
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3073 int charlen; 3093 int charlen;
3074 #endif 3094 #endif
3075 int i; 3095 int i;
3076 TRIO_CONST char *string; 3096 TRIO_CONST char *string;
3077 trio_pointer_t pointer; 3097 trio_pointer_t pointer;
3078 trio_flags_t flags; 3098 trio_flags_t flags;
3079 int width; 3099 int width;
3080 int precision; 3100 int precision;
3081 int base; 3101 int base;
3082 int index; 3102 int index;
3083 3103
3084 index = 0; 3104 index = 0;
3085 i = 0; 3105 i = 0;
3086 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) 3106 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
3087 (void)mblen(NULL, 0); 3107 (void)mblen(NULL, 0);
3088 #endif 3108 #endif
3089 3109
3090 while (format[index]) 3110 while (format[index])
3091 { 3111 {
3092 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) 3112 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
3093 if (! isascii(format[index])) 3113 if (! isascii(format[index]))
3094 { 3114 {
3095 charlen = mblen(&format[index], MB_LEN_MAX); 3115 charlen = mblen(&format[index], MB_LEN_MAX);
3096 /* 3116 /*
3097 * Only valid multibyte characters are handled here. Invalid 3117 * Only valid multibyte characters are handled here. Invalid
3098 * multibyte characters (charlen == -1) are handled as normal 3118 * multibyte characters (charlen == -1) are handled as normal
3099 * characters. 3119 * characters.
(...skipping 13 matching lines...) Expand all
3113 if (CHAR_IDENTIFIER == format[index + 1]) 3133 if (CHAR_IDENTIFIER == format[index + 1])
3114 { 3134 {
3115 data->OutStream(data, CHAR_IDENTIFIER); 3135 data->OutStream(data, CHAR_IDENTIFIER);
3116 index += 2; 3136 index += 2;
3117 } 3137 }
3118 else 3138 else
3119 { 3139 {
3120 /* Skip the parameter entries */ 3140 /* Skip the parameter entries */
3121 while (parameters[i].type == FORMAT_PARAMETER) 3141 while (parameters[i].type == FORMAT_PARAMETER)
3122 i++; 3142 i++;
3123 » 3143
3124 flags = parameters[i].flags; 3144 flags = parameters[i].flags;
3125 3145
3126 /* Find width */ 3146 /* Find width */
3127 width = parameters[i].width; 3147 width = parameters[i].width;
3128 if (flags & FLAGS_WIDTH_PARAMETER) 3148 if (flags & FLAGS_WIDTH_PARAMETER)
3129 { 3149 {
3130 /* Get width from parameter list */ 3150 /* Get width from parameter list */
3131 width = (int)parameters[width].data.number.as_signed; 3151 width = (int)parameters[width].data.number.as_signed;
3132 if (width < 0) 3152 if (width < 0)
3133 { 3153 {
3134 /* 3154 /*
3135 * A negative width is the same as the - flag and 3155 * A negative width is the same as the - flag and
3136 * a positive width. 3156 * a positive width.
3137 */ 3157 */
3138 flags |= FLAGS_LEFTADJUST; 3158 flags |= FLAGS_LEFTADJUST;
3139 flags &= ~FLAGS_NILPADDING; 3159 flags &= ~FLAGS_NILPADDING;
3140 width = -width; 3160 width = -width;
3141 } 3161 }
3142 } 3162 }
3143 » 3163
3144 /* Find precision */ 3164 /* Find precision */
3145 if (flags & FLAGS_PRECISION) 3165 if (flags & FLAGS_PRECISION)
3146 { 3166 {
3147 precision = parameters[i].precision; 3167 precision = parameters[i].precision;
3148 if (flags & FLAGS_PRECISION_PARAMETER) 3168 if (flags & FLAGS_PRECISION_PARAMETER)
3149 { 3169 {
3150 /* Get precision from parameter list */ 3170 /* Get precision from parameter list */
3151 precision = (int)parameters[precision].data.number.as_sign ed; 3171 precision = (int)parameters[precision].data.number.as_sign ed;
3152 if (precision < 0) 3172 if (precision < 0)
3153 { 3173 {
(...skipping 10 matching lines...) Expand all
3164 precision = NO_PRECISION; 3184 precision = NO_PRECISION;
3165 } 3185 }
3166 3186
3167 /* Find base */ 3187 /* Find base */
3168 base = parameters[i].base; 3188 base = parameters[i].base;
3169 if (flags & FLAGS_BASE_PARAMETER) 3189 if (flags & FLAGS_BASE_PARAMETER)
3170 { 3190 {
3171 /* Get base from parameter list */ 3191 /* Get base from parameter list */
3172 base = (int)parameters[base].data.number.as_signed; 3192 base = (int)parameters[base].data.number.as_signed;
3173 } 3193 }
3174 » 3194
3175 switch (parameters[i].type) 3195 switch (parameters[i].type)
3176 { 3196 {
3177 case FORMAT_CHAR: 3197 case FORMAT_CHAR:
3178 if (flags & FLAGS_QUOTE) 3198 if (flags & FLAGS_QUOTE)
3179 data->OutStream(data, CHAR_QUOTE); 3199 data->OutStream(data, CHAR_QUOTE);
3180 if (! (flags & FLAGS_LEFTADJUST)) 3200 if (! (flags & FLAGS_LEFTADJUST))
3181 { 3201 {
3182 while (--width > 0) 3202 while (--width > 0)
3183 data->OutStream(data, CHAR_ADJUST); 3203 data->OutStream(data, CHAR_ADJUST);
3184 } 3204 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3244 parameters[i].data.string, 3264 parameters[i].data.string,
3245 flags, 3265 flags,
3246 width, 3266 width,
3247 precision); 3267 precision);
3248 } 3268 }
3249 break; /* FORMAT_STRING */ 3269 break; /* FORMAT_STRING */
3250 3270
3251 case FORMAT_POINTER: 3271 case FORMAT_POINTER:
3252 { 3272 {
3253 trio_reference_t reference; 3273 trio_reference_t reference;
3254 » » 3274
3255 reference.data = data; 3275 reference.data = data;
3256 reference.parameter = &parameters[i]; 3276 reference.parameter = &parameters[i];
3257 trio_print_pointer(&reference, parameters[i].data.pointer); 3277 trio_print_pointer(&reference, parameters[i].data.pointer);
3258 } 3278 }
3259 break; /* FORMAT_POINTER */ 3279 break; /* FORMAT_POINTER */
3260 3280
3261 case FORMAT_COUNT: 3281 case FORMAT_COUNT:
3262 pointer = parameters[i].data.pointer; 3282 pointer = parameters[i].data.pointer;
3263 if (NULL != pointer) 3283 if (NULL != pointer)
3264 { 3284 {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
3347 def = TrioFindNamespace(parameters[i].user_name, NULL); 3367 def = TrioFindNamespace(parameters[i].user_name, NULL);
3348 } 3368 }
3349 if (def) { 3369 if (def) {
3350 reference.data = data; 3370 reference.data = data;
3351 reference.parameter = &parameters[i]; 3371 reference.parameter = &parameters[i];
3352 def->callback(&reference); 3372 def->callback(&reference);
3353 } 3373 }
3354 } 3374 }
3355 break; 3375 break;
3356 #endif /* defined(FORMAT_USER_DEFINED) */ 3376 #endif /* defined(FORMAT_USER_DEFINED) */
3357 » » 3377
3358 default: 3378 default:
3359 break; 3379 break;
3360 } /* switch parameter type */ 3380 } /* switch parameter type */
3361 3381
3362 /* Prepare for next */ 3382 /* Prepare for next */
3363 index = parameters[i].indexAfterSpecifier; 3383 index = parameters[i].indexAfterSpecifier;
3364 i++; 3384 i++;
3365 } 3385 }
3366 } 3386 }
3367 else /* not identifier */ 3387 else /* not identifier */
3368 { 3388 {
3369 data->OutStream(data, format[index++]); 3389 data->OutStream(data, format[index++]);
3370 } 3390 }
3371 } 3391 }
3372 return data->processed; 3392 return data->processed;
3373 } 3393 }
3374 3394
3375 /************************************************************************* 3395 /*************************************************************************
3376 * TrioFormatRef 3396 * TrioFormatRef
3377 */ 3397 */
3378 TRIO_PRIVATE int 3398 TRIO_PRIVATE int
3379 TrioFormatRef 3399 TrioFormatRef
3380 TRIO_ARGS4((reference, format, arglist, argarray), 3400 TRIO_ARGS4((reference, format, arglist, argarray),
3381 trio_reference_t *reference, 3401 trio_reference_t *reference,
3382 TRIO_CONST char *format, 3402 TRIO_CONST char *format,
3383 » va_list *arglist, 3403 » TRIO_VA_LIST_PTR arglist,
3384 trio_pointer_t *argarray) 3404 trio_pointer_t *argarray)
3385 { 3405 {
3386 int status; 3406 int status;
3387 trio_parameter_t parameters[MAX_PARAMETERS]; 3407 trio_parameter_t parameters[MAX_PARAMETERS];
3388 3408
3389 status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray); 3409 status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray);
3390 if (status < 0) 3410 if (status < 0)
3391 return status; 3411 return status;
3392 3412
3393 status = TrioFormatProcess(reference->data, format, parameters); 3413 status = TrioFormatProcess(reference->data, format, parameters);
3394 if (reference->data->error != 0) 3414 if (reference->data->error != 0)
3395 { 3415 {
3396 status = reference->data->error; 3416 status = reference->data->error;
3397 } 3417 }
3398 return status; 3418 return status;
3399 } 3419 }
3400 3420
3401 /************************************************************************* 3421 /*************************************************************************
3402 * TrioFormat 3422 * TrioFormat
3403 */ 3423 */
3404 TRIO_PRIVATE int 3424 TRIO_PRIVATE int
3405 TrioFormat 3425 TrioFormat
3406 TRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray), 3426 TRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray),
3407 trio_pointer_t destination, 3427 trio_pointer_t destination,
3408 size_t destinationSize, 3428 size_t destinationSize,
3409 void (*OutStream) TRIO_PROTO((trio_class_t *, int)), 3429 void (*OutStream) TRIO_PROTO((trio_class_t *, int)),
3410 TRIO_CONST char *format, 3430 TRIO_CONST char *format,
3411 » va_list *arglist, 3431 » TRIO_VA_LIST_PTR arglist,
3412 trio_pointer_t *argarray) 3432 trio_pointer_t *argarray)
3413 { 3433 {
3414 int status; 3434 int status;
3415 trio_class_t data; 3435 trio_class_t data;
3416 trio_parameter_t parameters[MAX_PARAMETERS]; 3436 trio_parameter_t parameters[MAX_PARAMETERS];
3417 3437
3418 assert(VALID(OutStream)); 3438 assert(VALID(OutStream));
3419 assert(VALID(format)); 3439 assert(VALID(format));
3420 3440
3421 memset(&data, 0, sizeof(data)); 3441 memset(&data, 0, sizeof(data));
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
3557 TRIO_PRIVATE void 3577 TRIO_PRIVATE void
3558 TrioOutStreamStringMax 3578 TrioOutStreamStringMax
3559 TRIO_ARGS2((self, output), 3579 TRIO_ARGS2((self, output),
3560 trio_class_t *self, 3580 trio_class_t *self,
3561 int output) 3581 int output)
3562 { 3582 {
3563 char **buffer; 3583 char **buffer;
3564 3584
3565 assert(VALID(self)); 3585 assert(VALID(self));
3566 assert(VALID(self->location)); 3586 assert(VALID(self->location));
3567 3587
3568 buffer = (char **)self->location; 3588 buffer = (char **)self->location;
3569 3589
3570 if (self->processed < self->max) 3590 if (self->processed < self->max)
3571 { 3591 {
3572 **buffer = (char)output; 3592 **buffer = (char)output;
3573 (*buffer)++; 3593 (*buffer)++;
3574 self->committed++; 3594 self->committed++;
3575 } 3595 }
3576 self->processed++; 3596 self->processed++;
3577 } 3597 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3625 TRIO_PUBLIC int 3645 TRIO_PUBLIC int
3626 trio_printf 3646 trio_printf
3627 TRIO_VARGS2((format, va_alist), 3647 TRIO_VARGS2((format, va_alist),
3628 TRIO_CONST char *format, 3648 TRIO_CONST char *format,
3629 TRIO_VA_DECL) 3649 TRIO_VA_DECL)
3630 { 3650 {
3631 int status; 3651 int status;
3632 va_list args; 3652 va_list args;
3633 3653
3634 assert(VALID(format)); 3654 assert(VALID(format));
3635 3655
3636 TRIO_VA_START(args, format); 3656 TRIO_VA_START(args, format);
3637 status = TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); 3657 status = TrioFormat(stdout, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(ar gs), NULL);
3638 TRIO_VA_END(args); 3658 TRIO_VA_END(args);
3639 return status; 3659 return status;
3640 } 3660 }
3641 3661
3642 /** 3662 /**
3643 Print to standard output stream. 3663 Print to standard output stream.
3644 3664
3645 @param format Formatting string. 3665 @param format Formatting string.
3646 @param args Arguments. 3666 @param args Arguments.
3647 @return Number of printed characters. 3667 @return Number of printed characters.
3648 */ 3668 */
3649 TRIO_PUBLIC int 3669 TRIO_PUBLIC int
3650 trio_vprintf 3670 trio_vprintf
3651 TRIO_ARGS2((format, args), 3671 TRIO_ARGS2((format, args),
3652 TRIO_CONST char *format, 3672 TRIO_CONST char *format,
3653 va_list args) 3673 va_list args)
3654 { 3674 {
3655 assert(VALID(format)); 3675 assert(VALID(format));
3656 3676
3657 return TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); 3677 return TrioFormat(stdout, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args ), NULL);
3658 } 3678 }
3659 3679
3660 /** 3680 /**
3661 Print to standard output stream. 3681 Print to standard output stream.
3662 3682
3663 @param format Formatting string. 3683 @param format Formatting string.
3664 @param args Arguments. 3684 @param args Arguments.
3665 @return Number of printed characters. 3685 @return Number of printed characters.
3666 */ 3686 */
3667 TRIO_PUBLIC int 3687 TRIO_PUBLIC int
(...skipping 24 matching lines...) Expand all
3692 TRIO_VARGS3((file, format, va_alist), 3712 TRIO_VARGS3((file, format, va_alist),
3693 FILE *file, 3713 FILE *file,
3694 TRIO_CONST char *format, 3714 TRIO_CONST char *format,
3695 TRIO_VA_DECL) 3715 TRIO_VA_DECL)
3696 { 3716 {
3697 int status; 3717 int status;
3698 va_list args; 3718 va_list args;
3699 3719
3700 assert(VALID(file)); 3720 assert(VALID(file));
3701 assert(VALID(format)); 3721 assert(VALID(format));
3702 3722
3703 TRIO_VA_START(args, format); 3723 TRIO_VA_START(args, format);
3704 status = TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); 3724 status = TrioFormat(file, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args ), NULL);
3705 TRIO_VA_END(args); 3725 TRIO_VA_END(args);
3706 return status; 3726 return status;
3707 } 3727 }
3708 3728
3709 /** 3729 /**
3710 Print to file. 3730 Print to file.
3711 3731
3712 @param file File pointer. 3732 @param file File pointer.
3713 @param format Formatting string. 3733 @param format Formatting string.
3714 @param args Arguments. 3734 @param args Arguments.
3715 @return Number of printed characters. 3735 @return Number of printed characters.
3716 */ 3736 */
3717 TRIO_PUBLIC int 3737 TRIO_PUBLIC int
3718 trio_vfprintf 3738 trio_vfprintf
3719 TRIO_ARGS3((file, format, args), 3739 TRIO_ARGS3((file, format, args),
3720 FILE *file, 3740 FILE *file,
3721 TRIO_CONST char *format, 3741 TRIO_CONST char *format,
3722 va_list args) 3742 va_list args)
3723 { 3743 {
3724 assert(VALID(file)); 3744 assert(VALID(file));
3725 assert(VALID(format)); 3745 assert(VALID(format));
3726 3746
3727 return TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); 3747 return TrioFormat(file, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL);
3728 } 3748 }
3729 3749
3730 /** 3750 /**
3731 Print to file. 3751 Print to file.
3732 3752
3733 @param file File pointer. 3753 @param file File pointer.
3734 @param format Formatting string. 3754 @param format Formatting string.
3735 @param args Arguments. 3755 @param args Arguments.
3736 @return Number of printed characters. 3756 @return Number of printed characters.
3737 */ 3757 */
3738 TRIO_PUBLIC int 3758 TRIO_PUBLIC int
3739 trio_fprintfv 3759 trio_fprintfv
3740 TRIO_ARGS3((file, format, args), 3760 TRIO_ARGS3((file, format, args),
3741 FILE *file, 3761 FILE *file,
3742 TRIO_CONST char *format, 3762 TRIO_CONST char *format,
3743 trio_pointer_t * args) 3763 trio_pointer_t * args)
3744 { 3764 {
3745 assert(VALID(file)); 3765 assert(VALID(file));
3746 assert(VALID(format)); 3766 assert(VALID(format));
3747 3767
3748 return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args); 3768 return TrioFormat(file, 0, TrioOutStreamFile, format, NULL, args);
3749 } 3769 }
3750 3770
3751 /************************************************************************* 3771 /*************************************************************************
3752 * dprintf 3772 * dprintf
3753 */ 3773 */
3754 3774
3755 /** 3775 /**
3756 Print to file descriptor. 3776 Print to file descriptor.
3757 3777
3758 @param fd File descriptor. 3778 @param fd File descriptor.
3759 @param format Formatting string. 3779 @param format Formatting string.
3760 @param ... Arguments. 3780 @param ... Arguments.
3761 @return Number of printed characters. 3781 @return Number of printed characters.
3762 */ 3782 */
3763 TRIO_PUBLIC int 3783 TRIO_PUBLIC int
3764 trio_dprintf 3784 trio_dprintf
3765 TRIO_VARGS3((fd, format, va_alist), 3785 TRIO_VARGS3((fd, format, va_alist),
3766 int fd, 3786 int fd,
3767 TRIO_CONST char *format, 3787 TRIO_CONST char *format,
3768 TRIO_VA_DECL) 3788 TRIO_VA_DECL)
3769 { 3789 {
3770 int status; 3790 int status;
3771 va_list args; 3791 va_list args;
3772 3792
3773 assert(VALID(format)); 3793 assert(VALID(format));
3774 3794
3775 TRIO_VA_START(args, format); 3795 TRIO_VA_START(args, format);
3776 status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); 3796 status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, TRIO_VA_LIST_ ADDR(args), NULL);
3777 TRIO_VA_END(args); 3797 TRIO_VA_END(args);
3778 return status; 3798 return status;
3779 } 3799 }
3780 3800
3781 /** 3801 /**
3782 Print to file descriptor. 3802 Print to file descriptor.
3783 3803
3784 @param fd File descriptor. 3804 @param fd File descriptor.
3785 @param format Formatting string. 3805 @param format Formatting string.
3786 @param args Arguments. 3806 @param args Arguments.
3787 @return Number of printed characters. 3807 @return Number of printed characters.
3788 */ 3808 */
3789 TRIO_PUBLIC int 3809 TRIO_PUBLIC int
3790 trio_vdprintf 3810 trio_vdprintf
3791 TRIO_ARGS3((fd, format, args), 3811 TRIO_ARGS3((fd, format, args),
3792 int fd, 3812 int fd,
3793 TRIO_CONST char *format, 3813 TRIO_CONST char *format,
3794 va_list args) 3814 va_list args)
3795 { 3815 {
3796 assert(VALID(format)); 3816 assert(VALID(format));
3797 3817
3798 return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); 3818 return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, TRIO_VA_LIST_AD DR(args), NULL);
3799 } 3819 }
3800 3820
3801 /** 3821 /**
3802 Print to file descriptor. 3822 Print to file descriptor.
3803 3823
3804 @param fd File descriptor. 3824 @param fd File descriptor.
3805 @param format Formatting string. 3825 @param format Formatting string.
3806 @param args Arguments. 3826 @param args Arguments.
3807 @return Number of printed characters. 3827 @return Number of printed characters.
3808 */ 3828 */
3809 TRIO_PUBLIC int 3829 TRIO_PUBLIC int
3810 trio_dprintfv 3830 trio_dprintfv
3811 TRIO_ARGS3((fd, format, args), 3831 TRIO_ARGS3((fd, format, args),
3812 int fd, 3832 int fd,
3813 TRIO_CONST char *format, 3833 TRIO_CONST char *format,
3814 trio_pointer_t *args) 3834 trio_pointer_t *args)
3815 { 3835 {
3816 assert(VALID(format)); 3836 assert(VALID(format));
3817 3837
3818 return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args); 3838 return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, NULL, args);
3819 } 3839 }
3820 3840
3821 /************************************************************************* 3841 /*************************************************************************
3822 * cprintf 3842 * cprintf
3823 */ 3843 */
3824 TRIO_PUBLIC int 3844 TRIO_PUBLIC int
3825 trio_cprintf 3845 trio_cprintf
3826 TRIO_VARGS4((stream, closure, format, va_alist), 3846 TRIO_VARGS4((stream, closure, format, va_alist),
3827 trio_outstream_t stream, 3847 trio_outstream_t stream,
3828 trio_pointer_t closure, 3848 trio_pointer_t closure,
3829 TRIO_CONST char *format, 3849 TRIO_CONST char *format,
3830 TRIO_VA_DECL) 3850 TRIO_VA_DECL)
3831 { 3851 {
3832 int status; 3852 int status;
3833 va_list args; 3853 va_list args;
3834 trio_custom_t data; 3854 trio_custom_t data;
3835 3855
3836 assert(VALID(stream)); 3856 assert(VALID(stream));
3837 assert(VALID(format)); 3857 assert(VALID(format));
3838 3858
3839 TRIO_VA_START(args, format); 3859 TRIO_VA_START(args, format);
3840 data.stream.out = stream; 3860 data.stream.out = stream;
3841 data.closure = closure; 3861 data.closure = closure;
3842 status = TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); 3862 status = TrioFormat(&data, 0, TrioOutStreamCustom, format, TRIO_VA_LIST_ADDR(a rgs), NULL);
3843 TRIO_VA_END(args); 3863 TRIO_VA_END(args);
3844 return status; 3864 return status;
3845 } 3865 }
3846 3866
3847 TRIO_PUBLIC int 3867 TRIO_PUBLIC int
3848 trio_vcprintf 3868 trio_vcprintf
3849 TRIO_ARGS4((stream, closure, format, args), 3869 TRIO_ARGS4((stream, closure, format, args),
3850 trio_outstream_t stream, 3870 trio_outstream_t stream,
3851 trio_pointer_t closure, 3871 trio_pointer_t closure,
3852 TRIO_CONST char *format, 3872 TRIO_CONST char *format,
3853 va_list args) 3873 va_list args)
3854 { 3874 {
3855 trio_custom_t data; 3875 trio_custom_t data;
3856 3876
3857 assert(VALID(stream)); 3877 assert(VALID(stream));
3858 assert(VALID(format)); 3878 assert(VALID(format));
3859 3879
3860 data.stream.out = stream; 3880 data.stream.out = stream;
3861 data.closure = closure; 3881 data.closure = closure;
3862 return TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); 3882 return TrioFormat(&data, 0, TrioOutStreamCustom, format, TRIO_VA_LIST_ADDR(arg s), NULL);
3863 } 3883 }
3864 3884
3865 TRIO_PUBLIC int 3885 TRIO_PUBLIC int
3866 trio_cprintfv 3886 trio_cprintfv
3867 TRIO_ARGS4((stream, closure, format, args), 3887 TRIO_ARGS4((stream, closure, format, args),
3868 trio_outstream_t stream, 3888 trio_outstream_t stream,
3869 trio_pointer_t closure, 3889 trio_pointer_t closure,
3870 TRIO_CONST char *format, 3890 TRIO_CONST char *format,
3871 void **args) 3891 void **args)
3872 { 3892 {
(...skipping 24 matching lines...) Expand all
3897 TRIO_VARGS3((buffer, format, va_alist), 3917 TRIO_VARGS3((buffer, format, va_alist),
3898 char *buffer, 3918 char *buffer,
3899 TRIO_CONST char *format, 3919 TRIO_CONST char *format,
3900 TRIO_VA_DECL) 3920 TRIO_VA_DECL)
3901 { 3921 {
3902 int status; 3922 int status;
3903 va_list args; 3923 va_list args;
3904 3924
3905 assert(VALID(buffer)); 3925 assert(VALID(buffer));
3906 assert(VALID(format)); 3926 assert(VALID(format));
3907 3927
3908 TRIO_VA_START(args, format); 3928 TRIO_VA_START(args, format);
3909 status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); 3929 status = TrioFormat(&buffer, 0, TrioOutStreamString, format, TRIO_VA_LIST_ADDR (args), NULL);
3910 *buffer = NIL; /* Terminate with NIL character */ 3930 *buffer = NIL; /* Terminate with NIL character */
3911 TRIO_VA_END(args); 3931 TRIO_VA_END(args);
3912 return status; 3932 return status;
3913 } 3933 }
3914 3934
3915 /** 3935 /**
3916 Print to string. 3936 Print to string.
3917 3937
3918 @param buffer Output string. 3938 @param buffer Output string.
3919 @param format Formatting string. 3939 @param format Formatting string.
3920 @param args Arguments. 3940 @param args Arguments.
3921 @return Number of printed characters. 3941 @return Number of printed characters.
3922 */ 3942 */
3923 TRIO_PUBLIC int 3943 TRIO_PUBLIC int
3924 trio_vsprintf 3944 trio_vsprintf
3925 TRIO_ARGS3((buffer, format, args), 3945 TRIO_ARGS3((buffer, format, args),
3926 char *buffer, 3946 char *buffer,
3927 TRIO_CONST char *format, 3947 TRIO_CONST char *format,
3928 va_list args) 3948 va_list args)
3929 { 3949 {
3930 int status; 3950 int status;
3931 3951
3932 assert(VALID(buffer)); 3952 assert(VALID(buffer));
3933 assert(VALID(format)); 3953 assert(VALID(format));
3934 3954
3935 status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); 3955 status = TrioFormat(&buffer, 0, TrioOutStreamString, format, TRIO_VA_LIST_ADDR (args), NULL);
3936 *buffer = NIL; 3956 *buffer = NIL;
3937 return status; 3957 return status;
3938 } 3958 }
3939 3959
3940 /** 3960 /**
3941 Print to string. 3961 Print to string.
3942 3962
3943 @param buffer Output string. 3963 @param buffer Output string.
3944 @param format Formatting string. 3964 @param format Formatting string.
3945 @param args Arguments. 3965 @param args Arguments.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3984 TRIO_VA_DECL) 4004 TRIO_VA_DECL)
3985 { 4005 {
3986 int status; 4006 int status;
3987 va_list args; 4007 va_list args;
3988 4008
3989 assert(VALID(buffer)); 4009 assert(VALID(buffer));
3990 assert(VALID(format)); 4010 assert(VALID(format));
3991 4011
3992 TRIO_VA_START(args, format); 4012 TRIO_VA_START(args, format);
3993 status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, 4013 status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
3994 » » TrioOutStreamStringMax, format, &args, NULL); 4014 » » TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), N ULL);
3995 if (max > 0) 4015 if (max > 0)
3996 *buffer = NIL; 4016 *buffer = NIL;
3997 TRIO_VA_END(args); 4017 TRIO_VA_END(args);
3998 return status; 4018 return status;
3999 } 4019 }
4000 4020
4001 /** 4021 /**
4002 Print at most @p max characters to string. 4022 Print at most @p max characters to string.
4003 4023
4004 @param buffer Output string. 4024 @param buffer Output string.
4005 @param max Maximum number of characters to print. 4025 @param max Maximum number of characters to print.
4006 @param format Formatting string. 4026 @param format Formatting string.
4007 @param args Arguments. 4027 @param args Arguments.
4008 @return Number of printed characters. 4028 @return Number of printed characters.
4009 */ 4029 */
4010 TRIO_PUBLIC int 4030 TRIO_PUBLIC int
4011 trio_vsnprintf 4031 trio_vsnprintf
4012 TRIO_ARGS4((buffer, max, format, args), 4032 TRIO_ARGS4((buffer, max, format, args),
4013 char *buffer, 4033 char *buffer,
4014 size_t max, 4034 size_t max,
4015 TRIO_CONST char *format, 4035 TRIO_CONST char *format,
4016 va_list args) 4036 va_list args)
4017 { 4037 {
4018 int status; 4038 int status;
4019 4039
4020 assert(VALID(buffer)); 4040 assert(VALID(buffer));
4021 assert(VALID(format)); 4041 assert(VALID(format));
4022 4042
4023 status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, 4043 status = TrioFormat(&buffer, max > 0 ? max - 1 : 0,
4024 » » TrioOutStreamStringMax, format, &args, NULL); 4044 » » TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), N ULL);
4025 if (max > 0) 4045 if (max > 0)
4026 *buffer = NIL; 4046 *buffer = NIL;
4027 return status; 4047 return status;
4028 } 4048 }
4029 4049
4030 /** 4050 /**
4031 Print at most @p max characters to string. 4051 Print at most @p max characters to string.
4032 4052
4033 @param buffer Output string. 4053 @param buffer Output string.
4034 @param max Maximum number of characters to print. 4054 @param max Maximum number of characters to print.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
4075 4095
4076 TRIO_VA_START(args, format); 4096 TRIO_VA_START(args, format);
4077 4097
4078 assert(VALID(buffer)); 4098 assert(VALID(buffer));
4079 assert(VALID(format)); 4099 assert(VALID(format));
4080 4100
4081 buf_len = trio_length(buffer); 4101 buf_len = trio_length(buffer);
4082 buffer = &buffer[buf_len]; 4102 buffer = &buffer[buf_len];
4083 4103
4084 status = TrioFormat(&buffer, max - 1 - buf_len, 4104 status = TrioFormat(&buffer, max - 1 - buf_len,
4085 » » TrioOutStreamStringMax, format, &args, NULL); 4105 » » TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), N ULL);
4086 TRIO_VA_END(args); 4106 TRIO_VA_END(args);
4087 *buffer = NIL; 4107 *buffer = NIL;
4088 return status; 4108 return status;
4089 } 4109 }
4090 4110
4091 TRIO_PUBLIC int 4111 TRIO_PUBLIC int
4092 trio_vsnprintfcat 4112 trio_vsnprintfcat
4093 TRIO_ARGS4((buffer, max, format, args), 4113 TRIO_ARGS4((buffer, max, format, args),
4094 char *buffer, 4114 char *buffer,
4095 size_t max, 4115 size_t max,
4096 TRIO_CONST char *format, 4116 TRIO_CONST char *format,
4097 va_list args) 4117 va_list args)
4098 { 4118 {
4099 int status; 4119 int status;
4100 size_t buf_len; 4120 size_t buf_len;
4101 4121
4102 assert(VALID(buffer)); 4122 assert(VALID(buffer));
4103 assert(VALID(format)); 4123 assert(VALID(format));
4104 4124
4105 buf_len = trio_length(buffer); 4125 buf_len = trio_length(buffer);
4106 buffer = &buffer[buf_len]; 4126 buffer = &buffer[buf_len];
4107 status = TrioFormat(&buffer, max - 1 - buf_len, 4127 status = TrioFormat(&buffer, max - 1 - buf_len,
4108 » » TrioOutStreamStringMax, format, &args, NULL); 4128 » » TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), N ULL);
4109 *buffer = NIL; 4129 *buffer = NIL;
4110 return status; 4130 return status;
4111 } 4131 }
4112 4132
4113 /************************************************************************* 4133 /*************************************************************************
4114 * trio_aprintf 4134 * trio_aprintf
4115 */ 4135 */
4116 4136
4117 /* Deprecated */ 4137 /* Deprecated */
4118 TRIO_PUBLIC char * 4138 TRIO_PUBLIC char *
4119 trio_aprintf 4139 trio_aprintf
4120 TRIO_VARGS2((format, va_alist), 4140 TRIO_VARGS2((format, va_alist),
4121 TRIO_CONST char *format, 4141 TRIO_CONST char *format,
4122 TRIO_VA_DECL) 4142 TRIO_VA_DECL)
4123 { 4143 {
4124 va_list args; 4144 va_list args;
4125 trio_string_t *info; 4145 trio_string_t *info;
4126 char *result = NULL; 4146 char *result = NULL;
4127 4147
4128 assert(VALID(format)); 4148 assert(VALID(format));
4129 4149
4130 info = trio_xstring_duplicate(""); 4150 info = trio_xstring_duplicate("");
4131 if (info) 4151 if (info)
4132 { 4152 {
4133 TRIO_VA_START(args, format); 4153 TRIO_VA_START(args, format);
4134 (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, 4154 (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
4135 » » format, &args, NULL); 4155 » » format, TRIO_VA_LIST_ADDR(args), NULL);
4136 TRIO_VA_END(args); 4156 TRIO_VA_END(args);
4137 4157
4138 trio_string_terminate(info); 4158 trio_string_terminate(info);
4139 result = trio_string_extract(info); 4159 result = trio_string_extract(info);
4140 trio_string_destroy(info); 4160 trio_string_destroy(info);
4141 } 4161 }
4142 return result; 4162 return result;
4143 } 4163 }
4144 4164
4145 /* Deprecated */ 4165 /* Deprecated */
4146 TRIO_PUBLIC char * 4166 TRIO_PUBLIC char *
4147 trio_vaprintf 4167 trio_vaprintf
4148 TRIO_ARGS2((format, args), 4168 TRIO_ARGS2((format, args),
4149 TRIO_CONST char *format, 4169 TRIO_CONST char *format,
4150 va_list args) 4170 va_list args)
4151 { 4171 {
4152 trio_string_t *info; 4172 trio_string_t *info;
4153 char *result = NULL; 4173 char *result = NULL;
4154 4174
4155 assert(VALID(format)); 4175 assert(VALID(format));
4156 4176
4157 info = trio_xstring_duplicate(""); 4177 info = trio_xstring_duplicate("");
4158 if (info) 4178 if (info)
4159 { 4179 {
4160 (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, 4180 (void)TrioFormat(info, 0, TrioOutStreamStringDynamic,
4161 » » format, &args, NULL); 4181 » » format, TRIO_VA_LIST_ADDR(args), NULL);
4162 trio_string_terminate(info); 4182 trio_string_terminate(info);
4163 result = trio_string_extract(info); 4183 result = trio_string_extract(info);
4164 trio_string_destroy(info); 4184 trio_string_destroy(info);
4165 } 4185 }
4166 return result; 4186 return result;
4167 } 4187 }
4168 4188
4169 TRIO_PUBLIC int 4189 TRIO_PUBLIC int
4170 trio_asprintf 4190 trio_asprintf
4171 TRIO_VARGS3((result, format, va_alist), 4191 TRIO_VARGS3((result, format, va_alist),
4172 char **result, 4192 char **result,
4173 TRIO_CONST char *format, 4193 TRIO_CONST char *format,
4174 TRIO_VA_DECL) 4194 TRIO_VA_DECL)
4175 { 4195 {
4176 va_list args; 4196 va_list args;
4177 int status; 4197 int status;
4178 trio_string_t *info; 4198 trio_string_t *info;
4179 4199
4180 assert(VALID(format)); 4200 assert(VALID(format));
4181 4201
4182 *result = NULL; 4202 *result = NULL;
4183 4203
4184 info = trio_xstring_duplicate(""); 4204 info = trio_xstring_duplicate("");
4185 if (info == NULL) 4205 if (info == NULL)
4186 { 4206 {
4187 status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); 4207 status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
4188 } 4208 }
4189 else 4209 else
4190 { 4210 {
4191 TRIO_VA_START(args, format); 4211 TRIO_VA_START(args, format);
4192 status = TrioFormat(info, 0, TrioOutStreamStringDynamic, 4212 status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
4193 » » » format, &args, NULL); 4213 » » » format, TRIO_VA_LIST_ADDR(args), NULL);
4194 TRIO_VA_END(args); 4214 TRIO_VA_END(args);
4195 if (status >= 0) 4215 if (status >= 0)
4196 { 4216 {
4197 trio_string_terminate(info); 4217 trio_string_terminate(info);
4198 *result = trio_string_extract(info); 4218 *result = trio_string_extract(info);
4199 } 4219 }
4200 trio_string_destroy(info); 4220 trio_string_destroy(info);
4201 } 4221 }
4202 return status; 4222 return status;
4203 } 4223 }
4204 4224
4205 TRIO_PUBLIC int 4225 TRIO_PUBLIC int
4206 trio_vasprintf 4226 trio_vasprintf
4207 TRIO_ARGS3((result, format, args), 4227 TRIO_ARGS3((result, format, args),
4208 char **result, 4228 char **result,
4209 TRIO_CONST char *format, 4229 TRIO_CONST char *format,
4210 va_list args) 4230 va_list args)
4211 { 4231 {
4212 int status; 4232 int status;
4213 trio_string_t *info; 4233 trio_string_t *info;
4214 4234
4215 assert(VALID(format)); 4235 assert(VALID(format));
4216 4236
4217 *result = NULL; 4237 *result = NULL;
4218 4238
4219 info = trio_xstring_duplicate(""); 4239 info = trio_xstring_duplicate("");
4220 if (info == NULL) 4240 if (info == NULL)
4221 { 4241 {
4222 status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); 4242 status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0);
4223 } 4243 }
4224 else 4244 else
4225 { 4245 {
4226 status = TrioFormat(info, 0, TrioOutStreamStringDynamic, 4246 status = TrioFormat(info, 0, TrioOutStreamStringDynamic,
4227 » » » format, &args, NULL); 4247 » » » format, TRIO_VA_LIST_ADDR(args), NULL);
4228 if (status >= 0) 4248 if (status >= 0)
4229 { 4249 {
4230 trio_string_terminate(info); 4250 trio_string_terminate(info);
4231 *result = trio_string_extract(info); 4251 *result = trio_string_extract(info);
4232 } 4252 }
4233 trio_string_destroy(info); 4253 trio_string_destroy(info);
4234 } 4254 }
4235 return status; 4255 return status;
4236 } 4256 }
4237 4257
(...skipping 19 matching lines...) Expand all
4257 * trio_register 4277 * trio_register
4258 */ 4278 */
4259 4279
4260 /** 4280 /**
4261 Register new user-defined specifier. 4281 Register new user-defined specifier.
4262 4282
4263 @param callback 4283 @param callback
4264 @param name 4284 @param name
4265 @return Handle. 4285 @return Handle.
4266 */ 4286 */
4267 TRIO_PUBLIC trio_pointer_t 4287 TRIO_PUBLIC trio_pointer_t
4268 trio_register 4288 trio_register
4269 TRIO_ARGS2((callback, name), 4289 TRIO_ARGS2((callback, name),
4270 trio_callback_t callback, 4290 trio_callback_t callback,
4271 TRIO_CONST char *name) 4291 TRIO_CONST char *name)
4272 { 4292 {
4273 trio_userdef_t *def; 4293 trio_userdef_t *def;
4274 trio_userdef_t *prev = NULL; 4294 trio_userdef_t *prev = NULL;
4275 4295
4276 if (callback == NULL) 4296 if (callback == NULL)
4277 return NULL; 4297 return NULL;
4278 4298
4279 if (name) 4299 if (name)
4280 { 4300 {
4281 /* Handle built-in namespaces */ 4301 /* Handle built-in namespaces */
4282 if (name[0] == ':') 4302 if (name[0] == ':')
4283 { 4303 {
4284 if (trio_equal(name, ":enter")) 4304 if (trio_equal(name, ":enter"))
4285 { 4305 {
4286 internalEnterCriticalRegion = callback; 4306 internalEnterCriticalRegion = callback;
4287 } 4307 }
4288 else if (trio_equal(name, ":leave")) 4308 else if (trio_equal(name, ":leave"))
4289 { 4309 {
4290 internalLeaveCriticalRegion = callback; 4310 internalLeaveCriticalRegion = callback;
4291 } 4311 }
4292 return NULL; 4312 return NULL;
4293 } 4313 }
4294 4314
4295 /* Bail out if namespace is too long */ 4315 /* Bail out if namespace is too long */
4296 if (trio_length(name) >= MAX_USER_NAME) 4316 if (trio_length(name) >= MAX_USER_NAME)
4297 return NULL; 4317 return NULL;
4298 4318
4299 /* Bail out if namespace already is registered */ 4319 /* Bail out if namespace already is registered */
4300 def = TrioFindNamespace(name, &prev); 4320 def = TrioFindNamespace(name, &prev);
4301 if (def) 4321 if (def)
4302 return NULL; 4322 return NULL;
4303 } 4323 }
4304 4324
4305 def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t)); 4325 def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t));
4306 if (def) 4326 if (def)
4307 { 4327 {
4308 if (internalEnterCriticalRegion) 4328 if (internalEnterCriticalRegion)
4309 (void)internalEnterCriticalRegion(NULL); 4329 (void)internalEnterCriticalRegion(NULL);
4310 4330
4311 if (name) 4331 if (name)
4312 { 4332 {
4313 /* Link into internal list */ 4333 /* Link into internal list */
4314 if (prev == NULL) 4334 if (prev == NULL)
4315 internalUserDef = def; 4335 internalUserDef = def;
4316 else 4336 else
4317 prev->next = def; 4337 prev->next = def;
4318 } 4338 }
4319 /* Initialize */ 4339 /* Initialize */
4320 def->callback = callback; 4340 def->callback = callback;
(...skipping 24 matching lines...) Expand all
4345 4365
4346 assert(VALID(self)); 4366 assert(VALID(self));
4347 4367
4348 if (self->name) 4368 if (self->name)
4349 { 4369 {
4350 def = TrioFindNamespace(self->name, &prev); 4370 def = TrioFindNamespace(self->name, &prev);
4351 if (def) 4371 if (def)
4352 { 4372 {
4353 if (internalEnterCriticalRegion) 4373 if (internalEnterCriticalRegion)
4354 (void)internalEnterCriticalRegion(NULL); 4374 (void)internalEnterCriticalRegion(NULL);
4355 » 4375
4356 if (prev == NULL) 4376 if (prev == NULL)
4357 internalUserDef = NULL; 4377 internalUserDef = NULL;
4358 else 4378 else
4359 prev->next = def->next; 4379 prev->next = def->next;
4360 » 4380
4361 if (internalLeaveCriticalRegion) 4381 if (internalLeaveCriticalRegion)
4362 (void)internalLeaveCriticalRegion(NULL); 4382 (void)internalLeaveCriticalRegion(NULL);
4363 } 4383 }
4364 trio_destroy(self->name); 4384 trio_destroy(self->name);
4365 } 4385 }
4366 TRIO_FREE(self); 4386 TRIO_FREE(self);
4367 } 4387 }
4368 4388
4369 /************************************************************************* 4389 /*************************************************************************
4370 * trio_get_format [public] 4390 * trio_get_format [public]
4371 */ 4391 */
4372 TRIO_CONST char * 4392 TRIO_CONST char *
4373 trio_get_format 4393 trio_get_format
4374 TRIO_ARGS1((ref), 4394 TRIO_ARGS1((ref),
4375 trio_pointer_t ref) 4395 trio_pointer_t ref)
4376 { 4396 {
4377 #if defined(FORMAT_USER_DEFINED) 4397 #if defined(FORMAT_USER_DEFINED)
4378 assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); 4398 assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
4379 #endif 4399 #endif
4380 4400
4381 return (((trio_reference_t *)ref)->parameter->user_data); 4401 return (((trio_reference_t *)ref)->parameter->user_data);
4382 } 4402 }
4383 4403
4384 /************************************************************************* 4404 /*************************************************************************
4385 * trio_get_argument [public] 4405 * trio_get_argument [public]
4386 */ 4406 */
4387 trio_pointer_t 4407 trio_pointer_t
4388 trio_get_argument 4408 trio_get_argument
4389 TRIO_ARGS1((ref), 4409 TRIO_ARGS1((ref),
4390 trio_pointer_t ref) 4410 trio_pointer_t ref)
4391 { 4411 {
4392 #if defined(FORMAT_USER_DEFINED) 4412 #if defined(FORMAT_USER_DEFINED)
4393 assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); 4413 assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED);
4394 #endif 4414 #endif
4395 4415
4396 return ((trio_reference_t *)ref)->parameter->data.pointer; 4416 return ((trio_reference_t *)ref)->parameter->data.pointer;
4397 } 4417 }
4398 4418
4399 /************************************************************************* 4419 /*************************************************************************
4400 * trio_get_width / trio_set_width [public] 4420 * trio_get_width / trio_set_width [public]
4401 */ 4421 */
4402 int 4422 int
4403 trio_get_width 4423 trio_get_width
4404 TRIO_ARGS1((ref), 4424 TRIO_ARGS1((ref),
4405 trio_pointer_t ref) 4425 trio_pointer_t ref)
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
4917 trio_print_ref 4937 trio_print_ref
4918 TRIO_VARGS3((ref, format, va_alist), 4938 TRIO_VARGS3((ref, format, va_alist),
4919 trio_pointer_t ref, 4939 trio_pointer_t ref,
4920 TRIO_CONST char *format, 4940 TRIO_CONST char *format,
4921 TRIO_VA_DECL) 4941 TRIO_VA_DECL)
4922 { 4942 {
4923 int status; 4943 int status;
4924 va_list arglist; 4944 va_list arglist;
4925 4945
4926 assert(VALID(format)); 4946 assert(VALID(format));
4927 4947
4928 TRIO_VA_START(arglist, format); 4948 TRIO_VA_START(arglist, format);
4929 status = TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); 4949 status = TrioFormatRef((trio_reference_t *)ref, format, TRIO_VA_LIST_ADDR(argl ist), NULL);
4930 TRIO_VA_END(arglist); 4950 TRIO_VA_END(arglist);
4931 return status; 4951 return status;
4932 } 4952 }
4933 4953
4934 /************************************************************************* 4954 /*************************************************************************
4935 * trio_vprint_ref [public] 4955 * trio_vprint_ref [public]
4936 */ 4956 */
4937 int 4957 int
4938 trio_vprint_ref 4958 trio_vprint_ref
4939 TRIO_ARGS3((ref, format, arglist), 4959 TRIO_ARGS3((ref, format, arglist),
4940 trio_pointer_t ref, 4960 trio_pointer_t ref,
4941 TRIO_CONST char *format, 4961 TRIO_CONST char *format,
4942 va_list arglist) 4962 va_list arglist)
4943 { 4963 {
4944 assert(VALID(format)); 4964 assert(VALID(format));
4945 4965
4946 return TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); 4966 return TrioFormatRef((trio_reference_t *)ref, format, TRIO_VA_LIST_ADDR(arglis t), NULL);
4947 } 4967 }
4948 4968
4949 /************************************************************************* 4969 /*************************************************************************
4950 * trio_printv_ref [public] 4970 * trio_printv_ref [public]
4951 */ 4971 */
4952 int 4972 int
4953 trio_printv_ref 4973 trio_printv_ref
4954 TRIO_ARGS3((ref, format, argarray), 4974 TRIO_ARGS3((ref, format, argarray),
4955 trio_pointer_t ref, 4975 trio_pointer_t ref,
4956 TRIO_CONST char *format, 4976 TRIO_CONST char *format,
4957 trio_pointer_t *argarray) 4977 trio_pointer_t *argarray)
4958 { 4978 {
4959 assert(VALID(format)); 4979 assert(VALID(format));
4960 4980
4961 return TrioFormatRef((trio_reference_t *)ref, format, NULL, argarray); 4981 return TrioFormatRef((trio_reference_t *)ref, format, NULL, argarray);
4962 } 4982 }
4963 4983
4964 #endif /* TRIO_EXTENSION */ 4984 #endif /* TRIO_EXTENSION */
4965 4985
4966 /************************************************************************* 4986 /*************************************************************************
4967 * trio_print_pointer [public] 4987 * trio_print_pointer [public]
4968 */ 4988 */
4969 void 4989 void
4970 trio_print_pointer 4990 trio_print_pointer
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
5199 index++; 5219 index++;
5200 } 5220 }
5201 /* Collect characters */ 5221 /* Collect characters */
5202 for (ch = format[index]; 5222 for (ch = format[index];
5203 (ch != SPECIFIER_UNGROUP) && (ch != NIL); 5223 (ch != SPECIFIER_UNGROUP) && (ch != NIL);
5204 ch = format[++index]) 5224 ch = format[++index])
5205 { 5225 {
5206 switch (ch) 5226 switch (ch)
5207 { 5227 {
5208 case QUALIFIER_MINUS: /* Scanlist ranges */ 5228 case QUALIFIER_MINUS: /* Scanlist ranges */
5209 » 5229
5210 /* 5230 /*
5211 * Both C99 and UNIX98 describes ranges as implementation- 5231 * Both C99 and UNIX98 describes ranges as implementation-
5212 * defined. 5232 * defined.
5213 * 5233 *
5214 * We support the following behaviour (although this may 5234 * We support the following behaviour (although this may
5215 * change as we become wiser) 5235 * change as we become wiser)
5216 * - only increasing ranges, ie. [a-b] but not [b-a] 5236 * - only increasing ranges, ie. [a-b] but not [b-a]
5217 * - transitive ranges, ie. [a-b-c] == [a-c] 5237 * - transitive ranges, ie. [a-b-c] == [a-c]
5218 * - trailing minus, ie. [a-] is interpreted as an 'a' 5238 * - trailing minus, ie. [a-] is interpreted as an 'a'
5219 * and a '-' 5239 * and a '-'
5220 * - duplicates (although we can easily convert these 5240 * - duplicates (although we can easily convert these
5221 * into errors) 5241 * into errors)
5222 */ 5242 */
5223 range_begin = format[index - 1]; 5243 range_begin = format[index - 1];
5224 range_end = format[++index]; 5244 range_end = format[++index];
5225 if (range_end == SPECIFIER_UNGROUP) 5245 if (range_end == SPECIFIER_UNGROUP)
5226 { 5246 {
5227 /* Trailing minus is included */ 5247 /* Trailing minus is included */
5228 characterclass[(int)ch]++; 5248 characterclass[(int)ch]++;
5229 ch = range_end; 5249 ch = range_end;
5230 break; /* for */ 5250 break; /* for */
5231 } 5251 }
5232 if (range_end == NIL) 5252 if (range_end == NIL)
5233 return TRIO_ERROR_RETURN(TRIO_EINVAL, index); 5253 return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
5234 if (range_begin > range_end) 5254 if (range_begin > range_end)
5235 return TRIO_ERROR_RETURN(TRIO_ERANGE, index); 5255 return TRIO_ERROR_RETURN(TRIO_ERANGE, index);
5236 » 5256
5237 for (i = (int)range_begin; i <= (int)range_end; i++) 5257 for (i = (int)range_begin; i <= (int)range_end; i++)
5238 characterclass[i]++; 5258 characterclass[i]++;
5239 » 5259
5240 ch = range_end; 5260 ch = range_end;
5241 break; 5261 break;
5242 » 5262
5243 #if TRIO_EXTENSION 5263 #if TRIO_EXTENSION
5244 5264
5245 case SPECIFIER_GROUP: 5265 case SPECIFIER_GROUP:
5246 » 5266
5247 switch (format[index + 1]) 5267 switch (format[index + 1])
5248 { 5268 {
5249 case QUALIFIER_DOT: /* Collating symbol */ 5269 case QUALIFIER_DOT: /* Collating symbol */
5250 /* 5270 /*
5251 * FIXME: This will be easier to implement when multibyte 5271 * FIXME: This will be easier to implement when multibyte
5252 * characters have been implemented. Until now, we ignore 5272 * characters have been implemented. Until now, we ignore
5253 * this feature. 5273 * this feature.
5254 */ 5274 */
5255 for (i = index + 2; ; i++) 5275 for (i = index + 2; ; i++)
5256 { 5276 {
5257 if (format[i] == NIL) 5277 if (format[i] == NIL)
5258 /* Error in syntax */ 5278 /* Error in syntax */
5259 return -1; 5279 return -1;
5260 else if (format[i] == QUALIFIER_DOT) 5280 else if (format[i] == QUALIFIER_DOT)
5261 break; /* for */ 5281 break; /* for */
5262 } 5282 }
5263 if (format[++i] != SPECIFIER_UNGROUP) 5283 if (format[++i] != SPECIFIER_UNGROUP)
5264 return -1; 5284 return -1;
5265 » 5285
5266 index = i; 5286 index = i;
5267 break; 5287 break;
5268 » 5288
5269 case QUALIFIER_EQUAL: /* Equivalence class expressions */ 5289 case QUALIFIER_EQUAL: /* Equivalence class expressions */
5270 { 5290 {
5271 unsigned int j; 5291 unsigned int j;
5272 unsigned int k; 5292 unsigned int k;
5273 » 5293
5274 if (internalCollationUnconverted) 5294 if (internalCollationUnconverted)
5275 { 5295 {
5276 /* Lazy evaluation of collation array */ 5296 /* Lazy evaluation of collation array */
5277 TrioGetCollation(); 5297 TrioGetCollation();
5278 internalCollationUnconverted = FALSE; 5298 internalCollationUnconverted = FALSE;
5279 } 5299 }
5280 for (i = index + 2; ; i++) 5300 for (i = index + 2; ; i++)
5281 { 5301 {
5282 if (format[i] == NIL) 5302 if (format[i] == NIL)
5283 /* Error in syntax */ 5303 /* Error in syntax */
5284 return -1; 5304 return -1;
5285 else if (format[i] == QUALIFIER_EQUAL) 5305 else if (format[i] == QUALIFIER_EQUAL)
5286 break; /* for */ 5306 break; /* for */
5287 else 5307 else
5288 { 5308 {
5289 /* Mark any equivalent character */ 5309 /* Mark any equivalent character */
5290 k = (unsigned int)format[i]; 5310 k = (unsigned int)format[i];
5291 for (j = 0; internalCollationArray[k][j] != NIL; j++) 5311 for (j = 0; internalCollationArray[k][j] != NIL; j++)
5292 characterclass[(int)internalCollationArray[k][j]]++; 5312 characterclass[(int)internalCollationArray[k][j]]++;
5293 } 5313 }
5294 } 5314 }
5295 if (format[++i] != SPECIFIER_UNGROUP) 5315 if (format[++i] != SPECIFIER_UNGROUP)
5296 return -1; 5316 return -1;
5297 » » 5317
5298 index = i; 5318 index = i;
5299 } 5319 }
5300 break; 5320 break;
5301 » 5321
5302 case QUALIFIER_COLON: /* Character class expressions */ 5322 case QUALIFIER_COLON: /* Character class expressions */
5303 » 5323
5304 if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1, 5324 if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1,
5305 &format[index])) 5325 &format[index]))
5306 { 5326 {
5307 for (i = 0; i < MAX_CHARACTER_CLASS; i++) 5327 for (i = 0; i < MAX_CHARACTER_CLASS; i++)
5308 if (isalnum(i)) 5328 if (isalnum(i))
5309 characterclass[i]++; 5329 characterclass[i]++;
5310 index += sizeof(CLASS_ALNUM) - 1; 5330 index += sizeof(CLASS_ALNUM) - 1;
5311 } 5331 }
5312 else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1, 5332 else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1,
5313 &format[index])) 5333 &format[index]))
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
5393 { 5413 {
5394 characterclass[(int)ch]++; 5414 characterclass[(int)ch]++;
5395 } 5415 }
5396 break; 5416 break;
5397 5417
5398 default: 5418 default:
5399 characterclass[(int)ch]++; 5419 characterclass[(int)ch]++;
5400 break; 5420 break;
5401 } 5421 }
5402 break; 5422 break;
5403 » 5423
5404 #endif /* TRIO_EXTENSION */ 5424 #endif /* TRIO_EXTENSION */
5405 » 5425
5406 default: 5426 default:
5407 characterclass[(int)ch]++; 5427 characterclass[(int)ch]++;
5408 break; 5428 break;
5409 } 5429 }
5410 } 5430 }
5411 return 0; 5431 return 0;
5412 } 5432 }
5413 5433
5414 /************************************************************************* 5434 /*************************************************************************
5415 * TrioReadNumber 5435 * TrioReadNumber
(...skipping 25 matching lines...) Expand all
5441 { 5461 {
5442 /* Lazy evaluation of digits array */ 5462 /* Lazy evaluation of digits array */
5443 memset(internalDigitArray, -1, sizeof(internalDigitArray)); 5463 memset(internalDigitArray, -1, sizeof(internalDigitArray));
5444 for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++) 5464 for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++)
5445 { 5465 {
5446 internalDigitArray[(int)internalDigitsLower[j]] = j; 5466 internalDigitArray[(int)internalDigitsLower[j]] = j;
5447 internalDigitArray[(int)internalDigitsUpper[j]] = j; 5467 internalDigitArray[(int)internalDigitsUpper[j]] = j;
5448 } 5468 }
5449 internalDigitsUnconverted = FALSE; 5469 internalDigitsUnconverted = FALSE;
5450 } 5470 }
5451 5471
5452 TrioSkipWhitespaces(self); 5472 TrioSkipWhitespaces(self);
5453 5473
5454 if (!(flags & FLAGS_UNSIGNED)) 5474 if (!(flags & FLAGS_UNSIGNED))
5455 { 5475 {
5456 /* Leading sign */ 5476 /* Leading sign */
5457 if (self->current == '+') 5477 if (self->current == '+')
5458 { 5478 {
5459 self->InStream(self, NULL); 5479 self->InStream(self, NULL);
5460 } 5480 }
5461 else if (self->current == '-') 5481 else if (self->current == '-')
5462 { 5482 {
5463 self->InStream(self, NULL); 5483 self->InStream(self, NULL);
5464 isNegative = TRUE; 5484 isNegative = TRUE;
5465 } 5485 }
5466 } 5486 }
5467 5487
5468 count = self->processed; 5488 count = self->processed;
5469 5489
5470 if (flags & FLAGS_ALTERNATIVE) 5490 if (flags & FLAGS_ALTERNATIVE)
5471 { 5491 {
5472 switch (base) 5492 switch (base)
5473 { 5493 {
5474 case NO_BASE: 5494 case NO_BASE:
5475 case BASE_OCTAL: 5495 case BASE_OCTAL:
5476 case BASE_HEX: 5496 case BASE_HEX:
5477 case BASE_BINARY: 5497 case BASE_BINARY:
5478 if (self->current == '0') 5498 if (self->current == '0')
5479 { 5499 {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
5520 5540
5521 self->InStream(self, NULL); 5541 self->InStream(self, NULL);
5522 } 5542 }
5523 if (internalThousandSeparator[j]) 5543 if (internalThousandSeparator[j])
5524 break; /* Mismatch */ 5544 break; /* Mismatch */
5525 else 5545 else
5526 continue; /* Match */ 5546 continue; /* Match */
5527 } 5547 }
5528 else 5548 else
5529 break; 5549 break;
5530 5550
5531 number *= base; 5551 number *= base;
5532 number += digit; 5552 number += digit;
5533 gotNumber = TRUE; /* we need at least one digit */ 5553 gotNumber = TRUE; /* we need at least one digit */
5534 5554
5535 self->InStream(self, NULL); 5555 self->InStream(self, NULL);
5536 } 5556 }
5537 5557
5538 /* Was anything read at all? */ 5558 /* Was anything read at all? */
5539 if (!gotNumber) 5559 if (!gotNumber)
5540 return FALSE; 5560 return FALSE;
5541 5561
5542 if (target) 5562 if (target)
5543 *target = (isNegative) ? -((trio_intmax_t)number) : number; 5563 *target = (isNegative) ? -((trio_intmax_t)number) : number;
5544 return TRUE; 5564 return TRUE;
5545 } 5565 }
5546 5566
5547 /************************************************************************* 5567 /*************************************************************************
5548 * TrioReadChar 5568 * TrioReadChar
5549 */ 5569 */
5550 TRIO_PRIVATE int 5570 TRIO_PRIVATE int
5551 TrioReadChar 5571 TrioReadChar
5552 TRIO_ARGS4((self, target, flags, width), 5572 TRIO_ARGS4((self, target, flags, width),
5553 trio_class_t *self, 5573 trio_class_t *self,
5554 char *target, 5574 char *target,
5555 trio_flags_t flags, 5575 trio_flags_t flags,
5556 int width) 5576 int width)
5557 { 5577 {
5558 int i; 5578 int i;
5559 char ch; 5579 char ch;
5560 trio_uintmax_t number; 5580 trio_uintmax_t number;
5561 5581
5562 assert(VALID(self)); 5582 assert(VALID(self));
5563 assert(VALID(self->InStream)); 5583 assert(VALID(self->InStream));
5564 5584
5565 for (i = 0; 5585 for (i = 0;
5566 (self->current != EOF) && (i < width); 5586 (self->current != EOF) && (i < width);
5567 i++) 5587 i++)
5568 { 5588 {
5569 ch = (char)self->current; 5589 ch = (char)self->current;
5570 self->InStream(self, NULL); 5590 self->InStream(self, NULL);
5571 if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH)) 5591 if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH))
(...skipping 24 matching lines...) Expand all
5596 return 0; 5616 return 0;
5597 ch = (char)number; 5617 ch = (char)number;
5598 } 5618 }
5599 else 5619 else
5600 { 5620 {
5601 ch = (char)self->current; 5621 ch = (char)self->current;
5602 } 5622 }
5603 break; 5623 break;
5604 } 5624 }
5605 } 5625 }
5606 5626
5607 if (target) 5627 if (target)
5608 target[i] = ch; 5628 target[i] = ch;
5609 } 5629 }
5610 return i + 1; 5630 return i + 1;
5611 } 5631 }
5612 5632
5613 /************************************************************************* 5633 /*************************************************************************
5614 * TrioReadString 5634 * TrioReadString
5615 */ 5635 */
5616 TRIO_PRIVATE BOOLEAN_T 5636 TRIO_PRIVATE BOOLEAN_T
5617 TrioReadString 5637 TrioReadString
5618 TRIO_ARGS4((self, target, flags, width), 5638 TRIO_ARGS4((self, target, flags, width),
5619 trio_class_t *self, 5639 trio_class_t *self,
5620 char *target, 5640 char *target,
5621 trio_flags_t flags, 5641 trio_flags_t flags,
5622 int width) 5642 int width)
5623 { 5643 {
5624 int i; 5644 int i;
5625 5645
5626 assert(VALID(self)); 5646 assert(VALID(self));
5627 assert(VALID(self->InStream)); 5647 assert(VALID(self->InStream));
5628 5648
5629 TrioSkipWhitespaces(self); 5649 TrioSkipWhitespaces(self);
5630 5650
5631 /* 5651 /*
5632 * Continue until end of string is reached, a whitespace is encountered, 5652 * Continue until end of string is reached, a whitespace is encountered,
5633 * or width is exceeded 5653 * or width is exceeded
5634 */ 5654 */
5635 for (i = 0; 5655 for (i = 0;
5636 ((width == NO_WIDTH) || (i < width)) && 5656 ((width == NO_WIDTH) || (i < width)) &&
5637 (! ((self->current == EOF) || isspace(self->current))); 5657 (! ((self->current == EOF) || isspace(self->current)));
5638 i++) 5658 i++)
5639 { 5659 {
5640 if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0) 5660 if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0)
(...skipping 15 matching lines...) Expand all
5656 trio_wchar_t *target, 5676 trio_wchar_t *target,
5657 trio_flags_t flags, 5677 trio_flags_t flags,
5658 int width) 5678 int width)
5659 { 5679 {
5660 int i; 5680 int i;
5661 int j; 5681 int j;
5662 int size; 5682 int size;
5663 int amount = 0; 5683 int amount = 0;
5664 trio_wchar_t wch; 5684 trio_wchar_t wch;
5665 char buffer[MB_LEN_MAX + 1]; 5685 char buffer[MB_LEN_MAX + 1];
5666 5686
5667 assert(VALID(self)); 5687 assert(VALID(self));
5668 assert(VALID(self->InStream)); 5688 assert(VALID(self->InStream));
5669 5689
5670 for (i = 0; 5690 for (i = 0;
5671 (self->current != EOF) && (i < width); 5691 (self->current != EOF) && (i < width);
5672 i++) 5692 i++)
5673 { 5693 {
5674 if (isascii(self->current)) 5694 if (isascii(self->current))
5675 { 5695 {
5676 if (TrioReadChar(self, buffer, flags, 1) == 0) 5696 if (TrioReadChar(self, buffer, flags, 1) == 0)
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
5713 TRIO_PRIVATE BOOLEAN_T 5733 TRIO_PRIVATE BOOLEAN_T
5714 TrioReadWideString 5734 TrioReadWideString
5715 TRIO_ARGS4((self, target, flags, width), 5735 TRIO_ARGS4((self, target, flags, width),
5716 trio_class_t *self, 5736 trio_class_t *self,
5717 trio_wchar_t *target, 5737 trio_wchar_t *target,
5718 trio_flags_t flags, 5738 trio_flags_t flags,
5719 int width) 5739 int width)
5720 { 5740 {
5721 int i; 5741 int i;
5722 int size; 5742 int size;
5723 5743
5724 assert(VALID(self)); 5744 assert(VALID(self));
5725 assert(VALID(self->InStream)); 5745 assert(VALID(self->InStream));
5726 5746
5727 TrioSkipWhitespaces(self); 5747 TrioSkipWhitespaces(self);
5728 5748
5729 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) 5749 #if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE)
5730 (void)mblen(NULL, 0); 5750 (void)mblen(NULL, 0);
5731 #endif 5751 #endif
5732 5752
5733 /* 5753 /*
5734 * Continue until end of string is reached, a whitespace is encountered, 5754 * Continue until end of string is reached, a whitespace is encountered,
5735 * or width is exceeded 5755 * or width is exceeded
5736 */ 5756 */
5737 for (i = 0; 5757 for (i = 0;
5738 ((width == NO_WIDTH) || (i < width)) && 5758 ((width == NO_WIDTH) || (i < width)) &&
5739 (! ((self->current == EOF) || isspace(self->current))); 5759 (! ((self->current == EOF) || isspace(self->current)));
5740 ) 5760 )
5741 { 5761 {
5742 size = TrioReadWideChar(self, &target[i], flags, 1); 5762 size = TrioReadWideChar(self, &target[i], flags, 1);
(...skipping 17 matching lines...) Expand all
5760 TrioReadGroup 5780 TrioReadGroup
5761 TRIO_ARGS5((self, target, characterclass, flags, width), 5781 TRIO_ARGS5((self, target, characterclass, flags, width),
5762 trio_class_t *self, 5782 trio_class_t *self,
5763 char *target, 5783 char *target,
5764 int *characterclass, 5784 int *characterclass,
5765 trio_flags_t flags, 5785 trio_flags_t flags,
5766 int width) 5786 int width)
5767 { 5787 {
5768 int ch; 5788 int ch;
5769 int i; 5789 int i;
5770 5790
5771 assert(VALID(self)); 5791 assert(VALID(self));
5772 assert(VALID(self->InStream)); 5792 assert(VALID(self->InStream));
5773 5793
5774 ch = self->current; 5794 ch = self->current;
5775 for (i = 0; 5795 for (i = 0;
5776 ((width == NO_WIDTH) || (i < width)) && 5796 ((width == NO_WIDTH) || (i < width)) &&
5777 (! ((ch == EOF) || 5797 (! ((ch == EOF) ||
5778 (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0)))); 5798 (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0))));
5779 i++) 5799 i++)
5780 { 5800 {
5781 if (target) 5801 if (target)
5782 target[i] = (char)ch; 5802 target[i] = (char)ch;
5783 self->InStream(self, &ch); 5803 self->InStream(self, &ch);
5784 } 5804 }
5785 5805
5786 if (target) 5806 if (target)
5787 target[i] = NIL; 5807 target[i] = NIL;
5788 return TRUE; 5808 return TRUE;
5789 } 5809 }
5790 5810
5791 /************************************************************************* 5811 /*************************************************************************
5792 * TrioReadDouble 5812 * TrioReadDouble
5793 * 5813 *
5794 * FIXME: 5814 * FIXME:
5795 * add long double 5815 * add long double
5796 * handle base 5816 * handle base
5797 */ 5817 */
5798 TRIO_PRIVATE BOOLEAN_T 5818 TRIO_PRIVATE BOOLEAN_T
5799 TrioReadDouble 5819 TrioReadDouble
5800 TRIO_ARGS4((self, target, flags, width), 5820 TRIO_ARGS4((self, target, flags, width),
5801 trio_class_t *self, 5821 trio_class_t *self,
5802 trio_pointer_t target, 5822 trio_pointer_t target,
5803 trio_flags_t flags, 5823 trio_flags_t flags,
5804 int width) 5824 int width)
5805 { 5825 {
5806 int ch; 5826 int ch;
5807 char doubleString[512]; 5827 char doubleString[512];
5808 int index = 0; 5828 int index = 0;
5809 int start; 5829 int start;
5810 int j; 5830 int j;
5811 BOOLEAN_T isHex = FALSE; 5831 BOOLEAN_T isHex = FALSE;
5812 5832
5813 doubleString[0] = 0; 5833 doubleString[0] = 0;
5814 5834
5815 if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1)) 5835 if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1))
5816 width = sizeof(doubleString) - 1; 5836 width = sizeof(doubleString) - 1;
5817 5837
5818 TrioSkipWhitespaces(self); 5838 TrioSkipWhitespaces(self);
5819 5839
5820 /* 5840 /*
5821 * Read entire double number from stream. trio_to_double requires 5841 * Read entire double number from stream. trio_to_double requires
5822 * a string as input, but InStream can be anything, so we have to 5842 * a string as input, but InStream can be anything, so we have to
5823 * collect all characters. 5843 * collect all characters.
5824 */ 5844 */
5825 ch = self->current; 5845 ch = self->current;
5826 if ((ch == '+') || (ch == '-')) 5846 if ((ch == '+') || (ch == '-'))
5827 { 5847 {
5828 doubleString[index++] = (char)ch; 5848 doubleString[index++] = (char)ch;
5829 self->InStream(self, &ch); 5849 self->InStream(self, &ch);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
5895 case '0': 5915 case '0':
5896 doubleString[index++] = (char)ch; 5916 doubleString[index++] = (char)ch;
5897 self->InStream(self, &ch); 5917 self->InStream(self, &ch);
5898 if (trio_to_upper(ch) == 'X') 5918 if (trio_to_upper(ch) == 'X')
5899 { 5919 {
5900 isHex = TRUE; 5920 isHex = TRUE;
5901 doubleString[index++] = (char)ch; 5921 doubleString[index++] = (char)ch;
5902 self->InStream(self, &ch); 5922 self->InStream(self, &ch);
5903 } 5923 }
5904 break; 5924 break;
5905 5925
5906 default: 5926 default:
5907 break; 5927 break;
5908 } 5928 }
5909 5929
5910 while ((ch != EOF) && (index - start < width)) 5930 while ((ch != EOF) && (index - start < width))
5911 { 5931 {
5912 /* Integer part */ 5932 /* Integer part */
5913 if (isHex ? isxdigit(ch) : isdigit(ch)) 5933 if (isHex ? isxdigit(ch) : isdigit(ch))
5914 { 5934 {
5915 doubleString[index++] = (char)ch; 5935 doubleString[index++] = (char)ch;
5916 self->InStream(self, &ch); 5936 self->InStream(self, &ch);
5917 } 5937 }
5918 else if (flags & FLAGS_QUOTE) 5938 else if (flags & FLAGS_QUOTE)
5919 { 5939 {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
5959 doubleString[index++] = (char)ch; 5979 doubleString[index++] = (char)ch;
5960 self->InStream(self, &ch); 5980 self->InStream(self, &ch);
5961 } 5981 }
5962 } 5982 }
5963 } 5983 }
5964 5984
5965 if ((index == start) || (*doubleString == NIL)) 5985 if ((index == start) || (*doubleString == NIL))
5966 return FALSE; 5986 return FALSE;
5967 5987
5968 doubleString[index] = 0; 5988 doubleString[index] = 0;
5969 5989
5970 if (flags & FLAGS_LONGDOUBLE) 5990 if (flags & FLAGS_LONGDOUBLE)
5971 { 5991 {
5972 *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL); 5992 *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL);
5973 } 5993 }
5974 else 5994 else
5975 { 5995 {
5976 *((double *)target) = trio_to_double(doubleString, NULL); 5996 *((double *)target) = trio_to_double(doubleString, NULL);
5977 } 5997 }
5978 return TRUE; 5998 return TRUE;
5979 } 5999 }
5980 6000
5981 /************************************************************************* 6001 /*************************************************************************
5982 * TrioReadPointer 6002 * TrioReadPointer
5983 */ 6003 */
5984 TRIO_PRIVATE BOOLEAN_T 6004 TRIO_PRIVATE BOOLEAN_T
5985 TrioReadPointer 6005 TrioReadPointer
5986 TRIO_ARGS3((self, target, flags), 6006 TRIO_ARGS3((self, target, flags),
5987 trio_class_t *self, 6007 trio_class_t *self,
5988 trio_pointer_t *target, 6008 trio_pointer_t *target,
5989 trio_flags_t flags) 6009 trio_flags_t flags)
5990 { 6010 {
5991 trio_uintmax_t number; 6011 trio_uintmax_t number;
5992 char buffer[sizeof(internalNullString)]; 6012 char buffer[sizeof(internalNullString)];
5993 6013
5994 flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING); 6014 flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING);
5995 6015
5996 if (TrioReadNumber(self, 6016 if (TrioReadNumber(self,
5997 &number, 6017 &number,
5998 flags, 6018 flags,
5999 POINTER_WIDTH, 6019 POINTER_WIDTH,
6000 BASE_HEX)) 6020 BASE_HEX))
6001 { 6021 {
6002 /* 6022 /*
6003 * The strange assignment of number is a workaround for a compiler 6023 * The strange assignment of number is a workaround for a compiler
6004 * warning 6024 * warning
6005 */ 6025 */
6006 if (target) 6026 if (target)
6007 *target = (char *)0 + number; 6027 *target = (char *)0 + number;
6008 return TRUE; 6028 return TRUE;
6009 } 6029 }
6010 else if (TrioReadString(self, 6030 else if (TrioReadString(self,
6011 (flags & FLAGS_IGNORE) 6031 (flags & FLAGS_IGNORE)
6012 ? NULL 6032 ? NULL
6013 : buffer, 6033 : buffer,
6014 0, 6034 0,
6015 sizeof(internalNullString) - 1)) 6035 sizeof(internalNullString) - 1))
6016 { 6036 {
6017 if (trio_equal_case(buffer, internalNullString)) 6037 if (trio_equal_case(buffer, internalNullString))
6018 { 6038 {
6019 if (target) 6039 if (target)
6020 *target = NULL; 6040 *target = NULL;
6021 return TRUE; 6041 return TRUE;
6022 } 6042 }
6023 } 6043 }
6024 return FALSE; 6044 return FALSE;
6025 } 6045 }
6026 6046
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
6070 if (ch != format[index + cnt]) 6090 if (ch != format[index + cnt])
6071 { 6091 {
6072 return TRIO_ERROR_RETURN(TRIO_EINVAL, index); 6092 return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
6073 } 6093 }
6074 data->InStream(data, &ch); 6094 data->InStream(data, &ch);
6075 } 6095 }
6076 continue; /* while characters left in formatting string */ 6096 continue; /* while characters left in formatting string */
6077 } 6097 }
6078 } 6098 }
6079 #endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ 6099 #endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */
6080 6100
6081 if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT)) 6101 if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT))
6082 { 6102 {
6083 return (assignment > 0) ? assignment : EOF; 6103 return (assignment > 0) ? assignment : EOF;
6084 } 6104 }
6085 6105
6086 if (CHAR_IDENTIFIER == format[index]) 6106 if (CHAR_IDENTIFIER == format[index])
6087 { 6107 {
6088 if (CHAR_IDENTIFIER == format[index + 1]) 6108 if (CHAR_IDENTIFIER == format[index + 1])
6089 { 6109 {
6090 /* Two % in format matches one % in input stream */ 6110 /* Two % in format matches one % in input stream */
6091 if (CHAR_IDENTIFIER == ch) 6111 if (CHAR_IDENTIFIER == ch)
6092 { 6112 {
6093 data->InStream(data, &ch); 6113 data->InStream(data, &ch);
6094 index += 2; 6114 index += 2;
6095 continue; /* while format chars left */ 6115 continue; /* while format chars left */
6096 } 6116 }
6097 else 6117 else
6098 return TRIO_ERROR_RETURN(TRIO_EINVAL, index); 6118 return TRIO_ERROR_RETURN(TRIO_EINVAL, index);
6099 } 6119 }
6100 6120
6101 /* Skip the parameter entries */ 6121 /* Skip the parameter entries */
6102 while (parameters[i].type == FORMAT_PARAMETER) 6122 while (parameters[i].type == FORMAT_PARAMETER)
6103 i++; 6123 i++;
6104 » 6124
6105 flags = parameters[i].flags; 6125 flags = parameters[i].flags;
6106 /* Find width */ 6126 /* Find width */
6107 width = parameters[i].width; 6127 width = parameters[i].width;
6108 if (flags & FLAGS_WIDTH_PARAMETER) 6128 if (flags & FLAGS_WIDTH_PARAMETER)
6109 { 6129 {
6110 /* Get width from parameter list */ 6130 /* Get width from parameter list */
6111 width = (int)parameters[width].data.number.as_signed; 6131 width = (int)parameters[width].data.number.as_signed;
6112 } 6132 }
6113 /* Find base */ 6133 /* Find base */
6114 base = parameters[i].base; 6134 base = parameters[i].base;
6115 if (flags & FLAGS_BASE_PARAMETER) 6135 if (flags & FLAGS_BASE_PARAMETER)
6116 { 6136 {
6117 /* Get base from parameter list */ 6137 /* Get base from parameter list */
6118 base = (int)parameters[base].data.number.as_signed; 6138 base = (int)parameters[base].data.number.as_signed;
6119 } 6139 }
6120 » 6140
6121 switch (parameters[i].type) 6141 switch (parameters[i].type)
6122 { 6142 {
6123 case FORMAT_INT: 6143 case FORMAT_INT:
6124 { 6144 {
6125 trio_uintmax_t number; 6145 trio_uintmax_t number;
6126 6146
6127 if (0 == base) 6147 if (0 == base)
6128 base = BASE_DECIMAL; 6148 base = BASE_DECIMAL;
6129 6149
6130 if (!TrioReadNumber(data, 6150 if (!TrioReadNumber(data,
(...skipping 27 matching lines...) Expand all
6158 *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number; 6178 *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number;
6159 else if (flags & FLAGS_LONG) 6179 else if (flags & FLAGS_LONG)
6160 *(long int *)pointer = (long int)number; 6180 *(long int *)pointer = (long int)number;
6161 else if (flags & FLAGS_SHORT) 6181 else if (flags & FLAGS_SHORT)
6162 *(short int *)pointer = (short int)number; 6182 *(short int *)pointer = (short int)number;
6163 else 6183 else
6164 *(int *)pointer = (int)number; 6184 *(int *)pointer = (int)number;
6165 } 6185 }
6166 } 6186 }
6167 break; /* FORMAT_INT */ 6187 break; /* FORMAT_INT */
6168 » 6188
6169 case FORMAT_STRING: 6189 case FORMAT_STRING:
6170 #if TRIO_WIDECHAR 6190 #if TRIO_WIDECHAR
6171 if (flags & FLAGS_WIDECHAR) 6191 if (flags & FLAGS_WIDECHAR)
6172 { 6192 {
6173 if (!TrioReadWideString(data, 6193 if (!TrioReadWideString(data,
6174 (flags & FLAGS_IGNORE) 6194 (flags & FLAGS_IGNORE)
6175 ? NULL 6195 ? NULL
6176 : parameters[i].data.wstring, 6196 : parameters[i].data.wstring,
6177 flags, 6197 flags,
6178 width)) 6198 width))
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
6222 int characterclass[MAX_CHARACTER_CLASS + 1]; 6242 int characterclass[MAX_CHARACTER_CLASS + 1];
6223 int rc; 6243 int rc;
6224 6244
6225 /* Skip over modifiers */ 6245 /* Skip over modifiers */
6226 while (format[index] != SPECIFIER_GROUP) 6246 while (format[index] != SPECIFIER_GROUP)
6227 { 6247 {
6228 index++; 6248 index++;
6229 } 6249 }
6230 /* Skip over group specifier */ 6250 /* Skip over group specifier */
6231 index++; 6251 index++;
6232 » » 6252
6233 memset(characterclass, 0, sizeof(characterclass)); 6253 memset(characterclass, 0, sizeof(characterclass));
6234 rc = TrioGetCharacterClass(format, 6254 rc = TrioGetCharacterClass(format,
6235 &index, 6255 &index,
6236 &flags, 6256 &flags,
6237 characterclass); 6257 characterclass);
6238 if (rc < 0) 6258 if (rc < 0)
6239 return rc; 6259 return rc;
6240 6260
6241 if (!TrioReadGroup(data, 6261 if (!TrioReadGroup(data,
6242 (flags & FLAGS_IGNORE) 6262 (flags & FLAGS_IGNORE)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
6284 else if (flags & FLAGS_SHORT) 6304 else if (flags & FLAGS_SHORT)
6285 { 6305 {
6286 *(short int *)pointer = (short int)count; 6306 *(short int *)pointer = (short int)count;
6287 } 6307 }
6288 else 6308 else
6289 { 6309 {
6290 *(int *)pointer = (int)count; 6310 *(int *)pointer = (int)count;
6291 } 6311 }
6292 } 6312 }
6293 break; /* FORMAT_COUNT */ 6313 break; /* FORMAT_COUNT */
6294 » 6314
6295 case FORMAT_CHAR: 6315 case FORMAT_CHAR:
6296 #if TRIO_WIDECHAR 6316 #if TRIO_WIDECHAR
6297 if (flags & FLAGS_WIDECHAR) 6317 if (flags & FLAGS_WIDECHAR)
6298 { 6318 {
6299 if (TrioReadWideChar(data, 6319 if (TrioReadWideChar(data,
6300 (flags & FLAGS_IGNORE) 6320 (flags & FLAGS_IGNORE)
6301 ? NULL 6321 ? NULL
6302 : parameters[i].data.wstring, 6322 : parameters[i].data.wstring,
6303 flags, 6323 flags,
6304 (width == NO_WIDTH) ? 1 : width) == 0) 6324 (width == NO_WIDTH) ? 1 : width) == 0)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
6346 { 6366 {
6347 /* Whitespaces may match any amount of whitespaces */ 6367 /* Whitespaces may match any amount of whitespaces */
6348 ch = TrioSkipWhitespaces(data); 6368 ch = TrioSkipWhitespaces(data);
6349 } 6369 }
6350 else if (ch == format[index]) 6370 else if (ch == format[index])
6351 { 6371 {
6352 data->InStream(data, &ch); 6372 data->InStream(data, &ch);
6353 } 6373 }
6354 else 6374 else
6355 return assignment; 6375 return assignment;
6356 » 6376
6357 index++; 6377 index++;
6358 } 6378 }
6359 } 6379 }
6360 return assignment; 6380 return assignment;
6361 } 6381 }
6362 6382
6363 /************************************************************************* 6383 /*************************************************************************
6364 * TrioScan 6384 * TrioScan
6365 */ 6385 */
6366 TRIO_PRIVATE int 6386 TRIO_PRIVATE int
6367 TrioScan 6387 TrioScan
6368 TRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray), 6388 TRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray),
6369 trio_pointer_t source, 6389 trio_pointer_t source,
6370 size_t sourceSize, 6390 size_t sourceSize,
6371 void (*InStream) TRIO_PROTO((trio_class_t *, int *)), 6391 void (*InStream) TRIO_PROTO((trio_class_t *, int *)),
6372 TRIO_CONST char *format, 6392 TRIO_CONST char *format,
6373 » va_list *arglist, 6393 » TRIO_VA_LIST_PTR arglist,
6374 trio_pointer_t *argarray) 6394 trio_pointer_t *argarray)
6375 { 6395 {
6376 int status; 6396 int status;
6377 trio_parameter_t parameters[MAX_PARAMETERS]; 6397 trio_parameter_t parameters[MAX_PARAMETERS];
6378 trio_class_t data; 6398 trio_class_t data;
6379 6399
6380 assert(VALID(InStream)); 6400 assert(VALID(InStream));
6381 assert(VALID(format)); 6401 assert(VALID(format));
6382 6402
6383 memset(&data, 0, sizeof(data)); 6403 memset(&data, 0, sizeof(data));
6384 data.InStream = InStream; 6404 data.InStream = InStream;
6385 data.location = (trio_pointer_t)source; 6405 data.location = (trio_pointer_t)source;
6386 data.max = sourceSize; 6406 data.max = sourceSize;
6387 data.error = 0; 6407 data.error = 0;
6388 6408
6389 #if defined(USE_LOCALE) 6409 #if defined(USE_LOCALE)
6390 if (NULL == internalLocaleValues) 6410 if (NULL == internalLocaleValues)
6391 { 6411 {
6392 TrioSetLocale(); 6412 TrioSetLocale();
6393 } 6413 }
6394 #endif 6414 #endif
6395 6415
6396 status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray); 6416 status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray);
6397 if (status < 0) 6417 if (status < 0)
6398 return status; 6418 return status;
6399 6419
6400 status = TrioScanProcess(&data, format, parameters); 6420 status = TrioScanProcess(&data, format, parameters);
6401 if (data.error != 0) 6421 if (data.error != 0)
6402 { 6422 {
6403 status = data.error; 6423 status = data.error;
6404 } 6424 }
6405 return status; 6425 return status;
6406 } 6426 }
6407 6427
6408 /************************************************************************* 6428 /*************************************************************************
6409 * TrioInStreamFile 6429 * TrioInStreamFile
6410 */ 6430 */
6411 TRIO_PRIVATE void 6431 TRIO_PRIVATE void
6412 TrioInStreamFile 6432 TrioInStreamFile
6413 TRIO_ARGS2((self, intPointer), 6433 TRIO_ARGS2((self, intPointer),
6414 trio_class_t *self, 6434 trio_class_t *self,
6415 int *intPointer) 6435 int *intPointer)
6416 { 6436 {
6417 FILE *file = (FILE *)self->location; 6437 FILE *file;
6418 6438
6419 assert(VALID(self)); 6439 assert(VALID(self));
6440 assert(VALID(self->location));
6420 assert(VALID(file)); 6441 assert(VALID(file));
6421 6442
6443 file = (FILE *)self->location;
6444
6422 self->current = fgetc(file); 6445 self->current = fgetc(file);
6423 if (self->current == EOF) 6446 if (self->current == EOF)
6424 { 6447 {
6425 self->error = (ferror(file)) 6448 self->error = (ferror(file))
6426 ? TRIO_ERROR_RETURN(TRIO_ERRNO, 0) 6449 ? TRIO_ERROR_RETURN(TRIO_ERRNO, 0)
6427 : TRIO_ERROR_RETURN(TRIO_EOF, 0); 6450 : TRIO_ERROR_RETURN(TRIO_EOF, 0);
6428 } 6451 }
6429 else 6452 else
6430 { 6453 {
6431 self->processed++; 6454 self->processed++;
6432 self->committed++; 6455 self->committed++;
6433 } 6456 }
6434 6457
6435 if (VALID(intPointer)) 6458 if (VALID(intPointer))
6436 { 6459 {
6437 *intPointer = self->current; 6460 *intPointer = self->current;
6438 } 6461 }
6439 } 6462 }
6440 6463
6441 /************************************************************************* 6464 /*************************************************************************
6442 * TrioInStreamFileDescriptor 6465 * TrioInStreamFileDescriptor
6443 */ 6466 */
6444 TRIO_PRIVATE void 6467 TRIO_PRIVATE void
6445 TrioInStreamFileDescriptor 6468 TrioInStreamFileDescriptor
6446 TRIO_ARGS2((self, intPointer), 6469 TRIO_ARGS2((self, intPointer),
6447 trio_class_t *self, 6470 trio_class_t *self,
6448 int *intPointer) 6471 int *intPointer)
6449 { 6472 {
6450 int fd = *((int *)self->location); 6473 int fd;
6451 int size; 6474 int size;
6452 unsigned char input; 6475 unsigned char input;
6453 6476
6454 assert(VALID(self)); 6477 assert(VALID(self));
6478 assert(VALID(self->location));
6479
6480 fd = *((int *)self->location);
6455 6481
6456 size = read(fd, &input, sizeof(char)); 6482 size = read(fd, &input, sizeof(char));
6457 if (size == -1) 6483 if (size == -1)
6458 { 6484 {
6459 self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0); 6485 self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0);
6460 self->current = EOF; 6486 self->current = EOF;
6461 } 6487 }
6462 else 6488 else
6463 { 6489 {
6464 self->current = (size == 0) ? EOF : input; 6490 self->current = (size == 0) ? EOF : input;
6465 } 6491 }
6466 if (self->current != EOF) 6492 if (self->current != EOF)
6467 { 6493 {
6468 self->committed++; 6494 self->committed++;
6469 self->processed++; 6495 self->processed++;
6470 } 6496 }
6471 6497
6472 if (VALID(intPointer)) 6498 if (VALID(intPointer))
6473 { 6499 {
6474 *intPointer = self->current; 6500 *intPointer = self->current;
6475 } 6501 }
6476 } 6502 }
6477 6503
6478 /************************************************************************* 6504 /*************************************************************************
6479 * TrioInStreamCustom 6505 * TrioInStreamCustom
6480 */ 6506 */
6481 TRIO_PRIVATE void 6507 TRIO_PRIVATE void
6482 TrioInStreamCustom 6508 TrioInStreamCustom
6483 TRIO_ARGS2((self, intPointer), 6509 TRIO_ARGS2((self, intPointer),
6484 trio_class_t *self, 6510 trio_class_t *self,
6485 int *intPointer) 6511 int *intPointer)
6486 { 6512 {
6487 trio_custom_t *data; 6513 trio_custom_t *data;
6488 6514
6489 assert(VALID(self)); 6515 assert(VALID(self));
6490 assert(VALID(self->location)); 6516 assert(VALID(self->location));
6491 6517
6492 data = (trio_custom_t *)self->location; 6518 data = (trio_custom_t *)self->location;
6493 6519
6494 self->current = (data->stream.in == NULL) 6520 self->current = (data->stream.in == NULL)
6495 ? NIL 6521 ? NIL
6496 : (data->stream.in)(data->closure); 6522 : (data->stream.in)(data->closure);
6497 6523
6498 if (self->current == NIL) 6524 if (self->current == NIL)
6499 { 6525 {
6500 self->current = EOF; 6526 self->current = EOF;
6501 } 6527 }
6502 else 6528 else
6503 { 6529 {
6504 self->processed++; 6530 self->processed++;
6505 self->committed++; 6531 self->committed++;
6506 } 6532 }
6507 6533
6508 if (VALID(intPointer)) 6534 if (VALID(intPointer))
6509 { 6535 {
6510 *intPointer = self->current; 6536 *intPointer = self->current;
6511 } 6537 }
6512 } 6538 }
6513 6539
6514 /************************************************************************* 6540 /*************************************************************************
6515 * TrioInStreamString 6541 * TrioInStreamString
6516 */ 6542 */
6517 TRIO_PRIVATE void 6543 TRIO_PRIVATE void
(...skipping 12 matching lines...) Expand all
6530 if (self->current == NIL) 6556 if (self->current == NIL)
6531 { 6557 {
6532 self->current = EOF; 6558 self->current = EOF;
6533 } 6559 }
6534 else 6560 else
6535 { 6561 {
6536 (*buffer)++; 6562 (*buffer)++;
6537 self->processed++; 6563 self->processed++;
6538 self->committed++; 6564 self->committed++;
6539 } 6565 }
6540 6566
6541 if (VALID(intPointer)) 6567 if (VALID(intPointer))
6542 { 6568 {
6543 *intPointer = self->current; 6569 *intPointer = self->current;
6544 } 6570 }
6545 } 6571 }
6546 6572
6547 /************************************************************************* 6573 /*************************************************************************
6548 * 6574 *
6549 * Formatted scanning functions 6575 * Formatted scanning functions
6550 * 6576 *
(...skipping 20 matching lines...) Expand all
6571 TRIO_PUBLIC int 6597 TRIO_PUBLIC int
6572 trio_scanf 6598 trio_scanf
6573 TRIO_VARGS2((format, va_alist), 6599 TRIO_VARGS2((format, va_alist),
6574 TRIO_CONST char *format, 6600 TRIO_CONST char *format,
6575 TRIO_VA_DECL) 6601 TRIO_VA_DECL)
6576 { 6602 {
6577 int status; 6603 int status;
6578 va_list args; 6604 va_list args;
6579 6605
6580 assert(VALID(format)); 6606 assert(VALID(format));
6581 6607
6582 TRIO_VA_START(args, format); 6608 TRIO_VA_START(args, format);
6583 status = TrioScan((trio_pointer_t)stdin, 0, 6609 status = TrioScan((trio_pointer_t)stdin, 0,
6584 TrioInStreamFile, 6610 TrioInStreamFile,
6585 » » format, &args, NULL); 6611 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6586 TRIO_VA_END(args); 6612 TRIO_VA_END(args);
6587 return status; 6613 return status;
6588 } 6614 }
6589 6615
6590 TRIO_PUBLIC int 6616 TRIO_PUBLIC int
6591 trio_vscanf 6617 trio_vscanf
6592 TRIO_ARGS2((format, args), 6618 TRIO_ARGS2((format, args),
6593 TRIO_CONST char *format, 6619 TRIO_CONST char *format,
6594 va_list args) 6620 va_list args)
6595 { 6621 {
6596 assert(VALID(format)); 6622 assert(VALID(format));
6597 6623
6598 return TrioScan((trio_pointer_t)stdin, 0, 6624 return TrioScan((trio_pointer_t)stdin, 0,
6599 TrioInStreamFile, 6625 TrioInStreamFile,
6600 » » format, &args, NULL); 6626 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6601 } 6627 }
6602 6628
6603 TRIO_PUBLIC int 6629 TRIO_PUBLIC int
6604 trio_scanfv 6630 trio_scanfv
6605 TRIO_ARGS2((format, args), 6631 TRIO_ARGS2((format, args),
6606 TRIO_CONST char *format, 6632 TRIO_CONST char *format,
6607 trio_pointer_t *args) 6633 trio_pointer_t *args)
6608 { 6634 {
6609 assert(VALID(format)); 6635 assert(VALID(format));
6610 6636
6611 return TrioScan((trio_pointer_t)stdin, 0, 6637 return TrioScan((trio_pointer_t)stdin, 0,
6612 TrioInStreamFile, 6638 TrioInStreamFile,
6613 format, NULL, args); 6639 format, NULL, args);
6614 } 6640 }
6615 6641
6616 /************************************************************************* 6642 /*************************************************************************
6617 * fscanf 6643 * fscanf
6618 */ 6644 */
6619 TRIO_PUBLIC int 6645 TRIO_PUBLIC int
6620 trio_fscanf 6646 trio_fscanf
6621 TRIO_VARGS3((file, format, va_alist), 6647 TRIO_VARGS3((file, format, va_alist),
6622 FILE *file, 6648 FILE *file,
6623 TRIO_CONST char *format, 6649 TRIO_CONST char *format,
6624 TRIO_VA_DECL) 6650 TRIO_VA_DECL)
6625 { 6651 {
6626 int status; 6652 int status;
6627 va_list args; 6653 va_list args;
6628 6654
6629 assert(VALID(file)); 6655 assert(VALID(file));
6630 assert(VALID(format)); 6656 assert(VALID(format));
6631 6657
6632 TRIO_VA_START(args, format); 6658 TRIO_VA_START(args, format);
6633 status = TrioScan((trio_pointer_t)file, 0, 6659 status = TrioScan((trio_pointer_t)file, 0,
6634 TrioInStreamFile, 6660 TrioInStreamFile,
6635 » » format, &args, NULL); 6661 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6636 TRIO_VA_END(args); 6662 TRIO_VA_END(args);
6637 return status; 6663 return status;
6638 } 6664 }
6639 6665
6640 TRIO_PUBLIC int 6666 TRIO_PUBLIC int
6641 trio_vfscanf 6667 trio_vfscanf
6642 TRIO_ARGS3((file, format, args), 6668 TRIO_ARGS3((file, format, args),
6643 FILE *file, 6669 FILE *file,
6644 TRIO_CONST char *format, 6670 TRIO_CONST char *format,
6645 va_list args) 6671 va_list args)
6646 { 6672 {
6647 assert(VALID(file)); 6673 assert(VALID(file));
6648 assert(VALID(format)); 6674 assert(VALID(format));
6649 6675
6650 return TrioScan((trio_pointer_t)file, 0, 6676 return TrioScan((trio_pointer_t)file, 0,
6651 TrioInStreamFile, 6677 TrioInStreamFile,
6652 » » format, &args, NULL); 6678 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6653 } 6679 }
6654 6680
6655 TRIO_PUBLIC int 6681 TRIO_PUBLIC int
6656 trio_fscanfv 6682 trio_fscanfv
6657 TRIO_ARGS3((file, format, args), 6683 TRIO_ARGS3((file, format, args),
6658 FILE *file, 6684 FILE *file,
6659 TRIO_CONST char *format, 6685 TRIO_CONST char *format,
6660 trio_pointer_t *args) 6686 trio_pointer_t *args)
6661 { 6687 {
6662 assert(VALID(file)); 6688 assert(VALID(file));
6663 assert(VALID(format)); 6689 assert(VALID(format));
6664 6690
6665 return TrioScan((trio_pointer_t)file, 0, 6691 return TrioScan((trio_pointer_t)file, 0,
6666 TrioInStreamFile, 6692 TrioInStreamFile,
6667 format, NULL, args); 6693 format, NULL, args);
6668 } 6694 }
6669 6695
6670 /************************************************************************* 6696 /*************************************************************************
6671 * dscanf 6697 * dscanf
6672 */ 6698 */
6673 TRIO_PUBLIC int 6699 TRIO_PUBLIC int
6674 trio_dscanf 6700 trio_dscanf
6675 TRIO_VARGS3((fd, format, va_alist), 6701 TRIO_VARGS3((fd, format, va_alist),
6676 int fd, 6702 int fd,
6677 TRIO_CONST char *format, 6703 TRIO_CONST char *format,
6678 TRIO_VA_DECL) 6704 TRIO_VA_DECL)
6679 { 6705 {
6680 int status; 6706 int status;
6681 va_list args; 6707 va_list args;
6682 6708
6683 assert(VALID(format)); 6709 assert(VALID(format));
6684 6710
6685 TRIO_VA_START(args, format); 6711 TRIO_VA_START(args, format);
6686 status = TrioScan((trio_pointer_t)&fd, 0, 6712 status = TrioScan((trio_pointer_t)&fd, 0,
6687 TrioInStreamFileDescriptor, 6713 TrioInStreamFileDescriptor,
6688 » » format, &args, NULL); 6714 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6689 TRIO_VA_END(args); 6715 TRIO_VA_END(args);
6690 return status; 6716 return status;
6691 } 6717 }
6692 6718
6693 TRIO_PUBLIC int 6719 TRIO_PUBLIC int
6694 trio_vdscanf 6720 trio_vdscanf
6695 TRIO_ARGS3((fd, format, args), 6721 TRIO_ARGS3((fd, format, args),
6696 int fd, 6722 int fd,
6697 TRIO_CONST char *format, 6723 TRIO_CONST char *format,
6698 va_list args) 6724 va_list args)
6699 { 6725 {
6700 assert(VALID(format)); 6726 assert(VALID(format));
6701 6727
6702 return TrioScan((trio_pointer_t)&fd, 0, 6728 return TrioScan((trio_pointer_t)&fd, 0,
6703 TrioInStreamFileDescriptor, 6729 TrioInStreamFileDescriptor,
6704 » » format, &args, NULL); 6730 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6705 } 6731 }
6706 6732
6707 TRIO_PUBLIC int 6733 TRIO_PUBLIC int
6708 trio_dscanfv 6734 trio_dscanfv
6709 TRIO_ARGS3((fd, format, args), 6735 TRIO_ARGS3((fd, format, args),
6710 int fd, 6736 int fd,
6711 TRIO_CONST char *format, 6737 TRIO_CONST char *format,
6712 trio_pointer_t *args) 6738 trio_pointer_t *args)
6713 { 6739 {
6714 assert(VALID(format)); 6740 assert(VALID(format));
6715 6741
6716 return TrioScan((trio_pointer_t)&fd, 0, 6742 return TrioScan((trio_pointer_t)&fd, 0,
6717 TrioInStreamFileDescriptor, 6743 TrioInStreamFileDescriptor,
6718 format, NULL, args); 6744 format, NULL, args);
6719 } 6745 }
6720 6746
6721 /************************************************************************* 6747 /*************************************************************************
6722 * cscanf 6748 * cscanf
6723 */ 6749 */
6724 TRIO_PUBLIC int 6750 TRIO_PUBLIC int
6725 trio_cscanf 6751 trio_cscanf
6726 TRIO_VARGS4((stream, closure, format, va_alist), 6752 TRIO_VARGS4((stream, closure, format, va_alist),
6727 trio_instream_t stream, 6753 trio_instream_t stream,
6728 trio_pointer_t closure, 6754 trio_pointer_t closure,
6729 TRIO_CONST char *format, 6755 TRIO_CONST char *format,
6730 TRIO_VA_DECL) 6756 TRIO_VA_DECL)
6731 { 6757 {
6732 int status; 6758 int status;
6733 va_list args; 6759 va_list args;
6734 trio_custom_t data; 6760 trio_custom_t data;
6735 6761
6736 assert(VALID(stream)); 6762 assert(VALID(stream));
6737 assert(VALID(format)); 6763 assert(VALID(format));
6738 6764
6739 TRIO_VA_START(args, format); 6765 TRIO_VA_START(args, format);
6740 data.stream.in = stream; 6766 data.stream.in = stream;
6741 data.closure = closure; 6767 data.closure = closure;
6742 status = TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); 6768 status = TrioScan(&data, 0, TrioInStreamCustom, format, TRIO_VA_LIST_ADDR(args ), NULL);
6743 TRIO_VA_END(args); 6769 TRIO_VA_END(args);
6744 return status; 6770 return status;
6745 } 6771 }
6746 6772
6747 TRIO_PUBLIC int 6773 TRIO_PUBLIC int
6748 trio_vcscanf 6774 trio_vcscanf
6749 TRIO_ARGS4((stream, closure, format, args), 6775 TRIO_ARGS4((stream, closure, format, args),
6750 trio_instream_t stream, 6776 trio_instream_t stream,
6751 trio_pointer_t closure, 6777 trio_pointer_t closure,
6752 TRIO_CONST char *format, 6778 TRIO_CONST char *format,
6753 va_list args) 6779 va_list args)
6754 { 6780 {
6755 trio_custom_t data; 6781 trio_custom_t data;
6756 6782
6757 assert(VALID(stream)); 6783 assert(VALID(stream));
6758 assert(VALID(format)); 6784 assert(VALID(format));
6759 6785
6760 data.stream.in = stream; 6786 data.stream.in = stream;
6761 data.closure = closure; 6787 data.closure = closure;
6762 return TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); 6788 return TrioScan(&data, 0, TrioInStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL);
6763 } 6789 }
6764 6790
6765 TRIO_PUBLIC int 6791 TRIO_PUBLIC int
6766 trio_cscanfv 6792 trio_cscanfv
6767 TRIO_ARGS4((stream, closure, format, args), 6793 TRIO_ARGS4((stream, closure, format, args),
6768 trio_instream_t stream, 6794 trio_instream_t stream,
6769 trio_pointer_t closure, 6795 trio_pointer_t closure,
6770 TRIO_CONST char *format, 6796 TRIO_CONST char *format,
6771 trio_pointer_t *args) 6797 trio_pointer_t *args)
6772 { 6798 {
6773 trio_custom_t data; 6799 trio_custom_t data;
6774 6800
6775 assert(VALID(stream)); 6801 assert(VALID(stream));
6776 assert(VALID(format)); 6802 assert(VALID(format));
6777 6803
6778 data.stream.in = stream; 6804 data.stream.in = stream;
6779 data.closure = closure; 6805 data.closure = closure;
6780 return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args); 6806 return TrioScan(&data, 0, TrioInStreamCustom, format, NULL, args);
6781 } 6807 }
6782 6808
6783 /************************************************************************* 6809 /*************************************************************************
6784 * sscanf 6810 * sscanf
6785 */ 6811 */
6786 TRIO_PUBLIC int 6812 TRIO_PUBLIC int
6787 trio_sscanf 6813 trio_sscanf
6788 TRIO_VARGS3((buffer, format, va_alist), 6814 TRIO_VARGS3((buffer, format, va_alist),
6789 TRIO_CONST char *buffer, 6815 TRIO_CONST char *buffer,
6790 TRIO_CONST char *format, 6816 TRIO_CONST char *format,
6791 TRIO_VA_DECL) 6817 TRIO_VA_DECL)
6792 { 6818 {
6793 int status; 6819 int status;
6794 va_list args; 6820 va_list args;
6795 6821
6796 assert(VALID(buffer)); 6822 assert(VALID(buffer));
6797 assert(VALID(format)); 6823 assert(VALID(format));
6798 6824
6799 TRIO_VA_START(args, format); 6825 TRIO_VA_START(args, format);
6800 status = TrioScan((trio_pointer_t)&buffer, 0, 6826 status = TrioScan((trio_pointer_t)&buffer, 0,
6801 TrioInStreamString, 6827 TrioInStreamString,
6802 » » format, &args, NULL); 6828 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6803 TRIO_VA_END(args); 6829 TRIO_VA_END(args);
6804 return status; 6830 return status;
6805 } 6831 }
6806 6832
6807 TRIO_PUBLIC int 6833 TRIO_PUBLIC int
6808 trio_vsscanf 6834 trio_vsscanf
6809 TRIO_ARGS3((buffer, format, args), 6835 TRIO_ARGS3((buffer, format, args),
6810 TRIO_CONST char *buffer, 6836 TRIO_CONST char *buffer,
6811 TRIO_CONST char *format, 6837 TRIO_CONST char *format,
6812 va_list args) 6838 va_list args)
6813 { 6839 {
6814 assert(VALID(buffer)); 6840 assert(VALID(buffer));
6815 assert(VALID(format)); 6841 assert(VALID(format));
6816 6842
6817 return TrioScan((trio_pointer_t)&buffer, 0, 6843 return TrioScan((trio_pointer_t)&buffer, 0,
6818 TrioInStreamString, 6844 TrioInStreamString,
6819 » » format, &args, NULL); 6845 » » format, TRIO_VA_LIST_ADDR(args), NULL);
6820 } 6846 }
6821 6847
6822 TRIO_PUBLIC int 6848 TRIO_PUBLIC int
6823 trio_sscanfv 6849 trio_sscanfv
6824 TRIO_ARGS3((buffer, format, args), 6850 TRIO_ARGS3((buffer, format, args),
6825 TRIO_CONST char *buffer, 6851 TRIO_CONST char *buffer,
6826 TRIO_CONST char *format, 6852 TRIO_CONST char *format,
6827 trio_pointer_t *args) 6853 trio_pointer_t *args)
6828 { 6854 {
6829 assert(VALID(buffer)); 6855 assert(VALID(buffer));
6830 assert(VALID(format)); 6856 assert(VALID(format));
6831 6857
6832 return TrioScan((trio_pointer_t)&buffer, 0, 6858 return TrioScan((trio_pointer_t)&buffer, 0,
6833 TrioInStreamString, 6859 TrioInStreamString,
6834 format, NULL, args); 6860 format, NULL, args);
6835 } 6861 }
6836 6862
6837 /** @} End of Scanf documentation module */ 6863 /** @} End of Scanf documentation module */
6838 6864
6839 /************************************************************************* 6865 /*************************************************************************
6840 * trio_strerror 6866 * trio_strerror
6841 */ 6867 */
(...skipping 18 matching lines...) Expand all
6860 case TRIO_ENOMEM: 6886 case TRIO_ENOMEM:
6861 return "Out of memory"; 6887 return "Out of memory";
6862 case TRIO_ERANGE: 6888 case TRIO_ERANGE:
6863 return "Invalid range"; 6889 return "Invalid range";
6864 case TRIO_ECUSTOM: 6890 case TRIO_ECUSTOM:
6865 return "Custom error"; 6891 return "Custom error";
6866 default: 6892 default:
6867 return "Unknown"; 6893 return "Unknown";
6868 } 6894 }
6869 } 6895 }
OLDNEW
« no previous file with comments | « third_party/libxml/src/trio.h ('k') | third_party/libxml/src/triodef.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698