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 */
|
---|