added some array iteration code
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-11-05 22:42:05 +09:00
parent ac39ef2bc4
commit d917f812d7
4 changed files with 53 additions and 16 deletions

49
hawk.go
View File

@ -103,8 +103,15 @@ const (
VAL_BOB ValType = C.HAWK_VAL_BOB VAL_BOB ValType = C.HAWK_VAL_BOB
) )
type BitMask C.hawk_bitmask_t type ValArrayItr struct {
c C.hawk_val_arr_itr_t
}
type ValMapItr struct {
c *C.hawk_val_map_itr_t
}
type BitMask C.hawk_bitmask_t
func deregister_instance(h *Hawk) { func deregister_instance(h *Hawk) {
fmt.Printf ("DEREGISER INSTANCE %p\n", h) fmt.Printf ("DEREGISER INSTANCE %p\n", h)
@ -647,19 +654,27 @@ 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(itr *ValArrayItr) *Val {
func (val *Val) ArrayFirstField() *Val { var i *C.hawk_val_arr_itr_t
var v *C.hawk_val_t var v *Val
var itr C.hawk_val_arr_itr_t var err error
v = C.hawk_rtx_getfirstarrvalitr(val.rtx.c, val.c, &itr) i = C.hawk_rtx_getfirstarrvalitr(val.rtx.c, val.c, &itr.c)
if v == nil { return nil, val.rtx.make_errinfo() } if i == nil { return nil }
return val.rtx.make_val(func() *C.hawk_val_t { return v }) v, err = val.rtx.make_val(func() *C.hawk_val_t { return itr.c.elem })
if err != nil { return nil }
return v;
} }
func (val *Val) ArrayNextField(itr ValArrItr) *Val { func (val *Val) ArrayNextField(itr *ValArrayItr) *Val {
var i *C.hawk_val_arr_itr_t
var v *Val
var err error
i = C.hawk_rtx_getnextarrvalitr(val.rtx.c, val.c, &itr.c)
if i == nil { return nil }
v, err = val.rtx.make_val(func() *C.hawk_val_t { return itr.c.elem })
if err != nil { return nil }
return v;
} }
*/
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
@ -678,6 +693,12 @@ func (val *Val) MapField(key string) (*Val, error) {
//func (val *Val) SetMapField(key string, val *Val) error { //func (val *Val) SetMapField(key string, val *Val) error {
//} //}
func (val *Val) String() string {
var s string
s, _ = val.ToStr()
return s
}
// ----------------------------------------------------------- // -----------------------------------------------------------
var val_type []string = []string{ var val_type []string = []string{
@ -702,6 +723,12 @@ func (t ValType) String() string {
// ----------------------------------------------------------- // -----------------------------------------------------------
func (itr *ValArrayItr) Index() int {
return int(itr.c.itr.idx)
}
// -----------------------------------------------------------
func ucstr_to_rune_slice(str *C.hawk_uch_t) []rune { func ucstr_to_rune_slice(str *C.hawk_uch_t) []rune {
return uchars_to_rune_slice(str, uintptr(C.hawk_count_ucstr(str))) return uchars_to_rune_slice(str, uintptr(C.hawk_count_ucstr(str)))
} }

View File

@ -132,7 +132,8 @@ return x
} }
function get_arr(s) { function get_arr(s) {
@local x; @local x;
x = hawk::array(s, (s %% s), 10, 20.99); x = hawk::array(s, (s %% s), 10, 20.99, "what the");
delete(x[3]);
for (i in x) print i, x[i]; for (i in x) print i, x[i];
return x; return x;
}`) }`)
@ -193,17 +194,26 @@ 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 i int
var sv string var sv string
var ff *hawk.Val
var itr hawk.ValArrayItr
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++ { for i = 1; i <= sz; i++ {
fmt.Printf("%d %v\n", i, hawk.Must(v.ArrayField(i))) fmt.Printf("%d %v\n", i, hawk.Must(v.ArrayField(i)))
} }
*/
ff = v.ArrayFirstField(&itr)
for ff != nil {
fmt.Printf("%d [%v]\n", itr.Index(), ff.String())
ff = v.ArrayNextField(&itr)
}
} }
} }
} }

View File

@ -412,7 +412,7 @@ typedef struct hawk_val_arr_itr_t hawk_val_arr_itr_t;
struct hawk_val_arr_itr_t struct hawk_val_arr_itr_t
{ {
hawk_arr_itr_t itr; hawk_arr_itr_t itr;
hawk_ptl_t elem; hawk_val_t* elem;
}; };
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */

View File

@ -1458,7 +1458,7 @@ hawk_val_arr_itr_t* hawk_rtx_getfirstarrvalitr (hawk_rtx_t* rtx, hawk_val_t* arr
HAWK_ASSERT(HAWK_RTX_GETVALTYPE(rtx, arr) == HAWK_VAL_ARR); HAWK_ASSERT(HAWK_RTX_GETVALTYPE(rtx, arr) == HAWK_VAL_ARR);
ptl = hawk_arr_getfirstelem(((hawk_val_arr_t*)arr)->arr, &itr->itr); ptl = hawk_arr_getfirstelem(((hawk_val_arr_t*)arr)->arr, &itr->itr);
if (!ptl) return HAWK_NULL; if (!ptl) return HAWK_NULL;
itr->elem = *ptl; itr->elem = ptl->ptr;
return itr; return itr;
} }
@ -1468,7 +1468,7 @@ hawk_val_arr_itr_t* hawk_rtx_getnextarrvalitr (hawk_rtx_t* rtx, hawk_val_t* arr,
HAWK_ASSERT(HAWK_RTX_GETVALTYPE(rtx, arr) == HAWK_VAL_ARR); HAWK_ASSERT(HAWK_RTX_GETVALTYPE(rtx, arr) == HAWK_VAL_ARR);
ptl = hawk_arr_getnextelem(((hawk_val_arr_t*)arr)->arr, &itr->itr); ptl = hawk_arr_getnextelem(((hawk_val_arr_t*)arr)->arr, &itr->itr);
if (!ptl) return HAWK_NULL; if (!ptl) return HAWK_NULL;
itr->elem = *ptl; itr->elem = ptl->ptr;
return itr; return itr;
} }