1.1 --- a/src/utils.c Mon Dec 30 09:54:10 2019 +0100 1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 @@ -1,448 +0,0 @@ 1.4 -/* 1.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 - * 1.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved. 1.8 - * 1.9 - * Redistribution and use in source and binary forms, with or without 1.10 - * modification, are permitted provided that the following conditions are met: 1.11 - * 1.12 - * 1. Redistributions of source code must retain the above copyright 1.13 - * notice, this list of conditions and the following disclaimer. 1.14 - * 1.15 - * 2. Redistributions in binary form must reproduce the above copyright 1.16 - * notice, this list of conditions and the following disclaimer in the 1.17 - * documentation and/or other materials provided with the distribution. 1.18 - * 1.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 1.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.29 - * POSSIBILITY OF SUCH DAMAGE. 1.30 - */ 1.31 - 1.32 -#include "ucx/utils.h" 1.33 - 1.34 -#include <math.h> 1.35 -#include <stdio.h> 1.36 -#include <limits.h> 1.37 -#include <errno.h> 1.38 - 1.39 -/* COPY FUCNTIONS */ 1.40 -void* ucx_strcpy(const void* s, void* data) { 1.41 - const char *str = (const char*) s; 1.42 - size_t n = 1+strlen(str); 1.43 - char *cpy = (char*) malloc(n); 1.44 - memcpy(cpy, str, n); 1.45 - return cpy; 1.46 -} 1.47 - 1.48 -void* ucx_memcpy(const void* m, void* n) { 1.49 - size_t k = *((size_t*)n); 1.50 - void *cpy = malloc(k); 1.51 - memcpy(cpy, m, k); 1.52 - return cpy; 1.53 -} 1.54 - 1.55 -size_t ucx_stream_bncopy(void *src, void *dest, read_func readfnc, 1.56 - write_func writefnc, char* buf, size_t bufsize, size_t n) { 1.57 - if(n == 0 || bufsize == 0) { 1.58 - return 0; 1.59 - } 1.60 - 1.61 - char *lbuf; 1.62 - size_t ncp = 0; 1.63 - 1.64 - if(buf) { 1.65 - lbuf = buf; 1.66 - } else { 1.67 - lbuf = (char*)malloc(bufsize); 1.68 - if(lbuf == NULL) { 1.69 - return 0; 1.70 - } 1.71 - } 1.72 - 1.73 - size_t r; 1.74 - size_t rn = bufsize > n ? n : bufsize; 1.75 - while((r = readfnc(lbuf, 1, rn, src)) != 0) { 1.76 - r = writefnc(lbuf, 1, r, dest); 1.77 - ncp += r; 1.78 - n -= r; 1.79 - rn = bufsize > n ? n : bufsize; 1.80 - if(r == 0 || n == 0) { 1.81 - break; 1.82 - } 1.83 - } 1.84 - 1.85 - if (lbuf != buf) { 1.86 - free(lbuf); 1.87 - } 1.88 - 1.89 - return ncp; 1.90 -} 1.91 - 1.92 -/* COMPARE FUNCTIONS */ 1.93 - 1.94 -int ucx_cmp_str(const void *s1, const void *s2, void *data) { 1.95 - return strcmp((const char*)s1, (const char*)s2); 1.96 -} 1.97 - 1.98 -int ucx_cmp_strn(const void *s1, const void *s2, void *n) { 1.99 - return strncmp((const char*)s1, (const char*)s2, *((size_t*) n)); 1.100 -} 1.101 - 1.102 -int ucx_cmp_sstr(const void *s1, const void *s2, void *data) { 1.103 - sstr_t a = *(const sstr_t*) s1; 1.104 - sstr_t b = *(const sstr_t*) s2; 1.105 - return sstrcmp(a, b); 1.106 -} 1.107 - 1.108 -int ucx_cmp_int(const void *i1, const void *i2, void *data) { 1.109 - int a = *((const int*) i1); 1.110 - int b = *((const int*) i2); 1.111 - if (a == b) { 1.112 - return 0; 1.113 - } else { 1.114 - return a < b ? -1 : 1; 1.115 - } 1.116 -} 1.117 - 1.118 -int ucx_cmp_longint(const void *i1, const void *i2, void *data) { 1.119 - long int a = *((const long int*) i1); 1.120 - long int b = *((const long int*) i2); 1.121 - if (a == b) { 1.122 - return 0; 1.123 - } else { 1.124 - return a < b ? -1 : 1; 1.125 - } 1.126 -} 1.127 - 1.128 -int ucx_cmp_longlong(const void *i1, const void *i2, void *data) { 1.129 - long long a = *((const long long*) i1); 1.130 - long long b = *((const long long*) i2); 1.131 - if (a == b) { 1.132 - return 0; 1.133 - } else { 1.134 - return a < b ? -1 : 1; 1.135 - } 1.136 -} 1.137 - 1.138 -int ucx_cmp_int16(const void *i1, const void *i2, void *data) { 1.139 - int16_t a = *((const int16_t*) i1); 1.140 - int16_t b = *((const int16_t*) i2); 1.141 - if (a == b) { 1.142 - return 0; 1.143 - } else { 1.144 - return a < b ? -1 : 1; 1.145 - } 1.146 -} 1.147 - 1.148 -int ucx_cmp_int32(const void *i1, const void *i2, void *data) { 1.149 - int32_t a = *((const int32_t*) i1); 1.150 - int32_t b = *((const int32_t*) i2); 1.151 - if (a == b) { 1.152 - return 0; 1.153 - } else { 1.154 - return a < b ? -1 : 1; 1.155 - } 1.156 -} 1.157 - 1.158 -int ucx_cmp_int64(const void *i1, const void *i2, void *data) { 1.159 - int64_t a = *((const int64_t*) i1); 1.160 - int64_t b = *((const int64_t*) i2); 1.161 - if (a == b) { 1.162 - return 0; 1.163 - } else { 1.164 - return a < b ? -1 : 1; 1.165 - } 1.166 -} 1.167 - 1.168 -int ucx_cmp_uint(const void *i1, const void *i2, void *data) { 1.169 - unsigned int a = *((const unsigned int*) i1); 1.170 - unsigned int b = *((const unsigned int*) i2); 1.171 - if (a == b) { 1.172 - return 0; 1.173 - } else { 1.174 - return a < b ? -1 : 1; 1.175 - } 1.176 -} 1.177 - 1.178 -int ucx_cmp_ulongint(const void *i1, const void *i2, void *data) { 1.179 - unsigned long int a = *((const unsigned long int*) i1); 1.180 - unsigned long int b = *((const unsigned long int*) i2); 1.181 - if (a == b) { 1.182 - return 0; 1.183 - } else { 1.184 - return a < b ? -1 : 1; 1.185 - } 1.186 -} 1.187 - 1.188 -int ucx_cmp_ulonglong(const void *i1, const void *i2, void *data) { 1.189 - unsigned long long a = *((const unsigned long long*) i1); 1.190 - unsigned long long b = *((const unsigned long long*) i2); 1.191 - if (a == b) { 1.192 - return 0; 1.193 - } else { 1.194 - return a < b ? -1 : 1; 1.195 - } 1.196 -} 1.197 - 1.198 -int ucx_cmp_uint16(const void *i1, const void *i2, void *data) { 1.199 - uint16_t a = *((const uint16_t*) i1); 1.200 - uint16_t b = *((const uint16_t*) i2); 1.201 - if (a == b) { 1.202 - return 0; 1.203 - } else { 1.204 - return a < b ? -1 : 1; 1.205 - } 1.206 -} 1.207 - 1.208 -int ucx_cmp_uint32(const void *i1, const void *i2, void *data) { 1.209 - uint32_t a = *((const uint32_t*) i1); 1.210 - uint32_t b = *((const uint32_t*) i2); 1.211 - if (a == b) { 1.212 - return 0; 1.213 - } else { 1.214 - return a < b ? -1 : 1; 1.215 - } 1.216 -} 1.217 - 1.218 -int ucx_cmp_uint64(const void *i1, const void *i2, void *data) { 1.219 - uint64_t a = *((const uint64_t*) i1); 1.220 - uint64_t b = *((const uint64_t*) i2); 1.221 - if (a == b) { 1.222 - return 0; 1.223 - } else { 1.224 - return a < b ? -1 : 1; 1.225 - } 1.226 -} 1.227 - 1.228 -intmax_t ucx_dist_int(const void *i1, const void *i2, void *data) { 1.229 - intmax_t a = *((const int*) i1); 1.230 - intmax_t b = *((const int*) i2); 1.231 - return a - b; 1.232 -} 1.233 - 1.234 -intmax_t ucx_dist_longint(const void *i1, const void *i2, void *data) { 1.235 - intmax_t a = *((const long int*) i1); 1.236 - intmax_t b = *((const long int*) i2); 1.237 - return a - b; 1.238 -} 1.239 - 1.240 -intmax_t ucx_dist_longlong(const void *i1, const void *i2, void *data) { 1.241 - intmax_t a = *((const long long*) i1); 1.242 - intmax_t b = *((const long long*) i2); 1.243 - return a - b; 1.244 -} 1.245 - 1.246 -intmax_t ucx_dist_int16(const void *i1, const void *i2, void *data) { 1.247 - intmax_t a = *((const int16_t*) i1); 1.248 - intmax_t b = *((const int16_t*) i2); 1.249 - return a - b; 1.250 -} 1.251 - 1.252 -intmax_t ucx_dist_int32(const void *i1, const void *i2, void *data) { 1.253 - intmax_t a = *((const int32_t*) i1); 1.254 - intmax_t b = *((const int32_t*) i2); 1.255 - return a - b; 1.256 -} 1.257 - 1.258 -intmax_t ucx_dist_int64(const void *i1, const void *i2, void *data) { 1.259 - intmax_t a = *((const int64_t*) i1); 1.260 - intmax_t b = *((const int64_t*) i2); 1.261 - return a - b; 1.262 -} 1.263 - 1.264 -intmax_t ucx_dist_uint(const void *i1, const void *i2, void *data) { 1.265 - uintmax_t a = *((const unsigned int*) i1); 1.266 - uintmax_t b = *((const unsigned int*) i2); 1.267 - return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a); 1.268 -} 1.269 - 1.270 -intmax_t ucx_dist_ulongint(const void *i1, const void *i2, void *data) { 1.271 - uintmax_t a = *((const unsigned long int*) i1); 1.272 - uintmax_t b = *((const unsigned long int*) i2); 1.273 - return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a); 1.274 -} 1.275 - 1.276 -intmax_t ucx_dist_ulonglong(const void *i1, const void *i2, void *data) { 1.277 - uintmax_t a = *((const unsigned long long*) i1); 1.278 - uintmax_t b = *((const unsigned long long*) i2); 1.279 - return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a); 1.280 -} 1.281 - 1.282 -intmax_t ucx_dist_uint16(const void *i1, const void *i2, void *data) { 1.283 - uintmax_t a = *((const uint16_t*) i1); 1.284 - uintmax_t b = *((const uint16_t*) i2); 1.285 - return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a); 1.286 -} 1.287 - 1.288 -intmax_t ucx_dist_uint32(const void *i1, const void *i2, void *data) { 1.289 - uintmax_t a = *((const uint32_t*) i1); 1.290 - uintmax_t b = *((const uint32_t*) i2); 1.291 - return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a); 1.292 -} 1.293 - 1.294 -intmax_t ucx_dist_uint64(const void *i1, const void *i2, void *data) { 1.295 - uintmax_t a = *((const uint64_t*) i1); 1.296 - uintmax_t b = *((const uint64_t*) i2); 1.297 - return a > b ? (intmax_t)(a - b) : -(intmax_t)(b - a); 1.298 -} 1.299 - 1.300 -int ucx_cmp_float(const void *f1, const void *f2, void *epsilon) { 1.301 - float a = *((const float*) f1); 1.302 - float b = *((const float*) f2); 1.303 - float e = !epsilon ? 1e-6f : *((float*)epsilon); 1.304 - if (fabsf(a - b) < e) { 1.305 - return 0; 1.306 - } else { 1.307 - return a < b ? -1 : 1; 1.308 - } 1.309 -} 1.310 - 1.311 -int ucx_cmp_double(const void *d1, const void *d2, void *epsilon) { 1.312 - double a = *((const double*) d1); 1.313 - double b = *((const double*) d2); 1.314 - double e = !epsilon ? 1e-14 : *((double*)epsilon); 1.315 - if (fabs(a - b) < e) { 1.316 - return 0; 1.317 - } else { 1.318 - return a < b ? -1 : 1; 1.319 - } 1.320 -} 1.321 - 1.322 -int ucx_cmp_ptr(const void *ptr1, const void *ptr2, void *data) { 1.323 - const intptr_t p1 = (const intptr_t) ptr1; 1.324 - const intptr_t p2 = (const intptr_t) ptr2; 1.325 - if (p1 == p2) { 1.326 - return 0; 1.327 - } else { 1.328 - return p1 < p2 ? -1 : 1; 1.329 - } 1.330 -} 1.331 - 1.332 -int ucx_cmp_mem(const void *ptr1, const void *ptr2, void *n) { 1.333 - return memcmp(ptr1, ptr2, *((size_t*)n)); 1.334 -} 1.335 - 1.336 -/* PRINTF FUNCTIONS */ 1.337 - 1.338 -#ifdef va_copy 1.339 -#define UCX_PRINTF_BUFSIZE 256 1.340 -#else 1.341 -#pragma message("WARNING: C99 va_copy macro not supported by this platform" \ 1.342 - " - limiting ucx_*printf to 2 KiB") 1.343 -#define UCX_PRINTF_BUFSIZE 0x800 1.344 -#endif 1.345 - 1.346 -int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) { 1.347 - int ret; 1.348 - va_list ap; 1.349 - va_start(ap, fmt); 1.350 - ret = ucx_vfprintf(stream, wfc, fmt, ap); 1.351 - va_end(ap); 1.352 - return ret; 1.353 -} 1.354 - 1.355 -int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) { 1.356 - char buf[UCX_PRINTF_BUFSIZE]; 1.357 -#ifdef va_copy 1.358 - va_list ap2; 1.359 - va_copy(ap2, ap); 1.360 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 1.361 - if (ret < 0) { 1.362 - return ret; 1.363 - } else if (ret < UCX_PRINTF_BUFSIZE) { 1.364 - return (int)wfc(buf, 1, ret, stream); 1.365 - } else { 1.366 - if (ret == INT_MAX) { 1.367 - errno = ENOMEM; 1.368 - return -1; 1.369 - } 1.370 - 1.371 - int len = ret + 1; 1.372 - char *newbuf = (char*)malloc(len); 1.373 - if (!newbuf) { 1.374 - return -1; 1.375 - } 1.376 - 1.377 - ret = vsnprintf(newbuf, len, fmt, ap2); 1.378 - if (ret > 0) { 1.379 - ret = (int)wfc(newbuf, 1, ret, stream); 1.380 - } 1.381 - free(newbuf); 1.382 - } 1.383 - return ret; 1.384 -#else 1.385 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 1.386 - if (ret < 0) { 1.387 - return ret; 1.388 - } else if (ret < UCX_PRINTF_BUFSIZE) { 1.389 - return (int)wfc(buf, 1, ret, stream); 1.390 - } else { 1.391 - errno = ENOMEM; 1.392 - return -1; 1.393 - } 1.394 -#endif 1.395 -} 1.396 - 1.397 -sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) { 1.398 - va_list ap; 1.399 - sstr_t ret; 1.400 - va_start(ap, fmt); 1.401 - ret = ucx_vasprintf(allocator, fmt, ap); 1.402 - va_end(ap); 1.403 - return ret; 1.404 -} 1.405 - 1.406 -sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) { 1.407 - sstr_t s; 1.408 - s.ptr = NULL; 1.409 - s.length = 0; 1.410 - char buf[UCX_PRINTF_BUFSIZE]; 1.411 -#ifdef va_copy 1.412 - va_list ap2; 1.413 - va_copy(ap2, ap); 1.414 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 1.415 - if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { 1.416 - s.ptr = (char*)almalloc(a, ret + 1); 1.417 - if (s.ptr) { 1.418 - s.length = (size_t)ret; 1.419 - memcpy(s.ptr, buf, ret); 1.420 - s.ptr[s.length] = '\0'; 1.421 - } 1.422 - } else if (ret == INT_MAX) { 1.423 - errno = ENOMEM; 1.424 - } else { 1.425 - int len = ret + 1; 1.426 - s.ptr = (char*)almalloc(a, len); 1.427 - if (s.ptr) { 1.428 - ret = vsnprintf(s.ptr, len, fmt, ap2); 1.429 - if (ret < 0) { 1.430 - free(s.ptr); 1.431 - s.ptr = NULL; 1.432 - } else { 1.433 - s.length = (size_t)ret; 1.434 - } 1.435 - } 1.436 - } 1.437 -#else 1.438 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 1.439 - if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { 1.440 - s.ptr = (char*)almalloc(a, ret + 1); 1.441 - if (s.ptr) { 1.442 - s.length = (size_t)ret; 1.443 - memcpy(s.ptr, buf, ret); 1.444 - s.ptr[s.length] = '\0'; 1.445 - } 1.446 - } else { 1.447 - errno = ENOMEM; 1.448 - } 1.449 -#endif 1.450 - return s; 1.451 -}