ucx/utils.c

changeset 142
ee8cb27d8b8e
parent 140
15f871f50bfd
child 144
b6dcc9d112eb
equal deleted inserted replaced
140:15f871f50bfd 142:ee8cb27d8b8e
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include "utils.h" 29 #include "utils.h"
30 #include <math.h> 30 #include <math.h>
31 #include <stdio.h>
32 #include <limits.h>
33 #include <errno.h>
31 34
32 /* COPY FUCNTIONS */ 35 /* COPY FUCNTIONS */
33 void* ucx_strcpy(void* s, void* data) { 36 void* ucx_strcpy(void* s, void* data) {
34 char *str = (char*) s; 37 char *str = (char*) s;
35 size_t n = 1+strlen(str); 38 size_t n = 1+strlen(str);
73 76
74 free(buf); 77 free(buf);
75 return ncp; 78 return ncp;
76 } 79 }
77 80
78 /* COMPARE FUNCTION */ 81 /* COMPARE FUNCTIONS */
79 82
80 int ucx_strcmp(void *s1, void *s2, void *data) { 83 int ucx_strcmp(void *s1, void *s2, void *data) {
81 return strcmp((char*)s1, (char*)s2); 84 return strcmp((char*)s1, (char*)s2);
82 } 85 }
83 86
126 } 129 }
127 130
128 int ucx_memcmp(void *ptr1, void *ptr2, void *n) { 131 int ucx_memcmp(void *ptr1, void *ptr2, void *n) {
129 return memcmp(ptr1, ptr2, *((size_t*)n)); 132 return memcmp(ptr1, ptr2, *((size_t*)n));
130 } 133 }
134
135 /* PRINTF FUNCTIONS */
136
137 #define UCX_PRINTF_BUFSIZE 256
138
139 int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) {
140 va_list ap;
141 int ret;
142 va_start(ap, fmt);
143 ret = ucx_vfprintf(stream, wfc, fmt, ap);
144 va_end(ap);
145 return ret;
146 }
147
148 int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) {
149 char buf[UCX_PRINTF_BUFSIZE];
150 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
151 if (ret < 0) {
152 return ret;
153 } else if (ret < UCX_PRINTF_BUFSIZE) {
154 return (int)wfc(buf, 1, ret, stream);
155 } else {
156 if (ret == INT_MAX) {
157 errno = ENOMEM;
158 return -1;
159 }
160
161 int len = ret + 1;
162 char *newbuf = (char*)malloc(len);
163 if (!newbuf) {
164 return -1;
165 }
166
167 ret = vsnprintf(newbuf, len, fmt, ap);
168 if (ret > 0) {
169 ret = (int)wfc(newbuf, 1, ret, stream);
170 }
171 free(newbuf);
172 }
173 return ret;
174 }
175
176 sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) {
177 va_list ap;
178 sstr_t ret;
179 va_start(ap, fmt);
180 ret = ucx_vasprintf(allocator, fmt, ap);
181 va_end(ap);
182 return ret;
183 }
184
185 sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) {
186 sstr_t s;
187 s.ptr = NULL;
188 s.length = 0;
189 char buf[UCX_PRINTF_BUFSIZE];
190 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
191 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) {
192 s.ptr = (char*)a->malloc(a->pool, ret + 1);
193 s.length = (size_t)ret;
194 memcpy(s.ptr, buf, ret);
195 s.ptr[s.length] = '\0';
196 } else if (ret == INT_MAX) {
197 errno = ENOMEM;
198 } else {
199 int len = ret + 1;
200 s.ptr = (char*)a->malloc(a->pool, len);
201 ret = vsnprintf(s.ptr, len, fmt, ap);
202 if (ret < 0) {
203 free(s.ptr);
204 s.ptr = NULL;
205 } else {
206 s.length = (size_t)ret;
207 }
208 }
209 return s;
210 }

mercurial