Exemple #1
0
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 );
}