Sat, 20 Jul 2013 11:13:26 +0200
some fixes
universe@103 | 1 | /* |
universe@103 | 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
universe@103 | 3 | * |
universe@103 | 4 | * Copyright 2013 Olaf Wintermann. All rights reserved. |
universe@103 | 5 | * |
universe@103 | 6 | * Redistribution and use in source and binary forms, with or without |
universe@103 | 7 | * modification, are permitted provided that the following conditions are met: |
universe@103 | 8 | * |
universe@103 | 9 | * 1. Redistributions of source code must retain the above copyright |
universe@103 | 10 | * notice, this list of conditions and the following disclaimer. |
universe@103 | 11 | * |
universe@103 | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
universe@103 | 13 | * notice, this list of conditions and the following disclaimer in the |
universe@103 | 14 | * documentation and/or other materials provided with the distribution. |
universe@103 | 15 | * |
universe@103 | 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
universe@103 | 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
universe@103 | 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
universe@103 | 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
universe@103 | 20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
universe@103 | 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
universe@103 | 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
universe@103 | 23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
universe@103 | 24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
universe@103 | 25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
universe@103 | 26 | * POSSIBILITY OF SUCH DAMAGE. |
universe@103 | 27 | */ |
universe@103 | 28 | |
olaf@120 | 29 | #ifndef UCX_BUFFER_H |
olaf@120 | 30 | #define UCX_BUFFER_H |
universe@56 | 31 | |
universe@69 | 32 | #include "ucx.h" |
universe@62 | 33 | #include <sys/types.h> |
universe@56 | 34 | #include <stdio.h> |
universe@56 | 35 | |
universe@56 | 36 | #ifdef __cplusplus |
universe@56 | 37 | extern "C" { |
universe@56 | 38 | #endif |
universe@56 | 39 | |
universe@85 | 40 | /* no autoextend or autofree behaviour */ |
universe@61 | 41 | #define UCX_BUFFER_DEFAULT 0x00 |
universe@85 | 42 | /* the buffer shall free the occupied memory space */ |
universe@61 | 43 | #define UCX_BUFFER_AUTOFREE 0x01 |
universe@64 | 44 | /* the buffer may automatically double its size on write operations */ |
universe@63 | 45 | #define UCX_BUFFER_AUTOEXTEND 0x02 |
universe@56 | 46 | |
universe@64 | 47 | /* the user shall not modify values, but may get the latest pointer */ |
universe@63 | 48 | typedef struct { |
olaf@76 | 49 | char *space; |
universe@63 | 50 | size_t pos; |
olaf@76 | 51 | size_t capacity; |
universe@63 | 52 | size_t size; |
universe@63 | 53 | int flags; |
universe@63 | 54 | } UcxBuffer; |
universe@56 | 55 | |
universe@61 | 56 | /* if space is NULL, new space is allocated and the autofree flag is enforced */ |
olaf@76 | 57 | UcxBuffer *ucx_buffer_new(void *space, size_t size, int flags); |
universe@60 | 58 | void ucx_buffer_free(UcxBuffer* buffer); |
universe@56 | 59 | |
universe@56 | 60 | /* |
universe@62 | 61 | * the autofree flag is enforced for the new buffer |
universe@62 | 62 | * if length is zero, the whole remaining buffer shall be extracted |
universe@62 | 63 | * the position of the new buffer is set to zero |
universe@62 | 64 | */ |
olaf@76 | 65 | UcxBuffer* ucx_buffer_extract(UcxBuffer *src, |
universe@62 | 66 | size_t start, size_t length, int flags); |
universe@62 | 67 | #define ucx_buffer_clone(src,flags) \ |
universe@62 | 68 | ucx_buffer_extract(src, 0, 0, flags) |
universe@62 | 69 | |
universe@62 | 70 | /* |
universe@60 | 71 | * Moves the position of the buffer to a new position relative to whence. |
universe@56 | 72 | * |
universe@56 | 73 | * SEEK_SET marks the start of the buffer |
universe@56 | 74 | * SEEK_CUR marks the current position |
universe@56 | 75 | * SEEK_END marks the first 0-byte in the buffer |
universe@56 | 76 | * |
universe@85 | 77 | * ucx_buffer_seek returns 0 on success and -1 if the new position is beyond the |
universe@60 | 78 | * bounds of the allocated buffer. In that case the position of the buffer |
universe@56 | 79 | * remains unchanged. |
universe@56 | 80 | * |
universe@56 | 81 | */ |
universe@60 | 82 | int ucx_buffer_seek(UcxBuffer *buffer, off_t offset, int whence); |
universe@56 | 83 | |
universe@85 | 84 | #define ucx_buffer_clear(buffer) memset(buffer->space, 0, buffer->size); \ |
universe@85 | 85 | buffer->size = 0; buffer->pos = 0; |
universe@85 | 86 | |
universe@56 | 87 | /* |
olaf@76 | 88 | * returns non-zero, if the current buffer position has exceeded the last |
universe@56 | 89 | * available byte of the underlying buffer |
universe@56 | 90 | * |
universe@56 | 91 | */ |
universe@60 | 92 | int ucx_buffer_eof(UcxBuffer *buffer); |
universe@56 | 93 | |
olaf@76 | 94 | |
olaf@76 | 95 | int ucx_buffere_extend(UcxBuffer *buffer, size_t len); |
olaf@76 | 96 | |
olaf@76 | 97 | size_t ucx_buffer_write(const void *ptr, size_t size, size_t nitems, |
olaf@76 | 98 | UcxBuffer *buffer); |
olaf@76 | 99 | |
olaf@76 | 100 | size_t ucx_buffer_read(void *ptr, size_t size, size_t nitems, |
olaf@76 | 101 | UcxBuffer *buffer); |
olaf@76 | 102 | |
universe@60 | 103 | int ucx_buffer_putc(UcxBuffer *b, int c); |
universe@60 | 104 | int ucx_buffer_getc(UcxBuffer *b); |
universe@56 | 105 | |
olaf@76 | 106 | |
olaf@76 | 107 | /* |
olaf@76 | 108 | * copies all bytes from s1 to s2 |
olaf@76 | 109 | * uses the read function r to read from s1 und writes the data using the |
olaf@76 | 110 | * write function w to s2 |
olaf@76 | 111 | * returns the number of bytes copied |
olaf@76 | 112 | */ |
olaf@76 | 113 | size_t ucx_buffer_generic_copy(void *s1, void *s2, read_func r, write_func w, |
olaf@76 | 114 | size_t bufsize); |
olaf@76 | 115 | |
olaf@86 | 116 | size_t ucx_buffer_generic_ncopy(void *s1, void *s2, read_func r, write_func w, |
olaf@86 | 117 | size_t bufsize, size_t n); |
olaf@76 | 118 | |
olaf@86 | 119 | #define UCX_DEFAULT_BUFFER_SIZE 0x1000 |
olaf@76 | 120 | |
olaf@76 | 121 | #define ucx_buffer_copy(s1,s2,r,w) \ |
olaf@76 | 122 | ucx_buffer_generic_copy(s1, s2, (read_func)r, (write_func)w, \ |
olaf@76 | 123 | UCX_DEFAULT_BUFFER_SIZE) |
olaf@76 | 124 | |
olaf@86 | 125 | #define ucx_buffer_ncopy(s1,s2,r,w, n) \ |
olaf@86 | 126 | ucx_buffer_generic_ncopy(s1, s2, (read_func)r, (write_func)w, \ |
olaf@86 | 127 | UCX_DEFAULT_BUFFER_SIZE, n) |
olaf@86 | 128 | |
universe@56 | 129 | #ifdef __cplusplus |
universe@56 | 130 | } |
universe@56 | 131 | #endif |
universe@56 | 132 | |
olaf@120 | 133 | #endif /* UCX_BUFFER_H */ |
universe@56 | 134 |