--- libaitio/inc/aitio.h 2012/07/03 08:51:05 1.20 +++ libaitio/inc/aitio.h 2012/07/22 20:39:45 1.21 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aitio.h,v 1.20 2012/07/03 08:51:05 misho Exp $ +* $Id: aitio.h,v 1.21 2012/07/22 20:39:45 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -62,6 +62,29 @@ SUCH DAMAGE. #include +#ifndef STRSIZ +#define STRSIZ 256 +#endif + +#ifndef be16toh +#define be16toh betoh16 +#endif +#ifndef be32toh +#define be32toh betoh32 +#endif +#ifndef be64toh +#define be64toh betoh64 +#endif +#ifndef le16toh +#define le16toh letoh16 +#endif +#ifndef le32toh +#define le32toh letoh32 +#endif +#ifndef le64toh +#define le64toh letoh64 +#endif + #define IO_SYSM 0 #define IO_MPOOL 1 @@ -96,7 +119,15 @@ typedef enum { typedef struct { uint8_t val_type; - uint8_t val_pad; + union { + struct { + uint8_t val_in:1; + uint8_t val_be:1; + uint8_t val_le:1; + uint8_t val_pad:5; + }; + uint8_t val_opt; + }; uint16_t val_key; uint32_t val_len; union { @@ -118,13 +149,16 @@ typedef struct { int64_t i64; } val; uint8_t val_data[0]; -} __packed ait_val_t; +} __packed ait_val_t; /* sizeof 16 bytes */ #define AIT_TYPE(_vl) ((ait_type_t) (_vl)->val_type) #define AIT_LEN(_vl) (_vl)->val_len #define AIT_KEY(_vl) (_vl)->val_key #define AIT_RAW(_vl) (_vl)->val.net #define AIT_ADDR(_vl) (_vl)->val.ptr +#define AIT_IN(_vl) (_vl)->val_in +#define AIT_BE(_vl) (_vl)->val_be +#define AIT_LE(_vl) (_vl)->val_le #define AIT_BLOB_CHUNKS(_vl, _n) (AIT_LEN((_vl)) / _n + (AIT_LEN((_vl)) % _n) ? 1 : 0) #define AIT_ISEMPTY(_vl) (AIT_TYPE((_vl)) == empty) @@ -255,22 +289,24 @@ typedef struct { #define AIT_FREE_VAL(_vl) do { ait_val_t *__val = (_vl); assert(__val); \ switch (AIT_TYPE(__val)) { \ case buffer: \ - if (__val->val.buffer) { \ + if (!__val->val_in && \ + __val->val.buffer) \ io_free(__val->val.buffer); \ - __val->val.buffer = NULL; \ - } \ + __val->val.buffer = NULL; \ break; \ case string: \ - if (__val->val.string) { \ + if (!__val->val_in && \ + __val->val.string) \ io_free(__val->val.string); \ - __val->val.string = NULL; \ - } \ + __val->val.string = NULL; \ break; \ default: \ break; \ } \ __val->val_type = empty; \ + __val->val_opt ^= __val->val_opt; \ AIT_LEN(__val) = 0; \ + AIT_KEY(__val) = 0; \ } while (0) struct io_ether_addr { @@ -286,6 +322,7 @@ typedef union { struct sockaddr_in6 sin6; struct sockaddr_dl sdl; } io_sockaddr_t; +#define IO_SOCKADDR_INIT { .ss = { 0 } } #define io_align(x, a) (((x) + (a)) & ~(a)) @@ -374,7 +411,8 @@ io_sockaddr_t *io_gethostbyname(const char *psHost, un * @vars = Variable array * return: -1 error, 0 nothing done or >0 size of marshaled data */ -int io_vars2buffer(unsigned char *buf, int buflen, array_t *vars); +inline int io_vars2buffer(unsigned char * __restrict buf, int buflen, + array_t * __restrict vars); /* * io_buffer2vars() - De-marshaling data from buffer to array with variables * @@ -385,7 +423,7 @@ int io_vars2buffer(unsigned char *buf, int buflen, arr *DON'T MODIFY OR DESTROY BUFFER*. =0 call io_arrayFree() before io_arrayDestroy() * return: =NULL error, !=NULL allocated variable array, after use must free with io_arrayDestroy() */ -array_t *io_buffer2vars(unsigned char *buf, int buflen, int vnum, int zcpy); +inline array_t *io_buffer2vars(unsigned char * __restrict buf, int buflen, int vnum, int zcpy); /* * io_vars2map() - Marshaling data from array with variables to memory map * @@ -394,7 +432,8 @@ array_t *io_buffer2vars(unsigned char *buf, int buflen * @vars = Variable array * return: -1 error, 0 nothing done or >0 size of marshaled data */ -int io_vars2map(unsigned char *buf, int buflen, array_t *vars); +inline int io_vars2map(unsigned char * __restrict buf, int buflen, + array_t * __restrict vars); /* * io_map2vars() - De-marshaling data from memory map to array with variables * @@ -405,7 +444,7 @@ int io_vars2map(unsigned char *buf, int buflen, array_ *DON'T MODIFY OR DESTROY BUFFER*. =0 call io_arrayFree() before io_arrayDestroy() * return: =NULL error, !=NULL allocated variable array, after use must free with io_arrayDestroy() */ -array_t *io_map2vars(unsigned char *buf, int buflen, int vnum, int zcpy); +inline array_t *io_map2vars(unsigned char * __restrict buf, int buflen, int vnum, int zcpy); /* * io_allocVar() - Allocate memory for variable @@ -450,14 +489,22 @@ inline void io_freeVars(array_t ** __restrict vars); */ inline ait_val_t *io_getVars(array_t ** __restrict vars, int n); /* - * io_sortVars() - Sorting array with variables + * io_sortVarsByKey() - Sorting array with variables by key * * @vars = Variable array - * @order = Sort order. If =0 ascend ot !=0 descend - * @cmp = Compare function for sorting. If =NULL compare by key + * @order = Sort order. If =0 ascend or !=0 descend * return: none */ -inline void io_sortVars(array_t * __restrict vars, int order, +inline void io_sortVarsByKey(array_t * __restrict vars, int order); +/* + * io_sortVarsByVal() - Sorting array with variables by value + * + * @vars = Variable array + * @order = Sort order. If =0 ascend or !=0 descend + * @cmp = Custom compare function for sorting. If =NULL compare by value + * return: none + */ +inline void io_sortVarsByVal(array_t * __restrict vars, int order, int (*cmp)(const void*, const void*)); /* * io_findKeyVars() - Find variable by key from array