Exemplo n.º 1
0
static rc_t CC write_to_namelist( void * dst, const String * S )
{
    rc_t rc = 0;
    VNamelist * namelist = dst;
    if ( S->len > 3 && S->addr[ 0 ] == '@' && S->addr[ 1 ] == 'R' && S->addr[ 2 ] == 'G' )
        rc = VNamelistAppendString ( namelist, S );
    return rc;
}
Exemplo n.º 2
0
static rc_t LoadFromFile( struct KFile const * f, VNamelist * nl )
{
    rc_t rc = 0;
    uint64_t pos = 0;
    char buffer[ 4096 ];
    buffer_range range;
    bool done = false;

    range.start = buffer;
    range.count = 0;
    range.processed = 0;
    range.state = STATE_ALPHA;

    do
    {
        size_t num_read;
        rc = KFileRead ( f, pos, ( char * )( range.start + range.processed ),
                         ( sizeof buffer ) - range.processed, &num_read );
        if ( rc == 0 )
        {
            done = ( num_read == 0 );
            if ( !done )
            {
                range.start = buffer;
                range.count = range.processed + num_read;

                LoadFromBuffer( nl, &range );
                if ( range.count > 0 )
                {
                    memmove ( buffer, range.start, range.count );
                }
                range.start = buffer;
                range.processed = range.count;

                pos += num_read;
            }
            else if ( range.state == STATE_ALPHA )
            {
                String S;
                S.addr = range.start;
                S.len = S.size = range.count;
                VNamelistAppendString ( nl, &S );
            }
        }
    } while ( rc == 0 && !done );

    return rc;
}
Exemplo n.º 3
0
/* ========================================================================================= */
static rc_t vds_add_to_sections( const char * path, uint32_t start, uint32_t len, VNamelist * sections )
{
    String S;
    StringInit( &S, &( path[ start ] ), len, len );
    return VNamelistAppendString ( sections, &S );
}
Exemplo n.º 4
0
static void LoadFromBuffer( VNamelist * nl, buffer_range * range )
{
    uint32_t idx;
    const char * p = range->start;
    String S;

    S.addr = p;
    S.len = S.size = range->processed;
    for ( idx = range->processed; idx < range->count; ++idx )
    {
        switch( p[ idx ] )
        {
        case 0x0A :
            switch( range->state )
            {
            case STATE_ALPHA : /* ALPHA --> LF */
                VNamelistAppendString ( nl, &S );
                range->state = STATE_LF;
                break;

            case STATE_LF : /* LF --> LF */
                VNamelistAppend ( nl, empty_str );
                break;

            case STATE_NL : /* NL --> LF */
                VNamelistAppend ( nl, empty_str );
                range->state = STATE_LF;
                break;
            }
            break;

        case 0x0D :
            switch( range->state )
            {
            case STATE_ALPHA : /* ALPHA --> NL */
                VNamelistAppendString ( nl, &S );
                range->state = STATE_NL;
                break;

            case STATE_LF : /* LF --> NL */
                range->state = STATE_NL;
                break;

            case STATE_NL : /* NL --> NL */
                VNamelistAppend ( nl, empty_str );
                break;
            }
            break;

        default   :
            switch( range->state )
            {
            case STATE_ALPHA : /* ALPHA --> ALPHA */
                S.len++;
                S.size++;
                break;

            case STATE_LF : /* LF --> ALPHA */
                S.addr = &p[ idx ];
                S.len = S.size = 1;
                range->state = STATE_ALPHA;
                break;

            case STATE_NL : /* NL --> ALPHA */
                S.addr = &p[ idx ];
                S.len = S.size = 1;
                range->state = STATE_ALPHA;
                break;
            }
            break;
        }
    }
    if ( range->state == STATE_ALPHA )
    {
        range->start = S.addr;
        range->count = S.len;
    }
    else
        range->count = 0;
}