|
version 1.4.4.1, 2012/03/27 20:53:37
|
version 1.7.2.4, 2012/05/18 13:37:48
|
|
Line 47 SUCH DAMAGE.
|
Line 47 SUCH DAMAGE.
|
| |
|
| |
|
| /* |
/* |
| * io_vars2buffer() Marshaling data from array with variables to buffer | * io_vars2buffer() - Marshaling data from array with variables to buffer |
| | * |
| * @buf = Buffer |
* @buf = Buffer |
| * @buflen = Size of buffer |
* @buflen = Size of buffer |
| * @vars = Variable array |
* @vars = Variable array |
|
Line 59 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
Line 60 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
| int Limit = 0; |
int Limit = 0; |
| register int i; |
register int i; |
| ait_val_t *v, *val; |
ait_val_t *v, *val; |
| u_char *data; | u_char *dat; |
| |
|
| assert(buf); |
assert(buf); |
| assert(vars); |
assert(vars); |
|
Line 70 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
Line 71 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
| |
|
| Limit = sizeof(ait_val_t) * io_arraySize(vars); |
Limit = sizeof(ait_val_t) * io_arraySize(vars); |
| if (Limit > buflen) { |
if (Limit > buflen) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d needed min %d ...\n", | io_SetErr(EMSGSIZE, "Short buffer buflen=%d needed min %d", |
| buflen, Limit); |
buflen, Limit); |
| return -1; |
return -1; |
| } else { |
} else { |
| memset(buf, 0, buflen); |
memset(buf, 0, buflen); |
| |
|
| v = (ait_val_t*) buf; |
v = (ait_val_t*) buf; |
| data = buf + Limit; | dat = buf + Limit; |
| } |
} |
| |
|
| /* marshaling */ |
/* marshaling */ |
|
Line 85 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
Line 86 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
| val = io_array(vars, i, ait_val_t*); |
val = io_array(vars, i, ait_val_t*); |
| |
|
| v[i].val_type = val->val_type; |
v[i].val_type = val->val_type; |
| |
AIT_KEY(&v[i]) = htobe16(AIT_KEY(val)); |
| AIT_LEN(&v[i]) = htobe32(AIT_LEN(val)); |
AIT_LEN(&v[i]) = htobe32(AIT_LEN(val)); |
| |
|
| switch (AIT_TYPE(val)) { |
switch (AIT_TYPE(val)) { |
|
Line 101 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
Line 103 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
| case u64: |
case u64: |
| v[i].val.net = htobe64(val->val.net); |
v[i].val.net = htobe64(val->val.net); |
| break; |
break; |
| |
case data: |
| |
if (AIT_LEN(val) > buflen - Limit) { |
| |
io_SetErr(EMSGSIZE, "Short buffer buflen=%d " |
| |
"needed min %d", buflen, Limit + AIT_LEN(val)); |
| |
return -1; |
| |
} else |
| |
Limit += AIT_LEN(val); |
| |
|
| |
memcpy(dat, val->val_data, AIT_LEN(val)); |
| |
/* Debug:: data offset in packet, not matter for anything! */ |
| |
v[i].val.net = dat - buf; |
| |
dat += AIT_LEN(val); |
| |
break; |
| case buffer: |
case buffer: |
| case string: |
case string: |
| if (AIT_LEN(val) > buflen - Limit) { |
if (AIT_LEN(val) > buflen - Limit) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d " | io_SetErr(EMSGSIZE, "Short buffer buflen=%d " |
| "needed min %d ...\n", buflen, Limit + AIT_LEN(val)); | "needed min %d", buflen, Limit + AIT_LEN(val)); |
| return -1; |
return -1; |
| } else |
} else |
| Limit += AIT_LEN(val); |
Limit += AIT_LEN(val); |
| |
|
| memcpy(data, val->val.buffer, AIT_LEN(val)); | memcpy(dat, val->val.buffer, AIT_LEN(val)); |
| /* Debug:: data offset in packet, not matter for anything! */ |
/* Debug:: data offset in packet, not matter for anything! */ |
| v[i].val.net = data - buf; | v[i].val.net = dat - buf; |
| data += AIT_LEN(val); | dat += AIT_LEN(val); |
| break; |
break; |
| default: |
default: |
| io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", | io_SetErr(EINVAL, "Unsupported variable type=%d at element #%d", |
| AIT_TYPE(val), i); |
AIT_TYPE(val), i); |
| return -1; |
return -1; |
| } |
} |
|
Line 126 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
Line 141 io_vars2buffer(u_char *buf, int buflen, array_t *vars)
|
| } |
} |
| |
|
| /* |
/* |
| * io_buffer2vars() De-marshaling data from buffer to array with variables | * io_buffer2vars() - De-marshaling data from buffer to array with variables |
| | * |
| * @buf = Buffer |
* @buf = Buffer |
| * @buflen = Size of buffer |
* @buflen = Size of buffer |
| * @vnum = Number of variables into buffer |
* @vnum = Number of variables into buffer |
|
Line 141 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
Line 157 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
| int Limit = 0; |
int Limit = 0; |
| register int i; |
register int i; |
| ait_val_t *v, *val; |
ait_val_t *v, *val; |
| u_char *data; | u_char *dat; |
| |
|
| assert(buf); |
assert(buf); |
| if (!buf || !buflen || !vnum) |
if (!buf || !buflen || !vnum) |
|
Line 149 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
Line 165 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
| |
|
| Limit = sizeof(ait_val_t) * vnum; |
Limit = sizeof(ait_val_t) * vnum; |
| if (Limit > buflen) { |
if (Limit > buflen) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d needed min %d ...\n", | io_SetErr(EMSGSIZE, "Short buffer buflen=%d needed min %d", |
| buflen, Limit); |
buflen, Limit); |
| return NULL; |
return NULL; |
| } else { |
} else { |
|
Line 157 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
Line 173 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
| return NULL; |
return NULL; |
| |
|
| v = (ait_val_t*) buf; |
v = (ait_val_t*) buf; |
| data = buf + Limit; | dat = buf + Limit; |
| } |
} |
| |
|
| /* de-marshaling */ |
/* de-marshaling */ |
|
Line 177 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
Line 193 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
| val->val_type = v[i].val_type; |
val->val_type = v[i].val_type; |
| #if defined(__OpenBSD__) |
#if defined(__OpenBSD__) |
| AIT_LEN(val) = betoh32(AIT_LEN(&v[i])); |
AIT_LEN(val) = betoh32(AIT_LEN(&v[i])); |
| |
AIT_KEY(val) = betoh16(AIT_KEY(&v[i])); |
| #else |
#else |
| AIT_LEN(val) = be32toh(AIT_LEN(&v[i])); |
AIT_LEN(val) = be32toh(AIT_LEN(&v[i])); |
| |
AIT_KEY(val) = be16toh(AIT_KEY(&v[i])); |
| #endif |
#endif |
| |
|
| switch (AIT_TYPE(val)) { |
switch (AIT_TYPE(val)) { |
|
Line 199 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
Line 217 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
| val->val.net = be64toh(v[i].val.net); |
val->val.net = be64toh(v[i].val.net); |
| #endif |
#endif |
| break; |
break; |
| |
case data: |
| |
/* WARNING:: remap data type to buffer */ |
| |
val->val_type = buffer; |
| case buffer: |
case buffer: |
| case string: |
case string: |
| if (AIT_LEN(val) > buflen - Limit) { |
if (AIT_LEN(val) > buflen - Limit) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d " | io_SetErr(EMSGSIZE, "Short buffer buflen=%d " |
| "needed min %d ...\n", buflen, Limit + AIT_LEN(val)); | "needed min %d", buflen, Limit + AIT_LEN(val)); |
| if (!zcpy) |
if (!zcpy) |
| io_arrayFree(vars); |
io_arrayFree(vars); |
| io_arrayDestroy(&vars); |
io_arrayDestroy(&vars); |
|
Line 219 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
Line 240 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
| io_arrayDestroy(&vars); |
io_arrayDestroy(&vars); |
| return NULL; |
return NULL; |
| } else |
} else |
| memcpy(val->val.buffer, data, AIT_LEN(val)); | memcpy(val->val.buffer, dat, AIT_LEN(val)); |
| } else |
} else |
| val->val.buffer = data; | val->val.buffer = dat; |
| data += AIT_LEN(val); | dat += AIT_LEN(val); |
| break; |
break; |
| default: |
default: |
| io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", | io_SetErr(EINVAL, "Unsupported variable type=%d at element #%d", |
| AIT_TYPE(val), i); |
AIT_TYPE(val), i); |
| if (!zcpy) |
if (!zcpy) |
| io_arrayFree(vars); |
io_arrayFree(vars); |
|
Line 240 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
Line 261 io_buffer2vars(u_char *buf, int buflen, int vnum, int
|
| /* buffer marshaling without swapping bytes to network order */ |
/* buffer marshaling without swapping bytes to network order */ |
| |
|
| /* |
/* |
| * io_vars2map() Marshaling data from array with variables to memory map | * io_vars2map() - Marshaling data from array with variables to memory map |
| | * |
| * @buf = Buffer |
* @buf = Buffer |
| * @buflen = Size of buffer |
* @buflen = Size of buffer |
| * @vars = Variable array |
* @vars = Variable array |
|
Line 252 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
Line 274 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
| int Limit = 0; |
int Limit = 0; |
| register int i; |
register int i; |
| ait_val_t *v, *val; |
ait_val_t *v, *val; |
| u_char *data; | u_char *dat; |
| |
|
| assert(buf); |
assert(buf); |
| assert(vars); |
assert(vars); |
|
Line 263 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
Line 285 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
| |
|
| Limit = sizeof(ait_val_t) * io_arraySize(vars); |
Limit = sizeof(ait_val_t) * io_arraySize(vars); |
| if (Limit > buflen) { |
if (Limit > buflen) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d needed min %d ...\n", | io_SetErr(EMSGSIZE, "Short buffer buflen=%d needed min %d", |
| buflen, Limit); |
buflen, Limit); |
| return -1; |
return -1; |
| } else { |
} else { |
| memset(buf, 0, buflen); |
memset(buf, 0, buflen); |
| |
|
| v = (ait_val_t*) buf; |
v = (ait_val_t*) buf; |
| data = buf + Limit; | dat = buf + Limit; |
| } |
} |
| |
|
| /* marshaling */ |
/* marshaling */ |
|
Line 278 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
Line 300 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
| val = io_array(vars, i, ait_val_t*); |
val = io_array(vars, i, ait_val_t*); |
| |
|
| v[i].val_type = val->val_type; |
v[i].val_type = val->val_type; |
| |
AIT_KEY(&v[i]) = AIT_KEY(val); |
| AIT_LEN(&v[i]) = AIT_LEN(val); |
AIT_LEN(&v[i]) = AIT_LEN(val); |
| |
|
| switch (AIT_TYPE(val)) { |
switch (AIT_TYPE(val)) { |
|
Line 294 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
Line 317 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
| case u64: |
case u64: |
| v[i].val.net = val->val.net; |
v[i].val.net = val->val.net; |
| break; |
break; |
| |
case data: |
| |
if (AIT_LEN(val) > buflen - Limit) { |
| |
io_SetErr(EMSGSIZE, "Short buffer buflen=%d " |
| |
"needed min %d", buflen, Limit + AIT_LEN(val)); |
| |
return -1; |
| |
} else |
| |
Limit += AIT_LEN(val); |
| |
|
| |
memcpy(dat, val->val_data, AIT_LEN(val)); |
| |
/* Debug:: data offset in packet, not matter for anything! */ |
| |
v[i].val.net = dat - buf; |
| |
dat += AIT_LEN(val); |
| |
break; |
| case buffer: |
case buffer: |
| case string: |
case string: |
| if (AIT_LEN(val) > buflen - Limit) { |
if (AIT_LEN(val) > buflen - Limit) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d " | io_SetErr(EMSGSIZE, "Short buffer buflen=%d " |
| "needed min %d ...\n", buflen, Limit + AIT_LEN(val)); | "needed min %d", buflen, Limit + AIT_LEN(val)); |
| return -1; |
return -1; |
| } else |
} else |
| Limit += AIT_LEN(val); |
Limit += AIT_LEN(val); |
| |
|
| memcpy(data, val->val.buffer, AIT_LEN(val)); | memcpy(dat, val->val.buffer, AIT_LEN(val)); |
| /* Debug:: data offset in packet, not matter for anything! */ |
/* Debug:: data offset in packet, not matter for anything! */ |
| v[i].val.net = data - buf; | v[i].val.net = dat - buf; |
| data += AIT_LEN(val); | dat += AIT_LEN(val); |
| break; |
break; |
| default: |
default: |
| io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", | io_SetErr(EINVAL, "Unsupported variable type=%d at element #%d", |
| AIT_TYPE(val), i); |
AIT_TYPE(val), i); |
| return -1; |
return -1; |
| } |
} |
|
Line 319 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
Line 355 io_vars2map(u_char *buf, int buflen, array_t *vars)
|
| } |
} |
| |
|
| /* |
/* |
| * io_map2vars() De-marshaling data from memory map to array with variables | * io_map2vars() - De-marshaling data from memory map to array with variables |
| | * |
| * @buf = Buffer |
* @buf = Buffer |
| * @buflen = Size of buffer |
* @buflen = Size of buffer |
| * @vnum = Number of variables into buffer |
* @vnum = Number of variables into buffer |
|
Line 334 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
Line 371 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
| int Limit = 0; |
int Limit = 0; |
| register int i; |
register int i; |
| ait_val_t *v, *val; |
ait_val_t *v, *val; |
| u_char *data; | u_char *dat; |
| |
|
| assert(buf); |
assert(buf); |
| if (!buf || !buflen || !vnum) |
if (!buf || !buflen || !vnum) |
|
Line 342 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
Line 379 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
| |
|
| Limit = sizeof(ait_val_t) * vnum; |
Limit = sizeof(ait_val_t) * vnum; |
| if (Limit > buflen) { |
if (Limit > buflen) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d needed min %d ...\n", | io_SetErr(EMSGSIZE, "Short buffer buflen=%d needed min %d", |
| buflen, Limit); |
buflen, Limit); |
| return NULL; |
return NULL; |
| } else { |
} else { |
|
Line 350 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
Line 387 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
| return NULL; |
return NULL; |
| |
|
| v = (ait_val_t*) buf; |
v = (ait_val_t*) buf; |
| data = buf + Limit; | dat = buf + Limit; |
| } |
} |
| |
|
| /* de-marshaling */ |
/* de-marshaling */ |
|
Line 368 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
Line 405 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
| io_arraySet(vars, i, val); |
io_arraySet(vars, i, val); |
| |
|
| val->val_type = v[i].val_type; |
val->val_type = v[i].val_type; |
| |
AIT_KEY(val) = AIT_KEY(&v[i]); |
| AIT_LEN(val) = AIT_LEN(&v[i]); |
AIT_LEN(val) = AIT_LEN(&v[i]); |
| |
|
| switch (AIT_TYPE(val)) { |
switch (AIT_TYPE(val)) { |
|
Line 384 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
Line 422 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
| case u64: |
case u64: |
| val->val.net = v[i].val.net; |
val->val.net = v[i].val.net; |
| break; |
break; |
| |
case data: |
| |
/* WARNING:: remap data type to buffer */ |
| |
val->val_type = buffer; |
| case buffer: |
case buffer: |
| case string: |
case string: |
| if (AIT_LEN(val) > buflen - Limit) { |
if (AIT_LEN(val) > buflen - Limit) { |
| io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d " | io_SetErr(EMSGSIZE, "short buffer buflen=%d " |
| "needed min %d ...\n", buflen, Limit + AIT_LEN(val)); | "needed min %d", buflen, Limit + AIT_LEN(val)); |
| if (!zcpy) |
if (!zcpy) |
| io_arrayFree(vars); |
io_arrayFree(vars); |
| io_arrayDestroy(&vars); |
io_arrayDestroy(&vars); |
|
Line 404 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
Line 445 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
| io_arrayDestroy(&vars); |
io_arrayDestroy(&vars); |
| return NULL; |
return NULL; |
| } else |
} else |
| memcpy(val->val.buffer, data, AIT_LEN(val)); | memcpy(val->val.buffer, dat, AIT_LEN(val)); |
| } else |
} else |
| val->val.buffer = data; | val->val.buffer = dat; |
| data += AIT_LEN(val); | dat += AIT_LEN(val); |
| break; |
break; |
| default: |
default: |
| io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", | io_SetErr(EINVAL, "Unsupported variable type=%d at element #%d", |
| AIT_TYPE(val), i); |
AIT_TYPE(val), i); |
| if (!zcpy) |
if (!zcpy) |
| io_arrayFree(vars); |
io_arrayFree(vars); |
|
Line 424 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
Line 465 io_map2vars(u_char *buf, int buflen, int vnum, int zcp
|
| |
|
| |
|
| /* |
/* |
| * io_allocVars() Allocate ait_val_t array | * io_allocVars() - Allocate ait_val_t array |
| | * |
| * @varnum = Number of variables |
* @varnum = Number of variables |
| * return: =NULL error or !=NULL allocated array |
* return: =NULL error or !=NULL allocated array |
| */ |
*/ |
|
Line 435 io_allocVars(int varnum)
|
Line 477 io_allocVars(int varnum)
|
| register int i; |
register int i; |
| ait_val_t *v; |
ait_val_t *v; |
| |
|
| if (!varnum || !(arr = io_arrayInit(varnum))) | if (!(arr = io_arrayInit(varnum))) |
| return NULL; |
return NULL; |
| |
|
| for (i = 0; i < io_arraySize(arr); i++) { |
for (i = 0; i < io_arraySize(arr); i++) { |
| v = malloc(sizeof(ait_val_t)); | if (!(v = io_allocVar())) { |
| if (!v) { | |
| LOGERR; | |
| io_freeVars(&arr); |
io_freeVars(&arr); |
| return NULL; |
return NULL; |
| } else { | } else |
| memset(v, 0, sizeof(ait_val_t)); | |
| io_arraySet(arr, i, v); |
io_arraySet(arr, i, v); |
| } |
|
| } |
} |
| |
|
| return arr; |
return arr; |
| } |
} |
| |
|
| /* |
/* |
| * io_clrVars() Clear ait_val_t elements from array | * io_getVars() - Get ait_val_t element from array and if not exists allocate it |
| | * |
| * @vars = Variable array |
* @vars = Variable array |
| |
* @n = index of variable into array |
| |
* return: NULL error or !=NULL ait_val_t element |
| |
*/ |
| |
inline ait_val_t * |
| |
io_getVars(array_t ** __restrict vars, int n) |
| |
{ |
| |
ait_val_t *v; |
| |
|
| |
if (!vars) |
| |
return NULL; |
| |
|
| |
if (!*vars) { |
| |
if (!(*vars = io_arrayInit(n + 1))) |
| |
return NULL; |
| |
} else { |
| |
if (n >= io_arraySize(*vars)) { |
| |
if (io_arrayGrow(*vars, n + 1, 0)) |
| |
return NULL; |
| |
if ((v = io_allocVar())) |
| |
return NULL; |
| |
else |
| |
io_arraySet(*vars, n, v); |
| |
return v; |
| |
} |
| |
} |
| |
|
| |
return io_array(*vars, n, ait_val_t*); |
| |
} |
| |
|
| |
/* |
| |
* io_clrVars() - Clear ait_val_t elements from array |
| |
* |
| |
* @vars = Variable array |
| * return: -1 error or size of array |
* return: -1 error or size of array |
| */ |
*/ |
| inline int |
inline int |
| io_clrVars(array_t * __restrict vars) |
io_clrVars(array_t * __restrict vars) |
| { |
{ |
| register int i; |
register int i; |
| |
ait_val_t *v; |
| |
|
| if (!vars) |
if (!vars) |
| return -1; |
return -1; |
| |
|
| for (i = 0; i < io_arraySize(vars); i++) |
for (i = 0; i < io_arraySize(vars); i++) |
| if (io_arrayGet(vars, i)) | if ((v = io_array(vars, i, ait_val_t*))) |
| AIT_FREE_VAL(io_array(vars, i, ait_val_t*)); | AIT_FREE_VAL(v); |
| |
|
| return io_arraySize(vars); |
return io_arraySize(vars); |
| } |
} |
| |
|
| /* |
/* |
| * io_freeVars() Free ait_val_t array | * io_freeVars() - Free ait_val_t array |
| | * |
| * @vars = Variable array |
* @vars = Variable array |
| * return: none |
* return: none |
| */ |
*/ |
|
Line 490 io_freeVars(array_t ** __restrict vars)
|
Line 564 io_freeVars(array_t ** __restrict vars)
|
| } |
} |
| |
|
| /* |
/* |
| * io_allocVar() Allocate memory for variable | * io_allocVar() - Allocate memory for variable |
| | * |
| * return: NULL error or new variable, after use free variable with io_freeVar() |
* return: NULL error or new variable, after use free variable with io_freeVar() |
| */ |
*/ |
| inline ait_val_t * |
inline ait_val_t * |
|
Line 510 io_allocVar(void)
|
Line 585 io_allocVar(void)
|
| } |
} |
| |
|
| /* |
/* |
| * io_freeVar() Free allocated memory for variable | * io_freeVar() - Free allocated memory for variable |
| | * |
| * @val = Variable |
* @val = Variable |
| * return: none |
* return: none |
| */ |
*/ |
| inline void |
inline void |
| io_freeVar(ait_val_t * __restrict val) | io_freeVar(ait_val_t ** __restrict val) |
| { |
{ |
| if (val) { | if (val && *val) { |
| AIT_FREE_VAL(val); | AIT_FREE_VAL(*val); |
| free(val); | free(*val); |
| val = NULL; | *val = NULL; |
| } |
} |
| |
} |
| |
|
| |
static int |
| |
_cmp_arr_key_asc(const void *a, const void *b) |
| |
{ |
| |
return AIT_KEY(*(ait_val_t**) a) - AIT_KEY(*(ait_val_t**) b); |
| |
} |
| |
|
| |
static int |
| |
_cmp_arr_key_desc(const void *a, const void *b) |
| |
{ |
| |
return AIT_KEY(*(ait_val_t**) b) - AIT_KEY(*(ait_val_t**) a); |
| |
} |
| |
|
| |
/* |
| |
* io_sortVars() - Sorting array with variables |
| |
* |
| |
* @vars = Variable array |
| |
* @order = Sort order. If =0 ascend or !=0 descend |
| |
* @cmp = Compare function for sorting. If =NULL compare by key |
| |
* return: none |
| |
*/ |
| |
inline void |
| |
io_sortVars(array_t * __restrict vars, int order, int (*cmp)(const void*, const void*)) |
| |
{ |
| |
if (!vars) |
| |
return; |
| |
|
| |
if (cmp) |
| |
qsort(vars->arr_data, vars->arr_num, sizeof(void*), cmp); |
| |
else if (order) |
| |
qsort(vars->arr_data, vars->arr_num, sizeof(void*), _cmp_arr_key_desc); |
| |
else |
| |
qsort(vars->arr_data, vars->arr_num, sizeof(void*), _cmp_arr_key_asc); |
| |
} |
| |
|
| |
/* |
| |
* io_findKeyVars() - Find variable by key from array |
| |
* |
| |
* @vars = Variables |
| |
* @key = Search key |
| |
* return: NULL error or not found, !=NULL valid element |
| |
*/ |
| |
ait_val_t * |
| |
io_findKeyVars(array_t * __restrict vars, u_short key) |
| |
{ |
| |
array_t *tmp; |
| |
ait_val_t **vv, *v = NULL; |
| |
register int i; |
| |
const u_char *p; |
| |
|
| |
if (!vars) |
| |
return NULL; |
| |
|
| |
if (io_arrayCopy(&tmp, vars) == -1) |
| |
return NULL; |
| |
else |
| |
qsort(tmp->arr_data, tmp->arr_num, sizeof(void*), _cmp_arr_key_asc); |
| |
|
| |
/* binary search */ |
| |
for (p = (const u_char*) tmp->arr_data, i = io_arraySize(tmp); i; i >>= 1) { |
| |
vv = (ait_val_t**) (p + (i >> 1) * sizeof(void*)); |
| |
if (!(key - AIT_KEY(*vv))) { /* found! */ |
| |
v = *vv; |
| |
break; |
| |
} |
| |
if ((key - AIT_KEY(*vv)) > 0) { /* move right key > current */ |
| |
p = (const u_char*) vv + sizeof(void*); |
| |
i--; |
| |
} /* else move left */ |
| |
} |
| |
|
| |
io_arrayDestroy(&tmp); |
| |
return v; |
| } |
} |