Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- har *
- readUntilEOL( FILE *line )
- {
- int cycle_counter = 1;
- char *buffer = NULL;
- char *buffer_saver = NULL; // if after realloc we lose memory
- if ( line == NULL ) {
- perror( "Empty file!" );
- return NULL;
- } else {
- const unsigned int BUFFER_SIZE = 1000000;
- buffer = calloc( BUFFER_SIZE, sizeof( *buffer ) );
- if ( buffer == NULL ) {
- perror( "Not enough memory for calloc" );
- return NULL;
- }
- do {
- buffer_saver = fgets( buffer + ( cycle_counter - 1 ) * ( BUFFER_SIZE - 1 ), BUFFER_SIZE, line );
- if ( buffer_saver == NULL ) { // third variant
- return buffer;
- }
- if ( ( strlen( buffer ) == 1 ) && ( buffer[0] == '\n' ) ) { // if it's blank string
- free( buffer );
- return NULL;
- }
- if ( buffer[ strlen( buffer ) - 1 ] == '\n' ) {
- return buffer;
- }
- cycle_counter++;
- buffer_saver = realloc( buffer, 1 + cycle_counter * ( BUFFER_SIZE - 1 ) * sizeof( *buffer ) );
- // we checked, that it's not EOL and EOF earlier, so we have at least one more symbol in line, so we have at least one byte of memory
- if ( buffer_saver == NULL ) {
- int memory_size = 1;
- buffer_saver = realloc( buffer, memory_size + 1 + ( BUFFER_SIZE - 1 ) * ( cycle_counter - 1 ) * sizeof( *buffer ) );
- while ( buffer_saver != NULL ) {
- buffer_saver = fgets( buffer + memory_size + ( cycle_counter - 1 ) * ( BUFFER_SIZE - 1 ), 1, line );
- if ( buffer_saver == NULL ) { // third variant
- return buffer;
- }
- if ( buffer[ strlen( buffer ) - 1 ] == '\n' ) {
- return buffer;
- }
- memory_size++;
- buffer_saver = realloc( buffer, ( memory_size + 1 + ( BUFFER_SIZE - 1 ) * ( cycle_counter - 1 ) * sizeof( *buffer ) ) );
- }
- perror( "Not enough memory for realloc." );
- free( buffer );
- return NULL;
- }
- buffer = buffer_saver;
- } while ( 1 );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement