00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _ARGP_FMTSTREAM_H
00026 #define _ARGP_FMTSTREAM_H
00027
00028 #include <stdio.h>
00029 #include <string.h>
00030 #include <unistd.h>
00031
00032 #ifndef __attribute__
00033
00034 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
00035 # define __attribute__(Spec)
00036 # endif
00037
00038
00039 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) || __STRICT_ANSI__
00040 # define __format__ format
00041 # define __printf__ printf
00042 # endif
00043 #endif
00044
00045 #if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
00046 || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H))
00047
00048 #define ARGP_FMTSTREAM_USE_LINEWRAP
00049 #endif
00050
00051 #ifdef ARGP_FMTSTREAM_USE_LINEWRAP
00052
00053
00054
00055
00056
00057 #include <linewrap.h>
00058
00059 typedef FILE *argp_fmtstream_t;
00060
00061 #define argp_make_fmtstream line_wrap_stream
00062 #define __argp_make_fmtstream line_wrap_stream
00063 #define argp_fmtstream_free line_unwrap_stream
00064 #define __argp_fmtstream_free line_unwrap_stream
00065
00066 #define __argp_fmtstream_putc(fs,ch) putc(ch,fs)
00067 #define argp_fmtstream_putc(fs,ch) putc(ch,fs)
00068 #define __argp_fmtstream_puts(fs,str) fputs(str,fs)
00069 #define argp_fmtstream_puts(fs,str) fputs(str,fs)
00070 #define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
00071 #define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
00072 #define __argp_fmtstream_printf fprintf
00073 #define argp_fmtstream_printf fprintf
00074
00075 #define __argp_fmtstream_lmargin line_wrap_lmargin
00076 #define argp_fmtstream_lmargin line_wrap_lmargin
00077 #define __argp_fmtstream_set_lmargin line_wrap_set_lmargin
00078 #define argp_fmtstream_set_lmargin line_wrap_set_lmargin
00079 #define __argp_fmtstream_rmargin line_wrap_rmargin
00080 #define argp_fmtstream_rmargin line_wrap_rmargin
00081 #define __argp_fmtstream_set_rmargin line_wrap_set_rmargin
00082 #define argp_fmtstream_set_rmargin line_wrap_set_rmargin
00083 #define __argp_fmtstream_wmargin line_wrap_wmargin
00084 #define argp_fmtstream_wmargin line_wrap_wmargin
00085 #define __argp_fmtstream_set_wmargin line_wrap_set_wmargin
00086 #define argp_fmtstream_set_wmargin line_wrap_set_wmargin
00087 #define __argp_fmtstream_point line_wrap_point
00088 #define argp_fmtstream_point line_wrap_point
00089
00090 #else
00091
00092
00093 #ifndef __const
00094 #define __const const
00095 #endif
00096
00097 struct argp_fmtstream
00098 {
00099 FILE *stream;
00100
00101 size_t lmargin, rmargin;
00102 ssize_t wmargin;
00103
00104
00105 size_t point_offs;
00106
00107 ssize_t point_col;
00108
00109 char *buf;
00110 char *p;
00111 char *end;
00112 };
00113
00114 typedef struct argp_fmtstream *argp_fmtstream_t;
00115
00116
00117
00118
00119
00120
00121
00122 extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,
00123 size_t __lmargin,
00124 size_t __rmargin,
00125 ssize_t __wmargin);
00126 extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,
00127 size_t __lmargin,
00128 size_t __rmargin,
00129 ssize_t __wmargin);
00130
00131
00132 extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
00133 extern void argp_fmtstream_free (argp_fmtstream_t __fs);
00134
00135 extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
00136 __const char *__fmt, ...)
00137 __attribute__ ((__format__ (printf, 2, 3)));
00138 extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
00139 __const char *__fmt, ...)
00140 __attribute__ ((__format__ (printf, 2, 3)));
00141
00142 extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
00143 extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
00144
00145 extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str);
00146 extern int argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str);
00147
00148 extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs,
00149 __const char *__str, size_t __len);
00150 extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,
00151 __const char *__str, size_t __len);
00152
00153
00154 #define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin)
00155 #define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin)
00156 #define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin)
00157 #define __argp_fmtstream_lmargin argp_fmtstream_lmargin
00158 #define __argp_fmtstream_rmargin argp_fmtstream_rmargin
00159 #define __argp_fmtstream_wmargin argp_fmtstream_wmargin
00160
00161
00162 extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
00163 size_t __lmargin);
00164 extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
00165 size_t __lmargin);
00166
00167
00168 extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
00169 size_t __rmargin);
00170 extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
00171 size_t __rmargin);
00172
00173
00174 extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
00175 size_t __wmargin);
00176 extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
00177 size_t __wmargin);
00178
00179
00180 extern size_t argp_fmtstream_point (argp_fmtstream_t __fs);
00181 extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs);
00182
00183
00184 extern void _argp_fmtstream_update (argp_fmtstream_t __fs);
00185 extern void __argp_fmtstream_update (argp_fmtstream_t __fs);
00186 extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
00187 extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
00188
00189 #ifdef __OPTIMIZE__
00190
00191
00192 #if !_LIBC
00193 #define __argp_fmtstream_putc argp_fmtstream_putc
00194 #define __argp_fmtstream_puts argp_fmtstream_puts
00195 #define __argp_fmtstream_write argp_fmtstream_write
00196 #define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
00197 #define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
00198 #define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
00199 #define __argp_fmtstream_point argp_fmtstream_point
00200 #define __argp_fmtstream_update _argp_fmtstream_update
00201 #define __argp_fmtstream_ensure _argp_fmtstream_ensure
00202 #endif
00203
00204 #ifndef ARGP_FS_EI
00205 #define ARGP_FS_EI extern inline
00206 #endif
00207
00208 ARGP_FS_EI size_t
00209 __argp_fmtstream_write (argp_fmtstream_t __fs,
00210 __const char *__str, size_t __len)
00211 {
00212 if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len))
00213 {
00214 memcpy (__fs->p, __str, __len);
00215 __fs->p += __len;
00216 return __len;
00217 }
00218 else
00219 return 0;
00220 }
00221
00222 ARGP_FS_EI int
00223 __argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str)
00224 {
00225 size_t __len = strlen (__str);
00226 if (__len)
00227 {
00228 size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);
00229 return __wrote == __len ? 0 : -1;
00230 }
00231 else
00232 return 0;
00233 }
00234
00235 ARGP_FS_EI int
00236 __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)
00237 {
00238 if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1))
00239 return *__fs->p++ = __ch;
00240 else
00241 return EOF;
00242 }
00243
00244
00245 ARGP_FS_EI size_t
00246 __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)
00247 {
00248 size_t __old;
00249 if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
00250 __argp_fmtstream_update (__fs);
00251 __old = __fs->lmargin;
00252 __fs->lmargin = __lmargin;
00253 return __old;
00254 }
00255
00256
00257 ARGP_FS_EI size_t
00258 __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)
00259 {
00260 size_t __old;
00261 if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
00262 __argp_fmtstream_update (__fs);
00263 __old = __fs->rmargin;
00264 __fs->rmargin = __rmargin;
00265 return __old;
00266 }
00267
00268
00269 ARGP_FS_EI size_t
00270 __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)
00271 {
00272 size_t __old;
00273 if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
00274 __argp_fmtstream_update (__fs);
00275 __old = __fs->wmargin;
00276 __fs->wmargin = __wmargin;
00277 return __old;
00278 }
00279
00280
00281 ARGP_FS_EI size_t
00282 __argp_fmtstream_point (argp_fmtstream_t __fs)
00283 {
00284 if ((size_t) (__fs->p - __fs->buf) > __fs->point_offs)
00285 __argp_fmtstream_update (__fs);
00286 return __fs->point_col >= 0 ? __fs->point_col : 0;
00287 }
00288
00289 #if !_LIBC
00290 #undef __argp_fmtstream_putc
00291 #undef __argp_fmtstream_puts
00292 #undef __argp_fmtstream_write
00293 #undef __argp_fmtstream_set_lmargin
00294 #undef __argp_fmtstream_set_rmargin
00295 #undef __argp_fmtstream_set_wmargin
00296 #undef __argp_fmtstream_point
00297 #undef __argp_fmtstream_update
00298 #undef __argp_fmtstream_ensure
00299 #endif
00300
00301 #endif
00302
00303 #endif
00304
00305 #endif