| /* See LICENSE.txt for the full license governing this code. */ | 
 | /** | 
 |  * \file rwhelper.c | 
 |  * | 
 |  * Source file with some helper functions for working with SDL_RWops. | 
 |  */ | 
 |  | 
 | #include <SDL_test.h> | 
 | #include "SDL_visualtest_sut_configparser.h" | 
 | #include "SDL_visualtest_rwhelper.h" | 
 |  | 
 | void | 
 | SDLVisualTest_RWHelperResetBuffer(SDLVisualTest_RWHelperBuffer* buffer) | 
 | { | 
 |     if(!buffer) | 
 |     { | 
 |         SDLTest_LogError("buffer argument cannot be NULL"); | 
 |         return; | 
 |     } | 
 |     buffer->buffer_pos = 0; | 
 |     buffer->buffer_width = 0; | 
 | } | 
 |  | 
 | char | 
 | SDLVisualTest_RWHelperReadChar(SDL_RWops* rw, SDLVisualTest_RWHelperBuffer* buffer) | 
 | { | 
 |     if(!rw || !buffer) | 
 |         return 0; | 
 |     /* if the buffer has been consumed, we fill it up again */ | 
 |     if(buffer->buffer_pos == buffer->buffer_width) | 
 |     { | 
 |         buffer->buffer_width = SDL_RWread(rw, buffer->buffer, 1, RWOPS_BUFFER_LEN); | 
 |         buffer->buffer_pos = 0; | 
 |         if(buffer->buffer_width == 0) | 
 |             return 0; | 
 |     } | 
 |     buffer->buffer_pos++; | 
 |     return buffer->buffer[buffer->buffer_pos - 1]; | 
 | } | 
 |  | 
 | /* does not include new lines in the buffer and adds a trailing null character */ | 
 | char* | 
 | SDLVisualTest_RWHelperReadLine(SDL_RWops* rw, char* str, int size, | 
 |                                SDLVisualTest_RWHelperBuffer* buffer, | 
 |                                char comment_char) | 
 | { | 
 |     char ch; | 
 |     int current_pos, done; | 
 |     if(!rw) | 
 |     { | 
 |         SDLTest_LogError("rw argument cannot be NULL"); | 
 |         return NULL; | 
 |     } | 
 |     if(!str) | 
 |     { | 
 |         SDLTest_LogError("str argument cannot be NULL"); | 
 |         return NULL; | 
 |     } | 
 |     if(!buffer) | 
 |     { | 
 |         SDLTest_LogError("buffer argument cannot be NULL"); | 
 |         return NULL; | 
 |     } | 
 |     if(size <= 0) | 
 |     { | 
 |         SDLTest_LogError("size argument should be positive"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     done = 0; | 
 |     while(!done) | 
 |     { | 
 |         /* ignore leading whitespace */ | 
 |         for(ch = SDLVisualTest_RWHelperReadChar(rw, buffer); ch && SDL_isspace(ch); | 
 |             ch = SDLVisualTest_RWHelperReadChar(rw, buffer)); | 
 |  | 
 |         for(current_pos = 0; | 
 |             ch && ch != '\n' && ch != '\r' && ch != comment_char; | 
 |             current_pos++) | 
 |         { | 
 |             str[current_pos] = ch; | 
 |             if(current_pos >= size - 2) | 
 |             { | 
 |                 current_pos++; | 
 |                 break; | 
 |             } | 
 |             ch = SDLVisualTest_RWHelperReadChar(rw, buffer); | 
 |         } | 
 |  | 
 |         done = 1; | 
 |         if(ch == comment_char) /* discard all characters until the next line */ | 
 |         { | 
 |             do | 
 |             { | 
 |                 ch = SDLVisualTest_RWHelperReadChar(rw, buffer); | 
 |             }while(ch && ch != '\n' && ch != '\r'); | 
 |  | 
 |             if(current_pos == 0) | 
 |                 done = 0; | 
 |         } | 
 |     } | 
 |     if(current_pos == 0) | 
 |         return NULL; | 
 |  | 
 |     str[current_pos] = '\0'; | 
 |     return str; | 
 | } | 
 |  | 
 | /* Lines with all whitespace are ignored */ | 
 | int | 
 | SDLVisualTest_RWHelperCountNonEmptyLines(SDL_RWops* rw, | 
 |                                          SDLVisualTest_RWHelperBuffer* buffer, | 
 |                                          char comment_char) | 
 | { | 
 |     int num_lines = 0; | 
 |     char str[MAX_SUTOPTION_LINE_LENGTH]; | 
 |     if(!rw) | 
 |     { | 
 |         SDLTest_LogError("rw argument cannot be NULL"); | 
 |         return -1; | 
 |     } | 
 |     if(!buffer) | 
 |     { | 
 |         SDLTest_LogError("buffer argument cannot be NULL"); | 
 |         return -1; | 
 |     } | 
 |     while(SDLVisualTest_RWHelperReadLine(rw, str, MAX_SUTOPTION_LINE_LENGTH, | 
 |                                          buffer, comment_char)) | 
 |         num_lines++; | 
 |     return num_lines; | 
 | } |