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
12 void
SDLVisualTest_RWHelperResetBuffer(SDLVisualTest_RWHelperBuffer * buffer)13 SDLVisualTest_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
24 char
SDLVisualTest_RWHelperReadChar(SDL_RWops * rw,SDLVisualTest_RWHelperBuffer * buffer)25 SDLVisualTest_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 */
42 char*
SDLVisualTest_RWHelperReadLine(SDL_RWops * rw,char * str,int size,SDLVisualTest_RWHelperBuffer * buffer,char comment_char)43 SDLVisualTest_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 */
110 int
SDLVisualTest_RWHelperCountNonEmptyLines(SDL_RWops * rw,SDLVisualTest_RWHelperBuffer * buffer,char comment_char)111 SDLVisualTest_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 }