static void HspVarComobj_Alloc( PVal *pval, const PVal *pval2 ) { // pval変数が必要とするサイズを確保する。 // (pvalがすでに確保されているメモリ解放は呼び出し側が行なう) // (pval2がNULLの場合は、新規データ) // (pval2が指定されている場合は、pval2の内容を継承して再確保) // int count,size; IUnknown **ppunk; #ifdef HSP_COMOBJ_DEBUG COM_DBG_MSG( "HspVarComobj_Alloc()\n" ); #endif if ( pval->len[1] < 1 ) pval->len[1] = 1; // 配列を最低 1 は確保する count = HspVarCoreCountElems(pval); size = count * sizeof( IUnknown* ); ppunk = (IUnknown **)sbAlloc( size ); pval->mode = HSPVAR_MODE_MALLOC; for (int i=0; i<count; i++) { ppunk[i] = NULL; } if ( pval2 != NULL ) { memcpy( ppunk, pval->pt, pval->size ); sbFree( pval->pt ); if ( pval->master ) sbFree( pval->master ); } pval->master = NULL; // ComDispParams 用 pval->pt = (char *)ppunk; pval->size = size; }
void HspVarCoreBye( void ) { int i; for(i=0;i<hspvartype_max;i++) { if ( mem_pval[i].mode == HSPVAR_MODE_MALLOC ) { HspVarCoreDispose( &mem_pval[i] ); } } sbFree( mem_pval ); sbFree( hspvarproc ); }
static void HspVarComobj_Free( PVal *pval ) { // PVALポインタの変数メモリを解放する // IUnknown** ppunk; if ( pval->master ) { FreeDispParams( (ComDispParams *)pval->master ); } if ( pval->mode == HSPVAR_MODE_MALLOC ) { // (一時変数に含まれるオブジェクトは Release しない) if ( (pval->support & HSPVAR_SUPPORT_TEMPVAR) == 0 ) { #ifdef HSP_COMOBJ_DEBUG COM_DBG_MSG( "HspVarComobj_Free()\n" ); #endif int count = HspVarCoreCountElems( pval ); ppunk = (IUnknown **)pval->pt; for (int i=0; i<count; i++) { ReleaseComPtr( &ppunk[i] ); } } sbFree( pval->pt ); } pval->pt = NULL; pval->flag = HSPVAR_MODE_NONE; }
static void HspVarInt_Alloc( PVal *pval, const PVal *pval2 ) { // pval変数が必要とするサイズを確保する。 // (pvalがすでに確保されているメモリ解放は呼び出し側が行なう) // (pval2がNULLの場合は、新規データ) // (pval2が指定されている場合は、pval2の内容を継承して再確保) // int i,size; char *pt; int *fv; if ( pval->len[1] < 1 ) pval->len[1] = 1; // 配列を最低1は確保する size = GetVarSize( pval ); pval->mode = HSPVAR_MODE_MALLOC; pt = sbAlloc( size ); fv = (int *)pt; for(i=0; i<(int)(size/sizeof(int)); i++) { fv[i]=0; } if ( pval2 != NULL ) { memcpy( pt, pval->pt, pval->size ); sbFree( pval->pt ); } pval->pt = pt; pval->size = size; }
static void HspVarStruct_Alloc( PVal *pval, const PVal *pval2 ) { // pval変数が必要とするサイズを確保する。 // (pvalがすでに確保されているメモリ解放は呼び出し側が行なう) // (pval2がNULLの場合は、新規データ) // (pval2が指定されている場合は、pval2の内容を継承して再確保) // int i,size; char *pt; FlexValue *fv; if ( pval->len[1] < 1 ) pval->len[1] = 1; // 配列を最低1は確保する pval->mode = HSPVAR_MODE_MALLOC; size = sizeof(FlexValue) * pval->len[1]; pt = sbAlloc( size ); fv = (FlexValue *)pt; for(i=0;i<pval->len[1];i++) { /* rev 53 BT#113: dimtypeでstruct型(モジュール型)変数が不完全な状態で作成される に対処。 */ memset( fv, 0, sizeof( FlexValue ) ); fv->type = FLEXVAL_TYPE_NONE; fv++; } if ( pval2 != NULL ) { memcpy( pt, pval->pt, pval->size ); sbFree( pval->pt ); } pval->pt = pt; pval->size = size; }
static void HspVarLabel_Free( PVal *pval ) { // PVALポインタの変数メモリを解放する // if ( pval->mode == HSPVAR_MODE_MALLOC ) { sbFree( pval->pt ); } pval->pt = NULL; pval->mode = HSPVAR_MODE_NONE; }
static void HspVarStruct_Free( PVal *pval ) { // PVALポインタの変数メモリを解放する // int i; FlexValue *fv; if ( pval->mode == HSPVAR_MODE_MALLOC ) { code_delstruct_all( pval ); // デストラクタがあれば呼び出す fv = (FlexValue *)pval->pt; for(i=0;i<pval->len[1];i++) { if ( fv->type == FLEXVAL_TYPE_ALLOC ) sbFree( fv->ptr ); fv++; } sbFree( pval->pt ); } pval->mode = HSPVAR_MODE_NONE; }
// Set static void HspVarStruct_Set( PVal *pval, PDAT *pdat, const void *in ) { FlexValue *fv; FlexValue *fv_src; fv = (FlexValue *)in; fv->type = FLEXVAL_TYPE_CLONE; fv_src = (FlexValue *)pdat; if ( fv_src->type == FLEXVAL_TYPE_ALLOC ) { sbFree( fv_src->ptr ); } memcpy( pdat, fv, sizeof(FlexValue) ); //sbCopy( (char **)pdat, (char *)fv->ptr, fv->size ); }
static void HspVarStr_Free( PVal *pval ) { // PVALポインタの変数メモリを解放する // char **pp; int i,size; if ( pval->mode == HSPVAR_MODE_MALLOC ) { size = GetVarSize( pval ); for(i=0;i<(int)(size/sizeof(char *));i++) { pp = GetFlexBufPtr( pval, i ); sbFree( *pp ); } free( pval->master ); } pval->mode = HSPVAR_MODE_NONE; }
BSTR comget_bstr( char *ps ) { int size; BSTR bstr; void *temp; size = cnvwstr( NULL, ps, 0 ) + 1; if ( size * sizeof(WCHAR) > HSPCTX_REFSTR_MAX ) { temp = sbAlloc( size * sizeof(WCHAR) ); cnvwstr( temp, ps, size ); bstr = SysAllocString( (LPOLESTR)temp ); sbFree( temp ); } else { cnvwstr( hspctx->stmp, ps, size ); bstr = SysAllocString( (LPOLESTR)hspctx->stmp ); } return bstr; }
static int object_modifier_remove(Object *ob, ModifierData *md, int *sort_depsgraph) { ModifierData *obmd; /* It seems on rapid delete it is possible to * get called twice on same modifier, so make * sure it is in list. */ for(obmd=ob->modifiers.first; obmd; obmd=obmd->next) if(obmd==md) break; if(!obmd) return 0; /* special cases */ if(md->type == eModifierType_ParticleSystem) { ParticleSystemModifierData *psmd=(ParticleSystemModifierData*)md; BLI_remlink(&ob->particlesystem, psmd->psys); psys_free(ob, psmd->psys); psmd->psys= NULL; } else if(md->type == eModifierType_Softbody) { if(ob->soft) { sbFree(ob->soft); ob->soft= NULL; ob->softflag= 0; } } else if(md->type == eModifierType_Collision) { if(ob->pd) ob->pd->deflect= 0; *sort_depsgraph = 1; } else if(md->type == eModifierType_Surface) { if(ob->pd && ob->pd->shape == PFIELD_SHAPE_SURFACE) ob->pd->shape = PFIELD_SHAPE_PLANE; *sort_depsgraph = 1; } else if(md->type == eModifierType_Smoke) { ob->dt = OB_TEXTURE; } else if(md->type == eModifierType_Multires) { int ok= 1; Mesh *me= ob->data; ModifierData *tmpmd; /* ensure MDISPS CustomData layer is't used by another multires modifiers */ for(tmpmd= ob->modifiers.first; tmpmd; tmpmd= tmpmd->next) if(tmpmd!=md && tmpmd->type == eModifierType_Multires) { ok= 0; break; } if(ok) { if(me->edit_mesh) { EditMesh *em= me->edit_mesh; /* CustomData_external_remove is used here only to mark layer as non-external for further free-ing, so zero element count looks safer than em->totface */ CustomData_external_remove(&em->fdata, &me->id, CD_MDISPS, 0); EM_free_data_layer(em, &em->fdata, CD_MDISPS); } else { CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface); CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface); } } } if(ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) && ob->particlesystem.first == NULL) { ob->mode &= ~OB_MODE_PARTICLE_EDIT; } BLI_remlink(&ob->modifiers, md); modifier_free(md); return 1; }
CAutoSbFree::~CAutoSbFree() { sbFree(*pptr_); }
static int cmdfunc_intcmd( int cmd ) { // cmdfunc : TYPE_INTCMD // (内蔵コマンド) // int p1,p2,p3; // code_next(); // 次のコードを取得(最初に必ず必要です) switch( cmd ) { // サブコマンドごとの分岐 case 0x00: // onexit case 0x01: // onerror case 0x02: // onkey case 0x03: // onclick case 0x04: // oncmd { /* rev 45 不具合 : (onxxx系命令) (ラベル型変数) 形式の書式でエラー に対処 */ int tval = *type; int opt = IRQ_OPT_GOTO; int cust; int actid; IRQDAT *irq; unsigned short *sbr; if ( tval == TYPE_VAR ) { if ( ( ctx->mem_var + *val )->flag == HSPVAR_FLAG_LABEL ) tval = TYPE_LABEL; } if (( tval != TYPE_PROGCMD )&&( tval != TYPE_LABEL )) { // ON/OFF切り替え int i = code_geti(); code_enableirq( cmd, i ); break; } if ( tval == TYPE_PROGCMD ) { // ジャンプ方法指定 opt = *val; if ( opt >= 2 ) throw HSPERR_SYNTAX; code_next(); } sbr = code_getlb2(); if ( cmd != 0x04 ) { code_setirq( cmd, opt, -1, sbr ); break; } cust = code_geti(); actid = *(exinfo->actscr); irq = code_seekirq( actid, cust ); if ( irq == NULL ) irq = code_addirq(); irq->flag = IRQ_FLAG_ENABLE; irq->opt = opt; irq->ptr = sbr; irq->custom = cust; irq->custom2 = actid; break; } case 0x11: // exist case 0x12: // delete case 0x13: // mkdir case 0x14: // chdir code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); code_event( HSPEVENT_FEXIST + (cmd - 0x11), 0, 0, NULL ); break; case 0x15: // dirlist { PVal *pval; APTR aptr; char *ptr; aptr = code_getva( &pval ); code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); p1=code_getdi(0); code_event( HSPEVENT_FDIRLIST1, p1, 0, &ptr ); code_setva( pval, aptr, TYPE_STRING, ptr ); code_event( HSPEVENT_FDIRLIST2, 0, 0, NULL ); break; } case 0x16: // bload case 0x17: // bsave { PVal *pval; char *ptr; int size; int tmpsize; code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); ptr = code_getvptr( &pval, &size ); p1 = code_getdi( -1 ); p2 = code_getdi( -1 ); if (( p1 < 0 )||( p1 > size )) p1 = size; if ( cmd == 0x16 ) { tmpsize = p2;if ( tmpsize<0 ) tmpsize = 0; code_event( HSPEVENT_FREAD, tmpsize, p1, ptr ); } else { code_event( HSPEVENT_FWRITE, p2, p1, ptr ); } break; } case 0x18: // bcopy code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); code_event( HSPEVENT_FCOPY, 0, 0, code_gets() ); break; case 0x19: // memfile { PVal *pval; char *ptr; int size; ptr = code_getvptr( &pval, &size ); p1=code_getdi( 0 ); p2=code_getdi( 0 ); if ( p2==0 ) p2 = size - p1; dpm_memfile( ptr+p1, p2 ); break; } case 0x1a: // poke case 0x1b: // wpoke case 0x1c: // lpoke { PVal *pval; char *ptr; int size; int fl; int len; char *bp; ptr = code_getvptr( &pval, &size ); p1 = code_getdi( 0 ); if ( p1<0 ) throw HSPERR_BUFFER_OVERFLOW; ptr += p1; if ( code_get() <= PARAM_END ) { fl = HSPVAR_FLAG_INT; bp = (char *)&p2; p2 = 0; } else { fl = mpval->flag; bp = mpval->pt; } if ( cmd == 0x1a ) { switch( fl ) { case HSPVAR_FLAG_INT: if ( p1 >= size ) throw HSPERR_BUFFER_OVERFLOW; *ptr = *bp; break; case HSPVAR_FLAG_STR: len = (int)strlen( bp ); ctx->strsize = len; len++; if ( (p1+len)>size ) throw HSPERR_BUFFER_OVERFLOW; strcpy( ptr, bp ); break; default: throw HSPERR_TYPE_MISMATCH; } break; } if ( fl != HSPVAR_FLAG_INT ) throw HSPERR_TYPE_MISMATCH; if ( cmd == 0x1b ) { if ( (p1+2)>size ) throw HSPERR_BUFFER_OVERFLOW; *(short *)ptr = (short)(*(short *)bp); } else { if ( (p1+4)>size ) throw HSPERR_BUFFER_OVERFLOW; *(int *)ptr = (*(int *)bp); } break; } case 0x1d: // getstr { PVal *pval2; PVal *pval; APTR aptr; char *ptr; char *p; int size; aptr = code_getva( &pval ); ptr = code_getvptr( &pval2, &size ); p1 = code_getdi( 0 ); p2 = code_getdi( 0 ); p3 = code_getdi( 1024 ); if ( p1 >= size ) throw HSPERR_BUFFER_OVERFLOW; ptr += p1; p = code_stmp( p3 + 1 ); strsp_ini(); ctx->stat = strsp_get( ptr, p, p2, p3 ); ctx->strsize = strsp_getptr(); code_setva( pval, aptr, HSPVAR_FLAG_STR, p ); break; } case 0x1e: // chdpm code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); p1 = code_getdi( -1 ); dpm_bye(); p2 = dpm_ini( ctx->fnbuffer, 0, -1, p1 ); if ( p2 ) throw HSPERR_FILE_IO; #ifndef HSP3IMP #ifdef HSPWIN Sleep( 1000 ); #endif #endif break; case 0x1f: // memexpand { PVal *pval; APTR aptr; PDAT *ptr; aptr = code_getva( &pval ); ptr = HspVarCorePtrAPTR( pval, aptr ); if (( pval->support & HSPVAR_SUPPORT_FLEXSTORAGE ) == 0 ) throw HSPERR_TYPE_MISMATCH; p1 = code_getdi( 0 ); if ( p1 < 64 ) p1 = 64; HspVarCoreAllocBlock( pval, ptr, p1 ); break; } case 0x20: // memcpy { PVal *pval; char *sptr; char *tptr; int bufsize_t,bufsize_s; tptr = code_getvptr( &pval, &bufsize_t ); sptr = code_getvptr( &pval, &bufsize_s ); p1 = code_getdi( 0 ); p2 = code_getdi( 0 ); p3 = code_getdi( 0 ); if( p2 < 0 || p3 < 0 ) throw HSPERR_BUFFER_OVERFLOW; tptr += p2; sptr += p3; if ( (p1+p2)>bufsize_t ) throw HSPERR_BUFFER_OVERFLOW; if ( (p1+p3)>bufsize_s ) throw HSPERR_BUFFER_OVERFLOW; if ( p1>0 ) { memmove( tptr, sptr, p1 ); } break; } case 0x21: // memset { PVal *pval; char *ptr; int size; ptr = code_getvptr( &pval, &size ); p1 = code_getdi( 0 ); p2 = code_getdi( 0 ); p3 = code_getdi( 0 ); if ( p3 < 0 ) throw HSPERR_BUFFER_OVERFLOW; ptr += p3; if ( (p3+p2)>size ) throw HSPERR_BUFFER_OVERFLOW; if ( p2>0 ) { memset( ptr, p1, p2 ); } break; } case 0x22: // notesel ctx->notep_aptr = ctx->note_aptr; ctx->notep_pval = ctx->note_pval; ctx->note_aptr = code_getva( &ctx->note_pval ); if ( ctx->note_pval->flag != HSPVAR_FLAG_STR ) { code_setva( ctx->note_pval, ctx->note_aptr, TYPE_STRING, "" ); } break; case 0x23: // noteadd { char *np; char *ps; char *tmp; int size; np = note_update(); ps = code_gets(); size = (int)strlen( ps ) + 8; HspVarCoreAllocBlock( ctx->note_pval, (PDAT *)np, (int)strlen(np) + size ); tmp = code_stmpstr( ps ); p1 = code_getdi( -1 ); p2 = code_getdi( 0 ); np = note_update(); note.PutLine( tmp, p1, p2 ); break; } case 0x24: // notedel p1 = code_getdi( 0 ); note_update(); note.PutLine( NULL, p1, 1 ); break; case 0x25: // noteload { int size; char *ptr; char *pdat; code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); p1 = code_getdi( -1 ); code_event( HSPEVENT_FEXIST, 0, 0, NULL ); size = ctx->strsize; if ( size < 0 ) throw HSPERR_FILE_IO; if ( p1>=0 ) if ( size >= p1 ) { ctx->strsize = size = p1; } pdat = note_update(); HspVarCoreAllocBlock( ctx->note_pval, (PDAT *)pdat, size+1 ); ptr = (char *)note_update(); code_event( HSPEVENT_FREAD, 0, size, ptr ); ptr[size] = 0; break; } case 0x26: // notesave { char *pdat; int size; code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); pdat = note_update(); size = (int)strlen( pdat ); code_event( HSPEVENT_FWRITE, -1, size, pdat ); break; } case 0x27: // randomize #ifdef HSPWIN p2 = (int)GetTickCount(); // Windowsの場合はtickをシード値とする #else p2 = (int)time(0); // Windows以外のランダムシード値 #endif p1 = code_getdi( p2 ); #ifdef HSPRANDMT mt.seed( p1 ); #else srand( p1 ); #endif break; case 0x28: // noteunsel ctx->note_aptr = ctx->notep_aptr; ctx->note_pval = ctx->notep_pval; break; case 0x29: // noteget { PVal *pval; APTR aptr; char *p; note_update(); aptr = code_getva( &pval ); p1 = code_getdi( 0 ); p = note.GetLineDirect( p1 ); code_setva( pval, aptr, TYPE_STRING, p ); note.ResumeLineDirect(); break; } case 0x2a: // split { // 指定した文字列で分割された要素を代入する(fujidig) PVal *pval = NULL; int aptr = 0; char *sptr; char *sep; char *newsptr; int size; int sep_len; int n = 0; int is_last = 0; sptr = code_getvptr( &pval, &size ); if ( pval->flag != HSPVAR_FLAG_STR ) throw HSPERR_TYPE_MISMATCH; sep = code_gets(); sep_len = (int)strlen( sep ); while (1) { newsptr = strstr2( sptr, sep ); if ( !is_last && *exinfo->npexflg & EXFLG_1 ) { // 分割結果の数が格納する変数より多ければ最後の変数に配列で格納していく // ただし最後の要素が a.2 のように要素指定があればそれ以降は全く格納しない if ( aptr != 0 ) pval = NULL; is_last = 1; aptr = 0; } if ( is_last ) { aptr ++; if ( pval != NULL && aptr >= pval->len[1] ) { if ( pval->len[2] != 0 ) throw HSPVAR_ERROR_ARRAYOVER; HspVarCoreReDim( pval, 1, aptr+1 ); } } else { aptr = code_getva( &pval ); } if ( pval != NULL ) { if ( newsptr == NULL ) { code_setva( pval, aptr, HSPVAR_FLAG_STR, sptr ); } else { var_set_str_len( pval, aptr, sptr, (int)(newsptr - sptr) ); } } n ++; if ( newsptr == NULL ) { // 格納する変数の数が分割できた数より多ければ残った変数それぞれに空文字列を格納する while( ( *exinfo->npexflg & EXFLG_1 ) == 0 ) { aptr = code_getva( &pval ); code_setva( pval, aptr, HSPVAR_FLAG_STR, "" ); } break; } sptr = newsptr + sep_len; } ctx->stat = n; break; } case 0x02b: // strrep { PVal *pval; APTR aptr; char *ss; char *s_rep; char *s_buffer; char *s_match; char *s_result; int len_match; int len_result; int len_buffer; aptr = code_getva( &pval ); if ( pval->flag != HSPVAR_FLAG_STR ) throw HSPERR_TYPE_MISMATCH; s_buffer = (char *)HspVarCorePtrAPTR( pval, aptr ); ss = code_gets(); if ( *ss == 0 ) throw HSPERR_ILLEGAL_FUNCTION; len_match = (int)strlen( ss ); s_match = sbAlloc( len_match + 1 ); memcpy( s_match, ss, len_match + 1 ); len_buffer = (int)strlen( s_buffer ); len_result = len_buffer + 0x4000; if ( len_result < 0x8000 ) len_result = 0x8000; s_result = sbAlloc( len_result ); *s_result = 0; s_rep = code_gets(); ReplaceSetMatch( s_buffer, s_match, s_result, len_buffer, len_match, len_result ); ReplaceStr( s_rep ); code_setva( pval, aptr, TYPE_STRING, s_result ); ctx->stat = ReplaceDone(); sbFree( s_match ); sbFree( s_result ); break; } case 0x02c: // setease { HSPREAL dval; HSPREAL dval2; dval = code_getd(); dval2 = code_getd(); p1 = code_getdi( ease_type ); setEase( p1, dval, dval2 ); break; } case 0x02d: // sortval { int a,i; PVal *p1; APTR ap; int order; ap = code_getva( &p1 ); // パラメータ1:変数 order = code_getdi( 0 ); // パラメータ2:数値 i=p1->len[1]; if (i<=0) throw HSPERR_ILLEGAL_FUNCTION; switch(p1->flag) { case HSPVAR_FLAG_DOUBLE: { double *dp; dp=(double *)p1->pt; DataIni( i ); for(a=0;a<i;a++) { dtmp[a].as.dkey=dp[a]; dtmp[a].info=a; } if (order == 0) { std::sort(dtmp, dtmp + i, less_double_1); } else { std::sort(dtmp, dtmp + i, less_double_0); } for(a=0;a<i;a++) { code_setva( p1, a, HSPVAR_FLAG_DOUBLE, &(dtmp[a].as.dkey) ); // 変数に値を代入 } break; } case HSPVAR_FLAG_INT: { int *p; p=(int *)p1->pt; DataIni( i ); for(a=0;a<i;a++) { dtmp[a].as.ikey=p[a]; dtmp[a].info=a; } if (order == 0) { std::sort(dtmp, dtmp + i, less_int_1); } else { std::sort(dtmp, dtmp + i, less_int_0); } for(a=0;a<i;a++) { p[a]=dtmp[a].as.ikey; } break; } default: throw HSPERR_ILLEGAL_FUNCTION; } break; } case 0x02e: // sortstr { int i,len,order; char *p; PVal *pv; APTR ap; HspVarProc *proc; char **pvstr; ap = code_getva( &pv ); // パラメータ1:変数 order = code_getdi( 0 ); // パラメータ2:数値 if ( pv->flag != 2 ) throw HSPERR_TYPE_MISMATCH; if (( pv->len[2] != 0 )||( ap != 0 )) throw HSPERR_ILLEGAL_FUNCTION; proc = HspVarCoreGetProc( pv->flag ); len = pv->len[1]; DataIni( len ); for(i=0;i<len;i++) { p = (char *)HspVarCorePtrAPTR( pv, i ); dtmp[i].as.skey = p; dtmp[i].info = i; } if (order == 0) { std::sort(dtmp, dtmp + i, less_str_1); } else { std::sort(dtmp, dtmp + i, less_str_0); } pvstr = (char **)(pv->master); // 変数に直接sbポインタを書き戻す for(i=0;i<len;i++) { if ( i == 0 ) { pv->pt = dtmp[i].as.skey; sbSetOption(pv->pt, &pv->pt); } else { pvstr[i] = dtmp[i].as.skey; sbSetOption(pvstr[i], &pvstr[i]); } } break; } case 0x02f: // sortnote { int i,sflag; char *p; char *stmp; PVal *pv; APTR ap; ap = code_getva( &pv ); // パラメータ1:変数 sflag = code_getdi( 0 ); // パラメータ2:数値 p = (char *)HspVarCorePtrAPTR( pv, ap ); i = GetNoteLines(p); if ( i <= 0 ) throw HSPERR_ILLEGAL_FUNCTION; DataIni( i ); NoteToData( p, dtmp ); if (sflag == 0) { std::sort(dtmp, dtmp + i, less_str_1); } else { std::sort(dtmp, dtmp + i, less_str_0); } stmp = code_stmp( (int)DataToNoteLen( dtmp, i ) + 1 ); DataToNote( dtmp, stmp, i ); code_setva( pv, ap, HSPVAR_FLAG_STR, stmp ); // 変数に値を代入 break; } case 0x030: // sortget { PVal *pv; APTR ap; int result; int n; ap = code_getva( &pv ); n = code_getdi( 0 ); if ( dtmp == NULL ) throw HSPERR_ILLEGAL_FUNCTION; if (0 <= n && n < dtmp_size ) { result=dtmp[n].info; } else { result=0; } code_setva( pv, ap, HSPVAR_FLAG_INT, &result ); break; } default: throw HSPERR_UNSUPPORTED_FUNCTION; } return RUNMODE_RUN; }
/* UNUSED, keep in case we want to copy functionality for use elsewhere */ static void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event) { Object *ob; Base *base; Curve *cu, *cu1; Nurb *nu; int do_scene_sort= 0; if (scene->id.lib) return; if (!(ob=OBACT)) return; if (scene->obedit) { // XXX get from context /* obedit_copymenu(); */ return; } if (event==9) { copymenu_properties(scene, v3d, ob); return; } else if (event==10) { copymenu_logicbricks(scene, v3d, ob); return; } else if (event==24) { /* moved to object_link_modifiers */ /* copymenu_modifiers(bmain, scene, v3d, ob); */ return; } for (base= FIRSTBASE; base; base= base->next) { if (base != BASACT) { if (TESTBASELIB(v3d, base)) { base->object->recalc |= OB_RECALC_OB; if (event==1) { /* loc */ copy_v3_v3(base->object->loc, ob->loc); copy_v3_v3(base->object->dloc, ob->dloc); } else if (event==2) { /* rot */ copy_v3_v3(base->object->rot, ob->rot); copy_v3_v3(base->object->drot, ob->drot); copy_qt_qt(base->object->quat, ob->quat); copy_qt_qt(base->object->dquat, ob->dquat); } else if (event==3) { /* size */ copy_v3_v3(base->object->size, ob->size); copy_v3_v3(base->object->dscale, ob->dscale); } else if (event==4) { /* drawtype */ base->object->dt= ob->dt; base->object->dtx= ob->dtx; base->object->empty_drawtype= ob->empty_drawtype; base->object->empty_drawsize= ob->empty_drawsize; } else if (event==5) { /* time offs */ base->object->sf= ob->sf; } else if (event==6) { /* dupli */ base->object->dupon= ob->dupon; base->object->dupoff= ob->dupoff; base->object->dupsta= ob->dupsta; base->object->dupend= ob->dupend; base->object->transflag &= ~OB_DUPLI; base->object->transflag |= (ob->transflag & OB_DUPLI); base->object->dup_group= ob->dup_group; if (ob->dup_group) id_lib_extern(&ob->dup_group->id); } else if (event==7) { /* mass */ base->object->mass= ob->mass; } else if (event==8) { /* damping */ base->object->damping= ob->damping; base->object->rdamping= ob->rdamping; } else if (event==11) { /* all physical attributes */ base->object->gameflag = ob->gameflag; base->object->inertia = ob->inertia; base->object->formfactor = ob->formfactor; base->object->damping= ob->damping; base->object->rdamping= ob->rdamping; base->object->min_vel= ob->min_vel; base->object->max_vel= ob->max_vel; if (ob->gameflag & OB_BOUNDS) { base->object->collision_boundtype = ob->collision_boundtype; } base->object->margin= ob->margin; base->object->bsoft= copy_bulletsoftbody(ob->bsoft); } else if (event==17) { /* tex space */ copy_texture_space(base->object, ob); } else if (event==18) { /* font settings */ if (base->object->type==ob->type) { cu= ob->data; cu1= base->object->data; cu1->spacemode= cu->spacemode; cu1->spacing= cu->spacing; cu1->linedist= cu->linedist; cu1->shear= cu->shear; cu1->fsize= cu->fsize; cu1->xof= cu->xof; cu1->yof= cu->yof; cu1->textoncurve= cu->textoncurve; cu1->wordspace= cu->wordspace; cu1->ulpos= cu->ulpos; cu1->ulheight= cu->ulheight; if (cu1->vfont) cu1->vfont->id.us--; cu1->vfont= cu->vfont; id_us_plus((ID *)cu1->vfont); if (cu1->vfontb) cu1->vfontb->id.us--; cu1->vfontb= cu->vfontb; id_us_plus((ID *)cu1->vfontb); if (cu1->vfonti) cu1->vfonti->id.us--; cu1->vfonti= cu->vfonti; id_us_plus((ID *)cu1->vfonti); if (cu1->vfontbi) cu1->vfontbi->id.us--; cu1->vfontbi= cu->vfontbi; id_us_plus((ID *)cu1->vfontbi); BKE_text_to_curve(bmain, scene, base->object, 0); /* needed? */ BLI_strncpy(cu1->family, cu->family, sizeof(cu1->family)); base->object->recalc |= OB_RECALC_DATA; } } else if (event==19) { /* bevel settings */ if (ELEM(base->object->type, OB_CURVE, OB_FONT)) { cu= ob->data; cu1= base->object->data; cu1->bevobj= cu->bevobj; cu1->taperobj= cu->taperobj; cu1->width= cu->width; cu1->bevresol= cu->bevresol; cu1->ext1= cu->ext1; cu1->ext2= cu->ext2; base->object->recalc |= OB_RECALC_DATA; } } else if (event==25) { /* curve resolution */ if (ELEM(base->object->type, OB_CURVE, OB_FONT)) { cu= ob->data; cu1= base->object->data; cu1->resolu= cu->resolu; cu1->resolu_ren= cu->resolu_ren; nu= cu1->nurb.first; while (nu) { nu->resolu= cu1->resolu; nu= nu->next; } base->object->recalc |= OB_RECALC_DATA; } } else if (event==21) { if (base->object->type==OB_MESH) { ModifierData *md = modifiers_findByType(ob, eModifierType_Subsurf); if (md) { ModifierData *tmd = modifiers_findByType(base->object, eModifierType_Subsurf); if (!tmd) { tmd = modifier_new(eModifierType_Subsurf); BLI_addtail(&base->object->modifiers, tmd); } modifier_copyData(md, tmd); base->object->recalc |= OB_RECALC_DATA; } } } else if (event==22) { /* Copy the constraint channels over */ copy_constraints(&base->object->constraints, &ob->constraints, TRUE); do_scene_sort= 1; } else if (event==23) { base->object->softflag= ob->softflag; if (base->object->soft) sbFree(base->object->soft); base->object->soft= copy_softbody(ob->soft); if (!modifiers_findByType(base->object, eModifierType_Softbody)) { BLI_addhead(&base->object->modifiers, modifier_new(eModifierType_Softbody)); } } else if (event==26) { #if 0 // XXX old animation system copy_nlastrips(&base->object->nlastrips, &ob->nlastrips); #endif // XXX old animation system } else if (event==27) { /* autosmooth */ if (base->object->type==OB_MESH) { Mesh *me= ob->data; Mesh *cme= base->object->data; cme->smoothresh= me->smoothresh; if (me->flag & ME_AUTOSMOOTH) cme->flag |= ME_AUTOSMOOTH; else cme->flag &= ~ME_AUTOSMOOTH; } } else if (event==28) { /* UV orco */ if (ELEM(base->object->type, OB_CURVE, OB_SURF)) { cu= ob->data; cu1= base->object->data; if (cu->flag & CU_UV_ORCO) cu1->flag |= CU_UV_ORCO; else cu1->flag &= ~CU_UV_ORCO; } } else if (event==29) { /* protected bits */ base->object->protectflag= ob->protectflag; } else if (event==30) { /* index object */ base->object->index= ob->index; } else if (event==31) { /* object color */ copy_v4_v4(base->object->col, ob->col); } } } } if (do_scene_sort) DAG_scene_sort(bmain, scene); DAG_ids_flush_update(bmain, 0); }
int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md) { ModifierData *obmd; int sort_depsgraph = 0; /* It seems on rapid delete it is possible to * get called twice on same modifier, so make * sure it is in list. */ for(obmd=ob->modifiers.first; obmd; obmd=obmd->next) if(obmd==md) break; if(!obmd) { BKE_reportf(reports, RPT_ERROR, "Modifier '%s' not in object '%s'", ob->id.name, md->name); return 0; } /* special cases */ if(md->type == eModifierType_ParticleSystem) { ParticleSystemModifierData *psmd=(ParticleSystemModifierData*)md; BLI_remlink(&ob->particlesystem, psmd->psys); psys_free(ob, psmd->psys); psmd->psys= NULL; } else if(md->type == eModifierType_Softbody) { if(ob->soft) { sbFree(ob->soft); ob->soft= NULL; ob->softflag= 0; } } else if(md->type == eModifierType_Collision) { if(ob->pd) ob->pd->deflect= 0; sort_depsgraph = 1; } else if(md->type == eModifierType_Surface) { if(ob->pd && ob->pd->shape == PFIELD_SHAPE_SURFACE) ob->pd->shape = PFIELD_SHAPE_PLANE; sort_depsgraph = 1; } else if(md->type == eModifierType_Smoke) { ob->dt = OB_TEXTURE; } else if(md->type == eModifierType_Multires) { int ok= 1; Mesh *me= ob->data; ModifierData *tmpmd; /* ensure MDISPS CustomData layer is't used by another multires modifiers */ for(tmpmd= ob->modifiers.first; tmpmd; tmpmd= tmpmd->next) if(tmpmd!=md && tmpmd->type == eModifierType_Multires) { ok= 0; break; } if(ok) { if(me->edit_mesh) { EditMesh *em= me->edit_mesh; /* CustomData_external_remove is used here only to mark layer as non-external for further free-ing, so zero element count looks safer than em->totface */ CustomData_external_remove(&em->fdata, &me->id, CD_MDISPS, 0); EM_free_data_layer(em, &em->fdata, CD_MDISPS); } else { CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface); CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface); } } } if(ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) && ob->particlesystem.first == NULL) { ob->mode &= ~OB_MODE_PARTICLE_EDIT; } BLI_remlink(&ob->modifiers, md); modifier_free(md); DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sorting has to be done after the update so that dynamic systems can react properly */ if(sort_depsgraph) DAG_scene_sort(bmain, scene); return 1; }
static int cmdfunc_intcmd( int cmd ) { // cmdfunc : TYPE_INTCMD // (内蔵コマンド) // int p1,p2,p3; // code_next(); // 次のコードを取得(最初に必ず必要です) switch( cmd ) { // サブコマンドごとの分岐 case 0x00: // onexit case 0x01: // onerror case 0x02: // onkey case 0x03: // onclick case 0x04: // oncmd { /* rev 45 不具合 : (onxxx系命令) (ラベル型変数) 形式の書式でエラー に対処 */ int tval = *type; int opt = IRQ_OPT_GOTO; int cust; int actid; IRQDAT *irq; unsigned short *sbr; if ( tval == TYPE_VAR ) { if ( ( ctx->mem_var + *val )->flag == HSPVAR_FLAG_LABEL ) tval = TYPE_LABEL; } if (( tval != TYPE_PROGCMD )&&( tval != TYPE_LABEL )) { // ON/OFF切り替え int i = code_geti(); code_enableirq( cmd, i ); break; } if ( tval == TYPE_PROGCMD ) { // ジャンプ方法指定 opt = *val; if ( opt >= 2 ) throw HSPERR_SYNTAX; code_next(); } sbr = code_getlb2(); if ( cmd != 0x04 ) { code_setirq( cmd, opt, -1, sbr ); break; } cust = code_geti(); actid = *(exinfo->actscr); irq = code_seekirq( actid, cust ); if ( irq == NULL ) irq = code_addirq(); irq->flag = IRQ_FLAG_ENABLE; irq->opt = opt; irq->ptr = sbr; irq->custom = cust; irq->custom2 = actid; break; } case 0x11: // exist case 0x12: // delete case 0x13: // mkdir case 0x14: // chdir code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); code_event( HSPEVENT_FEXIST + (cmd - 0x11), 0, 0, NULL ); break; case 0x15: // dirlist { PVal *pval; APTR aptr; char *ptr; aptr = code_getva( &pval ); code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); p1=code_getdi(0); code_event( HSPEVENT_FDIRLIST1, p1, 0, &ptr ); code_setva( pval, aptr, TYPE_STRING, ptr ); code_event( HSPEVENT_FDIRLIST2, 0, 0, NULL ); break; } case 0x16: // bload case 0x17: // bsave { PVal *pval; char *ptr; int size; int tmpsize; code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); ptr = code_getvptr( &pval, &size ); p1 = code_getdi( -1 ); p2 = code_getdi( -1 ); if (( p1 < 0 )||( p1 > size )) p1 = size; if ( cmd == 0x16 ) { tmpsize = p2;if ( tmpsize<0 ) tmpsize = 0; code_event( HSPEVENT_FREAD, tmpsize, p1, ptr ); } else { code_event( HSPEVENT_FWRITE, p2, p1, ptr ); } break; } case 0x18: // bcopy code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); code_event( HSPEVENT_FCOPY, 0, 0, code_gets() ); break; case 0x19: // memfile { PVal *pval; char *ptr; int size; ptr = code_getvptr( &pval, &size ); p1=code_getdi( 0 ); p2=code_getdi( 0 ); if ( p2==0 ) p2 = size - p1; dpm_memfile( ptr+p1, p2 ); break; } case 0x1a: // poke case 0x1b: // wpoke case 0x1c: // lpoke { PVal *pval; char *ptr; int size; int fl; int len; char *bp; ptr = code_getvptr( &pval, &size ); p1 = code_getdi( 0 ); if ( p1<0 ) throw HSPERR_BUFFER_OVERFLOW; ptr += p1; if ( code_get() <= PARAM_END ) { fl = HSPVAR_FLAG_INT; bp = (char *)&p2; p2 = 0; } else { fl = mpval->flag; bp = mpval->pt; } if ( cmd == 0x1a ) { switch( fl ) { case HSPVAR_FLAG_INT: if ( p1 >= size ) throw HSPERR_BUFFER_OVERFLOW; *ptr = *bp; break; case HSPVAR_FLAG_STR: len = (int)strlen( bp ); ctx->strsize = len; len++; if ( (p1+len)>size ) throw HSPERR_BUFFER_OVERFLOW; strcpy( ptr, bp ); break; default: throw HSPERR_TYPE_MISMATCH; } break; } if ( fl != HSPVAR_FLAG_INT ) throw HSPERR_TYPE_MISMATCH; if ( cmd == 0x1b ) { if ( (p1+2)>size ) throw HSPERR_BUFFER_OVERFLOW; *(short *)ptr = (short)(*(short *)bp); } else { if ( (p1+4)>size ) throw HSPERR_BUFFER_OVERFLOW; *(int *)ptr = (*(int *)bp); } break; } case 0x1d: // getstr { PVal *pval2; PVal *pval; APTR aptr; char *ptr; char *p; int size; aptr = code_getva( &pval ); ptr = code_getvptr( &pval2, &size ); p1 = code_getdi( 0 ); p2 = code_getdi( 0 ); p3 = code_getdi( 1024 ); if ( p1 >= size ) throw HSPERR_BUFFER_OVERFLOW; ptr += p1; p = code_stmp( p3 + 1 ); strsp_ini(); ctx->stat = strsp_get( ptr, p, p2, p3 ); ctx->strsize = strsp_getptr(); code_setva( pval, aptr, HSPVAR_FLAG_STR, p ); break; } case 0x1e: // chdpm code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); p1 = code_getdi( -1 ); dpm_bye(); p2 = dpm_ini( ctx->fnbuffer, 0, -1, p1 ); if ( p2 ) throw HSPERR_FILE_IO; #ifndef HSP3IMP #ifdef HSPWIN Sleep( 1000 ); #endif #endif break; case 0x1f: // memexpand { PVal *pval; APTR aptr; PDAT *ptr; aptr = code_getva( &pval ); ptr = HspVarCorePtrAPTR( pval, aptr ); if (( pval->support & HSPVAR_SUPPORT_FLEXSTORAGE ) == 0 ) throw HSPERR_TYPE_MISMATCH; p1 = code_getdi( 0 ); if ( p1 < 64 ) p1 = 64; HspVarCoreAllocBlock( pval, ptr, p1 ); break; } case 0x20: // memcpy { PVal *pval; char *sptr; char *tptr; int bufsize_t,bufsize_s; tptr = code_getvptr( &pval, &bufsize_t ); sptr = code_getvptr( &pval, &bufsize_s ); p1 = code_getdi( 0 ); p2 = code_getdi( 0 ); p3 = code_getdi( 0 ); if( p2 < 0 || p3 < 0 ) throw HSPERR_BUFFER_OVERFLOW; tptr += p2; sptr += p3; if ( (p1+p2)>bufsize_t ) throw HSPERR_BUFFER_OVERFLOW; if ( (p1+p3)>bufsize_s ) throw HSPERR_BUFFER_OVERFLOW; if ( p1>0 ) { memmove( tptr, sptr, p1 ); } break; } case 0x21: // memset { PVal *pval; char *ptr; int size; ptr = code_getvptr( &pval, &size ); p1 = code_getdi( 0 ); p2 = code_getdi( 0 ); p3 = code_getdi( 0 ); if ( p3 < 0 ) throw HSPERR_BUFFER_OVERFLOW; ptr += p3; if ( (p3+p2)>size ) throw HSPERR_BUFFER_OVERFLOW; if ( p2>0 ) { memset( ptr, p1, p2 ); } break; } case 0x22: // notesel ctx->notep_aptr = ctx->note_aptr; ctx->notep_pval = ctx->note_pval; ctx->note_aptr = code_getva( &ctx->note_pval ); if ( ctx->note_pval->flag != HSPVAR_FLAG_STR ) { code_setva( ctx->note_pval, ctx->note_aptr, TYPE_STRING, "" ); } break; case 0x23: // noteadd { char *np; char *ps; char *tmp; int size; np = note_update(); ps = code_gets(); size = (int)strlen( ps ) + 8; HspVarCoreAllocBlock( ctx->note_pval, (PDAT *)np, (int)strlen(np) + size ); tmp = sbAlloc( size ); strcpy( tmp, ps ); p1 = code_getdi( -1 ); p2 = code_getdi( 0 ); np = note_update(); note.PutLine( tmp, p1, p2 ); sbFree( tmp ); break; } case 0x24: // notedel p1 = code_getdi( 0 ); note_update(); note.PutLine( NULL, p1, 1 ); break; case 0x25: // noteload { int size; char *ptr; char *pdat; code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); p1 = code_getdi( -1 ); code_event( HSPEVENT_FEXIST, 0, 0, NULL ); size = ctx->strsize; if ( size < 0 ) throw HSPERR_FILE_IO; if ( p1>=0 ) if ( size >= p1 ) { ctx->strsize = size = p1; } pdat = note_update(); HspVarCoreAllocBlock( ctx->note_pval, (PDAT *)pdat, size+1 ); ptr = (char *)note_update(); code_event( HSPEVENT_FREAD, 0, size, ptr ); ptr[size] = 0; break; } case 0x26: // notesave { char *pdat; int size; code_event( HSPEVENT_FNAME, 0, 0, code_gets() ); pdat = note_update(); size = (int)strlen( pdat ); code_event( HSPEVENT_FWRITE, -1, size, pdat ); break; } case 0x27: // randomize #ifdef HSPWIN p2 = (int)GetTickCount(); // Windowsの場合はtickをシード値とする #else p2 = (int)time(0); // Windows以外のランダムシード値 #endif p1 = code_getdi( p2 ); srand( p1 ); break; case 0x28: // noteunsel ctx->note_aptr = ctx->notep_aptr; ctx->note_pval = ctx->notep_pval; break; case 0x29: // noteget { PVal *pval; APTR aptr; char *p; note_update(); aptr = code_getva( &pval ); p1 = code_getdi( 0 ); p = note.GetLineDirect( p1 ); code_setva( pval, aptr, TYPE_STRING, p ); note.ResumeLineDirect(); break; } case 0x2a: // split { // 指定した文字列で分割された要素を代入する(fujidig) PVal *pval = NULL; int aptr = 0; char *sptr; char *sep; char *newsptr; int size; int sep_len; int n = 0; int is_last = 0; sptr = code_getvptr( &pval, &size ); if ( pval->flag != HSPVAR_FLAG_STR ) throw HSPERR_TYPE_MISMATCH; sep = code_gets(); sep_len = (int)strlen( sep ); while (1) { newsptr = strstr2( sptr, sep ); if ( !is_last && *exinfo->npexflg & EXFLG_1 ) { // 分割結果の数が格納する変数より多ければ最後の変数に配列で格納していく // ただし最後の要素が a.2 のように要素指定があればそれ以降は全く格納しない if ( aptr != 0 ) pval = NULL; is_last = 1; aptr = 0; } if ( is_last ) { aptr ++; if ( pval != NULL && aptr >= pval->len[1] ) { if ( pval->len[2] != 0 ) throw HSPVAR_ERROR_ARRAYOVER; HspVarCoreReDim( pval, 1, aptr+1 ); } } else { aptr = code_getva( &pval ); } if ( pval != NULL ) { if ( newsptr == NULL ) { code_setva( pval, aptr, HSPVAR_FLAG_STR, sptr ); } else { var_set_str_len( pval, aptr, sptr, (int)(newsptr - sptr) ); } } n ++; if ( newsptr == NULL ) { // 格納する変数の数が分割できた数より多ければ残った変数それぞれに空文字列を格納する while( ( *exinfo->npexflg & EXFLG_1 ) == 0 ) { aptr = code_getva( &pval ); code_setva( pval, aptr, HSPVAR_FLAG_STR, "" ); } break; } sptr = newsptr + sep_len; } ctx->stat = n; break; } default: throw HSPERR_UNSUPPORTED_FUNCTION; } return RUNMODE_RUN; }