2021-05-09 13:30:38 +04:00
|
|
|
/* See LICENSE.txt for the full license governing this code. */
|
2021-04-18 07:35:25 +04:00
|
|
|
/**
|
|
|
|
* \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;
|
|
|
|
}
|