| /* See COPYING.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; |
| } |