変数名からその変数のクローンを作る

#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