added hawk_arr_itr_t, hawk_val_arr_itr_t and functions for them
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
14
hawk.go
14
hawk.go
@ -647,6 +647,20 @@ func (val *Val) ArrayField(index int) (*Val, error) {
|
|||||||
return val.rtx.make_val(func() *C.hawk_val_t { return v })
|
return val.rtx.make_val(func() *C.hawk_val_t { return v })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func (val *Val) ArrayFirstField() *Val {
|
||||||
|
var v *C.hawk_val_t
|
||||||
|
var itr C.hawk_val_arr_itr_t
|
||||||
|
v = C.hawk_rtx_getfirstarrvalitr(val.rtx.c, val.c, &itr)
|
||||||
|
if v == nil { return nil, val.rtx.make_errinfo() }
|
||||||
|
return val.rtx.make_val(func() *C.hawk_val_t { return v })
|
||||||
|
}
|
||||||
|
|
||||||
|
func (val *Val) ArrayNextField(itr ValArrItr) *Val {
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
func (val *Val) MapField(key string) (*Val, error) {
|
func (val *Val) MapField(key string) (*Val, error) {
|
||||||
var v *C.hawk_val_t
|
var v *C.hawk_val_t
|
||||||
var uc []C.hawk_uch_t
|
var uc []C.hawk_uch_t
|
||||||
|
|||||||
@ -193,11 +193,17 @@ return x;
|
|||||||
if f.Type() != hawk.VAL_STR {
|
if f.Type() != hawk.VAL_STR {
|
||||||
t.Errorf("the value at the hello field must be a string. but it was %s", f.Type().String())
|
t.Errorf("the value at the hello field must be a string. but it was %s", f.Type().String())
|
||||||
} else {
|
} else {
|
||||||
|
var i int
|
||||||
var sv string
|
var sv string
|
||||||
|
|
||||||
sv = hawk.Must(f.ToStr())
|
sv = hawk.Must(f.ToStr())
|
||||||
if sv != "hawk flieshawk flies" {
|
if sv != "hawk flieshawk flies" {
|
||||||
t.Errorf("the value for the hello field must be 'hawk flieshawk flies'. but it was %s", sv)
|
t.Errorf("the value for the hello field must be 'hawk flieshawk flies'. but it was %s", sv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for i = 1; i <= sz; i++ {
|
||||||
|
fmt.Printf("%d %v\n", i, hawk.Must(v.ArrayField(i)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
33
lib/arr.c
33
lib/arr.c
@ -33,7 +33,6 @@
|
|||||||
#define keeper_t hawk_arr_keeper_t
|
#define keeper_t hawk_arr_keeper_t
|
||||||
#define walker_t hawk_arr_walker_t
|
#define walker_t hawk_arr_walker_t
|
||||||
|
|
||||||
|
|
||||||
#define TOB(arr,len) ((len)*(arr)->scale)
|
#define TOB(arr,len) ((len)*(arr)->scale)
|
||||||
#define DPTR(slot) ((slot)->val.ptr)
|
#define DPTR(slot) ((slot)->val.ptr)
|
||||||
#define DLEN(slot) ((slot)->val.len)
|
#define DLEN(slot) ((slot)->val.len)
|
||||||
@ -482,6 +481,38 @@ void hawk_arr_clear (hawk_arr_t* arr)
|
|||||||
arr->tally = 0;
|
arr->tally = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hawk_ptl_t* hawk_arr_getfirstelem (hawk_arr_t* arr, hawk_arr_itr_t* itr)
|
||||||
|
{
|
||||||
|
hawk_oow_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < arr->size; i++)
|
||||||
|
{
|
||||||
|
if (arr->slot[i])
|
||||||
|
{
|
||||||
|
itr->idx = i;
|
||||||
|
return &arr->slot[i]->val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return HAWK_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_ptl_t* hawk_arr_getnextelem (hawk_arr_t* arr, hawk_arr_itr_t* itr)
|
||||||
|
{
|
||||||
|
hawk_oow_t i;
|
||||||
|
|
||||||
|
for (i = itr->idx + 1; i < arr->size; i++)
|
||||||
|
{
|
||||||
|
if (arr->slot[i])
|
||||||
|
{
|
||||||
|
itr->idx = i;
|
||||||
|
return &arr->slot[i]->val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return HAWK_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
hawk_oow_t hawk_arr_walk (hawk_arr_t* arr, walker_t walker, void* ctx)
|
hawk_oow_t hawk_arr_walk (hawk_arr_t* arr, walker_t walker, void* ctx)
|
||||||
{
|
{
|
||||||
hawk_arr_walk_t w = HAWK_ARR_WALK_FORWARD;
|
hawk_arr_walk_t w = HAWK_ARR_WALK_FORWARD;
|
||||||
|
|||||||
@ -134,7 +134,6 @@ typedef hawk_oow_t (*hawk_arr_sizer_t) (
|
|||||||
hawk_oow_t hint /**< sizing hint */
|
hawk_oow_t hint /**< sizing hint */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
typedef struct hawk_arr_style_t hawk_arr_style_t;
|
typedef struct hawk_arr_style_t hawk_arr_style_t;
|
||||||
|
|
||||||
struct hawk_arr_style_t
|
struct hawk_arr_style_t
|
||||||
@ -160,6 +159,12 @@ enum hawk_arr_style_kind_t
|
|||||||
|
|
||||||
typedef enum hawk_arr_style_kind_t hawk_arr_style_kind_t;
|
typedef enum hawk_arr_style_kind_t hawk_arr_style_kind_t;
|
||||||
|
|
||||||
|
struct hawk_arr_itr_t
|
||||||
|
{
|
||||||
|
hawk_oow_t idx;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct hawk_arr_itr_t hawk_arr_itr_t;
|
||||||
|
|
||||||
typedef hawk_arr_walk_t (*hawk_arr_walker_t) (
|
typedef hawk_arr_walk_t (*hawk_arr_walker_t) (
|
||||||
hawk_arr_t* arr /* array */,
|
hawk_arr_t* arr /* array */,
|
||||||
@ -346,6 +351,23 @@ HAWK_EXPORT void hawk_arr_clear (
|
|||||||
hawk_arr_t* arr
|
hawk_arr_t* arr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The hawk_arr_getfirstelem() function returns the pointer to the first element holder
|
||||||
|
* in an array.
|
||||||
|
*/
|
||||||
|
HAWK_EXPORT hawk_ptl_t* hawk_arr_getfirstelem (
|
||||||
|
hawk_arr_t* arr, /**< array */
|
||||||
|
hawk_arr_itr_t* itr /**< iterator*/
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The hawk_arr_getnextelem() function returns the pointer to the next element holder.
|
||||||
|
*/
|
||||||
|
HAWK_EXPORT hawk_ptl_t* hawk_arr_getnextelem (
|
||||||
|
hawk_arr_t* arr, /**< array */
|
||||||
|
hawk_arr_itr_t* itr /**< iterator*/
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The hawk_arr_walk() function calls the \a walker function for each
|
* The hawk_arr_walk() function calls the \a walker function for each
|
||||||
* element in the array beginning from the first. The \a walker function
|
* element in the array beginning from the first. The \a walker function
|
||||||
|
|||||||
23
lib/hawk.h
23
lib/hawk.h
@ -371,7 +371,6 @@ typedef hawk_map_itr_t hawk_val_map_itr_t;
|
|||||||
*/
|
*/
|
||||||
#define HAWK_VAL_MAP_ITR_VAL(itr) ((const hawk_val_t*)HAWK_MAP_VPTR((itr)->pair))
|
#define HAWK_VAL_MAP_ITR_VAL(itr) ((const hawk_val_t*)HAWK_MAP_VPTR((itr)->pair))
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The hawk_val_map_data_type_t type defines the type of
|
* The hawk_val_map_data_type_t type defines the type of
|
||||||
* map value data for the #hawk_val_map_data_t structure.
|
* map value data for the #hawk_val_map_data_t structure.
|
||||||
@ -405,6 +404,16 @@ struct hawk_val_map_data_t
|
|||||||
|
|
||||||
typedef struct hawk_val_map_data_t hawk_val_map_data_t;
|
typedef struct hawk_val_map_data_t hawk_val_map_data_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The hawk_val_arr_itr_t type defines the iterator to array value fields.
|
||||||
|
*/
|
||||||
|
typedef struct hawk_val_arr_itr_t hawk_val_arr_itr_t;
|
||||||
|
|
||||||
|
struct hawk_val_arr_itr_t
|
||||||
|
{
|
||||||
|
hawk_arr_itr_t itr;
|
||||||
|
hawk_ptl_t elem;
|
||||||
|
};
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
@ -3378,6 +3387,18 @@ HAWK_EXPORT hawk_ooi_t hawk_rtx_getarrvaltally (
|
|||||||
hawk_val_t* arr
|
hawk_val_t* arr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
HAWK_EXPORT hawk_val_arr_itr_t* hawk_rtx_getfirstarrvalitr (
|
||||||
|
hawk_rtx_t* rtx,
|
||||||
|
hawk_val_t* arr,
|
||||||
|
hawk_val_arr_itr_t* itr
|
||||||
|
);
|
||||||
|
|
||||||
|
HAWK_EXPORT hawk_val_arr_itr_t* hawk_rtx_getnextarrvalitr (
|
||||||
|
hawk_rtx_t* rtx,
|
||||||
|
hawk_val_t* arr,
|
||||||
|
hawk_val_arr_itr_t* itr
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The hawk_rtx_makerefval() function creates a reference value.
|
* The hawk_rtx_makerefval() function creates a reference value.
|
||||||
* \return value on success, #HAWK_NULL on failure
|
* \return value on success, #HAWK_NULL on failure
|
||||||
|
|||||||
@ -361,6 +361,7 @@ static int fnc_array (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
|||||||
tmp = hawk_rtx_makearrval(rtx, ((nargs > 0)? nargs: -1));
|
tmp = hawk_rtx_makearrval(rtx, ((nargs > 0)? nargs: -1));
|
||||||
if (HAWK_UNLIKELY(!tmp)) return -1; /* hard failure */
|
if (HAWK_UNLIKELY(!tmp)) return -1; /* hard failure */
|
||||||
|
|
||||||
|
/* 1-based. leave the first slot unassigned */
|
||||||
for (i = 0; i < nargs; i++)
|
for (i = 0; i < nargs; i++)
|
||||||
{
|
{
|
||||||
if (HAWK_UNLIKELY(hawk_rtx_setarrvalfld(rtx, tmp, i + 1, hawk_rtx_getarg(rtx, i)) == HAWK_NULL))
|
if (HAWK_UNLIKELY(hawk_rtx_setarrvalfld(rtx, tmp, i + 1, hawk_rtx_getarg(rtx, i)) == HAWK_NULL))
|
||||||
|
|||||||
20
lib/val.c
20
lib/val.c
@ -1452,6 +1452,26 @@ hawk_ooi_t hawk_rtx_getarrvaltally (hawk_rtx_t* rtx, hawk_val_t* arr)
|
|||||||
return HAWK_ARR_TALLY(_arr);
|
return HAWK_ARR_TALLY(_arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hawk_val_arr_itr_t* hawk_rtx_getfirstarrvalitr (hawk_rtx_t* rtx, hawk_val_t* arr, hawk_val_arr_itr_t* itr)
|
||||||
|
{
|
||||||
|
hawk_ptl_t* ptl;
|
||||||
|
HAWK_ASSERT(HAWK_RTX_GETVALTYPE(rtx, arr) == HAWK_VAL_ARR);
|
||||||
|
ptl = hawk_arr_getfirstelem(((hawk_val_arr_t*)arr)->arr, &itr->itr);
|
||||||
|
if (!ptl) return HAWK_NULL;
|
||||||
|
itr->elem = *ptl;
|
||||||
|
return itr;
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_val_arr_itr_t* hawk_rtx_getnextarrvalitr (hawk_rtx_t* rtx, hawk_val_t* arr, hawk_val_arr_itr_t* itr)
|
||||||
|
{
|
||||||
|
hawk_ptl_t* ptl;
|
||||||
|
HAWK_ASSERT(HAWK_RTX_GETVALTYPE(rtx, arr) == HAWK_VAL_ARR);
|
||||||
|
ptl = hawk_arr_getnextelem(((hawk_val_arr_t*)arr)->arr, &itr->itr);
|
||||||
|
if (!ptl) return HAWK_NULL;
|
||||||
|
itr->elem = *ptl;
|
||||||
|
return itr;
|
||||||
|
}
|
||||||
|
|
||||||
hawk_val_t* hawk_rtx_makerefval (hawk_rtx_t* rtx, int id, hawk_val_t** adr)
|
hawk_val_t* hawk_rtx_makerefval (hawk_rtx_t* rtx, int id, hawk_val_t** adr)
|
||||||
{
|
{
|
||||||
hawk_val_ref_t* val;
|
hawk_val_ref_t* val;
|
||||||
|
|||||||
Reference in New Issue
Block a user