#module
#deffunc init_getvn
if inited : return
inited = 1
mref hspctx, 68
dupptr hsphed, hspctx.0, 96 // hspctx.hsphed / sizeof HSPHED
max_val = lpeek( hsphed, 8 ) // hsphed.max_val
ds_ptr = lpeek( hspctx, 12 ) // hspctx.mem_mds
dinfo_ptr = lpeek( hspctx, 16 ) // hspctx.mem_di
dupptr dinfo, dinfo_ptr, lpeek( hsphed, 44 ) // hsphed.max_dinfo
sdim varnames, 64, max_val
varnames_i = 0
repeat
char = peek( dinfo, cnt )
if char == 255 : break
if char == 254 : continue cnt + 1 + 3 + 2
if char == 253 {
ds_offset = lpeek( dinfo, cnt + 1 ) & 0x00ffffff
varnames.varnames_i = strf( "%s", ds_ptr + ds_offset )
varnames_i ++
continue cnt + 1 + 3 + 2
}
if char == 252 : continue cnt + 1 + 2
loop
return
#defcfunc getvarname var v
init_getvn
dupptr vptr, hspctx.207, 4 // prmstack
pval_ptr = vptr
pval_ptr_first = hspctx.11 // mem_var
// sizeof PVal == 48
return varnames( ( pval_ptr - pval_ptr_first ) / 48 )
#deffunc getfromvarname var v, str name
init_getvn
id = -1
foreach varnames
if varnames.cnt == name : id = cnt : break
loop
if id < 0 : return 1
pval_ptr = hspctx.11 + id * 48
// PValポインタからクローンを作る
dupptr pval, pval_ptr, 48
flag = pval.0 & 0xffff
hspvarproc_ptr = callfunc( flag, hspctx.37, 1 ) // exinfo.HspFunc_getproc
// sizeof( HspVarProc ) == 140
dupptr hspvarproc, hspvarproc_ptr, 140
pval.10 = 0 // pval.offset
ptr = callfunc( pval_ptr, hspvarproc.7, 1 ) // hspvarproc.GetProc
size = 0
args = pval_ptr, ptr, varptr( size )
ptr2 = callfunc( args, hspvarproc.16, 3 ) // hspvarproc.GetBlockSize
dupptr v, ptr, size, flag
return 0
#global
hoge = "hello"
mes getvarname( hoge )
getfromvarname v, "max_val@m0"
mes v