~ubuntu-branches/ubuntu/raring/ifile/raring

« back to all changes in this revision

Viewing changes to argp/argp-fmtstream.h

  • Committer: Bazaar Package Importer
  • Author(s): Jens Peter Secher
  • Date: 2004-11-19 23:30:24 UTC
  • Revision ID: james.westby@ubuntu.com-20041119233024-3s7sqpy963jx22eu
Tags: upstream-1.3.4
ImportĀ upstreamĀ versionĀ 1.3.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Word-wrapping and line-truncating streams.
 
2
   Copyright (C) 1997 Free Software Foundation, Inc.
 
3
   This file is part of the GNU C Library.
 
4
   Written by Miles Bader <miles@gnu.ai.mit.edu>.
 
5
 
 
6
   The GNU C Library is free software; you can redistribute it and/or
 
7
   modify it under the terms of the GNU Library General Public License as
 
8
   published by the Free Software Foundation; either version 2 of the
 
9
   License, or (at your option) any later version.
 
10
 
 
11
   The GNU C Library is distributed in the hope that it will be useful,
 
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
   Library General Public License for more details.
 
15
 
 
16
   You should have received a copy of the GNU Library General Public
 
17
   License along with the GNU C Library; see the file COPYING.LIB.  If not,
 
18
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 
19
   Boston, MA 02111-1307, USA.  */
 
20
 
 
21
/* This package emulates glibc `line_wrap_stream' semantics for systems that
 
22
   don't have that.  If the system does have it, it is just a wrapper for
 
23
   that.  This header file is only used internally while compiling argp, and
 
24
   shouldn't be installed.  */
 
25
 
 
26
#ifndef __ARGP_FMTSTREAM_H__
 
27
#define __ARGP_FMTSTREAM_H__
 
28
 
 
29
#ifdef HAVE_CONFIG_H
 
30
#include <config.h>
 
31
#endif
 
32
 
 
33
#include <stdio.h>
 
34
#include <string.h>
 
35
#include <unistd.h>
 
36
 
 
37
#if    (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
 
38
    || (defined (__GNU_LIBRARY__) && defined (HAVE_LINEWRAP_H))
 
39
/* line_wrap_stream is available, so use that.  */
 
40
#define ARGP_FMTSTREAM_USE_LINEWRAP
 
41
#endif
 
42
 
 
43
#ifdef ARGP_FMTSTREAM_USE_LINEWRAP
 
44
/* Just be a simple wrapper for line_wrap_stream; the semantics are
 
45
   *slightly* different, as line_wrap_stream doesn't actually make a new
 
46
   object, it just modifies the given stream (reversibly) to do
 
47
   line-wrapping.  Since we control who uses this code, it doesn't matter.  */
 
48
 
 
49
#include <linewrap.h>
 
50
 
 
51
typedef FILE *argp_fmtstream_t;
 
52
 
 
53
#define argp_make_fmtstream line_wrap_stream
 
54
#define __argp_make_fmtstream line_wrap_stream
 
55
#define argp_fmtstream_free line_unwrap_stream
 
56
#define __argp_fmtstream_free line_unwrap_stream
 
57
 
 
58
#define __argp_fmtstream_putc(fs,ch) putc(ch,fs)
 
59
#define argp_fmtstream_putc(fs,ch) putc(ch,fs)
 
60
#define __argp_fmtstream_puts(fs,str) fputs(str,fs)
 
61
#define argp_fmtstream_puts(fs,str) fputs(str,fs)
 
62
#define __argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
 
63
#define argp_fmtstream_write(fs,str,len) fwrite(str,1,len,fs)
 
64
#define __argp_fmtstream_printf fprintf
 
65
#define argp_fmtstream_printf fprintf
 
66
 
 
67
#define __argp_fmtstream_lmargin line_wrap_lmargin
 
68
#define argp_fmtstream_lmargin line_wrap_lmargin
 
69
#define __argp_fmtstream_set_lmargin line_wrap_set_lmargin
 
70
#define argp_fmtstream_set_lmargin line_wrap_set_lmargin
 
71
#define __argp_fmtstream_rmargin line_wrap_rmargin
 
72
#define argp_fmtstream_rmargin line_wrap_rmargin
 
73
#define __argp_fmtstream_set_rmargin line_wrap_set_rmargin
 
74
#define argp_fmtstream_set_rmargin line_wrap_set_rmargin
 
75
#define __argp_fmtstream_wmargin line_wrap_wmargin
 
76
#define argp_fmtstream_wmargin line_wrap_wmargin
 
77
#define __argp_fmtstream_set_wmargin line_wrap_set_wmargin
 
78
#define argp_fmtstream_set_wmargin line_wrap_set_wmargin
 
79
#define __argp_fmtstream_point line_wrap_point
 
80
#define argp_fmtstream_point line_wrap_point
 
81
 
 
82
#else /* !ARGP_FMTSTREAM_USE_LINEWRAP */
 
83
/* Guess we have to define our own version.  */
 
84
 
 
85
#ifndef __const
 
86
#define __const const
 
87
#endif
 
88
 
 
89
struct argp_fmtstream
 
90
{
 
91
  FILE *stream;                 /* The stream we're outputting to.  */
 
92
 
 
93
  size_t lmargin, rmargin;      /* Left and right margins.  */
 
94
  ssize_t wmargin;              /* Margin to wrap to, or -1 to truncate.  */
 
95
 
 
96
  /* Point in buffer to which we've processed for wrapping, but not output.  */
 
97
  size_t point_offs;
 
98
  /* Output column at POINT_OFFS, or -1 meaning 0 but don't add lmargin.  */
 
99
  ssize_t point_col;
 
100
 
 
101
  char *buf;                    /* Output buffer.  */
 
102
  char *p;                      /* Current end of text in BUF. */
 
103
  char *end;                    /* Absolute end of BUF.  */
 
104
};
 
105
 
 
106
typedef struct argp_fmtstream *argp_fmtstream_t;
 
107
 
 
108
/* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
 
109
   written on it with LMARGIN spaces and limits them to RMARGIN columns
 
110
   total.  If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
 
111
   replacing the whitespace before them with a newline and WMARGIN spaces.
 
112
   Otherwise, chars beyond RMARGIN are simply dropped until a newline.
 
113
   Returns NULL if there was an error.  */
 
114
extern argp_fmtstream_t __argp_make_fmtstream (FILE *__stream,
 
115
                                               size_t __lmargin,
 
116
                                               size_t __rmargin,
 
117
                                               ssize_t __wmargin);
 
118
extern argp_fmtstream_t argp_make_fmtstream (FILE *__stream,
 
119
                                             size_t __lmargin,
 
120
                                             size_t __rmargin,
 
121
                                             ssize_t __wmargin);
 
122
 
 
123
/* Flush __FS to its stream, and free it (but don't close the stream).  */
 
124
extern void __argp_fmtstream_free (argp_fmtstream_t __fs);
 
125
extern void argp_fmtstream_free (argp_fmtstream_t __fs);
 
126
 
 
127
extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
 
128
                                       __const char *__fmt, ...)
 
129
#ifndef CONSTRUCTOR_FAILS
 
130
     __attribute__ ((__format__ (printf, 2, 3)));
 
131
#else
 
132
   ;
 
133
#endif
 
134
extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
 
135
                                      __const char *__fmt, ...)
 
136
#ifndef CONSTRUCTOR_FAILS
 
137
     __attribute__ ((__format__ (printf, 2, 3)));
 
138
#else
 
139
   ;
 
140
#endif
 
141
 
 
142
extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
 
143
extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
 
144
 
 
145
extern int __argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str);
 
146
extern int argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str);
 
147
 
 
148
extern size_t __argp_fmtstream_write (argp_fmtstream_t __fs,
 
149
                                      __const char *__str, size_t __len);
 
150
extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,
 
151
                                    __const char *__str, size_t __len);
 
152
 
 
153
/* Access macros for various bits of state.  */
 
154
#define argp_fmtstream_lmargin(__fs) ((__fs)->lmargin)
 
155
#define argp_fmtstream_rmargin(__fs) ((__fs)->rmargin)
 
156
#define argp_fmtstream_wmargin(__fs) ((__fs)->wmargin)
 
157
#define __argp_fmtstream_lmargin argp_fmtstream_lmargin
 
158
#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
 
159
#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
 
160
 
 
161
/* Set __FS's left margin to LMARGIN and return the old value.  */
 
162
extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
 
163
                                          size_t __lmargin);
 
164
extern size_t __argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
 
165
                                            size_t __lmargin);
 
166
 
 
167
/* Set __FS's right margin to __RMARGIN and return the old value.  */
 
168
extern size_t argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
 
169
                                          size_t __rmargin);
 
170
extern size_t __argp_fmtstream_set_rmargin (argp_fmtstream_t __fs,
 
171
                                            size_t __rmargin);
 
172
 
 
173
/* Set __FS's wrap margin to __WMARGIN and return the old value.  */
 
174
extern size_t argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
 
175
                                          size_t __wmargin);
 
176
extern size_t __argp_fmtstream_set_wmargin (argp_fmtstream_t __fs,
 
177
                                            size_t __wmargin);
 
178
 
 
179
/* Return the column number of the current output point in __FS.  */
 
180
extern size_t argp_fmtstream_point (argp_fmtstream_t __fs);
 
181
extern size_t __argp_fmtstream_point (argp_fmtstream_t __fs);
 
182
 
 
183
/* Internal routines.  */
 
184
extern void _argp_fmtstream_update (argp_fmtstream_t __fs);
 
185
extern void __argp_fmtstream_update (argp_fmtstream_t __fs);
 
186
extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
 
187
extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
 
188
 
 
189
#ifdef __OPTIMIZE__
 
190
/* Inline versions of above routines.  */
 
191
 
 
192
#if !_LIBC
 
193
#define __argp_fmtstream_putc argp_fmtstream_putc
 
194
#define __argp_fmtstream_puts argp_fmtstream_puts
 
195
#define __argp_fmtstream_write argp_fmtstream_write
 
196
#define __argp_fmtstream_set_lmargin argp_fmtstream_set_lmargin
 
197
#define __argp_fmtstream_set_rmargin argp_fmtstream_set_rmargin
 
198
#define __argp_fmtstream_set_wmargin argp_fmtstream_set_wmargin
 
199
#define __argp_fmtstream_point argp_fmtstream_point
 
200
#define __argp_fmtstream_update _argp_fmtstream_update
 
201
#define __argp_fmtstream_ensure _argp_fmtstream_ensure
 
202
#endif
 
203
 
 
204
#ifndef ARGP_FS_EI
 
205
#define ARGP_FS_EI extern inline
 
206
#endif
 
207
 
 
208
ARGP_FS_EI size_t
 
209
__argp_fmtstream_write (argp_fmtstream_t __fs,
 
210
                        __const char *__str, size_t __len)
 
211
{
 
212
  if (__fs->p + __len <= __fs->end || __argp_fmtstream_ensure (__fs, __len))
 
213
    {
 
214
      memcpy (__fs->p, __str, __len);
 
215
      __fs->p += __len;
 
216
      return __len;
 
217
    }
 
218
  else
 
219
    return 0;
 
220
}
 
221
 
 
222
ARGP_FS_EI int
 
223
__argp_fmtstream_puts (argp_fmtstream_t __fs, __const char *__str)
 
224
{
 
225
  size_t __len = strlen (__str);
 
226
  if (__len)
 
227
    {
 
228
      size_t __wrote = __argp_fmtstream_write (__fs, __str, __len);
 
229
      return __wrote == __len ? 0 : -1;
 
230
    }
 
231
  else
 
232
    return 0;
 
233
}
 
234
 
 
235
ARGP_FS_EI int
 
236
__argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch)
 
237
{
 
238
  if (__fs->p < __fs->end || __argp_fmtstream_ensure (__fs, 1))
 
239
    return *__fs->p++ = __ch;
 
240
  else
 
241
    return EOF;
 
242
}
 
243
 
 
244
/* Set __FS's left margin to __LMARGIN and return the old value.  */
 
245
ARGP_FS_EI size_t
 
246
__argp_fmtstream_set_lmargin (argp_fmtstream_t __fs, size_t __lmargin)
 
247
{
 
248
  size_t __old;
 
249
  if (__fs->p - __fs->buf > __fs->point_offs)
 
250
    __argp_fmtstream_update (__fs);
 
251
  __old = __fs->lmargin;
 
252
  __fs->lmargin = __lmargin;
 
253
  return __old;
 
254
}
 
255
 
 
256
/* Set __FS's right margin to __RMARGIN and return the old value.  */
 
257
ARGP_FS_EI size_t
 
258
__argp_fmtstream_set_rmargin (argp_fmtstream_t __fs, size_t __rmargin)
 
259
{
 
260
  size_t __old;
 
261
  if (__fs->p - __fs->buf > __fs->point_offs)
 
262
    __argp_fmtstream_update (__fs);
 
263
  __old = __fs->rmargin;
 
264
  __fs->rmargin = __rmargin;
 
265
  return __old;
 
266
}
 
267
 
 
268
/* Set FS's wrap margin to __WMARGIN and return the old value.  */
 
269
ARGP_FS_EI size_t
 
270
__argp_fmtstream_set_wmargin (argp_fmtstream_t __fs, size_t __wmargin)
 
271
{
 
272
  size_t __old;
 
273
  if (__fs->p - __fs->buf > __fs->point_offs)
 
274
    __argp_fmtstream_update (__fs);
 
275
  __old = __fs->wmargin;
 
276
  __fs->wmargin = __wmargin;
 
277
  return __old;
 
278
}
 
279
 
 
280
/* Return the column number of the current output point in __FS.  */
 
281
ARGP_FS_EI size_t
 
282
__argp_fmtstream_point (argp_fmtstream_t __fs)
 
283
{
 
284
  if (__fs->p - __fs->buf > __fs->point_offs)
 
285
    __argp_fmtstream_update (__fs);
 
286
  return __fs->point_col >= 0 ? __fs->point_col : 0;
 
287
}
 
288
 
 
289
#if !_LIBC
 
290
#undef __argp_fmtstream_putc
 
291
#undef __argp_fmtstream_puts
 
292
#undef __argp_fmtstream_write
 
293
#undef __argp_fmtstream_set_lmargin
 
294
#undef __argp_fmtstream_set_rmargin
 
295
#undef __argp_fmtstream_set_wmargin
 
296
#undef __argp_fmtstream_point
 
297
#undef __argp_fmtstream_update
 
298
#undef __argp_fmtstream_ensure
 
299
#endif
 
300
 
 
301
#endif /* __OPTIMIZE__ */
 
302
 
 
303
#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */
 
304
 
 
305
#endif /* __ARGP_FMTSTREAM_H__ */