From d917f812d7571ea5e61aa503a4c0fb135faed4ed Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 5 Nov 2025 22:42:05 +0900 Subject: [PATCH] added some array iteration code --- hawk.go | 49 ++++++++++++++++++++++++++++++++++++++----------- hawk_test.go | 14 ++++++++++++-- lib/hawk.h | 2 +- lib/val.c | 4 ++-- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/hawk.go b/hawk.go index 7fe4ffb5..305ec801 100644 --- a/hawk.go +++ b/hawk.go @@ -103,8 +103,15 @@ const ( 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) { 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 }) } -/* -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) ArrayFirstField(itr *ValArrayItr) *Val { + var i *C.hawk_val_arr_itr_t + var v *Val + var err error + i = C.hawk_rtx_getfirstarrvalitr(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) 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) { 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) String() string { + var s string + s, _ = val.ToStr() + return s +} + // ----------------------------------------------------------- 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 { return uchars_to_rune_slice(str, uintptr(C.hawk_count_ucstr(str))) } diff --git a/hawk_test.go b/hawk_test.go index c9b8b884..e60e82d5 100644 --- a/hawk_test.go +++ b/hawk_test.go @@ -132,7 +132,8 @@ return x } function get_arr(s) { @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]; return x; }`) @@ -193,17 +194,26 @@ return x; 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()) } else { - var i int + //var i int var sv string + var ff *hawk.Val + var itr hawk.ValArrayItr sv = hawk.Must(f.ToStr()) if sv != "hawk flieshawk flies" { 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))) } + */ + ff = v.ArrayFirstField(&itr) + for ff != nil { + fmt.Printf("%d [%v]\n", itr.Index(), ff.String()) + ff = v.ArrayNextField(&itr) + } } } } diff --git a/lib/hawk.h b/lib/hawk.h index 61e9ff86..9da35318 100644 --- a/lib/hawk.h +++ b/lib/hawk.h @@ -412,7 +412,7 @@ 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; + hawk_val_t* elem; }; /* ------------------------------------------------------------------------ */ diff --git a/lib/val.c b/lib/val.c index 6b423eac..38a3de6b 100644 --- a/lib/val.c +++ b/lib/val.c @@ -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); ptl = hawk_arr_getfirstelem(((hawk_val_arr_t*)arr)->arr, &itr->itr); if (!ptl) return HAWK_NULL; - itr->elem = *ptl; + itr->elem = ptl->ptr; 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); ptl = hawk_arr_getnextelem(((hawk_val_arr_t*)arr)->arr, &itr->itr); if (!ptl) return HAWK_NULL; - itr->elem = *ptl; + itr->elem = ptl->ptr; return itr; }