--- libaitio/src/Attic/vars.c 2012/08/28 08:53:32 1.12.4.1 +++ libaitio/src/Attic/vars.c 2012/08/29 13:51:30 1.13 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: vars.c,v 1.12.4.1 2012/08/28 08:53:32 misho Exp $ +* $Id: vars.c,v 1.13 2012/08/29 13:51:30 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -655,13 +655,14 @@ io_findKeyVars(array_t * __restrict vars, u_short key) } /* - * io_hashVar() - Generate hash key for variable + * io_hashVar() - Generate hash key for variable from string or value * * @v = variable + * @key = key string for hash, if =NULL hash will built from variable * return: hash key */ u_short -io_hashVar(ait_val_t * __restrict v) +io_hashVar(ait_val_t * __restrict v, const char * __restrict key) { void *p; u_short cksum; @@ -670,24 +671,30 @@ io_hashVar(ait_val_t * __restrict v) if (!v) return 0; - switch (AIT_TYPE(v)) { - case empty: - AIT_KEY(v) = 0; - return 0; - case string: - case buffer: - p = AIT_ADDR(v); - l = AIT_LEN(v) / 2; - break; - case data: - p = v->val_data; - l = AIT_LEN(v) / 2; - break; - default: - p = &AIT_RAW(v); - l = sizeof AIT_RAW(v) / 2; - break; + if (key) { + p = (void*) key; + l = (strlen(key) + 1) / 2; + } else { + switch (AIT_TYPE(v)) { + case empty: + AIT_KEY(v) = 0; + return 0; + case string: + case buffer: + p = AIT_ADDR(v); + l = AIT_LEN(v) / 2; + break; + case data: + p = v->val_data; + l = AIT_LEN(v) / 2; + break; + default: + p = &AIT_RAW(v); + l = sizeof AIT_RAW(v) / 2; + break; + } } + cksum = crcFletcher16((u_short*) p, l); if (AIT_BE(v)) @@ -715,7 +722,27 @@ io_hashKeyVars(array_t * __restrict vars) return -1; for (i = 0; i < io_arraySize(vars); i++) - io_hashVar(io_array(vars, i, ait_val_t*)); + io_hashVar(io_array(vars, i, ait_val_t*), NULL); return 0; } + +/* + * io_findKeyHash() - Find variable by hash string from array + * + * @vars = Variables + * @key = Search string + * return: NULL error or not found, !=NULL valid element + */ +inline ait_val_t * +io_findKeyHash(array_t * __restrict vars, const char * __restrict key) +{ + u_short k = 0; + + if (!vars || !key) + return NULL; + + k = crcFletcher16((u_short*) key, (strlen(key) + 1) / 2); + return io_findKeyVars(vars, k); +} +