コード例 #1
0
		void* BufferManager::Allocate(size_type size, size_type alignment)
		{
			const auto offset = GetFinalOffset(static_cast<const void*>(buffer_ + cursor_), alignment);
            if (cursor_ + offset + size > bufferSize_) return {};
			void* result = static_cast<void*>(buffer_ + cursor_ + offset);
			cursor_ += (size + offset);
			return result;
		}
コード例 #2
0
/*
// Struct Value Operand
//
// Returns 0 for OK, or -1 for Fatal Error
*/
static int StructValueOperand( char *source, int CmdType, uint *pValue )
{
    ASSIGN *pas;
    STRUCT *pst;
    char name[STRUCT_NAME_LEN];
    char name2[STRUCT_NAME_LEN];
    char *ext = 0;
    int i;

    for(i=0; i<STRUCT_NAME_LEN; i++)
    {
        name[i] = source[i];
        if( name[i]=='.' || name[i]==0 )
            break;
    }
    if( i==STRUCT_NAME_LEN )
        return(-1);

    if( name[i]=='.' )
    {
        name[i]=0;
        strcpy(name2,source+i+1);

        /*
        // Look for a name extenion. For example, the "W2" on "MyStruct.MyField.W2"
        */
        for(i=0; i<STRUCT_NAME_LEN; i++)
        {
            if( name2[i]=='.' || name2[i]==0 )
                break;
        }
        if( i==STRUCT_NAME_LEN )
            return(-1);
        if( name2[i]=='.' )
        {
            name2[i]=0;
            ext = name2+i+1;
        }
    }
    else
        name2[0]=0;

    pas = AssignFind(name);
    if( pas )
    {
        if( !strlen(name2) )
        {
            if( CmdType==SVO_SIZEOF )
                *pValue = pas->TotalSize;
            else
                *pValue = 0;
            return(0);
        }

        for( i=0; i<pas->Elements; i++ )
        {
            if( !stricmp(name2,pas->ElemName[i]) )
                break;
        }

        if( i==pas->Elements )
            return(-1);

        if( CmdType==SVO_SIZEOF )
        {
            if(ext)
                return( GetFinalSize( ext, pas->Size[i], pValue ) );
            *pValue = pas->Size[i];
        }
        else
        {
            if(ext)
                return( GetFinalOffset( ext, pas->Size[i], pas->Offset[i], pValue ) );
            *pValue = pas->Offset[i];
        }
        return(0);
    }

    pst = StructFind(name);
    if( pst )
    {
        if( !strlen(name2) )
        {
            if( CmdType==SVO_SIZEOF )
                *pValue = pst->TotalSize;
            else
                *pValue = 0;
            return(0);
        }

        for( i=0; i<pst->Elements; i++ )
        {
            if( !stricmp(name2,pst->ElemName[i]) )
                break;
        }

        if( i==pst->Elements )
            return(-1);

        if( CmdType==SVO_SIZEOF )
        {
            if(ext)
                return( GetFinalSize( ext, pst->Size[i], pValue ) );
            *pValue = pst->Size[i];
        }
        else
        {
            if(ext)
                return( GetFinalOffset( ext, pst->Size[i], pst->Offset[i], pValue ) );
            *pValue = pst->Offset[i];
        }
        return(0);
    }

    return -1;
}