Mercurial > code
annotate buf.c @ 172:a61cddaf7547
Rename Driver postgres
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 11 Sep 2013 15:27:00 +0200 |
parents | 7f214f26a4c0 |
children |
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 | 53 void |
54 buf_set(struct buf *buf, const char *fmt, ...) | |
55 { | |
56 va_list ap; | |
57 const char *p; | |
58 | |
59 va_start(ap, fmt); | |
60 for (p = fmt; *p != '\0'; ++p) | |
61 switch (*p) { | |
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 | 64 break; |
65 case 'm': | |
66 buf->malloc = va_arg(ap, void *(*)(size_t)); | |
67 break; | |
68 case 'r': | |
69 buf->realloc = va_arg(ap, void *(*)(void *, size_t)); | |
70 break; | |
71 case 'f': | |
72 case 't': | |
73 buf->flags = va_arg(ap, int); | |
74 break; | |
75 default: | |
76 break; | |
77 } | |
78 } | |
79 | |
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 | 120 * Append the caracter c to the end of buffer |
121 */ | |
122 int | |
123 buf_putc(struct buf *buf, int c) | |
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 | 128 } |
129 | |
130 /* | |
127 | 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 | 143 do { |
144 copied = vsnprintf(&buf->text[buf->length], | |
145 BUF_AVAIL(buf), fmt, ap); | |
125
b9723c197038
Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 |
127 | 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 | 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 | 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 | 188 if ((buf->text = realloc(buf->text, buf->length + 1)) == NULL) { |
189 buf->alsize = 0; | |
190 return -1; | |
191 } | |
129
2f71e113be63
Remove copy and ncopy and putc/puts
David Demelier <markand@malikania.fr>
parents:
128
diff
changeset
|
192 |
133 | 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 | 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 | 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 | 205 if ((start > 0 && start >= buf->length) || |
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 | 209 if (start < 0 && (int)buf->length + start >= 0) |
156 | 210 start = buf->length + start; |
141
5ed54050ae31
Added buf_cut, cut the buffer
David Demelier <markand@malikania.fr>
parents:
138
diff
changeset
|
211 |
156 | 212 buf->text[start] = '\0'; |
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 | 230 if (buf != NULL) { |
231 buf_clear(buf); | |
232 free(buf->text); | |
125
b9723c197038
Add brand new string buffer
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 |
133 | 234 buf->text = NULL; |
235 buf->alsize = 0; | |
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 } |