Annotation of libelwix/inc/elwix/aarray.h, revision 1.1

1.1     ! misho       1: /*************************************************************************
        !             2: * (C) 2013 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
        !             3: *  by Michael Pounov <misho@elwix.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: global.h,v 1.13 2012/08/29 13:51:29 misho Exp $
        !             7: *
        !             8: **************************************************************************
        !             9: The ELWIX and AITNET software is distributed under the following
        !            10: terms:
        !            11: 
        !            12: All of the documentation and software included in the ELWIX and AITNET
        !            13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
        !            14: 
        !            15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
        !            16:        by Michael Pounov <misho@elwix.org>.  All rights reserved.
        !            17: 
        !            18: Redistribution and use in source and binary forms, with or without
        !            19: modification, are permitted provided that the following conditions
        !            20: are met:
        !            21: 1. Redistributions of source code must retain the above copyright
        !            22:    notice, this list of conditions and the following disclaimer.
        !            23: 2. Redistributions in binary form must reproduce the above copyright
        !            24:    notice, this list of conditions and the following disclaimer in the
        !            25:    documentation and/or other materials provided with the distribution.
        !            26: 3. All advertising materials mentioning features or use of this software
        !            27:    must display the following acknowledgement:
        !            28: This product includes software developed by Michael Pounov <misho@elwix.org>
        !            29: ELWIX - Embedded LightWeight unIX and its contributors.
        !            30: 4. Neither the name of AITNET nor the names of its contributors
        !            31:    may be used to endorse or promote products derived from this software
        !            32:    without specific prior written permission.
        !            33: 
        !            34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
        !            35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            44: SUCH DAMAGE.
        !            45: */
        !            46: #ifndef __AARRAY_H
        !            47: #define __AARRAY_H
        !            48: 
        !            49: 
        !            50: typedef struct _tagArray {
        !            51:        int     arr_last;
        !            52:        int     arr_num;
        !            53:        void    **arr_data;
        !            54: } array_t;
        !            55: 
        !            56: #define array_Size(_arr)               ((_arr) ? (_arr)->arr_num : 0)
        !            57: #define array_Last(_arr)               (array_Size((_arr)) ? (_arr)->arr_last : -1)
        !            58: #define array_Zero(_arr)               (assert((_arr)), memset((_arr)->arr_data, 0, \
        !            59:                                                array_Size((_arr)) * sizeof(intptr_t)))
        !            60: 
        !            61: #define array_Get2(_arr, _d)           (assert((_arr) && (_arr)->arr_num > _d), ((_arr)->arr_data + _d))
        !            62: #define array_Get(_arr, _d)            (assert((_arr) && (_arr)->arr_num > _d), (_arr)->arr_data[_d])
        !            63: #define array(_arr, _d, _type)         (assert((_arr) && (_arr)->arr_num > _d), \
        !            64:                                                ((_type) (_arr)->arr_data[_d]))
        !            65: #define array_Set(_arr, _d, _ptr)      do { assert((_arr) && (_arr)->arr_num > _d); \
        !            66:                                                if ((_arr)->arr_last < _d) \
        !            67:                                                        (_arr)->arr_last = _d; \
        !            68:                                                (_arr)->arr_data[_d] = (void*) (_ptr); \
        !            69:                                        } while (0)
        !            70: #define array_Del(_arr, _d, _fri)      do { assert((_arr) && (_arr)->arr_num > _d); \
        !            71:                                                if (_fri && (_arr)->arr_data[_d]) \
        !            72:                                                        e_free((_arr)->arr_data[_d]); \
        !            73:                                                (_arr)->arr_data[_d] = NULL; \
        !            74:                                        } while (0)
        !            75: 
        !            76: /*
        !            77:  * array_Init() - Create and initialize dynamic array
        !            78:  *
        !            79:  * @numItems = Number of Items
        !            80:  * return: NULL error, != NULL allocated memory for array
        !            81:  */
        !            82: inline array_t *array_Init(int numItems);
        !            83: /*
        !            84:  * array_Destroy() - Free and destroy dynamic array
        !            85:  *
        !            86:  * @parr = Array
        !            87:  * return: none
        !            88:  */
        !            89: inline void array_Destroy(array_t ** __restrict parr);
        !            90: /*
        !            91:  * array_Free() - Free all data in dynamic array items
        !            92:  *     (WARNING! If assign static array dont use this!!!)
        !            93:  *
        !            94:  * @arr = Array
        !            95:  * return: none
        !            96:  */
        !            97: inline void array_Free(array_t * __restrict arr);
        !            98: 
        !            99: /*
        !           100:  * array_From() - Create and fill array from array with pointers
        !           101:  *
        !           102:  * @pargv = Array with pointers
        !           103:  * @argc = Number of Items, if 0 walk through argv and stop when reach NULL item
        !           104:  * return: NULL error, != NULL allocated new array
        !           105:  */
        !           106: array_t *array_From(const char *** __restrict pargv, int argc);
        !           107: /*
        !           108:  * array_Args() Parse and make array from arguments ... (input string will be modified!!! 
        !           109:  *     and output array must be free with io_arrayDestroy() after use!)
        !           110:  *
        !           111:  * @psArgs = Input arguments line, after execute string is modified!!!
        !           112:  * @nargs = Maximum requested count of arguments from input string psArgs, if 0 all psArgs
        !           113:  * @csDelim = Delimiter(s) for separate
        !           114:  * @parr = Output array of arguments ... (must be free with array_Destroy() after use!)
        !           115:  * return: 0 error format; -1 error:: can`t read; >0 ok, number of readed items
        !           116:  */
        !           117: int array_Args(char * __restrict psArgs, int nargs, const char *csDelim, 
        !           118:                array_t ** __restrict parr);
        !           119: /*
        !           120:  * array_To() - Create and fill array with pointers from dynamic array
        !           121:  *
        !           122:  * @arr = Array
        !           123:  * return: NULL error, != NULL allocated memory for array, NULL terminated
        !           124:  */
        !           125: char **array_To(array_t * __restrict arr);
        !           126: 
        !           127: /*
        !           128:  * array_Len() - Get last used element in dynamic array (array Length)
        !           129:  *
        !           130:  * @arr = Array
        !           131:  * return: -1 empty or >-1 position of last used element
        !           132:  */
        !           133: inline int array_Len(array_t * __restrict arr);
        !           134: 
        !           135: /*
        !           136:  * array_Grow() - Grow/Shrink dynamic array, Use with care when it shrink!!!
        !           137:  *
        !           138:  * @arr = Array
        !           139:  * @newNumItems = Number of Items
        !           140:  * @freeShrink = Free elements before shrink array
        !           141:  * return: -1 error, 0 ok
        !           142:  */
        !           143: int array_Grow(array_t * __restrict arr, int newNumItems, int freeShrink);
        !           144: /*
        !           145:  * array_Vacuum() - Vacuum dynamic array, empty elements will be deleted
        !           146:  *
        !           147:  * @arr = Array
        !           148:  * @fromWhere = 1 begin, 2 ALL empty elements
        !           149:  * return: -1 error, 0 ok
        !           150:  */
        !           151: int array_Vacuum(array_t * __restrict arr, int fromWhere);
        !           152: /*
        !           153:  * array_Concat() Concat source array to destination array
        !           154:  *
        !           155:  * @dest = Destination array
        !           156:  * @src = Source array
        !           157:  * return: -1 error; >0 new count of destination array
        !           158:  */
        !           159: int array_Concat(array_t * __restrict dest, array_t * __restrict src);
        !           160: /*
        !           161:  * array_Copy() Copy source array to destination array
        !           162:  *
        !           163:  * @dest = Destination array, after use free with io_arrayDestroy()
        !           164:  * @src = Source array
        !           165:  * return: -1 error; >0 count of destination array
        !           166:  */
        !           167: int array_Copy(array_t ** __restrict dest, array_t * __restrict src);
        !           168: 
        !           169: /*
        !           170:  * array_Elem() - Always GET/PUT element into dynamic array, if not enough elements grow array
        !           171:  *
        !           172:  * @arr = Array
        !           173:  * @n = Position
        !           174:  * @data = Element, if set NULL GET element at position or !=NULL PUT element at position
        !           175:  * return: -1 error or !=-1 return element at position
        !           176:  */
        !           177: inline void *array_Elem(array_t * __restrict arr, int n, void *data);
        !           178: /*
        !           179:  * array_Push() - Push element into dynamic array like stack manner, place at first empty position
        !           180:  *
        !           181:  * @arr = Array
        !           182:  * @data = Element, if set NULL return only first empty position
        !           183:  * @nogrow = Don't grow array if not enough space
        !           184:  * return: -1 not found empty position, array is full!, >-1 return position of stored element into array
        !           185:  */
        !           186: inline int array_Push(array_t * __restrict arr, void **data, int nogrow);
        !           187: /*
        !           188:  * array_Pop() - Pop element from dynamic array like stack manner, last used position
        !           189:  *
        !           190:  * @arr = Array
        !           191:  * @data = Element, if set NULL return only last used position
        !           192:  * @nodel = Don't delete after Pop element
        !           193:  * return: -1 not found used position, array is empty!, >-1 return element position
        !           194:  */
        !           195: inline int array_Pop(array_t * __restrict arr, void ** __restrict data, int nodel);
        !           196: 
        !           197: 
        !           198: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>