blob: e38a57fa6be0c565d5dc57cfa86941b254a04b3b [file]
/*
* Copyright 2016, NICTA
*
* This software may be distributed and modified according to the terms of
* the GNU General Public License version 2. Note that NO WARRANTY is provided.
* See "LICENSE_GPLv2.txt" for details.
*
* @TAG(NICTA_GPL)
*/
$ty:(R (SysState, WordArray a) SysState) $id:wordarray_create($ty:((SysState, U32)) args) {
$ty:(SysState) ex = args.p1;
u32 size = args.p2;
$ty:(R (SysState, WordArray a) SysState) ret;
$ty:(WordArray a) array = kmalloc(sizeof(*array));
if (array == NULL || !size) {
ret.tag = TAG_ENUM_Error;
ret.Error = ex;
} else {
array->values = kzalloc(size * sizeof (*(array->values)));
if (array->values == NULL) {
kfree(array);
ret.tag = TAG_ENUM_Error;
ret.Error = ex;
} else {
array->len = size;
ret.tag = TAG_ENUM_Success;
ret.Success.p1 = ex;
ret.Success.p2 = array;
}
}
return ret;
}
$ty:(R (SysState, WordArray a) SysState) $id:wordarray_create_nz($ty:((SysState, U32)) args) {
$ty:(SysState) ex = args.p1;
u32 size = args.p2;
$ty:(R (SysState, WordArray a) SysState) ret;
$ty:(WordArray a) array = kmalloc(sizeof(*array));
if (array == NULL || !size) {
ret.tag = TAG_ENUM_Error;
ret.Error = ex;
} else {
array->values = kzalloc(size * sizeof (*(array->values)));
if (array->values == NULL) {
kfree(array);
ret.tag = TAG_ENUM_Error;
ret.Error = ex;
} else {
array->len = size;
ret.tag = TAG_ENUM_Success;
ret.Success.p1 = ex;
ret.Success.p2 = array;
}
}
return ret;
}
$ty:(SysState) $id:wordarray_free($ty:((SysState, WordArray a)) args)
{
$ty:(WordArray a) array = args.p2;
if (array->values)
kfree(array->values);
kfree(array);
return args.p1;
}