/* 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 */