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(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# define printf trio_printf 159#endif 160#ifndef HAVE_VPRINTF 161# define vprintf trio_vprintf 162#endif 163#ifndef HAVE_FPRINTF 164# define fprintf trio_fprintf 165#endif 166#ifndef HAVE_VFPRINTF 167# define vfprintf trio_vfprintf 168#endif 169#ifndef HAVE_SPRINTF 170# define sprintf trio_sprintf 171#endif 172#ifndef HAVE_VSPRINTF 173# define vsprintf trio_vsprintf 174#endif 175#ifndef HAVE_SNPRINTF 176# define snprintf trio_snprintf 177#endif 178#ifndef HAVE_VSNPRINTF 179# define vsnprintf trio_vsnprintf 180#endif 181#ifndef HAVE_SCANF 182# define scanf trio_scanf 183#endif 184#ifndef HAVE_VSCANF 185# define vscanf trio_vscanf 186#endif 187#ifndef HAVE_FSCANF 188# define fscanf trio_fscanf 189#endif 190#ifndef HAVE_VFSCANF 191# define vfscanf trio_vfscanf 192#endif 193#ifndef HAVE_SSCANF 194# define sscanf trio_sscanf 195#endif 196#ifndef HAVE_VSSCANF 197# define vsscanf trio_vsscanf 198#endif 199/* These aren't stdio functions, but we make them look similar */ 200#define dprintf trio_dprintf 201#define vdprintf trio_vdprintf 202#define aprintf trio_aprintf 203#define vaprintf trio_vaprintf 204#define asprintf trio_asprintf 205#define vasprintf trio_vasprintf 206#define dscanf trio_dscanf 207#define vdscanf trio_vdscanf 208#endif 209 210#ifdef __cplusplus 211} /* extern "C" */ 212#endif 213 214#endif /* WITHOUT_TRIO */ 215 216#endif /* TRIO_TRIO_H */ 217