|
|
| version 1.1.2.2, 2011/05/03 14:22:18 | version 1.5.8.1, 2012/03/27 21:37:56 |
|---|---|
| Line 1 | Line 1 |
| /************************************************************************* | |
| * (C) 2011 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org> | |
| * by Michael Pounov <misho@elwix.org> | |
| * | |
| * $Author$ | |
| * $Id$ | |
| * | |
| ************************************************************************** | |
| The ELWIX and AITNET software is distributed under the following | |
| terms: | |
| All of the documentation and software included in the ELWIX and AITNET | |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> | |
| Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 | |
| by Michael Pounov <misho@elwix.org>. All rights reserved. | |
| Redistribution and use in source and binary forms, with or without | |
| modification, are permitted provided that the following conditions | |
| are met: | |
| 1. Redistributions of source code must retain the above copyright | |
| notice, this list of conditions and the following disclaimer. | |
| 2. Redistributions in binary form must reproduce the above copyright | |
| notice, this list of conditions and the following disclaimer in the | |
| documentation and/or other materials provided with the distribution. | |
| 3. All advertising materials mentioning features or use of this software | |
| must display the following acknowledgement: | |
| This product includes software developed by Michael Pounov <misho@elwix.org> | |
| ELWIX - Embedded LightWeight unIX and its contributors. | |
| 4. Neither the name of AITNET nor the names of its contributors | |
| may be used to endorse or promote products derived from this software | |
| without specific prior written permission. | |
| THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND | |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| SUCH DAMAGE. | |
| */ | |
| #include "global.h" | #include "global.h" |
| /* | /* |
| * io_sarrInit() - Create and initialize dynamic split-order array | * io_sarrInit() - Create and initialize dynamic split-order array |
| * | |
| * @numItems = Number of Items | * @numItems = Number of Items |
| * @segLen = Length of segment | * @segLen = Length of segment |
| * return: NULL error, != NULL allocated memory for array | * return: NULL error, != NULL allocated memory for array |
| Line 37 io_sarrInit(int numItems, int segLen) | Line 83 io_sarrInit(int numItems, int segLen) |
| /* | /* |
| * io_sarrDestroy() - Free all data in dynamic split-order array and Destroy array | * io_sarrDestroy() - Free all data in dynamic split-order array and Destroy array |
| * | |
| * @parr = Array | * @parr = Array |
| * return: none | * return: none |
| */ | */ |
| Line 45 io_sarrDestroy(sarr_t ** __restrict parr) | Line 92 io_sarrDestroy(sarr_t ** __restrict parr) |
| { | { |
| register int i; | register int i; |
| assert(parr); | if (!parr || !*parr) |
| if (!parr) | |
| return; | return; |
| for (i = 0; i < (*parr)->sarr_siz; i++) | for (i = 0; i < (*parr)->sarr_siz; i++) |
| Line 62 io_sarrDestroy(sarr_t ** __restrict parr) | Line 108 io_sarrDestroy(sarr_t ** __restrict parr) |
| } | } |
| /* | /* |
| * io_sarrCopy() Copy source split array to destination split array | |
| * | |
| * @dest = Destination split array, after use free with io_sarrDestroy() | |
| * @src = Source split array | |
| * return: -1 error; >0 count of destination split array | |
| */ | |
| int | |
| io_sarrCopy(sarr_t ** __restrict dest, sarr_t * __restrict src) | |
| { | |
| assert(dest); | |
| assert(src); | |
| if (!dest || !src) | |
| return -1; | |
| *dest = io_sarrInit(io_sarrSize(src), io_sarrSeg(src)); | |
| if (!*dest) | |
| return -1; | |
| memcpy((*dest)->sarr_data, src->sarr_data, (*dest)->sarr_siz * sizeof(sarr_seg_t)); | |
| return io_sarrSize(*dest); | |
| } | |
| /* | |
| * io_sarrVacuum() - Vacuum dynamic split-order array, empty segments will be freed | * io_sarrVacuum() - Vacuum dynamic split-order array, empty segments will be freed |
| * | |
| * @arr = Array | * @arr = Array |
| * return: -1 error, >-1 freed segments | * return: -1 error, >-1 freed segments |
| */ | */ |
| Line 73 io_sarrVacuum(sarr_t * __restrict arr) | Line 143 io_sarrVacuum(sarr_t * __restrict arr) |
| int cx = 0; | int cx = 0; |
| sarr_seg_t seg; | sarr_seg_t seg; |
| assert(arr); | |
| if (!arr) | if (!arr) |
| return -1; | return -1; |
| Line 94 io_sarrVacuum(sarr_t * __restrict arr) | Line 163 io_sarrVacuum(sarr_t * __restrict arr) |
| /* | /* |
| * io_sarrGrow() - Grow/Shrink dynamic split-order array, Use with care when it shrink!!! | * io_sarrGrow() - Grow/Shrink dynamic split-order array, Use with care when it shrink!!! |
| * | |
| * @arr = Array | * @arr = Array |
| * @newNumItems = Number of Items | * @newNumItems = Number of Items |
| * return: -1 error, 0 ok | * return: -1 error, 0 ok |
| Line 105 io_sarrGrow(sarr_t * __restrict arr, int newNumItems) | Line 175 io_sarrGrow(sarr_t * __restrict arr, int newNumItems) |
| int seg, n = 0; | int seg, n = 0; |
| register int i; | register int i; |
| assert(arr); | |
| if (!arr) | if (!arr) |
| return -1; | return -1; |
| Line 134 io_sarrGrow(sarr_t * __restrict arr, int newNumItems) | Line 203 io_sarrGrow(sarr_t * __restrict arr, int newNumItems) |
| /* | /* |
| * io_sarrGet() - Get element from dynamic split-order array | * io_sarrGet() - Get element from dynamic split-order array |
| * | |
| * @arr = Array | * @arr = Array |
| * @idx = Index (warning 1st element is at position 1) | * @idx = Index (warning 1st element is at position 1) |
| * return: NULL not found, !=NULL element | * return: NULL not found, !=NULL element |
| Line 144 io_sarrGet(sarr_t * __restrict arr, u_int idx) | Line 214 io_sarrGet(sarr_t * __restrict arr, u_int idx) |
| void *ret = NULL; | void *ret = NULL; |
| sarr_seg_t seg; | sarr_seg_t seg; |
| assert(arr); | |
| if (!arr || idx < 1 || arr->sarr_num < idx) | if (!arr || idx < 1 || arr->sarr_num < idx) |
| return ret; | return ret; |
| Line 156 io_sarrGet(sarr_t * __restrict arr, u_int idx) | Line 225 io_sarrGet(sarr_t * __restrict arr, u_int idx) |
| } | } |
| /* | /* |
| * io_sarrGet2() - Always get element from dynamic split-order array | |
| * Function automatic grow array. Good use for Hash tables! | |
| * | |
| * @arr = Array | |
| * @idx = Index (warning 1st element is at position 1) | |
| * return: NULL not found, !=NULL element | |
| */ | |
| void * | |
| io_sarrGet2(sarr_t * __restrict arr, u_int idx) | |
| { | |
| if (!arr || idx < 1) | |
| return NULL; | |
| if (arr->sarr_num < idx) | |
| if (io_sarrGrow(arr, idx)) | |
| return NULL; | |
| return io_sarrGet(arr, idx); | |
| } | |
| /* | |
| * io_sarrSet() - Set element to dynamic split-order array | * io_sarrSet() - Set element to dynamic split-order array |
| * | |
| * @arr = Array | * @arr = Array |
| * @idx = Index (warning 1st element is at position 1) | * @idx = Index (warning 1st element is at position 1) |
| * @data = Value | * @data = Value |
| Line 169 io_sarrSet(sarr_t * __restrict arr, u_int idx, void *d | Line 258 io_sarrSet(sarr_t * __restrict arr, u_int idx, void *d |
| sarr_seg_t seg; | sarr_seg_t seg; |
| register int pos; | register int pos; |
| assert(arr); | |
| if (!arr || idx < 1 || arr->sarr_num < idx) | if (!arr || idx < 1 || arr->sarr_num < idx) |
| return ret; | return ret; |
| seg = arr->sarr_data[idx / arr->sarr_seg]; | seg = arr->sarr_data[idx / arr->sarr_seg]; |
| if (seg) { | if (!seg) { |
| pos = idx % arr->sarr_seg; | seg = calloc(arr->sarr_seg, sizeof(void*)); |
| ret = seg[pos]; | if (!seg) { |
| seg[pos] = data; | LOGERR; |
| return ret; | |
| } else | |
| memset(seg, 0, arr->sarr_seg * sizeof(void*)); | |
| arr->sarr_data[idx / arr->sarr_seg] = seg; | |
| } | } |
| pos = idx % arr->sarr_seg; | |
| ret = seg[pos]; | |
| seg[pos] = data; | |
| return ret; | return ret; |
| } | |
| /* | |
| * io_sarr2array() - Convert from split-order array to dynamic array | |
| * | |
| * @sa = split array | |
| * @sarrFree = after convert split array !=0 will be destroyed sarray | |
| * return: NULL error or != NULL new array | |
| */ | |
| array_t * | |
| io_sarr2array(sarr_t ** __restrict sa, int sarrFree) | |
| { | |
| array_t *arr = NULL; | |
| int el; | |
| register int i; | |
| assert(sa && *sa); | |
| if (!sa || !*sa) | |
| return NULL; | |
| el = io_sarrSize(*sa); | |
| arr = io_arrayInit(el); | |
| if (!arr) | |
| return NULL; | |
| for (i = 0; i < el; i++) | |
| io_arraySet(arr, i, io_sarrGet(*sa, i + 1)); | |
| if (sarrFree) { | |
| free(*sa); | |
| *sa = NULL; | |
| } | |
| return arr; | |
| } | |
| /* | |
| * io_array2sarr() - Convert from dynamic array to split-order array | |
| * | |
| * @a = array | |
| * @segLen = Length of segment | |
| * @arrFree = after convert array !=0 will be destroyed | |
| * return: NULL error or != NULL new sarr | |
| */ | |
| sarr_t * | |
| io_array2sarr(array_t ** __restrict a, int segLen, int arrFree) | |
| { | |
| sarr_t *sa = NULL; | |
| int el; | |
| register int i; | |
| assert(a && *a); | |
| if (!a || !*a) | |
| return NULL; | |
| el = io_arraySize(*a); | |
| sa = io_sarrInit(el, segLen); | |
| if (!sa) | |
| return NULL; | |
| for (i = 0; i < el; i++) | |
| io_sarrSet(sa, i + 1, io_arrayGet(*a, i)); | |
| if (arrFree) { | |
| free(*a); | |
| *a = NULL; | |
| } | |
| return sa; | |
| } | } |