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