trio.h 7.25 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*************************************************************************
 *
 * $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
 * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
 * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
 *
16 17 18 19
 *************************************************************************
 *
 * http://ctrio.sourceforge.net/
 *
20 21
 ************************************************************************/

22 23
#ifndef TRIO_TRIO_H
#define TRIO_TRIO_H
24

25
#if !defined(WITHOUT_TRIO)
26

27 28 29 30
/*
 * Use autoconf defines if present. Packages using trio must define
 * HAVE_CONFIG_H as a compiler option themselves.
 */
31
#if defined(TRIO_HAVE_CONFIG_H)
32
# include "config.h"
33 34
#endif

35
#include "triodef.h"
36

37 38 39 40 41 42 43 44
#include <stdio.h>
#include <stdlib.h>
#if defined(TRIO_COMPILER_ANCIENT)
# include <varargs.h>
#else
# include <stdarg.h>
#endif

45 46 47 48
#ifdef __cplusplus
extern "C" {
#endif

49 50 51 52 53 54 55 56 57 58 59 60
/*
 * 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,
61
  TRIO_ERANGE   = 7,
62 63
  TRIO_ERRNO    = 8,
  TRIO_ECUSTOM  = 9
64 65
};

66 67 68 69 70 71 72 73 74
/* 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));
75 76 77

/*************************************************************************
 * Print Functions
78 79
 */

80 81 82
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));
83

84 85 86
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));
87

88 89 90
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));
91

92 93 94 95 96 97 98 99 100 101
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));
102

103 104 105 106 107
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));
108

109 110 111
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));
112

113 114
char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...));
char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args));
115

116 117
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));
118

119 120 121
/*************************************************************************
 * Scan Functions
 */
122 123 124 125 126 127 128
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));
129

130 131 132
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));
133

134 135 136 137 138 139
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));
140

141 142 143 144 145 146 147 148 149 150
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));
151

152 153 154
/*************************************************************************
 * Renaming
 */
155 156
#ifdef TRIO_REPLACE_STDIO
/* Replace the <stdio.h> functions */
157
#ifndef HAVE_PRINTF
158
# undef printf
159 160 161
# define printf trio_printf
#endif
#ifndef HAVE_VPRINTF
162
# undef vprintf
163 164 165
# define vprintf trio_vprintf
#endif
#ifndef HAVE_FPRINTF
166
# undef fprintf
167 168 169
# define fprintf trio_fprintf
#endif
#ifndef HAVE_VFPRINTF
170
# undef vfprintf
171 172 173
# define vfprintf trio_vfprintf
#endif
#ifndef HAVE_SPRINTF
174
# undef sprintf
175 176 177
# define sprintf trio_sprintf
#endif
#ifndef HAVE_VSPRINTF
178
# undef vsprintf
179 180 181
# define vsprintf trio_vsprintf
#endif
#ifndef HAVE_SNPRINTF
182
# undef snprintf
183 184 185
# define snprintf trio_snprintf
#endif
#ifndef HAVE_VSNPRINTF
186
# undef vsnprintf
187 188 189
# define vsnprintf trio_vsnprintf
#endif
#ifndef HAVE_SCANF
190
# undef scanf
191 192 193
# define scanf trio_scanf
#endif
#ifndef HAVE_VSCANF
194
# undef vscanf
195 196 197
# define vscanf trio_vscanf
#endif
#ifndef HAVE_FSCANF
198
# undef fscanf
199 200 201
# define fscanf trio_fscanf
#endif
#ifndef HAVE_VFSCANF
202
# undef vfscanf
203 204 205
# define vfscanf trio_vfscanf
#endif
#ifndef HAVE_SSCANF
206
# undef sscanf
207 208 209
# define sscanf trio_sscanf
#endif
#ifndef HAVE_VSSCANF
210
# undef vsscanf
211 212
# define vsscanf trio_vsscanf
#endif
213 214 215 216 217 218 219 220 221 222 223
/* 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

224 225 226 227 228
#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* WITHOUT_TRIO */
229 230

#endif /* TRIO_TRIO_H */