annotate buf.c @ 170:fd138f2a9773

Add C++ portable sockets
author David Demelier <markand@malikania.fr>
date Tue, 10 Sep 2013 15:17:56 +0200
parents 7f214f26a4c0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * buf.c -- easy way to manipulate strings
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2011, 2012, David Demelier <markand@malikania.fr>
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <stdio.h>
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdlib.h>
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <string.h>
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include "buf.h"
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
128
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
25 #define BUF_AVAIL(buf) ((buf)->alsize - (buf)->length)
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #define BUF_SAFE(buf) (!((buf)->flags & BUF_UNSAFE))
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #define BUF_FIXED(buf) ((buf)->flags & BUF_FIXED)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #define BUF_AUTO(buf) (buf->flags == 0)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
30 static void copy(struct buf *, const void *, size_t);
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
31 static int grow(struct buf *, size_t);
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 int
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
34 buf_init(struct buf *buf, const char *txt)
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 /* Set defaults if needed */
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
37 buf->chksize = (buf->chksize <= 0) ? 128 : buf->chksize;
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
38 buf->alsize = buf->chksize + 1;
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 buf->malloc = (buf->malloc == NULL) ? &malloc : buf->malloc;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 buf->realloc = (buf->realloc == NULL) ? &realloc : buf->realloc;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 if ((buf->text = buf->malloc(buf->alsize)) == NULL)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 return -1;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
45 if (txt != NULL)
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
46 buf_cat(buf, txt);
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
47
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 memset(buf->text, 0, buf->alsize);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 return 0;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
53 void
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
54 buf_set(struct buf *buf, const char *fmt, ...)
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
55 {
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
56 va_list ap;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
57 const char *p;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
58
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
59 va_start(ap, fmt);
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
60 for (p = fmt; *p != '\0'; ++p)
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
61 switch (*p) {
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
62 case 'l':
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
63 buf->chksize = va_arg(ap, int);
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
64 break;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
65 case 'm':
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
66 buf->malloc = va_arg(ap, void *(*)(size_t));
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
67 break;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
68 case 'r':
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
69 buf->realloc = va_arg(ap, void *(*)(void *, size_t));
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
70 break;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
71 case 'f':
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
72 case 't':
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
73 buf->flags = va_arg(ap, int);
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
74 break;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
75 default:
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
76 break;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
77 }
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
78 }
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
79
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
80 /*
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 * This function appends not more than max characters from str.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 int
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 buf_ncat(struct buf *buf, const char *str, size_t max)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 size_t tocopy = max;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
87
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 for (tocopy = 0; str[tocopy] != '\0' && tocopy < max; ++tocopy)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 continue;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
128
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
91 if (BUF_AVAIL(buf) <= tocopy) {
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 /* Can't add more */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 if (BUF_SAFE(buf) && BUF_FIXED(buf))
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 return -1;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 if (BUF_AUTO(buf)) {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 if (grow(buf, tocopy) < 0)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 return -1;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 } else {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 /* String is unsafe, truncate to the available size */
128
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
101 tocopy = BUF_AVAIL(buf) - 1;
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 copy(buf, str, tocopy);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 return 0;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 /*
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 * Append the string str to the end of the string buffer.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 int
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 buf_cat(struct buf *buf, const char *str)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 return buf_ncat(buf, str, strlen(str));
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 /*
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
120 * Append the caracter c to the end of buffer
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
121 */
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
122 int
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
123 buf_putc(struct buf *buf, int c)
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
124 {
141
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
125 char str[2] = { c, '\0' };
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
126
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
127 return buf_ncat(buf, str, 1);
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
128 }
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
129
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
130 /*
127
e00bc8f7eabf Fixed buf printf
David Demelier <markand@malikania.fr>
parents: 126
diff changeset
131 * Concatenate the printf(3) like call to the string buffer, this function
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 * returns -1 on fixed safe buffer, otherwise 0 is returned if there
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 * is no allocation failure.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 int
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 buf_vprintf(struct buf *buf, const char *fmt, va_list ap)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 {
128
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
138 int copied, rv = 0, done = 0;
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
139
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 if (BUF_FIXED(buf) && BUF_SAFE(buf))
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 return -1;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
127
e00bc8f7eabf Fixed buf printf
David Demelier <markand@malikania.fr>
parents: 126
diff changeset
143 do {
e00bc8f7eabf Fixed buf printf
David Demelier <markand@malikania.fr>
parents: 126
diff changeset
144 copied = vsnprintf(&buf->text[buf->length],
e00bc8f7eabf Fixed buf printf
David Demelier <markand@malikania.fr>
parents: 126
diff changeset
145 BUF_AVAIL(buf), fmt, ap);
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
127
e00bc8f7eabf Fixed buf printf
David Demelier <markand@malikania.fr>
parents: 126
diff changeset
147 if (copied >= (signed int)BUF_AVAIL(buf) || copied == -1) {
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 if (BUF_FIXED(buf))
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 done = 1;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 /*
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 * vsnprintf returns -1 on windows, we need to grow
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 * the buffer by block size.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 */
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
155 if (grow(buf, buf->alsize + buf->chksize) < 0) {
128
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
156 done = 1;
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
157 rv = -1;
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
158 }
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 } else {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 done = 1;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 } while (!done);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
128
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
164 buf->length = strlen(buf->text);
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
165
7e72d4008f6d Little changes in buffer
David Demelier <markand@malikania.fr>
parents: 127
diff changeset
166 return rv;
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 int
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 buf_printf(struct buf *buf, const char *fmt, ...)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 va_list ap;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 int rv;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 va_start(ap, fmt);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 rv = buf_vprintf(buf, fmt, ap);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 va_end(ap);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
178
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 return rv;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
181
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 /*
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
183 * Realloc the string to it's size and remove useless bytes.
129
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
184 */
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
185 int
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
186 buf_trim(struct buf *buf)
129
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
187 {
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
188 if ((buf->text = realloc(buf->text, buf->length + 1)) == NULL) {
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
189 buf->alsize = 0;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
190 return -1;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
191 }
129
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
192
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
193 buf->alsize = buf->length + 1;
129
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
194
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
195 return 0;
129
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
196 }
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
197
2f71e113be63 Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents: 128
diff changeset
198 /*
141
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
199 * Remove `n' characters from the buffer, a positive value will cut the string
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
200 * from beginning, negative value will cut from end.
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
201 */
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
202 void
156
8c7812fefe0f Fix buf_cut
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
203 buf_cut(struct buf *buf, int start)
141
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
204 {
156
8c7812fefe0f Fix buf_cut
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
205 if ((start > 0 && start >= buf->length) ||
8c7812fefe0f Fix buf_cut
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
206 (start < 0 && (int)buf->length + start < 0))
141
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
207 return;
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
208
158
44e7b975618a Fix warning in buf
David Demelier <markand@malikania.fr>
parents: 156
diff changeset
209 if (start < 0 && (int)buf->length + start >= 0)
156
8c7812fefe0f Fix buf_cut
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
210 start = buf->length + start;
141
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
211
156
8c7812fefe0f Fix buf_cut
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
212 buf->text[start] = '\0';
8c7812fefe0f Fix buf_cut
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
213 buf->length -= buf->length - start;
141
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
214 }
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
215
5ed54050ae31 Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents: 138
diff changeset
216 /*
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 * Clear the string buffer.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 void
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 buf_clear(struct buf *buf)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 memset(buf->text, 0, buf->alsize);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
223
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 buf->length = 0;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 void
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 buf_free(struct buf *buf)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 {
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
230 if (buf != NULL) {
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
231 buf_clear(buf);
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
232 free(buf->text);
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
233
133
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
234 buf->text = NULL;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
235 buf->alsize = 0;
d85dd98cb49d Add attributes
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
236 }
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
238
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 /*
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 * Append to the end of buffer the void ptr of count size.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 static void
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 copy(struct buf *buf, const void *ptr, size_t count)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 memcpy(buf->text + buf->length, ptr, count);
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
246
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 buf->text[buf->length + count] = '\0';
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 buf->length += count;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 /*
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 * Grow the text buffer until the available size fit the needed
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 * size. This function may return -1 on allocation failure.
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 */
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 static int
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 grow(struct buf *buf, size_t needed)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 {
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 while (BUF_AVAIL(buf) <= needed) {
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
259 buf->text = buf->realloc(buf->text, buf->alsize + buf->chksize);
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
260
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 if (buf->text == NULL)
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 return -1;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
263
166
7f214f26a4c0 Added a macro for pack.c
David Demelier <markand@malikania.fr>
parents: 158
diff changeset
264 buf->alsize += buf->chksize;
125
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 }
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
266
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 return 0;
b9723c197038 Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 }