1.1 --- a/src/buffer.c Mon Dec 30 09:54:10 2019 +0100 1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 @@ -1,297 +0,0 @@ 1.4 -/* 1.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 - * 1.7 - * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved. 1.8 - * 1.9 - * Redistribution and use in source and binary forms, with or without 1.10 - * modification, are permitted provided that the following conditions are met: 1.11 - * 1.12 - * 1. Redistributions of source code must retain the above copyright 1.13 - * notice, this list of conditions and the following disclaimer. 1.14 - * 1.15 - * 2. Redistributions in binary form must reproduce the above copyright 1.16 - * notice, this list of conditions and the following disclaimer in the 1.17 - * documentation and/or other materials provided with the distribution. 1.18 - * 1.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 1.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.29 - * POSSIBILITY OF SUCH DAMAGE. 1.30 - */ 1.31 - 1.32 -#include "ucx/buffer.h" 1.33 - 1.34 -#include <stdarg.h> 1.35 -#include <stdlib.h> 1.36 -#include <string.h> 1.37 - 1.38 -UcxBuffer *ucx_buffer_new(void *space, size_t capacity, int flags) { 1.39 - UcxBuffer *buffer = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 1.40 - if (buffer) { 1.41 - buffer->flags = flags; 1.42 - if (!space) { 1.43 - buffer->space = (char*)malloc(capacity); 1.44 - if (!buffer->space) { 1.45 - free(buffer); 1.46 - return NULL; 1.47 - } 1.48 - memset(buffer->space, 0, capacity); 1.49 - buffer->flags |= UCX_BUFFER_AUTOFREE; 1.50 - } else { 1.51 - buffer->space = (char*)space; 1.52 - } 1.53 - buffer->capacity = capacity; 1.54 - buffer->size = 0; 1.55 - 1.56 - buffer->pos = 0; 1.57 - } 1.58 - 1.59 - return buffer; 1.60 -} 1.61 - 1.62 -void ucx_buffer_free(UcxBuffer *buffer) { 1.63 - if ((buffer->flags & UCX_BUFFER_AUTOFREE) == UCX_BUFFER_AUTOFREE) { 1.64 - free(buffer->space); 1.65 - } 1.66 - free(buffer); 1.67 -} 1.68 - 1.69 -UcxBuffer* ucx_buffer_extract( 1.70 - UcxBuffer *src, size_t start, size_t length, int flags) { 1.71 - if (src->size == 0 || length == 0 || 1.72 - ((size_t)-1) - start < length || start+length > src->capacity) 1.73 - { 1.74 - return NULL; 1.75 - } 1.76 - 1.77 - UcxBuffer *dst = (UcxBuffer*) malloc(sizeof(UcxBuffer)); 1.78 - if (dst) { 1.79 - dst->space = (char*)malloc(length); 1.80 - if (!dst->space) { 1.81 - free(dst); 1.82 - return NULL; 1.83 - } 1.84 - dst->capacity = length; 1.85 - dst->size = length; 1.86 - dst->flags = flags | UCX_BUFFER_AUTOFREE; 1.87 - dst->pos = 0; 1.88 - memcpy(dst->space, src->space+start, length); 1.89 - } 1.90 - return dst; 1.91 -} 1.92 - 1.93 -int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence) { 1.94 - size_t npos; 1.95 - switch (whence) { 1.96 - case SEEK_CUR: 1.97 - npos = buffer->pos; 1.98 - break; 1.99 - case SEEK_END: 1.100 - npos = buffer->size; 1.101 - break; 1.102 - case SEEK_SET: 1.103 - npos = 0; 1.104 - break; 1.105 - default: 1.106 - return -1; 1.107 - } 1.108 - 1.109 - size_t opos = npos; 1.110 - npos += offset; 1.111 - 1.112 - if ((offset > 0 && npos < opos) || (offset < 0 && npos > opos)) { 1.113 - return -1; 1.114 - } 1.115 - 1.116 - if (npos >= buffer->size) { 1.117 - return -1; 1.118 - } else { 1.119 - buffer->pos = npos; 1.120 - return 0; 1.121 - } 1.122 - 1.123 -} 1.124 - 1.125 -int ucx_buffer_eof(UcxBuffer *buffer) { 1.126 - return buffer->pos >= buffer->size; 1.127 -} 1.128 - 1.129 -int ucx_buffer_extend(UcxBuffer *buffer, size_t len) { 1.130 - size_t newcap = buffer->capacity; 1.131 - 1.132 - if (buffer->capacity + len < buffer->capacity) { 1.133 - return -1; 1.134 - } 1.135 - 1.136 - while (buffer->capacity + len > newcap) { 1.137 - newcap <<= 1; 1.138 - if (newcap < buffer->capacity) { 1.139 - return -1; 1.140 - } 1.141 - } 1.142 - 1.143 - char *newspace = (char*)realloc(buffer->space, newcap); 1.144 - if (newspace) { 1.145 - memset(newspace+buffer->size, 0, newcap-buffer->size); 1.146 - buffer->space = newspace; 1.147 - buffer->capacity = newcap; 1.148 - } else { 1.149 - return -1; 1.150 - } 1.151 - 1.152 - return 0; 1.153 -} 1.154 - 1.155 -size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems, 1.156 - UcxBuffer *buffer) { 1.157 - size_t len; 1.158 - if(ucx_szmul(size, nitems, &len)) { 1.159 - return 0; 1.160 - } 1.161 - size_t required = buffer->pos + len; 1.162 - if (buffer->pos > required) { 1.163 - return 0; 1.164 - } 1.165 - 1.166 - if (required > buffer->capacity) { 1.167 - if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) { 1.168 - if (ucx_buffer_extend(buffer, required - buffer->capacity)) { 1.169 - return 0; 1.170 - } 1.171 - } else { 1.172 - len = buffer->capacity - buffer->pos; 1.173 - if (size > 1) { 1.174 - len -= len%size; 1.175 - } 1.176 - } 1.177 - } 1.178 - 1.179 - if (len == 0) { 1.180 - return len; 1.181 - } 1.182 - 1.183 - memcpy(buffer->space + buffer->pos, ptr, len); 1.184 - buffer->pos += len; 1.185 - if(buffer->pos > buffer->size) { 1.186 - buffer->size = buffer->pos; 1.187 - } 1.188 - 1.189 - return len / size; 1.190 -} 1.191 - 1.192 -size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems, 1.193 - UcxBuffer *buffer) { 1.194 - size_t len; 1.195 - if(ucx_szmul(size, nitems, &len)) { 1.196 - return 0; 1.197 - } 1.198 - if (buffer->pos + len > buffer->size) { 1.199 - len = buffer->size - buffer->pos; 1.200 - if (size > 1) len -= len%size; 1.201 - } 1.202 - 1.203 - if (len <= 0) { 1.204 - return len; 1.205 - } 1.206 - 1.207 - memcpy(ptr, buffer->space + buffer->pos, len); 1.208 - buffer->pos += len; 1.209 - 1.210 - return len / size; 1.211 -} 1.212 - 1.213 -int ucx_buffer_putc(UcxBuffer *buffer, int c) { 1.214 - if(buffer->pos >= buffer->capacity) { 1.215 - if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) { 1.216 - if(ucx_buffer_extend(buffer, 1)) { 1.217 - return EOF; 1.218 - } 1.219 - } else { 1.220 - return EOF; 1.221 - } 1.222 - } 1.223 - 1.224 - c &= 0xFF; 1.225 - buffer->space[buffer->pos] = (char) c; 1.226 - buffer->pos++; 1.227 - if(buffer->pos > buffer->size) { 1.228 - buffer->size = buffer->pos; 1.229 - } 1.230 - return c; 1.231 -} 1.232 - 1.233 -int ucx_buffer_getc(UcxBuffer *buffer) { 1.234 - if (ucx_buffer_eof(buffer)) { 1.235 - return EOF; 1.236 - } else { 1.237 - int c = ((unsigned char*)buffer->space)[buffer->pos]; 1.238 - buffer->pos++; 1.239 - return c; 1.240 - } 1.241 -} 1.242 - 1.243 -size_t ucx_buffer_puts(UcxBuffer *buffer, const char *str) { 1.244 - return ucx_buffer_write((const void*)str, 1, strlen(str), buffer); 1.245 -} 1.246 - 1.247 -int ucx_buffer_shift_left(UcxBuffer* buffer, size_t shift) { 1.248 - if (shift >= buffer->size) { 1.249 - buffer->pos = buffer->size = 0; 1.250 - } else { 1.251 - memmove(buffer->space, buffer->space + shift, buffer->size - shift); 1.252 - buffer->size -= shift; 1.253 - 1.254 - if (buffer->pos >= shift) { 1.255 - buffer->pos -= shift; 1.256 - } else { 1.257 - buffer->pos = 0; 1.258 - } 1.259 - } 1.260 - return 0; 1.261 -} 1.262 - 1.263 -int ucx_buffer_shift_right(UcxBuffer* buffer, size_t shift) { 1.264 - size_t req_capacity = buffer->size + shift; 1.265 - size_t movebytes; 1.266 - 1.267 - // auto extend buffer, if required and enabled 1.268 - if (buffer->capacity < req_capacity) { 1.269 - if ((buffer->flags & UCX_BUFFER_AUTOEXTEND) == UCX_BUFFER_AUTOEXTEND) { 1.270 - if (ucx_buffer_extend(buffer, req_capacity - buffer->capacity)) { 1.271 - return 1; 1.272 - } 1.273 - movebytes = buffer->size; 1.274 - } else { 1.275 - movebytes = buffer->capacity - shift; 1.276 - } 1.277 - } else { 1.278 - movebytes = buffer->size; 1.279 - } 1.280 - 1.281 - memmove(buffer->space + shift, buffer->space, movebytes); 1.282 - buffer->size = shift+movebytes; 1.283 - 1.284 - buffer->pos += shift; 1.285 - if (buffer->pos > buffer->size) { 1.286 - buffer->pos = buffer->size; 1.287 - } 1.288 - 1.289 - return 0; 1.290 -} 1.291 - 1.292 -int ucx_buffer_shift(UcxBuffer* buffer, off_t shift) { 1.293 - if (shift < 0) { 1.294 - return ucx_buffer_shift_left(buffer, (size_t) (-shift)); 1.295 - } else if (shift > 0) { 1.296 - return ucx_buffer_shift_right(buffer, (size_t) shift); 1.297 - } else { 1.298 - return 0; 1.299 - } 1.300 -}