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 * MERCHANTABILITY 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 46 extern "C" { 47 #endif 48 49 /* 50 * Error codes. 51 * 52 * Remember to add a textual description to trio_strerror. 53 */ 54 enum { 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 71 typedef int (*trio_outstream_t) TRIO_PROTO((trio_pointer_t, int)); 72 typedef int (*trio_instream_t) TRIO_PROTO((trio_pointer_t)); 73 74 TRIO_CONST char *trio_strerror TRIO_PROTO((int)); 75 76 /************************************************************************* 77 * Print Functions 78 */ 79 80 int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)); 81 int trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); 82 int trio_printfv TRIO_PROTO((TRIO_CONST char *format, void **args)); 83 84 int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); 85 int trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); 86 int trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); 87 88 int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); 89 int trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); 90 int trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); 91 92 int trio_cprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, 93 TRIO_CONST char *format, ...)); 94 int trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, 95 TRIO_CONST char *format, va_list args)); 96 int trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, 97 TRIO_CONST char *format, void **args)); 98 99 int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)); 100 int trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args)); 101 int trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, void **args)); 102 103 int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); 104 int trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, 105 va_list args)); 106 int trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, 107 void **args)); 108 109 int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); 110 int trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, 111 va_list args)); 112 113 char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)); 114 char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); 115 116 int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)); 117 int trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args)); 118 119 /************************************************************************* 120 * Scan Functions 121 */ 122 int trio_scanf TRIO_PROTO((TRIO_CONST char *format, ...)); 123 int trio_vscanf TRIO_PROTO((TRIO_CONST char *format, va_list args)); 124 int trio_scanfv TRIO_PROTO((TRIO_CONST char *format, void **args)); 125 126 int trio_fscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); 127 int trio_vfscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); 128 int trio_fscanfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); 129 130 int trio_dscanf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); 131 int trio_vdscanf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); 132 int trio_dscanfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); 133 134 int trio_cscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, 135 TRIO_CONST char *format, ...)); 136 int trio_vcscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, 137 TRIO_CONST char *format, va_list args)); 138 int trio_cscanfv TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, 139 TRIO_CONST char *format, void **args)); 140 141 int trio_sscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, ...)); 142 int trio_vsscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, va_list args)); 143 int trio_sscanfv TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, void **args)); 144 145 /************************************************************************* 146 * Locale Functions 147 */ 148 void trio_locale_set_decimal_point TRIO_PROTO((char *decimalPoint)); 149 void trio_locale_set_thousand_separator TRIO_PROTO((char *thousandSeparator)); 150 void 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