| /************************************************************************* |
| * |
| * $Id$ |
| * |
| * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. |
| * |
| * Permission to use, copy, modify, and distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND |
| * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. |
| * |
| ************************************************************************* |
| * |
| * http://ctrio.sourceforge.net/ |
| * |
| ************************************************************************/ |
| |
| #ifndef TRIO_TRIO_H |
| #define TRIO_TRIO_H |
| |
| #if !defined(WITHOUT_TRIO) |
| |
| /* |
| * Use autoconf defines if present. Packages using trio must define |
| * HAVE_CONFIG_H as a compiler option themselves. |
| */ |
| #if defined(TRIO_HAVE_CONFIG_H) |
| # include "config.h" |
| #endif |
| |
| #include "triodef.h" |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #if defined(TRIO_COMPILER_ANCIENT) |
| # include <varargs.h> |
| #else |
| # include <stdarg.h> |
| #endif |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* |
| * Error codes. |
| * |
| * Remember to add a textual description to trio_strerror. |
| */ |
| enum { |
| TRIO_EOF = 1, |
| TRIO_EINVAL = 2, |
| TRIO_ETOOMANY = 3, |
| TRIO_EDBLREF = 4, |
| TRIO_EGAP = 5, |
| TRIO_ENOMEM = 6, |
| TRIO_ERANGE = 7, |
| TRIO_ERRNO = 8, |
| TRIO_ECUSTOM = 9 |
| }; |
| |
| /* Error macros */ |
| #define TRIO_ERROR_CODE(x) ((-(x)) & 0x00FF) |
| #define TRIO_ERROR_POSITION(x) ((-(x)) >> 8) |
| #define TRIO_ERROR_NAME(x) trio_strerror(x) |
| |
| typedef int (*trio_outstream_t) TRIO_PROTO((trio_pointer_t, int)); |
| typedef int (*trio_instream_t) TRIO_PROTO((trio_pointer_t)); |
| |
| TRIO_CONST char *trio_strerror TRIO_PROTO((int)); |
| |
| /************************************************************************* |
| * Print Functions |
| */ |
| |
| int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)); |
| int trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); |
| int trio_printfv TRIO_PROTO((TRIO_CONST char *format, void **args)); |
| |
| int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); |
| int trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); |
| int trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); |
| |
| int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); |
| int trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); |
| int trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); |
| |
| int trio_cprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, |
| TRIO_CONST char *format, ...)); |
| int trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, |
| TRIO_CONST char *format, va_list args)); |
| int trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, |
| TRIO_CONST char *format, void **args)); |
| |
| int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)); |
| int trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args)); |
| int trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, void **args)); |
| |
| int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); |
| int trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, |
| va_list args)); |
| int trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, |
| void **args)); |
| |
| int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); |
| int trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, |
| va_list args)); |
| |
| char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)); |
| char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); |
| |
| int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)); |
| int trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args)); |
| |
| /************************************************************************* |
| * Scan Functions |
| */ |
| int trio_scanf TRIO_PROTO((TRIO_CONST char *format, ...)); |
| int trio_vscanf TRIO_PROTO((TRIO_CONST char *format, va_list args)); |
| int trio_scanfv TRIO_PROTO((TRIO_CONST char *format, void **args)); |
| |
| int trio_fscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); |
| int trio_vfscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); |
| int trio_fscanfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); |
| |
| int trio_dscanf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); |
| int trio_vdscanf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); |
| int trio_dscanfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); |
| |
| int trio_cscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, |
| TRIO_CONST char *format, ...)); |
| int trio_vcscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, |
| TRIO_CONST char *format, va_list args)); |
| int trio_cscanfv TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, |
| TRIO_CONST char *format, void **args)); |
| |
| int trio_sscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, ...)); |
| int trio_vsscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, va_list args)); |
| int trio_sscanfv TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, void **args)); |
| |
| /************************************************************************* |
| * Locale Functions |
| */ |
| void trio_locale_set_decimal_point TRIO_PROTO((char *decimalPoint)); |
| void trio_locale_set_thousand_separator TRIO_PROTO((char *thousandSeparator)); |
| void trio_locale_set_grouping TRIO_PROTO((char *grouping)); |
| |
| /************************************************************************* |
| * Renaming |
| */ |
| #ifdef TRIO_REPLACE_STDIO |
| /* Replace the <stdio.h> functions */ |
| #ifndef HAVE_PRINTF |
| # undef printf |
| # define printf trio_printf |
| #endif |
| #ifndef HAVE_VPRINTF |
| # undef vprintf |
| # define vprintf trio_vprintf |
| #endif |
| #ifndef HAVE_FPRINTF |
| # undef fprintf |
| # define fprintf trio_fprintf |
| #endif |
| #ifndef HAVE_VFPRINTF |
| # undef vfprintf |
| # define vfprintf trio_vfprintf |
| #endif |
| #ifndef HAVE_SPRINTF |
| # undef sprintf |
| # define sprintf trio_sprintf |
| #endif |
| #ifndef HAVE_VSPRINTF |
| # undef vsprintf |
| # define vsprintf trio_vsprintf |
| #endif |
| #ifndef HAVE_SNPRINTF |
| # undef snprintf |
| # define snprintf trio_snprintf |
| #endif |
| #ifndef HAVE_VSNPRINTF |
| # undef vsnprintf |
| # define vsnprintf trio_vsnprintf |
| #endif |
| #ifndef HAVE_SCANF |
| # undef scanf |
| # define scanf trio_scanf |
| #endif |
| #ifndef HAVE_VSCANF |
| # undef vscanf |
| # define vscanf trio_vscanf |
| #endif |
| #ifndef HAVE_FSCANF |
| # undef fscanf |
| # define fscanf trio_fscanf |
| #endif |
| #ifndef HAVE_VFSCANF |
| # undef vfscanf |
| # define vfscanf trio_vfscanf |
| #endif |
| #ifndef HAVE_SSCANF |
| # undef sscanf |
| # define sscanf trio_sscanf |
| #endif |
| #ifndef HAVE_VSSCANF |
| # undef vsscanf |
| # define vsscanf trio_vsscanf |
| #endif |
| /* These aren't stdio functions, but we make them look similar */ |
| #define dprintf trio_dprintf |
| #define vdprintf trio_vdprintf |
| #define aprintf trio_aprintf |
| #define vaprintf trio_vaprintf |
| #define asprintf trio_asprintf |
| #define vasprintf trio_vasprintf |
| #define dscanf trio_dscanf |
| #define vdscanf trio_vdscanf |
| #endif |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif |
| |
| #endif /* WITHOUT_TRIO */ |
| |
| #endif /* TRIO_TRIO_H */ |