diff options
Diffstat (limited to 'trio.c')
-rw-r--r-- | trio.c | 138 |
1 files changed, 58 insertions, 80 deletions
@@ -99,7 +99,7 @@ #endif #include <stddef.h> -#if defined( HAVE_ERRNO_H ) || defined( __VMS ) +#ifdef HAVE_ERRNO_H #include <errno.h> #endif @@ -126,23 +126,13 @@ # define TRIO_ERROR_RETURN(x,y) (-1) #endif -#ifndef VA_LIST_IS_ARRAY -#define TRIO_VA_LIST_PTR va_list * -#define TRIO_VA_LIST_ADDR(l) (&(l)) -#define TRIO_VA_LIST_DEREF(l) (*(l)) -#else -#define TRIO_VA_LIST_PTR va_list -#define TRIO_VA_LIST_ADDR(l) (l) -#define TRIO_VA_LIST_DEREF(l) (l) -#endif - typedef unsigned long trio_flags_t; /************************************************************************* * Platform specific definitions */ -#if defined(TRIO_PLATFORM_UNIX) || defined(TRIO_PLATFORM_OS400) +#if defined(TRIO_PLATFORM_UNIX) # include <unistd.h> # include <signal.h> # include <locale.h> @@ -218,7 +208,7 @@ typedef unsigned long int trio_ulonglong_t; #endif /* Maximal and fixed integer types */ -#if defined(TRIO_COMPILER_SUPPORTS_C99) && !defined( __VMS ) +#if defined(TRIO_COMPILER_SUPPORTS_C99) # include <stdint.h> typedef intmax_t trio_intmax_t; typedef uintmax_t trio_uintmax_t; @@ -226,12 +216,8 @@ typedef int8_t trio_int8_t; typedef int16_t trio_int16_t; typedef int32_t trio_int32_t; typedef int64_t trio_int64_t; -#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) || defined( __VMS ) +#elif defined(TRIO_COMPILER_SUPPORTS_UNIX98) # include <inttypes.h> -#ifdef __VMS -typedef long long int intmax_t; -typedef unsigned long long int uintmax_t; -#endif typedef intmax_t trio_intmax_t; typedef uintmax_t trio_uintmax_t; typedef int8_t trio_int8_t; @@ -322,9 +308,7 @@ typedef trio_longlong_t trio_int64_t; #define NAN_UPPER "NAN" #if !defined(HAVE_ISASCII) && !defined(isascii) -#ifndef __VMS -# define isascii(x) ((unsigned int)(x) < 128) -#endif +# define isascii(x) ((unsigned int)(x) < 128) #endif /* Various constants */ @@ -1183,7 +1167,7 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), int type, TRIO_CONST char *format, trio_parameter_t *parameters, - TRIO_VA_LIST_PTR arglist, + va_list *arglist, trio_pointer_t *argarray) { /* Count the number of times a parameter is referenced */ @@ -1961,14 +1945,14 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), if (flags & FLAGS_WIDECHAR) { parameters[i].data.wstring = (argarray == NULL) - ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_wchar_t *) + ? va_arg(*arglist, trio_wchar_t *) : (trio_wchar_t *)(argarray[num]); } else #endif { parameters[i].data.string = (argarray == NULL) - ? va_arg(TRIO_VA_LIST_DEREF(arglist), char *) + ? va_arg(*arglist, char *) : (char *)(argarray[num]); } break; @@ -1980,7 +1964,7 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), case FORMAT_COUNT: case FORMAT_UNKNOWN: parameters[i].data.pointer = (argarray == NULL) - ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t ) + ? va_arg(*arglist, trio_pointer_t ) : argarray[num]; break; @@ -1990,7 +1974,7 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), { if (argarray == NULL) parameters[i].data.pointer = - (trio_pointer_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t); + (trio_pointer_t)va_arg(*arglist, trio_pointer_t); else { if (parameters[i].type == FORMAT_CHAR) @@ -2048,36 +2032,36 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), #if defined(QUALIFIER_SIZE_T) || defined(QUALIFIER_SIZE_T_UPPER) if (parameters[i].flags & FLAGS_SIZE_T) parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), size_t) + ? (trio_uintmax_t)va_arg(*arglist, size_t) : (trio_uintmax_t)(*((size_t *)argarray[num])); else #endif #if defined(QUALIFIER_PTRDIFF_T) if (parameters[i].flags & FLAGS_PTRDIFF_T) parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), ptrdiff_t) + ? (trio_uintmax_t)va_arg(*arglist, ptrdiff_t) : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num])); else #endif #if defined(QUALIFIER_INTMAX_T) if (parameters[i].flags & FLAGS_INTMAX_T) parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_intmax_t) + ? (trio_uintmax_t)va_arg(*arglist, trio_intmax_t) : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num])); else #endif if (parameters[i].flags & FLAGS_QUAD) parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), trio_ulonglong_t) + ? (trio_uintmax_t)va_arg(*arglist, trio_ulonglong_t) : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num])); else if (parameters[i].flags & FLAGS_LONG) parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), long) + ? (trio_uintmax_t)va_arg(*arglist, long) : (trio_uintmax_t)(*((long *)argarray[num])); else { if (argarray == NULL) - parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), int); + parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(*arglist, int); else { if (parameters[i].type == FORMAT_CHAR) @@ -2098,11 +2082,11 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), */ if (parameters[i].flags & FLAGS_USER_DEFINED) parameters[i].data.pointer = (argarray == NULL) - ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_pointer_t ) + ? va_arg(*arglist, trio_pointer_t ) : argarray[num]; else parameters[i].data.number.as_unsigned = (argarray == NULL) - ? (trio_uintmax_t)va_arg(TRIO_VA_LIST_DEREF(arglist), int) + ? (trio_uintmax_t)va_arg(*arglist, int) : (trio_uintmax_t)(*((int *)argarray[num])); break; @@ -2111,17 +2095,17 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), { if (parameters[i].flags & FLAGS_LONGDOUBLE) parameters[i].data.longdoublePointer = (argarray == NULL) - ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_long_double_t *) + ? va_arg(*arglist, trio_long_double_t *) : (trio_long_double_t *)argarray[num]; else { if (parameters[i].flags & FLAGS_LONG) parameters[i].data.doublePointer = (argarray == NULL) - ? va_arg(TRIO_VA_LIST_DEREF(arglist), double *) + ? va_arg(*arglist, double *) : (double *)argarray[num]; else parameters[i].data.doublePointer = (argarray == NULL) - ? (double *)va_arg(TRIO_VA_LIST_DEREF(arglist), float *) + ? (double *)va_arg(*arglist, float *) : (double *)((float *)argarray[num]); } } @@ -2129,13 +2113,13 @@ TRIO_ARGS5((type, format, parameters, arglist, argarray), { if (parameters[i].flags & FLAGS_LONGDOUBLE) parameters[i].data.longdoubleNumber = (argarray == NULL) - ? va_arg(TRIO_VA_LIST_DEREF(arglist), trio_long_double_t) + ? va_arg(*arglist, trio_long_double_t) : (trio_long_double_t)(*((trio_long_double_t *)argarray[num])); else { if (argarray == NULL) parameters[i].data.longdoubleNumber = - (trio_long_double_t)va_arg(TRIO_VA_LIST_DEREF(arglist), double); + (trio_long_double_t)va_arg(*arglist, double); else { if (parameters[i].flags & FLAGS_SHORT) @@ -3400,7 +3384,7 @@ TrioFormatRef TRIO_ARGS4((reference, format, arglist, argarray), trio_reference_t *reference, TRIO_CONST char *format, - TRIO_VA_LIST_PTR arglist, + va_list *arglist, trio_pointer_t *argarray) { int status; @@ -3428,7 +3412,7 @@ TRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray), size_t destinationSize, void (*OutStream) TRIO_PROTO((trio_class_t *, int)), TRIO_CONST char *format, - TRIO_VA_LIST_PTR arglist, + va_list *arglist, trio_pointer_t *argarray) { int status; @@ -3654,7 +3638,7 @@ TRIO_VARGS2((format, va_alist), assert(VALID(format)); TRIO_VA_START(args, format); - status = TrioFormat(stdout, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL); + status = TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); TRIO_VA_END(args); return status; } @@ -3674,7 +3658,7 @@ TRIO_ARGS2((format, args), { assert(VALID(format)); - return TrioFormat(stdout, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL); + return TrioFormat(stdout, 0, TrioOutStreamFile, format, &args, NULL); } /** @@ -3721,7 +3705,7 @@ TRIO_VARGS3((file, format, va_alist), assert(VALID(format)); TRIO_VA_START(args, format); - status = TrioFormat(file, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL); + status = TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); TRIO_VA_END(args); return status; } @@ -3744,7 +3728,7 @@ TRIO_ARGS3((file, format, args), assert(VALID(file)); assert(VALID(format)); - return TrioFormat(file, 0, TrioOutStreamFile, format, TRIO_VA_LIST_ADDR(args), NULL); + return TrioFormat(file, 0, TrioOutStreamFile, format, &args, NULL); } /** @@ -3793,7 +3777,7 @@ TRIO_VARGS3((fd, format, va_alist), assert(VALID(format)); TRIO_VA_START(args, format); - status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, TRIO_VA_LIST_ADDR(args), NULL); + status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); TRIO_VA_END(args); return status; } @@ -3815,7 +3799,7 @@ TRIO_ARGS3((fd, format, args), { assert(VALID(format)); - return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, TRIO_VA_LIST_ADDR(args), NULL); + return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, &args, NULL); } /** @@ -3859,7 +3843,7 @@ TRIO_VARGS4((stream, closure, format, va_alist), TRIO_VA_START(args, format); data.stream.out = stream; data.closure = closure; - status = TrioFormat(&data, 0, TrioOutStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL); + status = TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); TRIO_VA_END(args); return status; } @@ -3879,7 +3863,7 @@ TRIO_ARGS4((stream, closure, format, args), data.stream.out = stream; data.closure = closure; - return TrioFormat(&data, 0, TrioOutStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL); + return TrioFormat(&data, 0, TrioOutStreamCustom, format, &args, NULL); } TRIO_PUBLIC int @@ -3926,7 +3910,7 @@ TRIO_VARGS3((buffer, format, va_alist), assert(VALID(format)); TRIO_VA_START(args, format); - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, TRIO_VA_LIST_ADDR(args), NULL); + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); *buffer = NIL; /* Terminate with NIL character */ TRIO_VA_END(args); return status; @@ -3952,7 +3936,7 @@ TRIO_ARGS3((buffer, format, args), assert(VALID(buffer)); assert(VALID(format)); - status = TrioFormat(&buffer, 0, TrioOutStreamString, format, TRIO_VA_LIST_ADDR(args), NULL); + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, &args, NULL); *buffer = NIL; return status; } @@ -4011,7 +3995,7 @@ TRIO_VARGS4((buffer, max, format, va_alist), TRIO_VA_START(args, format); status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, - TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL); + TrioOutStreamStringMax, format, &args, NULL); if (max > 0) *buffer = NIL; TRIO_VA_END(args); @@ -4041,7 +4025,7 @@ TRIO_ARGS4((buffer, max, format, args), assert(VALID(format)); status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, - TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL); + TrioOutStreamStringMax, format, &args, NULL); if (max > 0) *buffer = NIL; return status; @@ -4102,7 +4086,7 @@ TRIO_VARGS4((buffer, max, format, va_alist), buffer = &buffer[buf_len]; status = TrioFormat(&buffer, max - 1 - buf_len, - TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL); + TrioOutStreamStringMax, format, &args, NULL); TRIO_VA_END(args); *buffer = NIL; return status; @@ -4125,7 +4109,7 @@ TRIO_ARGS4((buffer, max, format, args), buf_len = trio_length(buffer); buffer = &buffer[buf_len]; status = TrioFormat(&buffer, max - 1 - buf_len, - TrioOutStreamStringMax, format, TRIO_VA_LIST_ADDR(args), NULL); + TrioOutStreamStringMax, format, &args, NULL); *buffer = NIL; return status; } @@ -4152,7 +4136,7 @@ TRIO_VARGS2((format, va_alist), { TRIO_VA_START(args, format); (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); TRIO_VA_END(args); trio_string_terminate(info); @@ -4178,7 +4162,7 @@ TRIO_ARGS2((format, args), if (info) { (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); trio_string_terminate(info); result = trio_string_extract(info); trio_string_destroy(info); @@ -4210,7 +4194,7 @@ TRIO_VARGS3((result, format, va_alist), { TRIO_VA_START(args, format); status = TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); TRIO_VA_END(args); if (status >= 0) { @@ -4244,7 +4228,7 @@ TRIO_ARGS3((result, format, args), else { status = TrioFormat(info, 0, TrioOutStreamStringDynamic, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); if (status >= 0) { trio_string_terminate(info); @@ -4946,7 +4930,7 @@ TRIO_VARGS3((ref, format, va_alist), assert(VALID(format)); TRIO_VA_START(arglist, format); - status = TrioFormatRef((trio_reference_t *)ref, format, TRIO_VA_LIST_ADDR(arglist), NULL); + status = TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); TRIO_VA_END(arglist); return status; } @@ -4963,7 +4947,7 @@ TRIO_ARGS3((ref, format, arglist), { assert(VALID(format)); - return TrioFormatRef((trio_reference_t *)ref, format, TRIO_VA_LIST_ADDR(arglist), NULL); + return TrioFormatRef((trio_reference_t *)ref, format, &arglist, NULL); } /************************************************************************* @@ -6390,7 +6374,7 @@ TRIO_ARGS6((source, sourceSize, InStream, format, arglist, argarray), size_t sourceSize, void (*InStream) TRIO_PROTO((trio_class_t *, int *)), TRIO_CONST char *format, - TRIO_VA_LIST_PTR arglist, + va_list *arglist, trio_pointer_t *argarray) { int status; @@ -6434,14 +6418,11 @@ TRIO_ARGS2((self, intPointer), trio_class_t *self, int *intPointer) { - FILE *file; + FILE *file = (FILE *)self->location; assert(VALID(self)); - assert(VALID(self->location)); assert(VALID(file)); - file = (FILE *)self->location; - self->current = fgetc(file); if (self->current == EOF) { @@ -6470,14 +6451,11 @@ TRIO_ARGS2((self, intPointer), trio_class_t *self, int *intPointer) { - int fd; + int fd = *((int *)self->location); int size; unsigned char input; assert(VALID(self)); - assert(VALID(self->location)); - - fd = *((int *)self->location); size = read(fd, &input, sizeof(char)); if (size == -1) @@ -6608,7 +6586,7 @@ TRIO_VARGS2((format, va_alist), TRIO_VA_START(args, format); status = TrioScan((trio_pointer_t)stdin, 0, TrioInStreamFile, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); TRIO_VA_END(args); return status; } @@ -6623,7 +6601,7 @@ TRIO_ARGS2((format, args), return TrioScan((trio_pointer_t)stdin, 0, TrioInStreamFile, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); } TRIO_PUBLIC int @@ -6658,7 +6636,7 @@ TRIO_VARGS3((file, format, va_alist), TRIO_VA_START(args, format); status = TrioScan((trio_pointer_t)file, 0, TrioInStreamFile, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); TRIO_VA_END(args); return status; } @@ -6675,7 +6653,7 @@ TRIO_ARGS3((file, format, args), return TrioScan((trio_pointer_t)file, 0, TrioInStreamFile, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); } TRIO_PUBLIC int @@ -6711,7 +6689,7 @@ TRIO_VARGS3((fd, format, va_alist), TRIO_VA_START(args, format); status = TrioScan((trio_pointer_t)&fd, 0, TrioInStreamFileDescriptor, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); TRIO_VA_END(args); return status; } @@ -6727,7 +6705,7 @@ TRIO_ARGS3((fd, format, args), return TrioScan((trio_pointer_t)&fd, 0, TrioInStreamFileDescriptor, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); } TRIO_PUBLIC int @@ -6765,7 +6743,7 @@ TRIO_VARGS4((stream, closure, format, va_alist), TRIO_VA_START(args, format); data.stream.in = stream; data.closure = closure; - status = TrioScan(&data, 0, TrioInStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL); + status = TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); TRIO_VA_END(args); return status; } @@ -6785,7 +6763,7 @@ TRIO_ARGS4((stream, closure, format, args), data.stream.in = stream; data.closure = closure; - return TrioScan(&data, 0, TrioInStreamCustom, format, TRIO_VA_LIST_ADDR(args), NULL); + return TrioScan(&data, 0, TrioInStreamCustom, format, &args, NULL); } TRIO_PUBLIC int @@ -6825,7 +6803,7 @@ TRIO_VARGS3((buffer, format, va_alist), TRIO_VA_START(args, format); status = TrioScan((trio_pointer_t)&buffer, 0, TrioInStreamString, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); TRIO_VA_END(args); return status; } @@ -6842,7 +6820,7 @@ TRIO_ARGS3((buffer, format, args), return TrioScan((trio_pointer_t)&buffer, 0, TrioInStreamString, - format, TRIO_VA_LIST_ADDR(args), NULL); + format, &args, NULL); } TRIO_PUBLIC int |