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 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; }
static void HspVarStr_Alloc( PVal *pval, const PVal *pval2 ) { // pval変数が必要とするサイズを確保する。 // (pvalがすでに確保されているメモリ解放は呼び出し側が行なう) // (pval2がNULLの場合は、新規データ。len[0]に確保バイト数が代入される) // (pval2が指定されている場合は、pval2の内容を継承して再確保) // char **pp; int i, i2, size, bsize; PVal oldvar; if ( pval->len[1] < 1 ) pval->len[1] = 1; // 配列を最低1は確保する if ( pval2 != NULL ) oldvar = *pval2; // 拡張時は以前の情報を保存する size = GetVarSize( pval ); pval->mode = HSPVAR_MODE_MALLOC; pval->master = (char *)calloc( size, 1 ); if ( pval->master == NULL ) throw HSPERR_OUT_OF_MEMORY; if ( pval2 == NULL ) { // 配列拡張なし bsize = pval->len[0]; if ( bsize < 64 ) bsize = 64; for(i=0;i<(int)(size/sizeof(char *));i++) { pp = GetFlexBufPtr( pval, i ); *pp = sbAllocClear( bsize ); sbSetOption( *pp, (void *)pp ); } return; } i2 = oldvar.size / sizeof(char *); for(i=0;i<(int)(size/sizeof(char *));i++) { pp = GetFlexBufPtr( pval, i ); if ( i>=i2 ) { *pp = sbAllocClear( 64 ); // 新規確保分 } else { *pp = *GetFlexBufPtr( &oldvar, i ); // 確保済みバッファ } sbSetOption( *pp, (void *)pp ); } free( oldvar.master ); }