annotate lib/argp-fmtstream.c @ 423:079d43b6967b 3.0-beta2 3.0-beta2

Added missing file
author lost@l-w.ca
date Sun, 19 Sep 2010 01:44:47 -0600
parents 3c2e1f24cc7d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
421
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
1 /* Word-wrapping and line-truncating streams
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
2 Copyright (C) 1997-1999, 2001-2003, 2005, 2009-2010 Free Software
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
3 Foundation, Inc.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
4 This file is part of the GNU C Library.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
5 Written by Miles Bader <miles@gnu.ai.mit.edu>.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
6
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
7 This program is free software: you can redistribute it and/or modify
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
9 the Free Software Foundation; either version 3 of the License, or
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
10 (at your option) any later version.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
11
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
12 This program is distributed in the hope that it will be useful,
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
15 GNU General Public License for more details.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
16
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
19
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
20 /* This package emulates glibc `line_wrap_stream' semantics for systems that
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
21 don't have that. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
22
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
24 # include <config.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
25 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
26
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
27 #include <stdlib.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
28 #include <string.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
29 #include <errno.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
30 #include <stdarg.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
31 #include <ctype.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
32
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
33 #include "argp-fmtstream.h"
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
34 #include "argp-namefrob.h"
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
35
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
36 #ifndef ARGP_FMTSTREAM_USE_LINEWRAP
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
37
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
38 #ifndef isblank
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
39 #define isblank(ch) ((ch)==' ' || (ch)=='\t')
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
40 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
41
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
42 #if defined _LIBC && defined USE_IN_LIBIO
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
43 # include <wchar.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
44 # include <libio/libioP.h>
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
45 # define __vsnprintf(s, l, f, a) _IO_vsnprintf (s, l, f, a)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
46 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
47
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
48 #define INIT_BUF_SIZE 200
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
49 #define PRINTF_SIZE_GUESS 150
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
50
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
51 /* Return an argp_fmtstream that outputs to STREAM, and which prefixes lines
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
52 written on it with LMARGIN spaces and limits them to RMARGIN columns
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
53 total. If WMARGIN >= 0, words that extend past RMARGIN are wrapped by
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
54 replacing the whitespace before them with a newline and WMARGIN spaces.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
55 Otherwise, chars beyond RMARGIN are simply dropped until a newline.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
56 Returns NULL if there was an error. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
57 argp_fmtstream_t
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
58 __argp_make_fmtstream (FILE *stream,
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
59 size_t lmargin, size_t rmargin, ssize_t wmargin)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
60 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
61 argp_fmtstream_t fs;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
62
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
63 fs = (struct argp_fmtstream *) malloc (sizeof (struct argp_fmtstream));
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
64 if (fs != NULL)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
65 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
66 fs->stream = stream;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
67
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
68 fs->lmargin = lmargin;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
69 fs->rmargin = rmargin;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
70 fs->wmargin = wmargin;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
71 fs->point_col = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
72 fs->point_offs = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
73
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
74 fs->buf = (char *) malloc (INIT_BUF_SIZE);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
75 if (! fs->buf)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
76 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
77 free (fs);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
78 fs = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
79 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
80 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
81 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
82 fs->p = fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
83 fs->end = fs->buf + INIT_BUF_SIZE;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
84 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
85 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
86
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
87 return fs;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
88 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
89 #if 0
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
90 /* Not exported. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
91 #ifdef weak_alias
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
92 weak_alias (__argp_make_fmtstream, argp_make_fmtstream)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
93 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
94 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
95
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
96 /* Flush FS to its stream, and free it (but don't close the stream). */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
97 void
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
98 __argp_fmtstream_free (argp_fmtstream_t fs)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
99 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
100 __argp_fmtstream_update (fs);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
101 if (fs->p > fs->buf)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
102 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
103 #ifdef USE_IN_LIBIO
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
104 __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
105 #else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
106 fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
107 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
108 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
109 free (fs->buf);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
110 free (fs);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
111 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
112 #if 0
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
113 /* Not exported. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
114 #ifdef weak_alias
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
115 weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
116 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
117 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
118
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
119 /* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
120 end of its buffer. This code is mostly from glibc stdio/linewrap.c. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
121 void
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
122 __argp_fmtstream_update (argp_fmtstream_t fs)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
123 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
124 char *buf, *nl;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
125 size_t len;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
126
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
127 /* Scan the buffer for newlines. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
128 buf = fs->buf + fs->point_offs;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
129 while (buf < fs->p)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
130 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
131 size_t r;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
132
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
133 if (fs->point_col == 0 && fs->lmargin != 0)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
134 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
135 /* We are starting a new line. Print spaces to the left margin. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
136 const size_t pad = fs->lmargin;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
137 if (fs->p + pad < fs->end)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
138 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
139 /* We can fit in them in the buffer by moving the
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
140 buffer text up and filling in the beginning. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
141 memmove (buf + pad, buf, fs->p - buf);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
142 fs->p += pad; /* Compensate for bigger buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
143 memset (buf, ' ', pad); /* Fill in the spaces. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
144 buf += pad; /* Don't bother searching them. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
145 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
146 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
147 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
148 /* No buffer space for spaces. Must flush. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
149 size_t i;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
150 for (i = 0; i < pad; i++)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
151 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
152 #ifdef USE_IN_LIBIO
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
153 if (_IO_fwide (fs->stream, 0) > 0)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
154 putwc_unlocked (L' ', fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
155 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
156 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
157 putc_unlocked (' ', fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
158 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
159 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
160 fs->point_col = pad;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
161 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
162
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
163 len = fs->p - buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
164 nl = memchr (buf, '\n', len);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
165
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
166 if (fs->point_col < 0)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
167 fs->point_col = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
168
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
169 if (!nl)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
170 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
171 /* The buffer ends in a partial line. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
172
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
173 if (fs->point_col + len < fs->rmargin)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
174 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
175 /* The remaining buffer text is a partial line and fits
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
176 within the maximum line width. Advance point for the
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
177 characters to be written and stop scanning. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
178 fs->point_col += len;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
179 break;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
180 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
181 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
182 /* Set the end-of-line pointer for the code below to
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
183 the end of the buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
184 nl = fs->p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
185 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
186 else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
187 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
188 /* The buffer contains a full line that fits within the maximum
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
189 line width. Reset point and scan the next line. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
190 fs->point_col = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
191 buf = nl + 1;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
192 continue;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
193 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
194
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
195 /* This line is too long. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
196 r = fs->rmargin - 1;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
197
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
198 if (fs->wmargin < 0)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
199 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
200 /* Truncate the line by overwriting the excess with the
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
201 newline and anything after it in the buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
202 if (nl < fs->p)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
203 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
204 memmove (buf + (r - fs->point_col), nl, fs->p - nl);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
205 fs->p -= buf + (r - fs->point_col) - nl;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
206 /* Reset point for the next line and start scanning it. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
207 fs->point_col = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
208 buf += r + 1; /* Skip full line plus \n. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
209 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
210 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
211 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
212 /* The buffer ends with a partial line that is beyond the
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
213 maximum line width. Advance point for the characters
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
214 written, and discard those past the max from the buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
215 fs->point_col += len;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
216 fs->p -= fs->point_col - r;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
217 break;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
218 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
219 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
220 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
221 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
222 /* Do word wrap. Go to the column just past the maximum line
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
223 width and scan back for the beginning of the word there.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
224 Then insert a line break. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
225
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
226 char *p, *nextline;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
227 int i;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
228
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
229 p = buf + (r + 1 - fs->point_col);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
230 while (p >= buf && !isblank ((unsigned char) *p))
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
231 --p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
232 nextline = p + 1; /* This will begin the next line. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
233
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
234 if (nextline > buf)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
235 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
236 /* Swallow separating blanks. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
237 if (p >= buf)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
238 do
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
239 --p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
240 while (p >= buf && isblank ((unsigned char) *p));
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
241 nl = p + 1; /* The newline will replace the first blank. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
242 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
243 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
244 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
245 /* A single word that is greater than the maximum line width.
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
246 Oh well. Put it on an overlong line by itself. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
247 p = buf + (r + 1 - fs->point_col);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
248 /* Find the end of the long word. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
249 if (p < nl)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
250 do
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
251 ++p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
252 while (p < nl && !isblank ((unsigned char) *p));
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
253 if (p == nl)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
254 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
255 /* It already ends a line. No fussing required. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
256 fs->point_col = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
257 buf = nl + 1;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
258 continue;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
259 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
260 /* We will move the newline to replace the first blank. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
261 nl = p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
262 /* Swallow separating blanks. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
263 do
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
264 ++p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
265 while (isblank ((unsigned char) *p));
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
266 /* The next line will start here. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
267 nextline = p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
268 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
269
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
270 /* Note: There are a bunch of tests below for
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
271 NEXTLINE == BUF + LEN + 1; this case is where NL happens to fall
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
272 at the end of the buffer, and NEXTLINE is in fact empty (and so
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
273 we need not be careful to maintain its contents). */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
274
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
275 if ((nextline == buf + len + 1
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
276 ? fs->end - nl < fs->wmargin + 1
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
277 : nextline - (nl + 1) < fs->wmargin)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
278 && fs->p > nextline)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
279 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
280 /* The margin needs more blanks than we removed. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
281 if (fs->end - fs->p > fs->wmargin + 1)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
282 /* Make some space for them. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
283 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
284 size_t mv = fs->p - nextline;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
285 memmove (nl + 1 + fs->wmargin, nextline, mv);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
286 nextline = nl + 1 + fs->wmargin;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
287 len = nextline + mv - buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
288 *nl++ = '\n';
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
289 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
290 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
291 /* Output the first line so we can use the space. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
292 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
293 #ifdef _LIBC
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
294 __fxprintf (fs->stream, "%.*s\n",
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
295 (int) (nl - fs->buf), fs->buf);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
296 #else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
297 if (nl > fs->buf)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
298 fwrite_unlocked (fs->buf, 1, nl - fs->buf, fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
299 putc_unlocked ('\n', fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
300 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
301
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
302 len += buf - fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
303 nl = buf = fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
304 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
305 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
306 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
307 /* We can fit the newline and blanks in before
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
308 the next word. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
309 *nl++ = '\n';
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
310
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
311 if (nextline - nl >= fs->wmargin
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
312 || (nextline == buf + len + 1 && fs->end - nextline >= fs->wmargin))
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
313 /* Add blanks up to the wrap margin column. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
314 for (i = 0; i < fs->wmargin; ++i)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
315 *nl++ = ' ';
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
316 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
317 for (i = 0; i < fs->wmargin; ++i)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
318 #ifdef USE_IN_LIBIO
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
319 if (_IO_fwide (fs->stream, 0) > 0)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
320 putwc_unlocked (L' ', fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
321 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
322 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
323 putc_unlocked (' ', fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
324
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
325 /* Copy the tail of the original buffer into the current buffer
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
326 position. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
327 if (nl < nextline)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
328 memmove (nl, nextline, buf + len - nextline);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
329 len -= nextline - buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
330
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
331 /* Continue the scan on the remaining lines in the buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
332 buf = nl;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
333
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
334 /* Restore bufp to include all the remaining text. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
335 fs->p = nl + len;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
336
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
337 /* Reset the counter of what has been output this line. If wmargin
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
338 is 0, we want to avoid the lmargin getting added, so we set
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
339 point_col to a magic value of -1 in that case. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
340 fs->point_col = fs->wmargin ? fs->wmargin : -1;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
341 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
342 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
343
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
344 /* Remember that we've scanned as far as the end of the buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
345 fs->point_offs = fs->p - fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
346 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
347
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
348 /* Ensure that FS has space for AMOUNT more bytes in its buffer, either by
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
349 growing the buffer, or by flushing it. True is returned iff we succeed. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
350 int
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
351 __argp_fmtstream_ensure (struct argp_fmtstream *fs, size_t amount)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
352 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
353 if ((size_t) (fs->end - fs->p) < amount)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
354 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
355 ssize_t wrote;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
356
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
357 /* Flush FS's buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
358 __argp_fmtstream_update (fs);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
359
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
360 #ifdef _LIBC
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
361 __fxprintf (fs->stream, "%.*s", (int) (fs->p - fs->buf), fs->buf);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
362 wrote = fs->p - fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
363 #else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
364 wrote = fwrite_unlocked (fs->buf, 1, fs->p - fs->buf, fs->stream);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
365 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
366 if (wrote == fs->p - fs->buf)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
367 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
368 fs->p = fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
369 fs->point_offs = 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
370 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
371 else
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
372 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
373 fs->p -= wrote;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
374 fs->point_offs -= wrote;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
375 memmove (fs->buf, fs->buf + wrote, fs->p - fs->buf);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
376 return 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
377 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
378
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
379 if ((size_t) (fs->end - fs->buf) < amount)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
380 /* Gotta grow the buffer. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
381 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
382 size_t old_size = fs->end - fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
383 size_t new_size = old_size + amount;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
384 char *new_buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
385
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
386 if (new_size < old_size || ! (new_buf = realloc (fs->buf, new_size)))
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
387 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
388 __set_errno (ENOMEM);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
389 return 0;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
390 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
391
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
392 fs->buf = new_buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
393 fs->end = new_buf + new_size;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
394 fs->p = fs->buf;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
395 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
396 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
397
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
398 return 1;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
399 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
400
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
401 ssize_t
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
402 __argp_fmtstream_printf (struct argp_fmtstream *fs, const char *fmt, ...)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
403 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
404 int out;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
405 size_t avail;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
406 size_t size_guess = PRINTF_SIZE_GUESS; /* How much space to reserve. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
407
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
408 do
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
409 {
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
410 va_list args;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
411
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
412 if (! __argp_fmtstream_ensure (fs, size_guess))
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
413 return -1;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
414
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
415 va_start (args, fmt);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
416 avail = fs->end - fs->p;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
417 out = __vsnprintf (fs->p, avail, fmt, args);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
418 va_end (args);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
419 if ((size_t) out >= avail)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
420 size_guess = out + 1;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
421 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
422 while ((size_t) out >= avail);
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
423
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
424 fs->p += out;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
425
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
426 return out;
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
427 }
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
428 #if 0
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
429 /* Not exported. */
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
430 #ifdef weak_alias
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
431 weak_alias (__argp_fmtstream_printf, argp_fmtstream_printf)
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
432 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
433 #endif
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
434
3c2e1f24cc7d Added generated files for release
lost@l-w.ca
parents:
diff changeset
435 #endif /* !ARGP_FMTSTREAM_USE_LINEWRAP */