1/************************************************************************* 2 * 3 * $Id$ 4 * 5 * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. 6 * 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 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 12 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 13 * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND 14 * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. 15 * 16 ************************************************************************* 17 * 18 * http://ctrio.sourceforge.net/ 19 * 20 ************************************************************************/ 21 22#ifndef TRIO_TRIO_H 23#define TRIO_TRIO_H 24 25#if !defined(WITHOUT_TRIO) 26 27/* 28 * Use autoconf defines if present. Packages using trio must define 29 * HAVE_CONFIG_H as a compiler option themselves. 30 */ 31#if defined(TRIO_HAVE_CONFIG_H) 32# include "config.h" 33#endif 34 35#include "triodef.h" 36 37#include <stdio.h> 38#include <stdlib.h> 39#if defined(TRIO_COMPILER_ANCIENT) 40# include <varargs.h> 41#else 42# include <stdarg.h> 43#endif 44 45#ifdef __cplusplus 46extern "C" { 47#endif 48 49/* 50 * Error codes. 51 * 52 * Remember to add a textual description to trio_strerror. 53 */ 54enum { 55 TRIO_EOF = 1, 56 TRIO_EINVAL = 2, 57 TRIO_ETOOMANY = 3, 58 TRIO_EDBLREF = 4, 59 TRIO_EGAP = 5, 60 TRIO_ENOMEM = 6, 61 TRIO_ERANGE = 7, 62 TRIO_ERRNO = 8, 63 TRIO_ECUSTOM = 9 64}; 65 66/* Error macros */ 67#define TRIO_ERROR_CODE(x) ((-(x)) & 0x00FF) 68#define TRIO_ERROR_POSITION(x) ((-(x)) >> 8) 69#define TRIO_ERROR_NAME(x) trio_strerror(x) 70 71typedef int (*trio_outstream_t) TRIO_PROTO((trio_pointer_t, int)); 72typedef int (*trio_instream_t) TRIO_PROTO((trio_pointer_t)); 73 74TRIO_CONST char *trio_strerror TRIO_PROTO((int)); 75 76/************************************************************************* 77 * Print Functions 78 */ 79 80int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)); 81int trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); 82int trio_printfv TRIO_PROTO((TRIO_CONST char *format, void **args)); 83 84int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); 85int trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); 86int trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); 87 88int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); 89int trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); 90int trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); 91 92int trio_cprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, 93 TRIO_CONST char *format, ...)); 94int trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, 95 TRIO_CONST char *format, va_list args)); 96int trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, 97 TRIO_CONST char *format, void **args)); 98 99int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)); 100int trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args)); 101int trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, void **args)); 102 103int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); 104int trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, 105 va_list args)); 106int trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, 107 void **args)); 108 109int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); 110int trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, 111 va_list args)); 112 113char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)); 114char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); 115 116int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)); 117int trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args)); 118 119/************************************************************************* 120 * Scan Functions 121 */ 122int trio_scanf TRIO_PROTO((TRIO_CONST char *format, ...)); 123int trio_vscanf TRIO_PROTO((TRIO_CONST char *format, va_list args)); 124int trio_scanfv TRIO_PROTO((TRIO_CONST char *format, void **args)); 125 126int trio_fscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); 127int trio_vfscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); 128int trio_fscanfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); 129 130int trio_dscanf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); 131int trio_vdscanf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); 132int trio_dscanfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); 133 134int trio_cscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, 135 TRIO_CONST char *format, ...)); 136int trio_vcscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, 137 TRIO_CONST char *format, va_list args)); 138int trio_cscanfv TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, 139 TRIO_CONST char *format, void **args)); 140 141int trio_sscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, ...)); 142int trio_vsscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, va_list args)); 143int trio_sscanfv TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, void **args)); 144 145/************************************************************************* 146 * Locale Functions 147 */ 148void trio_locale_set_decimal_point TRIO_PROTO((char *decimalPoint)); 149void trio_locale_set_thousand_separator TRIO_PROTO((char *thousandSeparator)); 150void trio_locale_set_grouping TRIO_PROTO((char *grouping)); 151 152/************************************************************************* 153 * Renaming 154 */ 155#ifdef TRIO_REPLACE_STDIO 156/* Replace the <stdio.h> functions */ 157#ifndef HAVE_PRINTF 158# undef printf 159# define printf trio_printf 160#endif 161#ifndef HAVE_VPRINTF 162# undef vprintf 163# define vprintf trio_vprintf 164#endif 165#ifndef HAVE_FPRINTF 166# undef fprintf 167# define fprintf trio_fprintf 168#endif 169#ifndef HAVE_VFPRINTF 170# undef vfprintf 171# define vfprintf trio_vfprintf 172#endif 173#ifndef HAVE_SPRINTF 174# undef sprintf 175# define sprintf trio_sprintf 176#endif 177#ifndef HAVE_VSPRINTF 178# undef vsprintf 179# define vsprintf trio_vsprintf 180#endif 181#ifndef HAVE_SNPRINTF 182# undef snprintf 183# define snprintf trio_snprintf 184#endif 185#ifndef HAVE_VSNPRINTF 186# undef vsnprintf 187# define vsnprintf trio_vsnprintf 188#endif 189#ifndef HAVE_SCANF 190# undef scanf 191# define scanf trio_scanf 192#endif 193#ifndef HAVE_VSCANF 194# undef vscanf 195# define vscanf trio_vscanf 196#endif 197#ifndef HAVE_FSCANF 198# undef fscanf 199# define fscanf trio_fscanf 200#endif 201#ifndef HAVE_VFSCANF 202# undef vfscanf 203# define vfscanf trio_vfscanf 204#endif 205#ifndef HAVE_SSCANF 206# undef sscanf 207# define sscanf trio_sscanf 208#endif 209#ifndef HAVE_VSSCANF 210# undef vsscanf 211# define vsscanf trio_vsscanf 212#endif 213/* These aren't stdio functions, but we make them look similar */ 214#define dprintf trio_dprintf 215#define vdprintf trio_vdprintf 216#define aprintf trio_aprintf 217#define vaprintf trio_vaprintf 218#define asprintf trio_asprintf 219#define vasprintf trio_vasprintf 220#define dscanf trio_dscanf 221#define vdscanf trio_vdscanf 222#endif 223 224#ifdef __cplusplus 225} /* extern "C" */ 226#endif 227 228#endif /* WITHOUT_TRIO */ 229 230#endif /* TRIO_TRIO_H */ 231