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; }
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; }
/* ========================================================================================= */ 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 ); }
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; }