/* See COPYING.txt for the full license governing this code. */
/**
 * \file rwhelper.c
 *
 * Header file with some helper functions for working with SDL_RWops.
 */

#include <SDL_rwops.h>

#ifndef SDL_visualtest_rwhelper_h_
#define SDL_visualtest_rwhelper_h_

/** Length of the buffer in SDLVisualTest_RWHelperBuffer */
#define RWOPS_BUFFER_LEN 256

/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
extern "C" {
#endif

/**
 * Struct that is used as a buffer by the RW helper functions. Should be initialized by calling
 * SDLVisualTest_RWHelperResetBuffer() before being used.
 */
typedef struct SDLVisualTest_RWHelperBuffer
{
    /*! Character buffer that data is read into */
    char buffer[RWOPS_BUFFER_LEN];
    /*! buffer[buffer_pos] is the next character to be read from the buffer */
    int buffer_pos;
    /*! Number of character read into the buffer */
    int buffer_width;
} SDLVisualTest_RWHelperBuffer;

/**
 * Resets the buffer pointed to by \c buffer used by some of the helper functions.
 * This function should be called when you're using one of the helper functions 
 * with a new SDL_RWops object.
 */
void SDLVisualTest_RWHelperResetBuffer(SDLVisualTest_RWHelperBuffer* buffer);

/**
 * Reads a single character using the SDL_RWops object pointed to by \c rw.
 * This function reads data in blocks and stores them in the buffer pointed to by
 * \c buffer, so other SDL_RWops functions should not be used in conjunction 
 * with this function.
 *
 * \return The character that was read.
 */
char SDLVisualTest_RWHelperReadChar(SDL_RWops* rw,
                                    SDLVisualTest_RWHelperBuffer* buffer);

/**
 * Reads characters using the SDL_RWops object pointed to by \c rw into the
 * character array pointed to by \c str (of size \c size) until either the 
 * array is full or a new line is encountered. If \c comment_char is encountered,
 * all characters from that position till the end of the line are ignored. The new line
 * is not included as part of the buffer. Lines with only whitespace and comments
 * are ignored. This function reads data in blocks and stores them in the buffer
 * pointed to by \c buffer, so other SDL_RWops functions should not be used in
 * conjunction with this function.
 * 
 * \return pointer to the string on success, NULL on failure or EOF.
 */
char* SDLVisualTest_RWHelperReadLine(SDL_RWops* rw, char* str, int size,
                                     SDLVisualTest_RWHelperBuffer* buffer,
                                     char comment_char);

/**
 * Counts the number of lines that are not all whitespace and comments using the
 * SDL_RWops object pointed to by \c rw. \c comment_char indicates the character
 * used for comments. Uses the buffer pointed to by \c buffer to read data in blocks.
 *
 * \return Number of lines on success, -1 on failure.
 */
int SDLVisualTest_RWHelperCountNonEmptyLines(SDL_RWops* rw,
                                             SDLVisualTest_RWHelperBuffer* buffer,
                                             char comment_char);

/* Ends C function definitions when using C++ */
#ifdef __cplusplus
}
#endif

#endif /* SDL_visualtest_rwhelper_h_ */

/* vi: set ts=4 sw=4 expandtab: */
