rwhelper.c (3482B)
1/* See COPYING.txt for the full license governing this code. */ 2/** 3 * \file rwhelper.c 4 * 5 * Source file with some helper functions for working with SDL_RWops. 6 */ 7 8#include <SDL_test.h> 9#include "SDL_visualtest_sut_configparser.h" 10#include "SDL_visualtest_rwhelper.h" 11 12void 13SDLVisualTest_RWHelperResetBuffer(SDLVisualTest_RWHelperBuffer* buffer) 14{ 15 if(!buffer) 16 { 17 SDLTest_LogError("buffer argument cannot be NULL"); 18 return; 19 } 20 buffer->buffer_pos = 0; 21 buffer->buffer_width = 0; 22} 23 24char 25SDLVisualTest_RWHelperReadChar(SDL_RWops* rw, SDLVisualTest_RWHelperBuffer* buffer) 26{ 27 if(!rw || !buffer) 28 return 0; 29 /* if the buffer has been consumed, we fill it up again */ 30 if(buffer->buffer_pos == buffer->buffer_width) 31 { 32 buffer->buffer_width = SDL_RWread(rw, buffer->buffer, 1, RWOPS_BUFFER_LEN); 33 buffer->buffer_pos = 0; 34 if(buffer->buffer_width == 0) 35 return 0; 36 } 37 buffer->buffer_pos++; 38 return buffer->buffer[buffer->buffer_pos - 1]; 39} 40 41/* does not include new lines in the buffer and adds a trailing null character */ 42char* 43SDLVisualTest_RWHelperReadLine(SDL_RWops* rw, char* str, int size, 44 SDLVisualTest_RWHelperBuffer* buffer, 45 char comment_char) 46{ 47 char ch; 48 int current_pos, done; 49 if(!rw) 50 { 51 SDLTest_LogError("rw argument cannot be NULL"); 52 return NULL; 53 } 54 if(!str) 55 { 56 SDLTest_LogError("str argument cannot be NULL"); 57 return NULL; 58 } 59 if(!buffer) 60 { 61 SDLTest_LogError("buffer argument cannot be NULL"); 62 return NULL; 63 } 64 if(size <= 0) 65 { 66 SDLTest_LogError("size argument should be positive"); 67 return NULL; 68 } 69 70 done = 0; 71 while(!done) 72 { 73 /* ignore leading whitespace */ 74 for(ch = SDLVisualTest_RWHelperReadChar(rw, buffer); ch && SDL_isspace(ch); 75 ch = SDLVisualTest_RWHelperReadChar(rw, buffer)); 76 77 for(current_pos = 0; 78 ch && ch != '\n' && ch != '\r' && ch != comment_char; 79 current_pos++) 80 { 81 str[current_pos] = ch; 82 if(current_pos >= size - 2) 83 { 84 current_pos++; 85 break; 86 } 87 ch = SDLVisualTest_RWHelperReadChar(rw, buffer); 88 } 89 90 done = 1; 91 if(ch == comment_char) /* discard all characters until the next line */ 92 { 93 do 94 { 95 ch = SDLVisualTest_RWHelperReadChar(rw, buffer); 96 }while(ch && ch != '\n' && ch != '\r'); 97 98 if(current_pos == 0) 99 done = 0; 100 } 101 } 102 if(current_pos == 0) 103 return NULL; 104 105 str[current_pos] = '\0'; 106 return str; 107} 108 109/* Lines with all whitespace are ignored */ 110int 111SDLVisualTest_RWHelperCountNonEmptyLines(SDL_RWops* rw, 112 SDLVisualTest_RWHelperBuffer* buffer, 113 char comment_char) 114{ 115 int num_lines = 0; 116 char str[MAX_SUTOPTION_LINE_LENGTH]; 117 if(!rw) 118 { 119 SDLTest_LogError("rw argument cannot be NULL"); 120 return -1; 121 } 122 if(!buffer) 123 { 124 SDLTest_LogError("buffer argument cannot be NULL"); 125 return -1; 126 } 127 while(SDLVisualTest_RWHelperReadLine(rw, str, MAX_SUTOPTION_LINE_LENGTH, 128 buffer, comment_char)) 129 num_lines++; 130 return num_lines; 131}