static void AllocBlock( PVal *pval, PDAT *pdat, int size ) { char **pp; if ( pval->mode == HSPVAR_MODE_CLONE ) return; pp = (char **)sbGetOption( (char *)pdat ); *pp = sbExpand( *pp, size ); }
void HspVarCoreResetVartype( int expand ) { // VARTYPEを初期化する(HspVarCoreInitの後で呼ぶ) // (expandに拡張するVARTYPEの数を指定する) // hspvartype_limit = hspvartype_max + expand; if ( expand >= 0 ) { hspvarproc = (HspVarProc *)sbExpand( (char *)hspvarproc, sizeof(HspVarProc) * hspvartype_limit ); mem_pval = (PVal *)sbExpand( (char *)mem_pval, sizeof(PVal) * hspvartype_limit ); } // 標準の型を登録する // HspVarCoreRegisterType( HSPVAR_FLAG_INT, (HSPVAR_COREFUNC)HspVarInt_Init ); HspVarCoreRegisterType( HSPVAR_FLAG_STR, (HSPVAR_COREFUNC)HspVarStr_Init ); HspVarCoreRegisterType( HSPVAR_FLAG_DOUBLE, (HSPVAR_COREFUNC)HspVarDouble_Init ); HspVarCoreRegisterType( HSPVAR_FLAG_STRUCT, (HSPVAR_COREFUNC)HspVarStruct_Init ); HspVarCoreRegisterType( HSPVAR_FLAG_LABEL, (HSPVAR_COREFUNC)HspVarLabel_Init ); // ラベル型(3.1) }
static void cnvformat_expand( char **p, int *capacity, int len, int n ) { int needed_size = len + n + 1; int capa = *capacity; if ( needed_size > capa ) { while ( needed_size > capa ) { capa *= 2; } *p = sbExpand( *p, capa ); *capacity = capa; } }
static void *reffunc_ctrlfunc( int *type_res, int arg ) { // reffunc : TYPE_DLLCTRL // (拡張DLLコントロール関数) // void *ptr; int p1,p2; // '('で始まるかを調べる // if ( *type != TYPE_MARK ) throw ( HSPERR_INVALID_FUNCPARAM ); if ( *val != '(' ) throw ( HSPERR_INVALID_FUNCPARAM ); code_next(); ptr = &reffunc_intfunc_ivalue; *type_res = HSPVAR_FLAG_INT; switch( arg ) { // サブコマンドごとの分岐 case 0x100: // callfunc { PVal *pval; PDAT *p; pval = code_getpval(); p = HspVarCorePtrAPTR( pval, 0 ); p1 = code_geti(); p2 = code_geti(); reffunc_intfunc_ivalue = call_extfunc( (void *)p1, (int *)p, p2 ); break; } case 0x101: // cnvwtos { PVal *pval; char *sptr; int size; sptr = code_getvptr( &pval, &size ); hspctx->stmp = sbExpand( hspctx->stmp, size ); ptr = hspctx->stmp; cnvsjis( ptr, sptr, size ); *type_res = HSPVAR_FLAG_STR; break; } case 0x102: // comevdisp #ifdef HSP_COM_UNSUPPORTED throw ( HSPERR_UNSUPPORTED_FUNCTION ); #else { PVal *pval; APTR aptr; IUnknown **ppunk; // 第1パラメータ:COMオブジェクト変数 aptr = code_getva( &pval ); if ( pval->flag != TYPE_COMOBJ ) throw ( HSPERR_TYPE_MISMATCH ); ppunk = (IUnknown **)HspVarCorePtrAPTR( pval, aptr ); if ( !IsVaridComPtr(ppunk) ) throw ( HSPERR_COMDLL_ERROR ); // イベントの DISPID 取得 reffunc_intfunc_ivalue = GetEventDispID( *ppunk ); break; } #endif // HSP_COM_UNSUPPORTED case 0x103: // libptr { //LIBDAT *lib; STRUCTDAT *st; switch( *type ) { case TYPE_DLLFUNC: case TYPE_MODCMD: p1 = *val; break; case TYPE_DLLCTRL: p1 = *val; if ( p1 >= TYPE_OFFSET_COMOBJ ) { p1 -= TYPE_OFFSET_COMOBJ; break; } default: throw ( HSPERR_TYPE_MISMATCH ); } code_next(); st = GetPRM( p1 ); //lib = &hspctx->mem_linfo[ st->index ]; reffunc_intfunc_ivalue = (int)st; break; } default: throw ( HSPERR_SYNTAX ); } // ')'で終わるかを調べる // if ( *type != TYPE_MARK ) throw ( HSPERR_INVALID_FUNCPARAM ); if ( *val != ')' ) throw ( HSPERR_INVALID_FUNCPARAM ); code_next(); return ptr; }