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 } |