Mon, 13 Nov 2017 13:52:00 +0100
ucx is now used as external library
1.1 --- a/Makefile Thu Nov 10 18:44:48 2016 +0100 1.2 +++ b/Makefile Mon Nov 13 13:52:00 2017 +0100 1.3 @@ -34,11 +34,6 @@ 1.4 SRC = frontend.c 1.5 SRC += c2html.c 1.6 SRC += highlighter.c 1.7 -SRC += ucx/allocator.c 1.8 -SRC += ucx/buffer.c 1.9 -SRC += ucx/list.c 1.10 -SRC += ucx/string.c 1.11 -SRC += ucx/utils.c 1.12 1.13 OBJ = $(SRC:%.c=build/%$(OBJ_EXT)) 1.14
2.1 --- a/clang.mk Thu Nov 10 18:44:48 2016 +0100 2.2 +++ b/clang.mk Mon Nov 13 13:52:00 2017 +0100 2.3 @@ -36,5 +36,5 @@ 2.4 CC = clang 2.5 CFLAGS = -O2 2.6 LD = clang 2.7 -LDFLAGS = 2.8 +LDFLAGS = -lucx 2.9 OBJ_EXT = .o
3.1 --- a/gcc.mk Thu Nov 10 18:44:48 2016 +0100 3.2 +++ b/gcc.mk Mon Nov 13 13:52:00 2017 +0100 3.3 @@ -36,5 +36,5 @@ 3.4 CC = gcc 3.5 CFLAGS = -O2 -std=gnu99 3.6 LD = gcc 3.7 -LDFLAGS = 3.8 +LDFLAGS = -lucx 3.9 OBJ_EXT = .o
4.1 --- a/src/c2html.c Thu Nov 10 18:44:48 2016 +0100 4.2 +++ b/src/c2html.c Mon Nov 13 13:52:00 2017 +0100 4.3 @@ -29,8 +29,8 @@ 4.4 4.5 #include "c2html.h" 4.6 4.7 -#include "ucx/list.h" 4.8 -#include "ucx/utils.h" 4.9 +#include <ucx/list.h> 4.10 +#include <ucx/utils.h> 4.11 4.12 #define try_write(wfnc, str, n, buf, written, maxlen) \ 4.13 { \ 4.14 @@ -99,8 +99,8 @@ 4.15 size_t maxlen, c2html_highlighter_func hltr, int showln) { 4.16 4.17 UcxBuffer *content = ucx_buffer_new(NULL, ibuflen*2, UCX_BUFFER_AUTOEXTEND); 4.18 - ucx_stream_copy(inputbuffer, content, rfnc, (write_func) ucx_buffer_write, 4.19 - ibuf, ibuflen, (size_t)-1); 4.20 + ucx_stream_bcopy(inputbuffer, content, rfnc, (write_func) ucx_buffer_write, 4.21 + ibuf, ibuflen); 4.22 4.23 size_t n = c2html_bformatn(content->space, content->size, 4.24 outputbuffer, wfnc, maxlen, hltr, showln);
5.1 --- a/src/frontend.c Thu Nov 10 18:44:48 2016 +0100 5.2 +++ b/src/frontend.c Mon Nov 13 13:52:00 2017 +0100 5.3 @@ -33,7 +33,7 @@ 5.4 #include <string.h> 5.5 5.6 #include "c2html.h" 5.7 -#include "ucx/utils.h" 5.8 +#include <ucx/utils.h> 5.9 5.10 #define FILEBUF_SIZE 4096 5.11 5.12 @@ -55,7 +55,7 @@ 5.13 } 5.14 return 1; 5.15 } 5.16 - ucx_stream_copy(headerfile, fout, 5.17 + ucx_stream_bncopy(headerfile, fout, 5.18 (read_func) fread, (write_func) fwrite, 5.19 copybuf, copybuflen, (size_t)-1); 5.20 fclose(headerfile);
6.1 --- a/src/highlighter.c Thu Nov 10 18:44:48 2016 +0100 6.2 +++ b/src/highlighter.c Mon Nov 13 13:52:00 2017 +0100 6.3 @@ -33,8 +33,8 @@ 6.4 #include <stdio.h> 6.5 #include <string.h> 6.6 #include <ctype.h> 6.7 -#include "ucx/string.h" 6.8 -#include "ucx/utils.h" 6.9 +#include <ucx/string.h> 6.10 +#include <ucx/utils.h> 6.11 6.12 static void put_htmlescaped(UcxBuffer *dest, char c) { 6.13 if (c == '>') {
7.1 --- a/src/highlighter.h Thu Nov 10 18:44:48 2016 +0100 7.2 +++ b/src/highlighter.h Mon Nov 13 13:52:00 2017 +0100 7.3 @@ -30,7 +30,7 @@ 7.4 #ifndef C2HTML_HIGHLIGHTER_H 7.5 #define C2HTML_HIGHLIGHTER_H 7.6 7.7 -#include "ucx/buffer.h" 7.8 +#include <ucx/buffer.h> 7.9 7.10 #ifdef __cplusplus 7.11 extern "C" {
8.1 --- a/src/ucx/allocator.c Thu Nov 10 18:44:48 2016 +0100 8.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 8.3 @@ -1,59 +0,0 @@ 8.4 -/* 8.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 8.6 - * 8.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 8.8 - * 8.9 - * Redistribution and use in source and binary forms, with or without 8.10 - * modification, are permitted provided that the following conditions are met: 8.11 - * 8.12 - * 1. Redistributions of source code must retain the above copyright 8.13 - * notice, this list of conditions and the following disclaimer. 8.14 - * 8.15 - * 2. Redistributions in binary form must reproduce the above copyright 8.16 - * notice, this list of conditions and the following disclaimer in the 8.17 - * documentation and/or other materials provided with the distribution. 8.18 - * 8.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 8.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 8.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 8.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 8.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 8.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 8.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 8.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 8.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 8.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 8.29 - * POSSIBILITY OF SUCH DAMAGE. 8.30 - */ 8.31 - 8.32 -#include <stdlib.h> 8.33 -#include "allocator.h" 8.34 - 8.35 -UcxAllocator default_allocator = { 8.36 - NULL, 8.37 - ucx_default_malloc, 8.38 - ucx_default_calloc, 8.39 - ucx_default_realloc, 8.40 - ucx_default_free 8.41 -}; 8.42 - 8.43 -UcxAllocator *ucx_default_allocator() { 8.44 - UcxAllocator *allocator = &default_allocator; 8.45 - return allocator; 8.46 -} 8.47 - 8.48 -void *ucx_default_malloc(void *ignore, size_t n) { 8.49 - return malloc(n); 8.50 -} 8.51 - 8.52 -void *ucx_default_calloc(void *ignore, size_t n, size_t size) { 8.53 - return calloc(n, size); 8.54 -} 8.55 - 8.56 -void *ucx_default_realloc(void *ignore, void *data, size_t n) { 8.57 - return realloc(data, n); 8.58 -} 8.59 - 8.60 -void ucx_default_free(void *ignore, void *data) { 8.61 - free(data); 8.62 -}
9.1 --- a/src/ucx/allocator.h Thu Nov 10 18:44:48 2016 +0100 9.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 9.3 @@ -1,206 +0,0 @@ 9.4 -/* 9.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 9.6 - * 9.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 9.8 - * 9.9 - * Redistribution and use in source and binary forms, with or without 9.10 - * modification, are permitted provided that the following conditions are met: 9.11 - * 9.12 - * 1. Redistributions of source code must retain the above copyright 9.13 - * notice, this list of conditions and the following disclaimer. 9.14 - * 9.15 - * 2. Redistributions in binary form must reproduce the above copyright 9.16 - * notice, this list of conditions and the following disclaimer in the 9.17 - * documentation and/or other materials provided with the distribution. 9.18 - * 9.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 9.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 9.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 9.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 9.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 9.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 9.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 9.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 9.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 9.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 9.29 - * POSSIBILITY OF SUCH DAMAGE. 9.30 - */ 9.31 -/** 9.32 - * Allocator for custom memory management. 9.33 - * 9.34 - * An UCX allocator consists of a pointer to the memory area / pool and four 9.35 - * function pointers to memory management functions operating on this memory 9.36 - * area / pool. These functions shall behave equivalent to the standard libc 9.37 - * functions <code>malloc(), calloc(), realloc()</code> and <code>free()</code>. 9.38 - * 9.39 - * The signature of the memory management functions is based on the signature 9.40 - * of the respective libc function but each of them takes the pointer to the 9.41 - * memory area / pool as first argument. 9.42 - * 9.43 - * As the pointer to the memory area / pool can be arbitrarily chosen, any data 9.44 - * can be provided to the memory management functions. An UcxMempool is just 9.45 - * one example. 9.46 - * 9.47 - * @see mempool.h 9.48 - * @see UcxMap 9.49 - * 9.50 - * @file allocator.h 9.51 - * @author Mike Becker 9.52 - * @author Olaf Wintermann 9.53 - */ 9.54 - 9.55 -#ifndef UCX_ALLOCATOR_H 9.56 -#define UCX_ALLOCATOR_H 9.57 - 9.58 -#include "ucx.h" 9.59 - 9.60 -#ifdef __cplusplus 9.61 -extern "C" { 9.62 -#endif 9.63 - 9.64 -/** 9.65 - * A function pointer to the allocators <code>malloc()</code> function. 9.66 - * @see UcxAllocator 9.67 - */ 9.68 -typedef void*(*ucx_allocator_malloc)(void *pool, size_t n); 9.69 - 9.70 -/** 9.71 - * A function pointer to the allocators <code>calloc()</code> function. 9.72 - * @see UcxAllocator 9.73 - */ 9.74 -typedef void*(*ucx_allocator_calloc)(void *pool, size_t n, size_t size); 9.75 - 9.76 -/** 9.77 - * A function pointer to the allocators <code>realloc()</code> function. 9.78 - * @see UcxAllocator 9.79 - */ 9.80 -typedef void*(*ucx_allocator_realloc)(void *pool, void *data, size_t n); 9.81 - 9.82 -/** 9.83 - * A function pointer to the allocators <code>free()</code> function. 9.84 - * @see UcxAllocator 9.85 - */ 9.86 -typedef void(*ucx_allocator_free)(void *pool, void *data); 9.87 - 9.88 -/** 9.89 - * UCX allocator data structure containing memory management functions. 9.90 - */ 9.91 -typedef struct { 9.92 - /** Pointer to an area of memory or a complex memory pool. 9.93 - * This pointer will be passed to any memory management function as first 9.94 - * argument. 9.95 - */ 9.96 - void *pool; 9.97 - /** 9.98 - * The <code>malloc()</code> function for this allocator. 9.99 - */ 9.100 - ucx_allocator_malloc malloc; 9.101 - /** 9.102 - * The <code>calloc()</code> function for this allocator. 9.103 - */ 9.104 - ucx_allocator_calloc calloc; 9.105 - /** 9.106 - * The <code>realloc()</code> function for this allocator. 9.107 - */ 9.108 - ucx_allocator_realloc realloc; 9.109 - /** 9.110 - * The <code>free()</code> function for this allocator. 9.111 - */ 9.112 - ucx_allocator_free free; 9.113 -} UcxAllocator; 9.114 - 9.115 -/** 9.116 - * Returns a pointer to the default allocator. 9.117 - * 9.118 - * The default allocator contains wrappers to the standard libc memory 9.119 - * management functions. Use this function to get a pointer to a globally 9.120 - * available allocator. You may also define an own UcxAllocator by assigning 9.121 - * #UCX_ALLOCATOR_DEFAULT to a variable and pass the address of this variable 9.122 - * to any function that takes an UcxAllocator as argument. Note that using 9.123 - * this function is the recommended way of passing a default allocator, thus 9.124 - * it never runs out of scope. 9.125 - * 9.126 - * @return a pointer to the default allocator 9.127 - * 9.128 - * @see UCX_ALLOCATOR_DEFAULT 9.129 - */ 9.130 -UcxAllocator *ucx_default_allocator(); 9.131 - 9.132 -/** 9.133 - * A wrapper for the standard libc <code>malloc()</code> function. 9.134 - * @param ignore ignored (may be used by allocators for pooled memory) 9.135 - * @param n argument passed to <code>malloc()</code> 9.136 - * @return return value of <code>malloc()</code> 9.137 - */ 9.138 -void *ucx_default_malloc(void *ignore, size_t n); 9.139 -/** 9.140 - * A wrapper for the standard libc <code>calloc()</code> function. 9.141 - * @param ignore ignored (may be used by allocators for pooled memory) 9.142 - * @param n argument passed to <code>calloc()</code> 9.143 - * @param size argument passed to <code>calloc()</code> 9.144 - * @return return value of <code>calloc()</code> 9.145 - */ 9.146 -void *ucx_default_calloc(void *ignore, size_t n, size_t size); 9.147 -/** 9.148 - * A wrapper for the standard libc <code>realloc()</code> function. 9.149 - * @param ignore ignored (may be used by allocators for pooled memory) 9.150 - * @param data argumend passed to <code>realloc()</code> 9.151 - * @param n argument passed to <code>realloc()</code> 9.152 - * @return return value of <code>realloc()</code> 9.153 - */ 9.154 -void *ucx_default_realloc(void *ignore, void *data, size_t n); 9.155 -/** 9.156 - * A wrapper for the standard libc <code>free()</code> function. 9.157 - * @param ignore ignored (may be used by allocators for pooled memory) 9.158 - * @param data argument passed to <code>free()</code> 9.159 - */ 9.160 -void ucx_default_free(void *ignore, void *data); 9.161 - 9.162 -/** 9.163 - * Shorthand for calling an allocators malloc function. 9.164 - * @param allocator the allocator to use 9.165 - * @param n size of space to allocate 9.166 - * @return a pointer to the allocated memory area 9.167 - */ 9.168 -#define almalloc(allocator, n) ((allocator)->malloc((allocator)->pool, n)) 9.169 - 9.170 -/** 9.171 - * Shorthand for calling an allocators calloc function. 9.172 - * @param allocator the allocator to use 9.173 - * @param n the count of elements the space should be allocated for 9.174 - * @param size the size of each element 9.175 - * @return a pointer to the allocated memory area 9.176 - */ 9.177 -#define alcalloc(allocator, n, size) \ 9.178 - ((allocator)->calloc((allocator)->pool, n, size)) 9.179 - 9.180 -/** 9.181 - * Shorthand for calling an allocators realloc function. 9.182 - * @param allocator the allocator to use 9.183 - * @param ptr the pointer to the memory area that shall be reallocated 9.184 - * @param n the new size of the allocated memory area 9.185 - * @return a pointer to the reallocated memory area 9.186 - */ 9.187 -#define alrealloc(allocator, ptr, n) \ 9.188 - ((allocator)->realloc((allocator)->pool, ptr, n)) 9.189 - 9.190 -/** 9.191 - * Shorthand for calling an allocators free function. 9.192 - * @param allocator the allocator to use 9.193 - * @param ptr the pointer to the memory area that shall be freed 9.194 - */ 9.195 -#define alfree(allocator, ptr) ((allocator)->free((allocator)->pool, ptr)) 9.196 - 9.197 -/** 9.198 - * Convenient macro for a default allocator <code>struct</code> definition. 9.199 - */ 9.200 -#define UCX_ALLOCATOR_DEFAULT {NULL, \ 9.201 - ucx_default_malloc, ucx_default_calloc, ucx_default_realloc, \ 9.202 - ucx_default_free } 9.203 - 9.204 -#ifdef __cplusplus 9.205 -} 9.206 -#endif 9.207 - 9.208 -#endif /* UCX_ALLOCATOR_H */ 9.209 -
10.1 --- a/src/ucx/buffer.c Thu Nov 10 18:44:48 2016 +0100 10.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 10.3 @@ -1,234 +0,0 @@ 10.4 -/* 10.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 10.6 - * 10.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 10.8 - * 10.9 - * Redistribution and use in source and binary forms, with or without 10.10 - * modification, are permitted provided that the following conditions are met: 10.11 - * 10.12 - * 1. Redistributions of source code must retain the above copyright 10.13 - * notice, this list of conditions and the following disclaimer. 10.14 - * 10.15 - * 2. Redistributions in binary form must reproduce the above copyright 10.16 - * notice, this list of conditions and the following disclaimer in the 10.17 - * documentation and/or other materials provided with the distribution. 10.18 - * 10.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 10.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 10.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 10.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 10.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 10.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 10.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 10.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 10.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 10.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 10.29 - * POSSIBILITY OF SUCH DAMAGE. 10.30 - */ 10.31 - 10.32 -#include "buffer.h" 10.33 -#include <stdarg.h> 10.34 -#include <stdlib.h> 10.35 -#include <string.h> 10.36 - 10.37 -UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags) { 10.38 - UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 10.39 - if (buffer) { 10.40 - buffer->flags = flags; 10.41 - if (!space) { 10.42 - buffer->space = (char*)malloc(capacity); 10.43 - if (!buffer->space) { 10.44 - free(buffer); 10.45 - return NULL; 10.46 - } 10.47 - memset(buffer->space, 0, capacity); 10.48 - buffer->flags |= UCX_BUFFER_AUTOFREE; 10.49 - } else { 10.50 - buffer->space = (char*)space; 10.51 - } 10.52 - buffer->capacity = capacity; 10.53 - buffer->size = 0; 10.54 - 10.55 - buffer->pos = 0; 10.56 - } 10.57 - 10.58 - return buffer; 10.59 -} 10.60 - 10.61 -void ucx_buffer_free(UcxBuffer *buffer) { 10.62 - if ((buffer->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE) { 10.63 - free(buffer->space); 10.64 - } 10.65 - free(buffer); 10.66 -} 10.67 - 10.68 -UcxBuffer* ucx_buffer_extract( 10.69 - UcxBuffer *src, size_t start, size_t length, int flags) { 10.70 - 10.71 - if (src->size == 0 || length == 0 || start+length > src->capacity) { 10.72 - return NULL; 10.73 - } 10.74 - 10.75 - UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 10.76 - if (dst) { 10.77 - dst->space = (char*)malloc(length); 10.78 - if (!dst->space) { 10.79 - free(dst); 10.80 - return NULL; 10.81 - } 10.82 - dst->capacity = length; 10.83 - dst->size = length; 10.84 - dst->flags = flags | UCX_BUFFER_AUTOFREE; 10.85 - dst->pos = 0; 10.86 - memcpy(dst->space, src->space+start, length); 10.87 - } 10.88 - return dst; 10.89 -} 10.90 - 10.91 -int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) { 10.92 - size_t npos; 10.93 - switch (whence) { 10.94 - case SEEK_CUR: 10.95 - npos = buffer->pos; 10.96 - break; 10.97 - case SEEK_END: 10.98 - npos = buffer->size; 10.99 - break; 10.100 - case SEEK_SET: 10.101 - npos = 0; 10.102 - break; 10.103 - default: 10.104 - return -1; 10.105 - } 10.106 - 10.107 - size_t opos = npos; 10.108 - npos += offset; 10.109 - 10.110 - if ((offset > 0 && npos < opos) || (offset < 0 && npos > opos)) { 10.111 - return -1; 10.112 - } 10.113 - 10.114 - if (npos >= buffer->size) { 10.115 - return -1; 10.116 - } else { 10.117 - buffer->pos = npos; 10.118 - return 0; 10.119 - } 10.120 - 10.121 -} 10.122 - 10.123 -int ucx_buffer_eof(UcxBuffer *buffer) { 10.124 - return buffer->pos >= buffer->size; 10.125 -} 10.126 - 10.127 -int ucx_buffer_extend(UcxBuffer *buffer, size_t len) { 10.128 - size_t newcap = buffer->capacity; 10.129 - 10.130 - if (buffer->capacity + len < buffer->capacity) { 10.131 - return -1; 10.132 - } 10.133 - 10.134 - while (buffer->capacity + len > newcap) { 10.135 - newcap <<= 1; 10.136 - if (newcap < buffer->capacity) { 10.137 - return -1; 10.138 - } 10.139 - } 10.140 - 10.141 - char *newspace = (char*)realloc(buffer->space, newcap); 10.142 - if (newspace) { 10.143 - memset(newspace+buffer->size, 0, newcap-buffer->size); 10.144 - buffer->space = newspace; 10.145 - buffer->capacity = newcap; 10.146 - } else { 10.147 - return -1; 10.148 - } 10.149 - 10.150 - return 0; 10.151 -} 10.152 - 10.153 -size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems, 10.154 - UcxBuffer *buffer) { 10.155 - size_t len = size * nitems; 10.156 - size_t required = buffer->pos + len; 10.157 - if (buffer->pos > required) { 10.158 - return 0; 10.159 - } 10.160 - 10.161 - if (required > buffer->capacity) { 10.162 - if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) { 10.163 - if (ucx_buffer_extend(buffer, required - buffer->capacity)) { 10.164 - return 0; 10.165 - } 10.166 - } else { 10.167 - len = buffer->capacity - buffer->pos; 10.168 - if (size > 1) { 10.169 - len -= len%size; 10.170 - } 10.171 - } 10.172 - } 10.173 - 10.174 - if (len == 0) { 10.175 - return len; 10.176 - } 10.177 - 10.178 - memcpy(buffer->space + buffer->pos, ptr, len); 10.179 - buffer->pos += len; 10.180 - if(buffer->pos > buffer->size) { 10.181 - buffer->size = buffer->pos; 10.182 - } 10.183 - 10.184 - return len / size; 10.185 -} 10.186 - 10.187 -size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems, 10.188 - UcxBuffer *buffer) { 10.189 - size_t len = size * nitems; 10.190 - if (buffer->pos + len > buffer->size) { 10.191 - len = buffer->size - buffer->pos; 10.192 - if (size > 1) len -= len%size; 10.193 - } 10.194 - 10.195 - if (len <= 0) { 10.196 - return len; 10.197 - } 10.198 - 10.199 - memcpy(ptr, buffer->space + buffer->pos, len); 10.200 - buffer->pos += len; 10.201 - 10.202 - return len / size; 10.203 -} 10.204 - 10.205 -int ucx_buffer_putc(UcxBuffer *buffer, int c) { 10.206 - if(buffer->pos >= buffer->capacity) { 10.207 - if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) { 10.208 - if(ucx_buffer_extend(buffer, 1)) { 10.209 - return EOF; 10.210 - } 10.211 - } else { 10.212 - return EOF; 10.213 - } 10.214 - } 10.215 - 10.216 - c &= 0xFF; 10.217 - buffer->space[buffer->pos] = (char) c; 10.218 - buffer->pos++; 10.219 - if(buffer->pos > buffer->size) { 10.220 - buffer->size = buffer->pos; 10.221 - } 10.222 - return c; 10.223 -} 10.224 - 10.225 -int ucx_buffer_getc(UcxBuffer *buffer) { 10.226 - if (ucx_buffer_eof(buffer)) { 10.227 - return EOF; 10.228 - } else { 10.229 - int c = buffer->space[buffer->pos]; 10.230 - buffer->pos++; 10.231 - return c; 10.232 - } 10.233 -} 10.234 - 10.235 -size_t ucx_buffer_puts(UcxBuffer *buffer, char *str) { 10.236 - return ucx_buffer_write((const void*)str, 1, strlen(str), buffer); 10.237 -}
11.1 --- a/src/ucx/buffer.h Thu Nov 10 18:44:48 2016 +0100 11.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 11.3 @@ -1,270 +0,0 @@ 11.4 -/* 11.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 11.6 - * 11.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 11.8 - * 11.9 - * Redistribution and use in source and binary forms, with or without 11.10 - * modification, are permitted provided that the following conditions are met: 11.11 - * 11.12 - * 1. Redistributions of source code must retain the above copyright 11.13 - * notice, this list of conditions and the following disclaimer. 11.14 - * 11.15 - * 2. Redistributions in binary form must reproduce the above copyright 11.16 - * notice, this list of conditions and the following disclaimer in the 11.17 - * documentation and/or other materials provided with the distribution. 11.18 - * 11.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 11.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 11.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 11.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 11.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 11.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 11.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 11.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 11.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 11.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 11.29 - * POSSIBILITY OF SUCH DAMAGE. 11.30 - */ 11.31 - 11.32 -/** 11.33 - * @file buffer.h 11.34 - * 11.35 - * Advanced buffer implementation. 11.36 - * 11.37 - * Instances of UcxBuffer can be used to read from or to write to like one 11.38 - * would do with a stream. This allows the use of ucx_stream_copy() to copy 11.39 - * contents from one buffer to another. 11.40 - * 11.41 - * Some features for convenient use of the buffer 11.42 - * can be enabled. See the documentation of the macro constants for more 11.43 - * information. 11.44 - * 11.45 - * @author Mike Becker 11.46 - * @author Olaf Wintermann 11.47 - */ 11.48 - 11.49 -#ifndef UCX_BUFFER_H 11.50 -#define UCX_BUFFER_H 11.51 - 11.52 -#include "ucx.h" 11.53 -#include <sys/types.h> 11.54 -#include <stdio.h> 11.55 - 11.56 -#ifdef __cplusplus 11.57 -extern "C" { 11.58 -#endif 11.59 - 11.60 -/** 11.61 - * No buffer features enabled (all flags cleared). 11.62 - */ 11.63 -#define UCX_BUFFER_DEFAULT 0x00 11.64 - 11.65 -/** 11.66 - * If this flag is enabled, the buffer will automatically free its contents. 11.67 - */ 11.68 -#define UCX_BUFFER_AUTOFREE 0x01 11.69 - 11.70 -/** 11.71 - * If this flag is enabled, the buffer will automatically extends its capacity. 11.72 - */ 11.73 -#define UCX_BUFFER_AUTOEXTEND 0x02 11.74 - 11.75 -/** UCX Buffer. */ 11.76 -typedef struct { 11.77 - /** A pointer to the buffer contents. */ 11.78 - char *space; 11.79 - /** Current position of the buffer. */ 11.80 - size_t pos; 11.81 - /** Current capacity (i.e. maximum size) of the buffer. */ 11.82 - size_t capacity; 11.83 - /** Current size of the buffer content. */ 11.84 - size_t size; 11.85 - /** 11.86 - * Flag register for buffer features. 11.87 - * @see #UCX_BUFFER_DEFAULT 11.88 - * @see #UCX_BUFFER_AUTOFREE 11.89 - * @see #UCX_BUFFER_AUTOEXTEND 11.90 - */ 11.91 - int flags; 11.92 -} UcxBuffer; 11.93 - 11.94 -/** 11.95 - * Creates a new buffer. 11.96 - * 11.97 - * <b>Note:</b> you may provide <code>NULL</code> as argument for 11.98 - * <code>space</code>. Then this function will allocate the space and enforce 11.99 - * the #UCX_BUFFER_AUTOFREE flag. 11.100 - * 11.101 - * @param space pointer to the memory area, or <code>NULL</code> to allocate 11.102 - * new memory 11.103 - * @param capacity the capacity of the buffer 11.104 - * @param flags buffer features (see UcxBuffer.flags) 11.105 - * @return the new buffer 11.106 - */ 11.107 -UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags); 11.108 - 11.109 -/** 11.110 - * Destroys a buffer. 11.111 - * 11.112 - * If the #UCX_BUFFER_AUTOFREE feature is enabled, the contents of the buffer 11.113 - * are also freed. 11.114 - * 11.115 - * @param buffer the buffer to destroy 11.116 - */ 11.117 -void ucx_buffer_free(UcxBuffer* buffer); 11.118 - 11.119 -/** 11.120 - * Creates a new buffer and fills it with extracted content from another buffer. 11.121 - * 11.122 - * <b>Note:</b> the #UCX_BUFFER_AUTOFREE feature is enforced for the new buffer. 11.123 - * 11.124 - * @param src the source buffer 11.125 - * @param start the start position of extraction 11.126 - * @param length the count of bytes to extract (must not be zero) 11.127 - * @param flags feature mask for the new buffer 11.128 - * @return a new buffer containing the extraction 11.129 - */ 11.130 -UcxBuffer* ucx_buffer_extract(UcxBuffer *src, 11.131 - size_t start, size_t length, int flags); 11.132 - 11.133 -/** 11.134 - * A shorthand macro for the full extraction of the buffer. 11.135 - * 11.136 - * @param src the source buffer 11.137 - * @param flags feature mask for the new buffer 11.138 - * @return a new buffer with the extracted content 11.139 - */ 11.140 -#define ucx_buffer_clone(src,flags) \ 11.141 - ucx_buffer_extract(src, 0, (src)->capacity, flags) 11.142 - 11.143 -/** 11.144 - * Moves the position of the buffer. 11.145 - * 11.146 - * The new position is relative to the <code>whence</code> argument. 11.147 - * 11.148 - * SEEK_SET marks the start of the buffer. 11.149 - * SEEK_CUR marks the current position. 11.150 - * SEEK_END marks the end of the buffer. 11.151 - * 11.152 - * With an offset of zero, this function sets the buffer position to zero 11.153 - * (SEEK_SET), the buffer size (SEEK_END) or leaves the buffer position 11.154 - * unchanged (SEEK_CUR). 11.155 - * 11.156 - * @param buffer 11.157 - * @param offset position offset relative to <code>whence</code> 11.158 - * @param whence one of SEEK_SET, SEEK_CUR or SEEK_END 11.159 - * @return 0 on success, non-zero if the position is invalid 11.160 - * 11.161 - */ 11.162 -int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence); 11.163 - 11.164 -/** 11.165 - * Clears the buffer by resetting the position and deleting the data. 11.166 - * 11.167 - * The data is deleted by a zeroing it with call to <code>memset()</code>. 11.168 - * 11.169 - * @param buffer the buffer to be cleared 11.170 - */ 11.171 -#define ucx_buffer_clear(buffer) memset(buffer->space, 0, buffer->size); \ 11.172 - buffer->size = 0; buffer->pos = 0; 11.173 - 11.174 -/** 11.175 - * Tests, if the buffer position has exceeded the buffer capacity. 11.176 - * 11.177 - * @param buffer the buffer to test 11.178 - * @return non-zero, if the current buffer position has exceeded the last 11.179 - * available byte of the buffer. 11.180 - */ 11.181 -int ucx_buffer_eof(UcxBuffer *buffer); 11.182 - 11.183 - 11.184 -/** 11.185 - * Extends the capacity of the buffer. 11.186 - * 11.187 - * <b>Note:</b> The buffer capacity increased by a power of two. I.e. 11.188 - * the buffer capacity is doubled, as long as it would not hold the current 11.189 - * content plus the additional required bytes. 11.190 - * 11.191 - * <b>Attention:</b> the argument provided is the number of <i>additional</i> 11.192 - * bytes the buffer shall hold. It is <b>NOT</b> the total number of bytes the 11.193 - * buffer shall hold. 11.194 - * 11.195 - * @param buffer the buffer to extend 11.196 - * @param additional_bytes the number of additional bytes the buffer shall 11.197 - * <i>at least</i> hold 11.198 - * @return 0 on success or a non-zero value on failure 11.199 - */ 11.200 -int ucx_buffer_extend(UcxBuffer *buffer, size_t additional_bytes); 11.201 - 11.202 -/** 11.203 - * Writes data to an UcxBuffer. 11.204 - * 11.205 - * The position of the buffer is increased by the number of bytes written. 11.206 - * 11.207 - * @param ptr a pointer to the memory area containing the bytes to be written 11.208 - * @param size the length of one element 11.209 - * @param nitems the element count 11.210 - * @param buffer the UcxBuffer to write to 11.211 - * @return the total count of bytes written 11.212 - */ 11.213 -size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems, 11.214 - UcxBuffer *buffer); 11.215 - 11.216 -/** 11.217 - * Reads data from an UcxBuffer. 11.218 - * 11.219 - * The position of the buffer is increased by the number of bytes read. 11.220 - * 11.221 - * @param ptr a pointer to the memory area where to store the read data 11.222 - * @param size the length of one element 11.223 - * @param nitems the element count 11.224 - * @param buffer the UcxBuffer to read from 11.225 - * @return the total number of elements read 11.226 - */ 11.227 -size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems, 11.228 - UcxBuffer *buffer); 11.229 - 11.230 -/** 11.231 - * Writes a character to a buffer. 11.232 - * 11.233 - * The least significant byte of the argument is written to the buffer. If the 11.234 - * end of the buffer is reached and #UCX_BUFFER_AUTOEXTEND feature is enabled, 11.235 - * the buffer capacity is extended by ucx_buffer_extend(). If the feature is 11.236 - * disabled or buffer extension fails, <code>EOF</code> is returned. 11.237 - * 11.238 - * On successful write the position of the buffer is increased. 11.239 - * 11.240 - * @param buffer the buffer to write to 11.241 - * @param c the character to write as <code>int</code> value 11.242 - * @return the byte that has bean written as <code>int</code> value or 11.243 - * <code>EOF</code> when the end of the stream is reached and automatic 11.244 - * extension is not enabled or not possible 11.245 - */ 11.246 -int ucx_buffer_putc(UcxBuffer *buffer, int c); 11.247 - 11.248 -/** 11.249 - * Gets a character from a buffer. 11.250 - * 11.251 - * The current position of the buffer is increased after a successful read. 11.252 - * 11.253 - * @param buffer the buffer to read from 11.254 - * @return the character as <code>int</code> value or <code>EOF</code>, if the 11.255 - * end of the buffer is reached 11.256 - */ 11.257 -int ucx_buffer_getc(UcxBuffer *buffer); 11.258 - 11.259 -/** 11.260 - * Writes a string to a buffer. 11.261 - * 11.262 - * @param buffer the buffer 11.263 - * @param str the string 11.264 - * @return the number of bytes written 11.265 - */ 11.266 -size_t ucx_buffer_puts(UcxBuffer *buffer, char *str); 11.267 - 11.268 -#ifdef __cplusplus 11.269 -} 11.270 -#endif 11.271 - 11.272 -#endif /* UCX_BUFFER_H */ 11.273 -
12.1 --- a/src/ucx/list.c Thu Nov 10 18:44:48 2016 +0100 12.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 12.3 @@ -1,335 +0,0 @@ 12.4 -/* 12.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 12.6 - * 12.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 12.8 - * 12.9 - * Redistribution and use in source and binary forms, with or without 12.10 - * modification, are permitted provided that the following conditions are met: 12.11 - * 12.12 - * 1. Redistributions of source code must retain the above copyright 12.13 - * notice, this list of conditions and the following disclaimer. 12.14 - * 12.15 - * 2. Redistributions in binary form must reproduce the above copyright 12.16 - * notice, this list of conditions and the following disclaimer in the 12.17 - * documentation and/or other materials provided with the distribution. 12.18 - * 12.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 12.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 12.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 12.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 12.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 12.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 12.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 12.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 12.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 12.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 12.29 - * POSSIBILITY OF SUCH DAMAGE. 12.30 - */ 12.31 - 12.32 -#include "list.h" 12.33 - 12.34 -UcxList *ucx_list_clone(UcxList *l, copy_func fnc, void *data) { 12.35 - return ucx_list_clone_a(ucx_default_allocator(), l, fnc, data); 12.36 -} 12.37 - 12.38 -UcxList *ucx_list_clone_a(UcxAllocator *alloc, UcxList *l, 12.39 - copy_func fnc, void *data) { 12.40 - UcxList *ret = NULL; 12.41 - while (l) { 12.42 - if (fnc) { 12.43 - ret = ucx_list_append_a(alloc, ret, fnc(l->data, data)); 12.44 - } else { 12.45 - ret = ucx_list_append_a(alloc, ret, l->data); 12.46 - } 12.47 - l = l->next; 12.48 - } 12.49 - return ret; 12.50 -} 12.51 - 12.52 -int ucx_list_equals(const UcxList *l1, const UcxList *l2, 12.53 - cmp_func fnc, void* data) { 12.54 - if (l1 == l2) return 1; 12.55 - 12.56 - while (l1 != NULL && l2 != NULL) { 12.57 - if (fnc == NULL) { 12.58 - if (l1->data != l2->data) return 0; 12.59 - } else { 12.60 - if (fnc(l1->data, l2->data, data) != 0) return 0; 12.61 - } 12.62 - l1 = l1->next; 12.63 - l2 = l2->next; 12.64 - } 12.65 - 12.66 - return (l1 == NULL && l2 == NULL); 12.67 -} 12.68 - 12.69 -void ucx_list_free(UcxList *l) { 12.70 - ucx_list_free_a(ucx_default_allocator(), l); 12.71 -} 12.72 - 12.73 -void ucx_list_free_a(UcxAllocator *alloc, UcxList *l) { 12.74 - UcxList *e = l, *f; 12.75 - while (e != NULL) { 12.76 - f = e; 12.77 - e = e->next; 12.78 - alfree(alloc, f); 12.79 - } 12.80 -} 12.81 - 12.82 -void ucx_list_free_content(UcxList* list, ucx_destructor destr) { 12.83 - while (list != NULL) { 12.84 - destr(list->data); 12.85 - list = list->next; 12.86 - } 12.87 -} 12.88 - 12.89 -UcxList *ucx_list_append(UcxList *l, void *data) { 12.90 - return ucx_list_append_a(ucx_default_allocator(), l, data); 12.91 -} 12.92 - 12.93 -UcxList *ucx_list_append_a(UcxAllocator *alloc, UcxList *l, void *data) { 12.94 - UcxList *nl = (UcxList*) almalloc(alloc, sizeof(UcxList)); 12.95 - if (!nl) { 12.96 - return NULL; 12.97 - } 12.98 - 12.99 - nl->data = data; 12.100 - nl->next = NULL; 12.101 - if (l) { 12.102 - UcxList *t = ucx_list_last(l); 12.103 - t->next = nl; 12.104 - nl->prev = t; 12.105 - return l; 12.106 - } else { 12.107 - nl->prev = NULL; 12.108 - return nl; 12.109 - } 12.110 -} 12.111 - 12.112 -UcxList *ucx_list_prepend(UcxList *l, void *data) { 12.113 - return ucx_list_prepend_a(ucx_default_allocator(), l, data); 12.114 -} 12.115 - 12.116 -UcxList *ucx_list_prepend_a(UcxAllocator *alloc, UcxList *l, void *data) { 12.117 - UcxList *nl = ucx_list_append_a(alloc, NULL, data); 12.118 - if (!nl) { 12.119 - return NULL; 12.120 - } 12.121 - l = ucx_list_first(l); 12.122 - 12.123 - if (l) { 12.124 - nl->next = l; 12.125 - l->prev = nl; 12.126 - } 12.127 - return nl; 12.128 -} 12.129 - 12.130 -UcxList *ucx_list_concat(UcxList *l1, UcxList *l2) { 12.131 - if (l1) { 12.132 - UcxList *last = ucx_list_last(l1); 12.133 - last->next = l2; 12.134 - if (l2) { 12.135 - l2->prev = last; 12.136 - } 12.137 - return l1; 12.138 - } else { 12.139 - return l2; 12.140 - } 12.141 -} 12.142 - 12.143 -UcxList *ucx_list_last(const UcxList *l) { 12.144 - if (l == NULL) return NULL; 12.145 - 12.146 - const UcxList *e = l; 12.147 - while (e->next != NULL) { 12.148 - e = e->next; 12.149 - } 12.150 - return (UcxList*)e; 12.151 -} 12.152 - 12.153 -ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem) { 12.154 - ssize_t index = 0; 12.155 - while (list) { 12.156 - if (list == elem) { 12.157 - return index; 12.158 - } 12.159 - list = list->next; 12.160 - index++; 12.161 - } 12.162 - return -1; 12.163 -} 12.164 - 12.165 -UcxList *ucx_list_get(const UcxList *l, size_t index) { 12.166 - if (l == NULL) return NULL; 12.167 - 12.168 - const UcxList *e = l; 12.169 - while (e->next && index > 0) { 12.170 - e = e->next; 12.171 - index--; 12.172 - } 12.173 - 12.174 - return (UcxList*)(index == 0 ? e : NULL); 12.175 -} 12.176 - 12.177 -ssize_t ucx_list_find(UcxList *l, void *elem, cmp_func fnc, void *cmpdata) { 12.178 - ssize_t index = 0; 12.179 - UCX_FOREACH(e, l) { 12.180 - if (fnc) { 12.181 - if (fnc(elem, e->data, cmpdata) == 0) { 12.182 - return index; 12.183 - } 12.184 - } else { 12.185 - if (elem == e->data) { 12.186 - return index; 12.187 - } 12.188 - } 12.189 - index++; 12.190 - } 12.191 - return -1; 12.192 -} 12.193 - 12.194 -int ucx_list_contains(UcxList *l, void *elem, cmp_func fnc, void *cmpdata) { 12.195 - return ucx_list_find(l, elem, fnc, cmpdata) > -1; 12.196 -} 12.197 - 12.198 -size_t ucx_list_size(const UcxList *l) { 12.199 - if (l == NULL) return 0; 12.200 - 12.201 - const UcxList *e = l; 12.202 - size_t s = 1; 12.203 - while (e->next != NULL) { 12.204 - e = e->next; 12.205 - s++; 12.206 - } 12.207 - 12.208 - return s; 12.209 -} 12.210 - 12.211 -static UcxList *ucx_list_sort_merge(int length, 12.212 - UcxList* restrict ls, UcxList* restrict le, UcxList* restrict re, 12.213 - cmp_func fnc, void* data) { 12.214 - 12.215 - UcxList** sorted = (UcxList**) malloc(sizeof(UcxList*)*length); 12.216 - UcxList *rc, *lc; 12.217 - 12.218 - lc = ls; rc = le; 12.219 - int n = 0; 12.220 - while (lc && lc != le && rc != re) { 12.221 - if (fnc(lc->data, rc->data, data) <= 0) { 12.222 - sorted[n] = lc; 12.223 - lc = lc->next; 12.224 - } else { 12.225 - sorted[n] = rc; 12.226 - rc = rc->next; 12.227 - } 12.228 - n++; 12.229 - } 12.230 - while (lc && lc != le) { 12.231 - sorted[n] = lc; 12.232 - lc = lc->next; 12.233 - n++; 12.234 - } 12.235 - while (rc && rc != re) { 12.236 - sorted[n] = rc; 12.237 - rc = rc->next; 12.238 - n++; 12.239 - } 12.240 - 12.241 - // Update pointer 12.242 - sorted[0]->prev = NULL; 12.243 - for (int i = 0 ; i < length-1 ; i++) { 12.244 - sorted[i]->next = sorted[i+1]; 12.245 - sorted[i+1]->prev = sorted[i]; 12.246 - } 12.247 - sorted[length-1]->next = NULL; 12.248 - 12.249 - UcxList *ret = sorted[0]; 12.250 - free(sorted); 12.251 - return ret; 12.252 -} 12.253 - 12.254 -UcxList *ucx_list_sort(UcxList *l, cmp_func fnc, void *data) { 12.255 - if (l == NULL) { 12.256 - return NULL; 12.257 - } 12.258 - 12.259 - UcxList *lc; 12.260 - int ln = 1; 12.261 - 12.262 - UcxList *restrict ls = l, *restrict le, *restrict re; 12.263 - 12.264 - // check how many elements are already sorted 12.265 - lc = ls; 12.266 - while (lc->next != NULL && fnc(lc->next->data, lc->data, data) > 0) { 12.267 - lc = lc->next; 12.268 - ln++; 12.269 - } 12.270 - le = lc->next; 12.271 - 12.272 - if (le == NULL) { 12.273 - return l; // this list is already sorted :) 12.274 - } else { 12.275 - UcxList *rc; 12.276 - int rn = 1; 12.277 - rc = le; 12.278 - // skip already sorted elements 12.279 - while (rc->next != NULL && fnc(rc->next->data, rc->data, data) > 0) { 12.280 - rc = rc->next; 12.281 - rn++; 12.282 - } 12.283 - re = rc->next; 12.284 - 12.285 - // {ls,...,le->prev} and {rs,...,re->prev} are sorted - merge them 12.286 - UcxList *sorted = ucx_list_sort_merge(ln+rn, 12.287 - ls, le, re, 12.288 - fnc, data); 12.289 - 12.290 - // Something left? Sort it! 12.291 - size_t remainder_length = ucx_list_size(re); 12.292 - if (remainder_length > 0) { 12.293 - UcxList *remainder = ucx_list_sort(re, fnc, data); 12.294 - 12.295 - // merge sorted list with (also sorted) remainder 12.296 - l = ucx_list_sort_merge(ln+rn+remainder_length, 12.297 - sorted, remainder, NULL, fnc, data); 12.298 - } else { 12.299 - // no remainder - we've got our sorted list 12.300 - l = sorted; 12.301 - } 12.302 - 12.303 - return l; 12.304 - } 12.305 -} 12.306 - 12.307 -UcxList *ucx_list_first(const UcxList *l) { 12.308 - if (!l) { 12.309 - return NULL; 12.310 - } 12.311 - 12.312 - const UcxList *e = l; 12.313 - while (e->prev) { 12.314 - e = e->prev; 12.315 - } 12.316 - return (UcxList *)e; 12.317 -} 12.318 - 12.319 -UcxList *ucx_list_remove(UcxList *l, UcxList *e) { 12.320 - return ucx_list_remove_a(ucx_default_allocator(), l, e); 12.321 -} 12.322 - 12.323 -UcxList *ucx_list_remove_a(UcxAllocator *alloc, UcxList *l, UcxList *e) { 12.324 - if (l == e) { 12.325 - l = e->next; 12.326 - } 12.327 - 12.328 - if (e->next) { 12.329 - e->next->prev = e->prev; 12.330 - } 12.331 - 12.332 - if (e->prev) { 12.333 - e->prev->next = e->next; 12.334 - } 12.335 - 12.336 - alfree(alloc, e); 12.337 - return l; 12.338 -}
13.1 --- a/src/ucx/list.h Thu Nov 10 18:44:48 2016 +0100 13.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 13.3 @@ -1,395 +0,0 @@ 13.4 -/* 13.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 13.6 - * 13.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 13.8 - * 13.9 - * Redistribution and use in source and binary forms, with or without 13.10 - * modification, are permitted provided that the following conditions are met: 13.11 - * 13.12 - * 1. Redistributions of source code must retain the above copyright 13.13 - * notice, this list of conditions and the following disclaimer. 13.14 - * 13.15 - * 2. Redistributions in binary form must reproduce the above copyright 13.16 - * notice, this list of conditions and the following disclaimer in the 13.17 - * documentation and/or other materials provided with the distribution. 13.18 - * 13.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 13.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 13.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 13.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 13.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 13.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 13.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 13.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 13.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 13.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 13.29 - * POSSIBILITY OF SUCH DAMAGE. 13.30 - */ 13.31 -/** 13.32 - * Doubly linked list implementation. 13.33 - * 13.34 - * @file list.h 13.35 - * @author Mike Becker 13.36 - * @author Olaf Wintermann 13.37 - */ 13.38 - 13.39 -#ifndef UCX_LIST_H 13.40 -#define UCX_LIST_H 13.41 - 13.42 -#include "ucx.h" 13.43 -#include "allocator.h" 13.44 - 13.45 -#ifdef __cplusplus 13.46 -extern "C" { 13.47 -#endif 13.48 - 13.49 -/** 13.50 - * Loop statement for UCX lists. 13.51 - * 13.52 - * The first argument is the name of the iteration variable. The scope of 13.53 - * this variable is limited to the <code>UCX_FOREACH</code> statement. 13.54 - * 13.55 - * The second argument is a pointer to the list. In most cases this will be the 13.56 - * pointer to the first element of the list, but it may also be an arbitrary 13.57 - * element of the list. The iteration will then start with that element. 13.58 - * 13.59 - * 13.60 - * @param list The first element of the list 13.61 - * @param elem The variable name of the element 13.62 - */ 13.63 -#define UCX_FOREACH(elem,list) \ 13.64 - for (UcxList* elem = list ; elem != NULL ; elem = elem->next) 13.65 - 13.66 -/** 13.67 - * UCX list type. 13.68 - * @see UcxList 13.69 - */ 13.70 -typedef struct UcxList UcxList; 13.71 - 13.72 -/** 13.73 - * UCX list structure. 13.74 - */ 13.75 -struct UcxList { 13.76 - /** 13.77 - * List element payload. 13.78 - */ 13.79 - void *data; 13.80 - /** 13.81 - * Pointer to the next list element or <code>NULL</code>, if this is the 13.82 - * last element. 13.83 - */ 13.84 - UcxList *next; 13.85 - /** 13.86 - * Pointer to the previous list element or <code>NULL</code>, if this is 13.87 - * the first element. 13.88 - */ 13.89 - UcxList *prev; 13.90 -}; 13.91 - 13.92 -/** 13.93 - * Creates an element-wise copy of a list. 13.94 - * 13.95 - * This function clones the specified list by creating new list elements and 13.96 - * copying the data with the specified copy_func(). If no copy_func() is 13.97 - * specified, a shallow copy is created and the new list will reference the 13.98 - * same data as the source list. 13.99 - * 13.100 - * @param list the list to copy 13.101 - * @param cpyfnc a pointer to the function that shall copy an element (may be 13.102 - * <code>NULL</code>) 13.103 - * @param data additional data for the copy_func() 13.104 - * @return a pointer to the copy 13.105 - */ 13.106 -UcxList *ucx_list_clone(UcxList *list, copy_func cpyfnc, void* data); 13.107 - 13.108 -/** 13.109 - * Creates an element-wise copy of a list using an UcxAllocator. 13.110 - * 13.111 - * See ucx_list_clone() for details. 13.112 - * 13.113 - * Keep in mind, that you might want to pass the allocator as an (part of the) 13.114 - * argument for the <code>data</code> parameter, if you want the copy_func() to 13.115 - * make use of the allocator. 13.116 - * 13.117 - * @param allocator the allocator to use 13.118 - * @param list the list to copy 13.119 - * @param cpyfnc a pointer to the function that shall copy an element (may be 13.120 - * <code>NULL</code>) 13.121 - * @param data additional data for the copy_func() 13.122 - * @return a pointer to the copy 13.123 - * @see ucx_list_clone() 13.124 - */ 13.125 -UcxList *ucx_list_clone_a(UcxAllocator *allocator, UcxList *list, 13.126 - copy_func cpyfnc, void* data); 13.127 - 13.128 -/** 13.129 - * Compares two UCX lists element-wise by using a compare function. 13.130 - * 13.131 - * Each element of the two specified lists are compared by using the specified 13.132 - * compare function and the additional data. The type and content of this 13.133 - * additional data depends on the cmp_func() used. 13.134 - * 13.135 - * If the list pointers denote elements within a list, the lists are compared 13.136 - * starting with the denoted elements. Thus any previous elements are not taken 13.137 - * into account. This might be useful to check, if certain list tails match 13.138 - * each other. 13.139 - * 13.140 - * @param list1 the first list 13.141 - * @param list2 the second list 13.142 - * @param cmpfnc the compare function 13.143 - * @param data additional data for the compare function 13.144 - * @return 1, if and only if the two lists equal element-wise, 0 otherwise 13.145 - */ 13.146 -int ucx_list_equals(const UcxList *list1, const UcxList *list2, 13.147 - cmp_func cmpfnc, void* data); 13.148 - 13.149 -/** 13.150 - * Destroys the entire list. 13.151 - * 13.152 - * The members of the list are not automatically freed, so ensure they are 13.153 - * otherwise referenced or destroyed by ucx_list_free_contents(). 13.154 - * Otherwise, a memory leak is likely to occur. 13.155 - * 13.156 - * <b>Caution:</b> the argument <b>MUST</b> denote an entire list (i.e. a call 13.157 - * to ucx_list_first() on the argument must return the argument itself) 13.158 - * 13.159 - * @param list the list to free 13.160 - * @see ucx_list_free_contents() 13.161 - */ 13.162 -void ucx_list_free(UcxList *list); 13.163 - 13.164 -/** 13.165 - * Destroys the entire list using an UcxAllocator. 13.166 - * 13.167 - * See ucx_list_free() for details. 13.168 - * 13.169 - * @param allocator the allocator to use 13.170 - * @param list the list to free 13.171 - * @see ucx_list_free() 13.172 - */ 13.173 -void ucx_list_free_a(UcxAllocator *allocator, UcxList *list); 13.174 - 13.175 -/** 13.176 - * Destroys the contents of the specified list by calling the specified 13.177 - * destructor on each of them. 13.178 - * 13.179 - * Note, that the contents are not usable afterwards and the list should be 13.180 - * destroyed with ucx_list_free(). 13.181 - * 13.182 - * @param list the list for which the contents shall be freed 13.183 - * @param destr the destructor function (e.g. stdlib free()) 13.184 - * @see ucx_list_free() 13.185 - */ 13.186 -void ucx_list_free_content(UcxList* list, ucx_destructor destr); 13.187 - 13.188 - 13.189 -/** 13.190 - * Inserts an element at the end of the list. 13.191 - * 13.192 - * This is generally an O(n) operation, as the end of the list is retrieved with 13.193 - * ucx_list_last(). 13.194 - * 13.195 - * @param list the list where to append the data, or <code>NULL</code> to 13.196 - * create a new list 13.197 - * @param data the data to insert 13.198 - * @return <code>list</code>, if it is not <code>NULL</code> or a pointer to 13.199 - * the newly created list otherwise 13.200 - */ 13.201 -UcxList *ucx_list_append(UcxList *list, void *data); 13.202 - 13.203 -/** 13.204 - * Inserts an element at the end of the list using an UcxAllocator. 13.205 - * 13.206 - * See ucx_list_append() for details. 13.207 - * 13.208 - * @param allocator the allocator to use 13.209 - * @param list the list where to append the data, or <code>NULL</code> to 13.210 - * create a new list 13.211 - * @param data the data to insert 13.212 - * @return <code>list</code>, if it is not <code>NULL</code> or a pointer to 13.213 - * the newly created list otherwise 13.214 - * @see ucx_list_append() 13.215 - */ 13.216 -UcxList *ucx_list_append_a(UcxAllocator *allocator, UcxList *list, void *data); 13.217 - 13.218 -/** 13.219 - * Inserts an element at the beginning of the list. 13.220 - * 13.221 - * You <i>should</i> overwrite the old list pointer by calling 13.222 - * <code>mylist = ucx_list_prepend(mylist, mydata);</code>. However, you may 13.223 - * also perform successive calls of ucx_list_prepend() on the same list pointer, 13.224 - * as this function always searchs for the head of the list with 13.225 - * ucx_list_first(). 13.226 - * 13.227 - * @param list the list where to insert the data or <code>NULL</code> to create 13.228 - * a new list 13.229 - * @param data the data to insert 13.230 - * @return a pointer to the new list head 13.231 - */ 13.232 -UcxList *ucx_list_prepend(UcxList *list, void *data); 13.233 - 13.234 -/** 13.235 - * Inserts an element at the beginning of the list using an UcxAllocator. 13.236 - * 13.237 - * See ucx_list_prepend() for details. 13.238 - * 13.239 - * @param allocator the allocator to use 13.240 - * @param list the list where to insert the data or <code>NULL</code> to create 13.241 - * a new list 13.242 - * @param data the data to insert 13.243 - * @return a pointer to the new list head 13.244 - * @see ucx_list_prepend() 13.245 - */ 13.246 -UcxList *ucx_list_prepend_a(UcxAllocator *allocator, UcxList *list, void *data); 13.247 - 13.248 -/** 13.249 - * Concatenates two lists. 13.250 - * 13.251 - * Either of the two arguments may be <code>NULL</code>. 13.252 - * 13.253 - * This function modifies the references to the next/previous element of 13.254 - * the last/first element of <code>list1</code>/<code> 13.255 - * list2</code>. 13.256 - * 13.257 - * @param list1 first list 13.258 - * @param list2 second list 13.259 - * @return if <code>list1</code> is <code>NULL</code>, <code>list2</code> is 13.260 - * returned, otherwise <code>list1</code> is returned 13.261 - */ 13.262 -UcxList *ucx_list_concat(UcxList *list1, UcxList *list2); 13.263 - 13.264 -/** 13.265 - * Returns the first element of a list. 13.266 - * 13.267 - * If the argument is the list pointer, it is directly returned. Otherwise 13.268 - * this function traverses to the first element of the list and returns the 13.269 - * list pointer. 13.270 - * 13.271 - * @param elem one element of the list 13.272 - * @return the first element of the list, the specified element is a member of 13.273 - */ 13.274 -UcxList *ucx_list_first(const UcxList *elem); 13.275 - 13.276 -/** 13.277 - * Returns the last element of a list. 13.278 - * 13.279 - * If the argument has no successor, it is the last element and therefore 13.280 - * directly returned. Otherwise this function traverses to the last element of 13.281 - * the list and returns it. 13.282 - * 13.283 - * @param elem one element of the list 13.284 - * @return the last element of the list, the specified element is a member of 13.285 - */ 13.286 -UcxList *ucx_list_last(const UcxList *elem); 13.287 - 13.288 -/** 13.289 - * Returns the list element at the specified index. 13.290 - * 13.291 - * @param list the list to retrieve the element from 13.292 - * @param index index of the element to return 13.293 - * @return the element at the specified index or <code>NULL</code>, if the 13.294 - * index is greater than the list size 13.295 - */ 13.296 -UcxList *ucx_list_get(const UcxList *list, size_t index); 13.297 - 13.298 -/** 13.299 - * Returns the index of an element. 13.300 - * 13.301 - * @param list the list where to search for the element 13.302 - * @param elem the element to find 13.303 - * @return the index of the element or -1 if the list does not contain the 13.304 - * element 13.305 - */ 13.306 -ssize_t ucx_list_indexof(const UcxList *list, const UcxList *elem); 13.307 - 13.308 -/** 13.309 - * Returns the element count of the list. 13.310 - * 13.311 - * @param list the list whose elements are counted 13.312 - * @return the element count 13.313 - */ 13.314 -size_t ucx_list_size(const UcxList *list); 13.315 - 13.316 -/** 13.317 - * Returns the index of an element containing the specified data. 13.318 - * 13.319 - * This function uses a cmp_func() to compare the data of each list element 13.320 - * with the specified data. If no cmp_func is provided, the pointers are 13.321 - * compared. 13.322 - * 13.323 - * If the list contains the data more than once, the index of the first 13.324 - * occurrence is returned. 13.325 - * 13.326 - * @param list the list where to search for the data 13.327 - * @param elem the element data 13.328 - * @param cmpfnc the compare function 13.329 - * @param data additional data for the compare function 13.330 - * @return the index of the element containing the specified data or -1 if the 13.331 - * data is not found in this list 13.332 - */ 13.333 -ssize_t ucx_list_find(UcxList *list, void *elem, cmp_func cmpfnc, void *data); 13.334 - 13.335 -/** 13.336 - * Checks, if a list contains a specific element. 13.337 - * 13.338 - * An element is found, if ucx_list_find() returns a value greater than -1. 13.339 - * 13.340 - * @param list the list where to search for the data 13.341 - * @param elem the element data 13.342 - * @param cmpfnc the compare function 13.343 - * @param data additional data for the compare function 13.344 - * @return 1, if and only if the list contains the specified element data 13.345 - * @see ucx_list_find() 13.346 - */ 13.347 -int ucx_list_contains(UcxList *list, void *elem, cmp_func cmpfnc, void *data); 13.348 - 13.349 -/** 13.350 - * Sorts an UcxList with natural merge sort. 13.351 - * 13.352 - * This function uses O(n) additional temporary memory for merge operations 13.353 - * that is automatically freed after each merge. 13.354 - * 13.355 - * As the head of the list might change, you <b>MUST</b> call this function 13.356 - * as follows: <code>mylist = ucx_list_sort(mylist, mycmpfnc, mydata);</code>. 13.357 - * 13.358 - * @param list the list to sort 13.359 - * @param cmpfnc the function that shall be used to compare the element data 13.360 - * @param data additional data for the cmp_func() 13.361 - * @return the sorted list 13.362 - */ 13.363 -UcxList *ucx_list_sort(UcxList *list, cmp_func cmpfnc, void *data); 13.364 - 13.365 -/** 13.366 - * Removes an element from the list. 13.367 - * 13.368 - * If the first element is removed, the list pointer changes. So it is 13.369 - * <i>highly recommended</i> to <i>always</i> update the pointer by calling 13.370 - * <code>mylist = ucx_list_remove(mylist, myelem);</code>. 13.371 - * 13.372 - * @param list the list from which the element shall be removed 13.373 - * @param element the element to remove 13.374 - * @return returns the updated list pointer or <code>NULL</code>, if the list 13.375 - * is now empty 13.376 - */ 13.377 -UcxList *ucx_list_remove(UcxList *list, UcxList *element); 13.378 - 13.379 -/** 13.380 - * Removes an element from the list using an UcxAllocator. 13.381 - * 13.382 - * See ucx_list_remove() for details. 13.383 - * 13.384 - * @param allocator the allocator to use 13.385 - * @param list the list from which the element shall be removed 13.386 - * @param element the element to remove 13.387 - * @return returns the updated list pointer or <code>NULL</code>, if the list 13.388 - * @see ucx_list_remove() 13.389 - */ 13.390 -UcxList *ucx_list_remove_a(UcxAllocator *allocator, UcxList *list, 13.391 - UcxList *element); 13.392 - 13.393 -#ifdef __cplusplus 13.394 -} 13.395 -#endif 13.396 - 13.397 -#endif /* UCX_LIST_H */ 13.398 -
14.1 --- a/src/ucx/string.c Thu Nov 10 18:44:48 2016 +0100 14.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 14.3 @@ -1,381 +0,0 @@ 14.4 -/* 14.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 14.6 - * 14.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 14.8 - * 14.9 - * Redistribution and use in source and binary forms, with or without 14.10 - * modification, are permitted provided that the following conditions are met: 14.11 - * 14.12 - * 1. Redistributions of source code must retain the above copyright 14.13 - * notice, this list of conditions and the following disclaimer. 14.14 - * 14.15 - * 2. Redistributions in binary form must reproduce the above copyright 14.16 - * notice, this list of conditions and the following disclaimer in the 14.17 - * documentation and/or other materials provided with the distribution. 14.18 - * 14.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 14.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 14.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 14.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 14.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 14.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 14.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 14.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 14.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 14.29 - * POSSIBILITY OF SUCH DAMAGE. 14.30 - */ 14.31 - 14.32 -#include <stdlib.h> 14.33 -#include <string.h> 14.34 -#include <stdarg.h> 14.35 -#include <ctype.h> 14.36 - 14.37 -#include "string.h" 14.38 -#include "allocator.h" 14.39 - 14.40 -sstr_t sstr(char *cstring) { 14.41 - sstr_t string; 14.42 - string.ptr = cstring; 14.43 - string.length = strlen(cstring); 14.44 - return string; 14.45 -} 14.46 - 14.47 -sstr_t sstrn(char *cstring, size_t length) { 14.48 - sstr_t string; 14.49 - string.ptr = cstring; 14.50 - string.length = length; 14.51 - return string; 14.52 -} 14.53 - 14.54 -size_t sstrnlen(size_t n, sstr_t s, ...) { 14.55 - va_list ap; 14.56 - size_t size = s.length; 14.57 - va_start(ap, s); 14.58 - 14.59 - for (size_t i = 1 ; i < n ; i++) { 14.60 - sstr_t str = va_arg(ap, sstr_t); 14.61 - size += str.length; 14.62 - } 14.63 - va_end(ap); 14.64 - 14.65 - return size; 14.66 -} 14.67 - 14.68 -static sstr_t sstrvcat_a( 14.69 - UcxAllocator *a, 14.70 - size_t count, 14.71 - sstr_t s1, 14.72 - sstr_t s2, 14.73 - va_list ap) { 14.74 - sstr_t str; 14.75 - str.ptr = NULL; 14.76 - str.length = 0; 14.77 - if(count < 2) { 14.78 - return str; 14.79 - } 14.80 - 14.81 - sstr_t *strings = (sstr_t*) calloc(count, sizeof(sstr_t)); 14.82 - if(!strings) { 14.83 - return str; 14.84 - } 14.85 - 14.86 - // get all args and overall length 14.87 - strings[0] = s1; 14.88 - strings[1] = s2; 14.89 - size_t strlen = s1.length + s2.length; 14.90 - for (size_t i=2;i<count;i++) { 14.91 - sstr_t s = va_arg (ap, sstr_t); 14.92 - strings[i] = s; 14.93 - strlen += s.length; 14.94 - } 14.95 - 14.96 - // create new string 14.97 - str.ptr = (char*) almalloc(a, strlen + 1); 14.98 - str.length = strlen; 14.99 - if(!str.ptr) { 14.100 - free(strings); 14.101 - str.length = 0; 14.102 - return str; 14.103 - } 14.104 - 14.105 - // concatenate strings 14.106 - size_t pos = 0; 14.107 - for (size_t i=0;i<count;i++) { 14.108 - sstr_t s = strings[i]; 14.109 - memcpy(str.ptr + pos, s.ptr, s.length); 14.110 - pos += s.length; 14.111 - } 14.112 - 14.113 - str.ptr[str.length] = '\0'; 14.114 - 14.115 - free(strings); 14.116 - 14.117 - return str; 14.118 -} 14.119 - 14.120 -sstr_t sstrcat(size_t count, sstr_t s1, sstr_t s2, ...) { 14.121 - va_list ap; 14.122 - va_start(ap, s2); 14.123 - sstr_t s = sstrvcat_a(ucx_default_allocator(), count, s1, s2, ap); 14.124 - va_end(ap); 14.125 - return s; 14.126 -} 14.127 - 14.128 -sstr_t sstrcat_a(UcxAllocator *a, size_t count, sstr_t s1, sstr_t s2, ...) { 14.129 - va_list ap; 14.130 - va_start(ap, s2); 14.131 - sstr_t s = sstrvcat_a(a, count, s1, s2, ap); 14.132 - va_end(ap); 14.133 - return s; 14.134 -} 14.135 - 14.136 -sstr_t sstrsubs(sstr_t s, size_t start) { 14.137 - return sstrsubsl (s, start, s.length-start); 14.138 -} 14.139 - 14.140 -sstr_t sstrsubsl(sstr_t s, size_t start, size_t length) { 14.141 - sstr_t new_sstr; 14.142 - if (start >= s.length) { 14.143 - new_sstr.ptr = NULL; 14.144 - new_sstr.length = 0; 14.145 - } else { 14.146 - if (length > s.length-start) { 14.147 - length = s.length-start; 14.148 - } 14.149 - new_sstr.ptr = &s.ptr[start]; 14.150 - new_sstr.length = length; 14.151 - } 14.152 - return new_sstr; 14.153 -} 14.154 - 14.155 -sstr_t sstrchr(sstr_t s, int c) { 14.156 - for(size_t i=0;i<s.length;i++) { 14.157 - if(s.ptr[i] == c) { 14.158 - return sstrsubs(s, i); 14.159 - } 14.160 - } 14.161 - sstr_t n; 14.162 - n.ptr = NULL; 14.163 - n.length = 0; 14.164 - return n; 14.165 -} 14.166 - 14.167 -sstr_t sstrrchr(sstr_t s, int c) { 14.168 - if (s.length > 0) { 14.169 - for(size_t i=s.length;i>0;i--) { 14.170 - if(s.ptr[i-1] == c) { 14.171 - return sstrsubs(s, i-1); 14.172 - } 14.173 - } 14.174 - } 14.175 - sstr_t n; 14.176 - n.ptr = NULL; 14.177 - n.length = 0; 14.178 - return n; 14.179 -} 14.180 - 14.181 -sstr_t sstrstr(sstr_t string, sstr_t match) { 14.182 - if (match.length == 0) { 14.183 - return string; 14.184 - } 14.185 - 14.186 - for (size_t i = 0 ; i < string.length ; i++) { 14.187 - sstr_t substr = sstrsubs(string, i); 14.188 - if (sstrprefix(substr, match)) { 14.189 - return substr; 14.190 - } 14.191 - } 14.192 - 14.193 - sstr_t emptystr; 14.194 - emptystr.length = 0; 14.195 - emptystr.ptr = NULL; 14.196 - return emptystr; 14.197 -} 14.198 - 14.199 -sstr_t* sstrsplit(sstr_t s, sstr_t d, ssize_t *n) { 14.200 - return sstrsplit_a(ucx_default_allocator(), s, d, n); 14.201 -} 14.202 - 14.203 -sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t s, sstr_t d, ssize_t *n) { 14.204 - if (s.length == 0 || d.length == 0) { 14.205 - *n = -1; 14.206 - return NULL; 14.207 - } 14.208 - 14.209 - sstr_t* result; 14.210 - ssize_t nmax = *n; 14.211 - *n = 1; 14.212 - 14.213 - /* special case: exact match - no processing needed */ 14.214 - if (sstrcmp(s, d) == 0) { 14.215 - *n = 0; 14.216 - return NULL; 14.217 - } 14.218 - sstr_t sv = sstrdup(s); 14.219 - if (sv.length == 0) { 14.220 - *n = -2; 14.221 - return NULL; 14.222 - } 14.223 - 14.224 - for (size_t i = 0 ; i < s.length ; i++) { 14.225 - sstr_t substr = sstrsubs(sv, i); 14.226 - if (sstrprefix(substr, d)) { 14.227 - (*n)++; 14.228 - for (size_t j = 0 ; j < d.length ; j++) { 14.229 - sv.ptr[i+j] = 0; 14.230 - } 14.231 - i += d.length - 1; // -1, because the loop will do a i++ 14.232 - } 14.233 - if ((*n) == nmax) break; 14.234 - } 14.235 - result = (sstr_t*) almalloc(allocator, sizeof(sstr_t)*(*n)); 14.236 - 14.237 - if (result) { 14.238 - char *pptr = sv.ptr; 14.239 - for (ssize_t i = 0 ; i < *n ; i++) { 14.240 - size_t l = strlen(pptr); 14.241 - char* ptr = (char*) almalloc(allocator, l + 1); 14.242 - if (ptr) { 14.243 - memcpy(ptr, pptr, l); 14.244 - ptr[l] = 0; 14.245 - 14.246 - result[i] = sstrn(ptr, l); 14.247 - pptr += l + d.length; 14.248 - } else { 14.249 - for (ssize_t j = i-1 ; j >= 0 ; j--) { 14.250 - alfree(allocator, result[j].ptr); 14.251 - } 14.252 - alfree(allocator, result); 14.253 - *n = -2; 14.254 - break; 14.255 - } 14.256 - } 14.257 - } else { 14.258 - *n = -2; 14.259 - } 14.260 - 14.261 - free(sv.ptr); 14.262 - 14.263 - return result; 14.264 -} 14.265 - 14.266 -int sstrcmp(sstr_t s1, sstr_t s2) { 14.267 - if (s1.length == s2.length) { 14.268 - return memcmp(s1.ptr, s2.ptr, s1.length); 14.269 - } else if (s1.length > s2.length) { 14.270 - return 1; 14.271 - } else { 14.272 - return -1; 14.273 - } 14.274 -} 14.275 - 14.276 -int sstrcasecmp(sstr_t s1, sstr_t s2) { 14.277 - if (s1.length == s2.length) { 14.278 -#ifdef _WIN32 14.279 - return _strnicmp(s1.ptr, s2.ptr, s1.length); 14.280 -#else 14.281 - return strncasecmp(s1.ptr, s2.ptr, s1.length); 14.282 -#endif 14.283 - } else if (s1.length > s2.length) { 14.284 - return 1; 14.285 - } else { 14.286 - return -1; 14.287 - } 14.288 -} 14.289 - 14.290 -sstr_t sstrdup(sstr_t s) { 14.291 - return sstrdup_a(ucx_default_allocator(), s); 14.292 -} 14.293 - 14.294 -sstr_t sstrdup_a(UcxAllocator *allocator, sstr_t s) { 14.295 - sstr_t newstring; 14.296 - newstring.ptr = (char*)almalloc(allocator, s.length + 1); 14.297 - if (newstring.ptr) { 14.298 - newstring.length = s.length; 14.299 - newstring.ptr[newstring.length] = 0; 14.300 - 14.301 - memcpy(newstring.ptr, s.ptr, s.length); 14.302 - } else { 14.303 - newstring.length = 0; 14.304 - } 14.305 - 14.306 - return newstring; 14.307 -} 14.308 - 14.309 -sstr_t sstrtrim(sstr_t string) { 14.310 - sstr_t newstr = string; 14.311 - 14.312 - while (newstr.length > 0 && isspace(*newstr.ptr)) { 14.313 - newstr.ptr++; 14.314 - newstr.length--; 14.315 - } 14.316 - while (newstr.length > 0 && isspace(newstr.ptr[newstr.length-1])) { 14.317 - newstr.length--; 14.318 - } 14.319 - 14.320 - return newstr; 14.321 -} 14.322 - 14.323 -int sstrprefix(sstr_t string, sstr_t prefix) { 14.324 - if (string.length == 0) { 14.325 - return prefix.length == 0; 14.326 - } 14.327 - if (prefix.length == 0) { 14.328 - return 1; 14.329 - } 14.330 - 14.331 - if (prefix.length > string.length) { 14.332 - return 0; 14.333 - } else { 14.334 - return memcmp(string.ptr, prefix.ptr, prefix.length) == 0; 14.335 - } 14.336 -} 14.337 - 14.338 -int sstrsuffix(sstr_t string, sstr_t suffix) { 14.339 - if (string.length == 0) { 14.340 - return suffix.length == 0; 14.341 - } 14.342 - if (suffix.length == 0) { 14.343 - return 1; 14.344 - } 14.345 - 14.346 - if (suffix.length > string.length) { 14.347 - return 0; 14.348 - } else { 14.349 - return memcmp(string.ptr+string.length-suffix.length, 14.350 - suffix.ptr, suffix.length) == 0; 14.351 - } 14.352 -} 14.353 - 14.354 -sstr_t sstrlower(sstr_t string) { 14.355 - sstr_t ret = sstrdup(string); 14.356 - for (size_t i = 0; i < ret.length ; i++) { 14.357 - ret.ptr[i] = tolower(ret.ptr[i]); 14.358 - } 14.359 - return ret; 14.360 -} 14.361 - 14.362 -sstr_t sstrlower_a(UcxAllocator *allocator, sstr_t string) { 14.363 - sstr_t ret = sstrdup_a(allocator, string); 14.364 - for (size_t i = 0; i < ret.length ; i++) { 14.365 - ret.ptr[i] = tolower(ret.ptr[i]); 14.366 - } 14.367 - return ret; 14.368 -} 14.369 - 14.370 -sstr_t sstrupper(sstr_t string) { 14.371 - sstr_t ret = sstrdup(string); 14.372 - for (size_t i = 0; i < ret.length ; i++) { 14.373 - ret.ptr[i] = toupper(ret.ptr[i]); 14.374 - } 14.375 - return ret; 14.376 -} 14.377 - 14.378 -sstr_t sstrupper_a(UcxAllocator *allocator, sstr_t string) { 14.379 - sstr_t ret = sstrdup_a(allocator, string); 14.380 - for (size_t i = 0; i < ret.length ; i++) { 14.381 - ret.ptr[i] = toupper(ret.ptr[i]); 14.382 - } 14.383 - return ret; 14.384 -}
15.1 --- a/src/ucx/string.h Thu Nov 10 18:44:48 2016 +0100 15.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 15.3 @@ -1,457 +0,0 @@ 15.4 -/* 15.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 15.6 - * 15.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 15.8 - * 15.9 - * Redistribution and use in source and binary forms, with or without 15.10 - * modification, are permitted provided that the following conditions are met: 15.11 - * 15.12 - * 1. Redistributions of source code must retain the above copyright 15.13 - * notice, this list of conditions and the following disclaimer. 15.14 - * 15.15 - * 2. Redistributions in binary form must reproduce the above copyright 15.16 - * notice, this list of conditions and the following disclaimer in the 15.17 - * documentation and/or other materials provided with the distribution. 15.18 - * 15.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 15.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 15.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 15.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 15.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 15.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 15.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 15.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 15.29 - * POSSIBILITY OF SUCH DAMAGE. 15.30 - */ 15.31 -/** 15.32 - * Bounded string implementation. 15.33 - * 15.34 - * The UCX strings (<code>sstr_t</code>) provide an alternative to C strings. 15.35 - * The main difference to C strings is, that <code>sstr_t</code> does <b>not 15.36 - * need to be <code>NULL</code>-terminated</b>. Instead the length is stored 15.37 - * within the structure. 15.38 - * 15.39 - * When using <code>sstr_t</code>, developers must be full aware of what type 15.40 - * of string (<code>NULL</code>-terminated) or not) they are using, when 15.41 - * accessing the <code>char* ptr</code> directly. 15.42 - * 15.43 - * The UCX string module provides some common string functions, known from 15.44 - * standard libc, working with <code>sstr_t</code>. 15.45 - * 15.46 - * @file string.h 15.47 - * @author Mike Becker 15.48 - * @author Olaf Wintermann 15.49 - */ 15.50 - 15.51 -#ifndef UCX_STRING_H 15.52 -#define UCX_STRING_H 15.53 - 15.54 -#include "ucx.h" 15.55 -#include "allocator.h" 15.56 -#include <stddef.h> 15.57 - 15.58 -/** Shortcut for a <code>sstr_t struct</code> literal. */ 15.59 -#define ST(s) { (char*)s, sizeof(s)-1 } 15.60 - 15.61 -/** Shortcut for the conversion of a C string to a <code>sstr_t</code>. */ 15.62 -#define S(s) sstrn((char*)s, sizeof(s)-1) 15.63 - 15.64 -#ifdef __cplusplus 15.65 -extern "C" { 15.66 -#endif 15.67 - 15.68 -/** 15.69 - * The UCX string structure. 15.70 - */ 15.71 -typedef struct { 15.72 - /** A reference to the string (<b>not necessarily <code>NULL</code> 15.73 - * -terminated</b>) */ 15.74 - char *ptr; 15.75 - /** The length of the string */ 15.76 - size_t length; 15.77 -} sstr_t; 15.78 - 15.79 -/** 15.80 - * Creates a new sstr_t based on a C string. 15.81 - * 15.82 - * The length is implicitly inferred by using a call to <code>strlen()</code>. 15.83 - * 15.84 - * <b>Note:</b> the sstr_t will hold a <i>reference</i> to the C string. If you 15.85 - * do want a copy, use sstrdup() on the return value of this function. 15.86 - * 15.87 - * @param cstring the C string to wrap 15.88 - * @return a new sstr_t containing the C string 15.89 - * 15.90 - * @see sstrn() 15.91 - */ 15.92 -sstr_t sstr(char *cstring); 15.93 - 15.94 -/** 15.95 - * Creates a new sstr_t of the specified length based on a C string. 15.96 - * 15.97 - * <b>Note:</b> the sstr_t will hold a <i>reference</i> to the C string. If you 15.98 - * do want a copy, use sstrdup() on the return value of this function. 15.99 - * 15.100 - * @param cstring the C string to wrap 15.101 - * @param length the length of the string 15.102 - * @return a new sstr_t containing the C string 15.103 - * 15.104 - * @see sstr() 15.105 - * @see S() 15.106 - */ 15.107 -sstr_t sstrn(char *cstring, size_t length); 15.108 - 15.109 - 15.110 -/** 15.111 - * Returns the cumulated length of all specified strings. 15.112 - * 15.113 - * At least one string must be specified. 15.114 - * 15.115 - * <b>Attention:</b> if the count argument does not match the count of the 15.116 - * specified strings, the behavior is undefined. 15.117 - * 15.118 - * @param count the total number of specified strings (so at least 1) 15.119 - * @param string the first string 15.120 - * @param ... all other strings 15.121 - * @return the cumulated length of all strings 15.122 - */ 15.123 -size_t sstrnlen(size_t count, sstr_t string, ...); 15.124 - 15.125 -/** 15.126 - * Concatenates two or more strings. 15.127 - * 15.128 - * The resulting string will be allocated by standard <code>malloc()</code>. 15.129 - * So developers <b>MUST</b> pass the sstr_t.ptr to <code>free()</code>. 15.130 - * 15.131 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>- 15.132 - * terminated. 15.133 - * 15.134 - * @param count the total number of strings to concatenate 15.135 - * @param s1 first string 15.136 - * @param s2 second string 15.137 - * @param ... all remaining strings 15.138 - * @return the concatenated string 15.139 - */ 15.140 -sstr_t sstrcat(size_t count, sstr_t s1, sstr_t s2, ...); 15.141 - 15.142 -/** 15.143 - * Concatenates two or more strings using an UcxAllocator. 15.144 - * 15.145 - * See sstrcat() for details. 15.146 - * 15.147 - * @param a the allocator to use 15.148 - * @param count the total number of strings to concatenate 15.149 - * @param s1 first string 15.150 - * @param s2 second string 15.151 - * @param ... all remaining strings 15.152 - * @return the concatenated string 15.153 - */ 15.154 -sstr_t sstrcat_a(UcxAllocator *a, size_t count, sstr_t s1, sstr_t s2, ...); 15.155 - 15.156 - 15.157 -/** 15.158 - * Returns a substring starting at the specified location. 15.159 - * 15.160 - * <b>Attention:</b> the new string references the same memory area as the 15.161 - * input string and will <b>NOT</b> be <code>NULL</code>-terminated. 15.162 - * Use sstrdup() to get a copy. 15.163 - * 15.164 - * @param string input string 15.165 - * @param start start location of the substring 15.166 - * @return a substring of <code>string</code> starting at <code>start</code> 15.167 - * 15.168 - * @see sstrsubsl() 15.169 - * @see sstrchr() 15.170 - */ 15.171 -sstr_t sstrsubs(sstr_t string, size_t start); 15.172 - 15.173 -/** 15.174 - * Returns a substring with a maximum length starting at the specified location. 15.175 - * 15.176 - * <b>Attention:</b> the new string references the same memory area as the 15.177 - * input string and will <b>NOT</b> be <code>NULL</code>-terminated. 15.178 - * Use sstrdup() to get a copy. 15.179 - * 15.180 - * @param string input string 15.181 - * @param start start location of the substring 15.182 - * @param length the maximum length of the substring 15.183 - * @return a substring of <code>string</code> starting at <code>start</code> 15.184 - * with a maximum length of <code>length</code> 15.185 - * 15.186 - * @see sstrsubs() 15.187 - * @see sstrchr() 15.188 - */ 15.189 -sstr_t sstrsubsl(sstr_t string, size_t start, size_t length); 15.190 - 15.191 -/** 15.192 - * Returns a substring starting at the location of the first occurrence of the 15.193 - * specified character. 15.194 - * 15.195 - * If the string does not contain the character, an empty string is returned. 15.196 - * 15.197 - * @param string the string where to locate the character 15.198 - * @param chr the character to locate 15.199 - * @return a substring starting at the first location of <code>chr</code> 15.200 - * 15.201 - * @see sstrsubs() 15.202 - */ 15.203 -sstr_t sstrchr(sstr_t string, int chr); 15.204 - 15.205 -/** 15.206 - * Returns a substring starting at the location of the last occurrence of the 15.207 - * specified character. 15.208 - * 15.209 - * If the string does not contain the character, an empty string is returned. 15.210 - * 15.211 - * @param string the string where to locate the character 15.212 - * @param chr the character to locate 15.213 - * @return a substring starting at the last location of <code>chr</code> 15.214 - * 15.215 - * @see sstrsubs() 15.216 - */ 15.217 -sstr_t sstrrchr(sstr_t string, int chr); 15.218 - 15.219 -/** 15.220 - * Returns a substring starting at the location of the first occurrence of the 15.221 - * specified string. 15.222 - * 15.223 - * If the string does not contain the other string, an empty string is returned. 15.224 - * 15.225 - * If <code>match</code> is an empty string, the complete <code>string</code> is 15.226 - * returned. 15.227 - * 15.228 - * @param string the string to be scanned 15.229 - * @param match string containing the sequence of characters to match 15.230 - * @return a substring starting at the first occurrence of 15.231 - * <code>match</code>, or an empty string, if the sequence is not 15.232 - * present in <code>string</code> 15.233 - */ 15.234 -sstr_t sstrstr(sstr_t string, sstr_t match); 15.235 - 15.236 -/** 15.237 - * Splits a string into parts by using a delimiter string. 15.238 - * 15.239 - * This function will return <code>NULL</code>, if one of the following happens: 15.240 - * <ul> 15.241 - * <li>the string length is zero</li> 15.242 - * <li>the delimeter length is zero</li> 15.243 - * <li>the string equals the delimeter</li> 15.244 - * <li>memory allocation fails</li> 15.245 - * </ul> 15.246 - * 15.247 - * The integer referenced by <code>count</code> is used as input and determines 15.248 - * the maximum size of the resulting array, i.e. the maximum count of splits to 15.249 - * perform + 1. 15.250 - * 15.251 - * The integer referenced by <code>count</code> is also used as output and is 15.252 - * set to 15.253 - * <ul> 15.254 - * <li>-2, on memory allocation errors</li> 15.255 - * <li>-1, if either the string or the delimiter is an empty string</li> 15.256 - * <li>0, if the string equals the delimiter</li> 15.257 - * <li>1, if the string does not contain the delimiter</li> 15.258 - * <li>the count of array items, otherwise</li> 15.259 - * </ul> 15.260 - * 15.261 - * If the string starts with the delimiter, the first item of the resulting 15.262 - * array will be an empty string. 15.263 - * 15.264 - * If the string ends with the delimiter and the maximum list size is not 15.265 - * exceeded, the last array item will be an empty string. 15.266 - * 15.267 - * <b>Attention:</b> The array pointer <b>AND</b> all sstr_t.ptr of the array 15.268 - * items must be manually passed to <code>free()</code>. Use sstrsplit_a() with 15.269 - * an allocator to managed memory, to avoid this. 15.270 - * 15.271 - * @param string the string to split 15.272 - * @param delim the delimiter string 15.273 - * @param count IN: the maximum size of the resulting array (0 = no limit), 15.274 - * OUT: the actual size of the array 15.275 - * @return a sstr_t array containing the split strings or 15.276 - * <code>NULL</code> on error 15.277 - * 15.278 - * @see sstrsplit_a() 15.279 - */ 15.280 -sstr_t* sstrsplit(sstr_t string, sstr_t delim, ssize_t *count); 15.281 - 15.282 -/** 15.283 - * Performing sstrsplit() using an UcxAllocator. 15.284 - * 15.285 - * <i>Read the description of sstrsplit() for details.</i> 15.286 - * 15.287 - * The memory for the sstr_t.ptr pointers of the array items and the memory for 15.288 - * the sstr_t array itself are allocated by using the UcxAllocator.malloc() 15.289 - * function. 15.290 - * 15.291 - * <b>Note:</b> the allocator is not used for memory that is freed within the 15.292 - * same call of this function (locally scoped variables). 15.293 - * 15.294 - * @param allocator the UcxAllocator used for allocating memory 15.295 - * @param string the string to split 15.296 - * @param delim the delimiter string 15.297 - * @param count IN: the maximum size of the resulting array (0 = no limit), 15.298 - * OUT: the actual size of the array 15.299 - * @return a sstr_t array containing the split strings or 15.300 - * <code>NULL</code> on error 15.301 - * 15.302 - * @see sstrsplit() 15.303 - */ 15.304 -sstr_t* sstrsplit_a(UcxAllocator *allocator, sstr_t string, sstr_t delim, 15.305 - ssize_t *count); 15.306 - 15.307 -/** 15.308 - * Compares two UCX strings with standard <code>memcmp()</code>. 15.309 - * 15.310 - * At first it compares the sstr_t.length attribute of the two strings. The 15.311 - * <code>memcmp()</code> function is called, if and only if the lengths match. 15.312 - * 15.313 - * @param s1 the first string 15.314 - * @param s2 the second string 15.315 - * @return -1, if the length of s1 is less than the length of s2 or 1, if the 15.316 - * length of s1 is greater than the length of s2 or the result of 15.317 - * <code>memcmp()</code> otherwise (i.e. 0 if the strings match) 15.318 - */ 15.319 -int sstrcmp(sstr_t s1, sstr_t s2); 15.320 - 15.321 -/** 15.322 - * Compares two UCX strings ignoring the case. 15.323 - * 15.324 - * At first it compares the sstr_t.length attribute of the two strings. If and 15.325 - * only if the lengths match, both strings are compared char by char ignoring 15.326 - * the case. 15.327 - * 15.328 - * @param s1 the first string 15.329 - * @param s2 the second string 15.330 - * @return -1, if the length of s1 is less than the length of s2 or 1, if the 15.331 - * length of s1 is greater than the length of s2 or the difference between the 15.332 - * first two differing characters otherwise (i.e. 0 if the strings match and 15.333 - * no characters differ) 15.334 - */ 15.335 -int sstrcasecmp(sstr_t s1, sstr_t s2); 15.336 - 15.337 -/** 15.338 - * Creates a duplicate of the specified string. 15.339 - * 15.340 - * The new sstr_t will contain a copy allocated by standard 15.341 - * <code>malloc()</code>. So developers <b>MUST</b> pass the sstr_t.ptr to 15.342 - * <code>free()</code>. 15.343 - * 15.344 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>- 15.345 - * terminated. 15.346 - * 15.347 - * @param string the string to duplicate 15.348 - * @return a duplicate of the string 15.349 - * @see sstrdup_a() 15.350 - */ 15.351 -sstr_t sstrdup(sstr_t string); 15.352 - 15.353 -/** 15.354 - * Creates a duplicate of the specified string using an UcxAllocator. 15.355 - * 15.356 - * The new sstr_t will contain a copy allocated by the allocators 15.357 - * ucx_allocator_malloc function. So it is implementation depended, whether the 15.358 - * returned sstr_t.ptr pointer must be passed to the allocators 15.359 - * ucx_allocator_free function manually. 15.360 - * 15.361 - * The sstr_t.ptr of the return value will <i>always</i> be <code>NULL</code>- 15.362 - * terminated. 15.363 - * 15.364 - * @param allocator a valid instance of an UcxAllocator 15.365 - * @param string the string to duplicate 15.366 - * @return a duplicate of the string 15.367 - * @see sstrdup() 15.368 - */ 15.369 -sstr_t sstrdup_a(UcxAllocator *allocator, sstr_t string); 15.370 - 15.371 -/** 15.372 - * Omits leading and trailing spaces. 15.373 - * 15.374 - * This function returns a new sstr_t containing a trimmed version of the 15.375 - * specified string. 15.376 - * 15.377 - * <b>Note:</b> the new sstr_t references the same memory, thus you 15.378 - * <b>MUST NOT</b> pass the sstr_t.ptr of the return value to 15.379 - * <code>free()</code>. It is also highly recommended to avoid assignments like 15.380 - * <code>mystr = sstrtrim(mystr);</code> as you lose the reference to the 15.381 - * source string. Assignments of this type are only permitted, if the 15.382 - * sstr_t.ptr of the source string does not need to be freed or if another 15.383 - * reference to the source string exists. 15.384 - * 15.385 - * @param string the string that shall be trimmed 15.386 - * @return a new sstr_t containing the trimmed string 15.387 - */ 15.388 -sstr_t sstrtrim(sstr_t string); 15.389 - 15.390 -/** 15.391 - * Checks, if a string has a specific prefix. 15.392 - * @param string the string to check 15.393 - * @param prefix the prefix the string should have 15.394 - * @return 1, if and only if the string has the specified prefix, 0 otherwise 15.395 - */ 15.396 -int sstrprefix(sstr_t string, sstr_t prefix); 15.397 - 15.398 -/** 15.399 - * Checks, if a string has a specific suffix. 15.400 - * @param string the string to check 15.401 - * @param suffix the suffix the string should have 15.402 - * @return 1, if and only if the string has the specified suffix, 0 otherwise 15.403 - */ 15.404 -int sstrsuffix(sstr_t string, sstr_t suffix); 15.405 - 15.406 -/** 15.407 - * Returns a lower case version of a string. 15.408 - * 15.409 - * This function creates a duplicate of the input string, first. See the 15.410 - * documentation of sstrdup() for the implications. 15.411 - * 15.412 - * @param string the input string 15.413 - * @return the resulting lower case string 15.414 - * @see sstrdup() 15.415 - */ 15.416 -sstr_t sstrlower(sstr_t string); 15.417 - 15.418 -/** 15.419 - * Returns a lower case version of a string. 15.420 - * 15.421 - * This function creates a duplicate of the input string, first. See the 15.422 - * documentation of sstrdup_a() for the implications. 15.423 - * 15.424 - * @param allocator the allocator used for duplicating the string 15.425 - * @param string the input string 15.426 - * @return the resulting lower case string 15.427 - * @see sstrdup_a() 15.428 - */ 15.429 -sstr_t sstrlower_a(UcxAllocator *allocator, sstr_t string); 15.430 - 15.431 -/** 15.432 - * Returns a upper case version of a string. 15.433 - * 15.434 - * This function creates a duplicate of the input string, first. See the 15.435 - * documentation of sstrdup() for the implications. 15.436 - * 15.437 - * @param string the input string 15.438 - * @return the resulting upper case string 15.439 - * @see sstrdup() 15.440 - */ 15.441 -sstr_t sstrupper(sstr_t string); 15.442 - 15.443 -/** 15.444 - * Returns a upper case version of a string. 15.445 - * 15.446 - * This function creates a duplicate of the input string, first. See the 15.447 - * documentation of sstrdup_a() for the implications. 15.448 - * 15.449 - * @param allocator the allocator used for duplicating the string 15.450 - * @param string the input string 15.451 - * @return the resulting upper case string 15.452 - * @see sstrdup_a() 15.453 - */ 15.454 -sstr_t sstrupper_a(UcxAllocator *allocator, sstr_t string); 15.455 - 15.456 -#ifdef __cplusplus 15.457 -} 15.458 -#endif 15.459 - 15.460 -#endif /* UCX_STRING_H */
16.1 --- a/src/ucx/ucx.h Thu Nov 10 18:44:48 2016 +0100 16.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 16.3 @@ -1,138 +0,0 @@ 16.4 -/* 16.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 16.6 - * 16.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 16.8 - * 16.9 - * Redistribution and use in source and binary forms, with or without 16.10 - * modification, are permitted provided that the following conditions are met: 16.11 - * 16.12 - * 1. Redistributions of source code must retain the above copyright 16.13 - * notice, this list of conditions and the following disclaimer. 16.14 - * 16.15 - * 2. Redistributions in binary form must reproduce the above copyright 16.16 - * notice, this list of conditions and the following disclaimer in the 16.17 - * documentation and/or other materials provided with the distribution. 16.18 - * 16.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 16.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 16.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 16.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 16.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 16.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 16.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 16.29 - * POSSIBILITY OF SUCH DAMAGE. 16.30 - */ 16.31 -/** 16.32 - * Main UCX Header providing most common definitions. 16.33 - * 16.34 - * @file ucx.h 16.35 - * @author Mike Becker 16.36 - * @author Olaf Wintermann 16.37 - */ 16.38 - 16.39 -#ifndef UCX_H 16.40 -#define UCX_H 16.41 - 16.42 -/** Major UCX version as integer constant. */ 16.43 -#define UCX_VERSION_MAJOR 0 16.44 - 16.45 -/** Minor UCX version as integer constant. */ 16.46 -#define UCX_VERSION_MINOR 9 16.47 - 16.48 -/** The UCX version in format [major].[minor] */ 16.49 -#define UCX_VERSION UCX_VERSION_MAJOR.UCX_VERSION_MINOR 16.50 - 16.51 -#include <stdlib.h> 16.52 - 16.53 -#ifdef _WIN32 16.54 -#if !(defined __ssize_t_defined || defined _SSIZE_T_) 16.55 -#include <BaseTsd.h> 16.56 -typedef SSIZE_T ssize_t; 16.57 -#define __ssize_t_defined 16.58 -#define _SSIZE_T_ 16.59 -#endif /* __ssize_t_defined and _SSIZE_T */ 16.60 -#else /* !_WIN32 */ 16.61 -#include <sys/types.h> 16.62 -#endif /* _WIN32 */ 16.63 - 16.64 -#ifdef __cplusplus 16.65 -#ifndef _Bool 16.66 -#define _Bool bool 16.67 -#define restrict 16.68 -#endif 16.69 -/** Use C naming even when compiling with C++. */ 16.70 -#define UCX_EXTERN extern "C" 16.71 -extern "C" { 16.72 -#else 16.73 -/** Pointless in C. */ 16.74 -#define UCX_EXTERN 16.75 -#endif 16.76 - 16.77 - 16.78 -/** 16.79 - * A function pointer to a destructor function. 16.80 - * @see ucx_mempool_setdestr() 16.81 - * @see ucx_mempool_regdestr() 16.82 - */ 16.83 -typedef void(*ucx_destructor)(void*); 16.84 - 16.85 -/** 16.86 - * Function pointer to a compare function. 16.87 - * 16.88 - * The compare function shall take three arguments: the two values that shall be 16.89 - * compared and optional additional data. 16.90 - * The function shall then return -1 if the first argument is less than the 16.91 - * second argument, 1 if the first argument is greater than the second argument 16.92 - * and 0 if both arguments are equal. If the third argument is 16.93 - * <code>NULL</code>, it shall be ignored. 16.94 - */ 16.95 -typedef int(*cmp_func)(void*,void*,void*); 16.96 - 16.97 -/** 16.98 - * Function pointer to a copy function. 16.99 - * 16.100 - * The copy function shall create a copy of the first argument and may use 16.101 - * additional data provided by the second argument. If the second argument is 16.102 - * <code>NULL</code>, it shall be ignored. 16.103 - 16.104 - * <b>Attention:</b> if pointers returned by functions of this type may be 16.105 - * passed to <code>free()</code> depends on the implementation of the 16.106 - * respective <code>copy_func</code>. 16.107 - */ 16.108 -typedef void*(*copy_func)(void*,void*); 16.109 - 16.110 -/** 16.111 - * Function pointer to a write function. 16.112 - * 16.113 - * The signature of the write function shall be compatible to the signature 16.114 - * of standard <code>fwrite</code>, though it may use arbitrary data types for 16.115 - * source and destination. 16.116 - * 16.117 - * The arguments shall contain (in ascending order): a pointer to the source, 16.118 - * the length of one element, the element count and a pointer to the 16.119 - * destination. 16.120 - */ 16.121 -typedef size_t(*write_func)(const void*, size_t, size_t, void*); 16.122 - 16.123 -/** 16.124 - * Function pointer to a read function. 16.125 - * 16.126 - * The signature of the read function shall be compatible to the signature 16.127 - * of standard <code>fread</code>, though it may use arbitrary data types for 16.128 - * source and destination. 16.129 - * 16.130 - * The arguments shall contain (in ascending order): a pointer to the 16.131 - * destination, the length of one element, the element count and a pointer to 16.132 - * the source. 16.133 - */ 16.134 -typedef size_t(*read_func)(void*, size_t, size_t, void*); 16.135 - 16.136 -#ifdef __cplusplus 16.137 -} 16.138 -#endif 16.139 - 16.140 -#endif /* UCX_H */ 16.141 -
17.1 --- a/src/ucx/utils.c Thu Nov 10 18:44:48 2016 +0100 17.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 17.3 @@ -1,259 +0,0 @@ 17.4 -/* 17.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 17.6 - * 17.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 17.8 - * 17.9 - * Redistribution and use in source and binary forms, with or without 17.10 - * modification, are permitted provided that the following conditions are met: 17.11 - * 17.12 - * 1. Redistributions of source code must retain the above copyright 17.13 - * notice, this list of conditions and the following disclaimer. 17.14 - * 17.15 - * 2. Redistributions in binary form must reproduce the above copyright 17.16 - * notice, this list of conditions and the following disclaimer in the 17.17 - * documentation and/or other materials provided with the distribution. 17.18 - * 17.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 17.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 17.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 17.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 17.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 17.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 17.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 17.29 - * POSSIBILITY OF SUCH DAMAGE. 17.30 - */ 17.31 - 17.32 -#include "utils.h" 17.33 -#include <math.h> 17.34 -#include <stdio.h> 17.35 -#include <limits.h> 17.36 -#include <errno.h> 17.37 - 17.38 -/* COPY FUCNTIONS */ 17.39 -void* ucx_strcpy(void* s, void* data) { 17.40 - char *str = (char*) s; 17.41 - size_t n = 1+strlen(str); 17.42 - char *cpy = (char*) malloc(n); 17.43 - memcpy(cpy, str, n); 17.44 - return cpy; 17.45 -} 17.46 - 17.47 -void* ucx_memcpy(void* m, void* n) { 17.48 - size_t k = *((size_t*)n); 17.49 - void *cpy = malloc(k); 17.50 - memcpy(cpy, m, k); 17.51 - return cpy; 17.52 -} 17.53 - 17.54 -size_t ucx_stream_copy(void *src, void *dest, read_func readfnc, 17.55 - write_func writefnc, char* buf, size_t bufsize, size_t n) { 17.56 - if(n == 0 || bufsize == 0) { 17.57 - return 0; 17.58 - } 17.59 - 17.60 - char *lbuf; 17.61 - size_t ncp = 0; 17.62 - 17.63 - if(buf) { 17.64 - lbuf = buf; 17.65 - } else { 17.66 - lbuf = (char*)malloc(bufsize); 17.67 - if(lbuf == NULL) { 17.68 - return 0; 17.69 - } 17.70 - } 17.71 - 17.72 - size_t r; 17.73 - size_t rn = bufsize > n ? n : bufsize; 17.74 - while((r = readfnc(lbuf, 1, rn, src)) != 0) { 17.75 - r = writefnc(lbuf, 1, r, dest); 17.76 - ncp += r; 17.77 - n -= r; 17.78 - rn = bufsize > n ? n : bufsize; 17.79 - if(r == 0 || n == 0) { 17.80 - break; 17.81 - } 17.82 - } 17.83 - 17.84 - if (lbuf != buf) { 17.85 - free(lbuf); 17.86 - } 17.87 - 17.88 - return ncp; 17.89 -} 17.90 - 17.91 -/* COMPARE FUNCTIONS */ 17.92 - 17.93 -int ucx_strcmp(void *s1, void *s2, void *data) { 17.94 - return strcmp((char*)s1, (char*)s2); 17.95 -} 17.96 - 17.97 -int ucx_strncmp(void *s1, void *s2, void *n) { 17.98 - return strncmp((char*)s1, (char*)s2, *((size_t*) n)); 17.99 -} 17.100 - 17.101 -int ucx_intcmp(void *i1, void *i2, void *data) { 17.102 - int a = *((int*) i1); 17.103 - int b = *((int*) i2); 17.104 - if (a == b) { 17.105 - return 0; 17.106 - } else { 17.107 - return a < b ? -1 : 1; 17.108 - } 17.109 -} 17.110 - 17.111 -int ucx_floatcmp(void *f1, void *f2, void *epsilon) { 17.112 - float a = *((float*) f1); 17.113 - float b = *((float*) f2); 17.114 - float e = !epsilon ? 1e-6f : *((float*)epsilon); 17.115 - if (fabsf(a - b) < e) { 17.116 - return 0; 17.117 - } else { 17.118 - return a < b ? -1 : 1; 17.119 - } 17.120 -} 17.121 - 17.122 -int ucx_doublecmp(void *d1, void *d2, void *epsilon) { 17.123 - double a = *((float*) d1); 17.124 - double b = *((float*) d2); 17.125 - double e = !epsilon ? 1e-14 : *((double*)epsilon); 17.126 - if (fabs(a - b) < e) { 17.127 - return 0; 17.128 - } else { 17.129 - return a < b ? -1 : 1; 17.130 - } 17.131 -} 17.132 - 17.133 -int ucx_ptrcmp(void *ptr1, void *ptr2, void *data) { 17.134 - intptr_t p1 = (intptr_t) ptr1; 17.135 - intptr_t p2 = (intptr_t) ptr2; 17.136 - if (p1 == p2) { 17.137 - return 0; 17.138 - } else { 17.139 - return p1 < p2 ? -1 : 1; 17.140 - } 17.141 -} 17.142 - 17.143 -int ucx_memcmp(void *ptr1, void *ptr2, void *n) { 17.144 - return memcmp(ptr1, ptr2, *((size_t*)n)); 17.145 -} 17.146 - 17.147 -/* PRINTF FUNCTIONS */ 17.148 - 17.149 -#ifdef va_copy 17.150 -#define UCX_PRINTF_BUFSIZE 256 17.151 -#else 17.152 -#pragma message("WARNING: C99 va_copy macro not supported by this platform" \ 17.153 - " - limiting ucx_*printf to 2 KiB") 17.154 -#define UCX_PRINTF_BUFSIZE 0x800 17.155 -#endif 17.156 - 17.157 -int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) { 17.158 - int ret; 17.159 - va_list ap; 17.160 - va_start(ap, fmt); 17.161 - ret = ucx_vfprintf(stream, wfc, fmt, ap); 17.162 - va_end(ap); 17.163 - return ret; 17.164 -} 17.165 - 17.166 -int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) { 17.167 - char buf[UCX_PRINTF_BUFSIZE]; 17.168 -#ifdef va_copy 17.169 - va_list ap2; 17.170 - va_copy(ap2, ap); 17.171 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 17.172 - if (ret < 0) { 17.173 - return ret; 17.174 - } else if (ret < UCX_PRINTF_BUFSIZE) { 17.175 - return (int)wfc(buf, 1, ret, stream); 17.176 - } else { 17.177 - if (ret == INT_MAX) { 17.178 - errno = ENOMEM; 17.179 - return -1; 17.180 - } 17.181 - 17.182 - int len = ret + 1; 17.183 - char *newbuf = (char*)malloc(len); 17.184 - if (!newbuf) { 17.185 - return -1; 17.186 - } 17.187 - 17.188 - ret = vsnprintf(newbuf, len, fmt, ap2); 17.189 - if (ret > 0) { 17.190 - ret = (int)wfc(newbuf, 1, ret, stream); 17.191 - } 17.192 - free(newbuf); 17.193 - } 17.194 - return ret; 17.195 -#else 17.196 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 17.197 - if (ret < 0) { 17.198 - return ret; 17.199 - } else if (ret < UCX_PRINTF_BUFSIZE) { 17.200 - return (int)wfc(buf, 1, ret, stream); 17.201 - } else { 17.202 - errno = ENOMEM; 17.203 - return -1; 17.204 - } 17.205 -#endif 17.206 -} 17.207 - 17.208 -sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) { 17.209 - va_list ap; 17.210 - sstr_t ret; 17.211 - va_start(ap, fmt); 17.212 - ret = ucx_vasprintf(allocator, fmt, ap); 17.213 - va_end(ap); 17.214 - return ret; 17.215 -} 17.216 - 17.217 -sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) { 17.218 - sstr_t s; 17.219 - s.ptr = NULL; 17.220 - s.length = 0; 17.221 - char buf[UCX_PRINTF_BUFSIZE]; 17.222 -#ifdef va_copy 17.223 - va_list ap2; 17.224 - va_copy(ap2, ap); 17.225 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 17.226 - if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { 17.227 - s.ptr = (char*)almalloc(a, ret + 1); 17.228 - if (s.ptr) { 17.229 - s.length = (size_t)ret; 17.230 - memcpy(s.ptr, buf, ret); 17.231 - s.ptr[s.length] = '\0'; 17.232 - } 17.233 - } else if (ret == INT_MAX) { 17.234 - errno = ENOMEM; 17.235 - } else { 17.236 - int len = ret + 1; 17.237 - s.ptr = (char*)almalloc(a, len); 17.238 - if (s.ptr) { 17.239 - ret = vsnprintf(s.ptr, len, fmt, ap2); 17.240 - if (ret < 0) { 17.241 - free(s.ptr); 17.242 - s.ptr = NULL; 17.243 - } else { 17.244 - s.length = (size_t)ret; 17.245 - } 17.246 - } 17.247 - } 17.248 -#else 17.249 - int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 17.250 - if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { 17.251 - s.ptr = (char*)almalloc(a, ret + 1); 17.252 - if (s.ptr) { 17.253 - s.length = (size_t)ret; 17.254 - memcpy(s.ptr, buf, ret); 17.255 - s.ptr[s.length] = '\0'; 17.256 - } 17.257 - } else { 17.258 - errno = ENOMEM; 17.259 - } 17.260 -#endif 17.261 - return s; 17.262 -}
18.1 --- a/src/ucx/utils.h Thu Nov 10 18:44:48 2016 +0100 18.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 18.3 @@ -1,254 +0,0 @@ 18.4 -/* 18.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 18.6 - * 18.7 - * Copyright 2015 Olaf Wintermann. All rights reserved. 18.8 - * 18.9 - * Redistribution and use in source and binary forms, with or without 18.10 - * modification, are permitted provided that the following conditions are met: 18.11 - * 18.12 - * 1. Redistributions of source code must retain the above copyright 18.13 - * notice, this list of conditions and the following disclaimer. 18.14 - * 18.15 - * 2. Redistributions in binary form must reproduce the above copyright 18.16 - * notice, this list of conditions and the following disclaimer in the 18.17 - * documentation and/or other materials provided with the distribution. 18.18 - * 18.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 18.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 18.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 18.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 18.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 18.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 18.29 - * POSSIBILITY OF SUCH DAMAGE. 18.30 - */ 18.31 - 18.32 -/** 18.33 - * @file utils.h 18.34 - * 18.35 - * Compare, copy and printf functions. 18.36 - * 18.37 - * @author Mike Becker 18.38 - * @author Olaf Wintermann 18.39 - */ 18.40 - 18.41 -#ifndef UCX_UTILS_H 18.42 -#define UCX_UTILS_H 18.43 - 18.44 -#ifdef __cplusplus 18.45 -extern "C" { 18.46 -#endif 18.47 - 18.48 -#include "ucx.h" 18.49 -#include "string.h" 18.50 -#include "allocator.h" 18.51 -#include <inttypes.h> 18.52 -#include <string.h> 18.53 -#include <stdarg.h> 18.54 - 18.55 -/** 18.56 - * Copies a string. 18.57 - * @param s the string to copy 18.58 - * @param data omitted 18.59 - * @return a pointer to a copy of s1 that can be passed to free(void*) 18.60 - */ 18.61 -void *ucx_strcpy(void *s, void *data); 18.62 - 18.63 -/** 18.64 - * Copies a memory area. 18.65 - * @param m a pointer to the memory area 18.66 - * @param n a pointer to the size_t containing the size of the memory area 18.67 - * @return a pointer to a copy of the specified memory area that can 18.68 - * be passed to free(void*) 18.69 - */ 18.70 -void *ucx_memcpy(void *m, void *n); 18.71 - 18.72 - 18.73 -/** 18.74 - * Reads data from a stream and writes it to another stream. 18.75 - * 18.76 - * @param src the source stream 18.77 - * @param dest the destination stream 18.78 - * @param rfnc the read function 18.79 - * @param wfnc the write function 18.80 - * @param buf a pointer to the copy buffer or <code>NULL</code> if a buffer 18.81 - * shall be implicitly created on the heap 18.82 - * @param bufsize the size of the copy buffer - if <code>NULL</code> was 18.83 - * provided for <code>buf</code>, this is the size of the buffer that shall be 18.84 - * implicitly created 18.85 - * @param n the maximum number of bytes that shall be copied 18.86 - * @return the total number of bytes copied 18.87 - */ 18.88 -size_t ucx_stream_copy(void *src, void *dest, read_func rfnc, write_func wfnc, 18.89 - char* buf, size_t bufsize, size_t n); 18.90 - 18.91 -/** 18.92 - * Shorthand for ucx_stream_copy using the default copy buffer. 18.93 - * 18.94 - * @param src the source stream 18.95 - * @param dest the destination stream 18.96 - * @param rfnc the read function 18.97 - * @param wfnc the write function 18.98 - * @return total number of bytes copied 18.99 - */ 18.100 -#define ucx_stream_hcopy(src,dest,rfnc,wfnc) ucx_stream_copy(\ 18.101 - src, dest, (read_func)rfnc, (write_func)wfnc, NULL, 0x100, (size_t)-1) 18.102 - 18.103 -/** 18.104 - * Shorthand for ucx_stream_copy using the default copy buffer and a copy limit. 18.105 - * 18.106 - * @param src the source stream 18.107 - * @param dest the destination stream 18.108 - * @param rfnc the read function 18.109 - * @param wfnc the write function 18.110 - * @param n maximum number of bytes that shall be copied 18.111 - * @return total number of bytes copied 18.112 - */ 18.113 -#define ucx_stream_ncopy(src,dest,rfnc,wfnc, n) ucx_stream_copy(\ 18.114 - src, dest, (read_func)rfnc, (write_func)wfnc, NULL, 0x100, n) 18.115 - 18.116 -/** 18.117 - * Wraps the strcmp function. 18.118 - * @param s1 string one 18.119 - * @param s2 string two 18.120 - * @param data omitted 18.121 - * @return the result of strcmp(s1, s2) 18.122 - */ 18.123 -int ucx_strcmp(void *s1, void *s2, void *data); 18.124 - 18.125 -/** 18.126 - * Wraps the strncmp function. 18.127 - * @param s1 string one 18.128 - * @param s2 string two 18.129 - * @param n a pointer to the size_t containing the third strncmp parameter 18.130 - * @return the result of strncmp(s1, s2, *n) 18.131 - */ 18.132 -int ucx_strncmp(void *s1, void *s2, void *n); 18.133 - 18.134 -/** 18.135 - * Compares two integers of type int. 18.136 - * @param i1 pointer to integer one 18.137 - * @param i2 pointer to integer two 18.138 - * @param data omitted 18.139 - * @return -1, if *i1 is less than *i2, 0 if both are equal, 18.140 - * 1 if *i1 is greater than *i2 18.141 - */ 18.142 -int ucx_intcmp(void *i1, void *i2, void *data); 18.143 - 18.144 -/** 18.145 - * Compares two real numbers of type float. 18.146 - * @param f1 pointer to float one 18.147 - * @param f2 pointer to float two 18.148 - * @param data if provided: a pointer to precision (default: 1e-6f) 18.149 - * @return -1, if *f1 is less than *f2, 0 if both are equal, 18.150 - * 1 if *f1 is greater than *f2 18.151 - */ 18.152 - 18.153 -int ucx_floatcmp(void *f1, void *f2, void *data); 18.154 - 18.155 -/** 18.156 - * Compares two real numbers of type double. 18.157 - * @param d1 pointer to double one 18.158 - * @param d2 pointer to double two 18.159 - * @param data if provided: a pointer to precision (default: 1e-14) 18.160 - * @return -1, if *d1 is less than *d2, 0 if both are equal, 18.161 - * 1 if *d1 is greater than *d2 18.162 - */ 18.163 -int ucx_doublecmp(void *d1, void *d2, void *data); 18.164 - 18.165 -/** 18.166 - * Compares two pointers. 18.167 - * @param ptr1 pointer one 18.168 - * @param ptr2 pointer two 18.169 - * @param data omitted 18.170 - * @return -1 if ptr1 is less than ptr2, 0 if both are equal, 18.171 - * 1 if ptr1 is greater than ptr2 18.172 - */ 18.173 -int ucx_ptrcmp(void *ptr1, void *ptr2, void *data); 18.174 - 18.175 -/** 18.176 - * Compares two memory areas. 18.177 - * @param ptr1 pointer one 18.178 - * @param ptr2 pointer two 18.179 - * @param n a pointer to the size_t containing the third parameter for memcmp 18.180 - * @return the result of memcmp(ptr1, ptr2, *n) 18.181 - */ 18.182 -int ucx_memcmp(void *ptr1, void *ptr2, void *n); 18.183 - 18.184 -/** 18.185 - * A <code>printf()</code> like function which writes the output to a stream by 18.186 - * using a write_func(). 18.187 - * @param stream the stream the data is written to 18.188 - * @param wfc the write function 18.189 - * @param fmt format string 18.190 - * @param ... additional arguments 18.191 - * @return the total number of bytes written 18.192 - */ 18.193 -int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...); 18.194 - 18.195 -/** 18.196 - * <code>va_list</code> version of ucx_fprintf(). 18.197 - * @param stream the stream the data is written to 18.198 - * @param wfc the write function 18.199 - * @param fmt format string 18.200 - * @param ap argument list 18.201 - * @return the total number of bytes written 18.202 - * @see ucx_fprintf() 18.203 - */ 18.204 -int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap); 18.205 - 18.206 -/** 18.207 - * A <code>printf()</code> like function which allocates space for a sstr_t 18.208 - * the result is written to. 18.209 - * 18.210 - * <b>Attention</b>: The sstr_t data is allocated with the allocators 18.211 - * ucx_allocator_malloc() function. So it is implementation dependent, if 18.212 - * the returned sstr_t.ptr pointer must be passed to the allocators 18.213 - * ucx_allocator_free() function manually. 18.214 - * 18.215 - * <b>Note</b>: The sstr_t.ptr of the return value will <i>always</i> be 18.216 - * <code>NULL</code>-terminated. 18.217 - * 18.218 - * @param allocator the UcxAllocator used for allocating the result sstr_t 18.219 - * @param fmt format string 18.220 - * @param ... additional arguments 18.221 - * @return a sstr_t containing the formatted string 18.222 - */ 18.223 -sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...); 18.224 - 18.225 -/** Shortcut for ucx_asprintf() with default allocator. */ 18.226 -#define ucx_sprintf(fmt, ...) \ 18.227 - ucx_asprintf(ucx_default_allocator(), fmt, __VA_ARGS__) 18.228 - 18.229 -/** 18.230 - * <code>va_list</code> version of ucx_asprintf(). 18.231 - * 18.232 - * @param allocator the UcxAllocator used for allocating the result sstr_t 18.233 - * @param fmt format string 18.234 - * @param ap argument list 18.235 - * @return a sstr_t containing the formatted string 18.236 - * @see ucx_asprintf() 18.237 - */ 18.238 -sstr_t ucx_vasprintf(UcxAllocator *allocator, const char *fmt, va_list ap); 18.239 - 18.240 -/** 18.241 - * A <code>printf()</code> like function which writes the output to an 18.242 - * UcxBuffer. 18.243 - * 18.244 - * @param buffer the buffer the data is written to 18.245 - * @param ... format string and additional arguments 18.246 - * @return the total number of bytes written 18.247 - * @see ucx_fprintf() 18.248 - */ 18.249 -#define ucx_bprintf(buffer, ...) ucx_fprintf((UcxBuffer*)buffer, \ 18.250 - (write_func)ucx_buffer_write, __VA_ARGS__) 18.251 - 18.252 -#ifdef __cplusplus 18.253 -} 18.254 -#endif 18.255 - 18.256 -#endif /* UCX_UTILS_H */ 18.257 -