/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8-*- */
/*
* This file is part of The Croco Library
*
* modify it under the terms of version 2.1 of the GNU Lesser General Public
* License as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* Author: Dodji Seketeli
* See COPYRIGHTS file for copyright information.
*/
#include "stdio.h"
#include <string.h>
#include "cr-input.h"
#include "cr-enc-handler.h"
/**
*@CRInput:
*
*The definition of the #CRInput class.
*/
/*******************
*Private type defs
*******************/
/**
*The private attributes of
*the #CRInputPriv class.
*/
struct _CRInputPriv {
/*
*The input buffer
*/
/*
*The index of the next byte
*to be read.
*/
/*
*The current line number
*/
/*
*The current col number
*/
/*
*the reference count of this
*instance.
*/
};
/***************************
*private constants
**************************/
static CRInput *cr_input_new_real (void);
static CRInput *
cr_input_new_real (void)
{
if (!result) {
cr_utils_trace_info ("Out of memory");
return NULL;
}
cr_utils_trace_info ("Out of memory");
return NULL;
}
return result;
}
/****************
*Public methods
***************/
/**
* cr_input_new_from_buf:
*@a_buf: the memory buffer to create the input stream from.
*The #CRInput keeps this pointer so user should not free it !.
*@a_len: the size of the input buffer.
*@a_enc: the buffer's encoding.
*@a_free_buf: if set to TRUE, this a_buf will be freed
*at the destruction of this instance. If set to false, it is up
*to the caller to free it.
*
*Creates a new input stream from a memory buffer.
*Returns the newly built instance of #CRInput.
*/
CRInput *
enum CREncoding a_enc,
{
result = cr_input_new_real ();
/*transform the encoding in utf8 */
if (!enc_handler) {
goto error;
}
goto error;
}
} else {
}
return result;
if (result) {
}
return NULL;
}
/**
* cr_input_new_from_uri:
*@a_file_uri: the file to create *the input stream from.
*@a_enc: the encoding of the file *to create the input from.
*
*Creates a new input stream from
*a file.
*
*Returns the newly created input stream if
*this method could read the file and create it,
*NULL otherwise.
*/
CRInput *
{
len = 0,
buf_size = 0;
#ifdef CR_DEBUG
cr_utils_trace_debug ("could not open file");
#endif
return NULL;
}
/*load the file */
while (loop) {
CR_INPUT_MEM_CHUNK_SIZE /*nb of bytes */ ,
file_ptr);
if (nb_read != CR_INPUT_MEM_CHUNK_SIZE) {
/*we read less chars than we wanted */
/*we reached eof */
} else {
/*a pb occured !! */
cr_utils_trace_debug ("an io error occured");
goto cleanup;
}
}
/*read went well */
}
}
if (!result) {
goto cleanup;
}
/*
*we should free buf here because it's own by CRInput.
*(see the last parameter of cr_input_new_from_buf().
*/
}
if (file_ptr) {
}
if (buf) {
}
return result;
}
/**
* cr_input_destroy:
*@a_this: the current instance of #CRInput.
*
*The destructor of the #CRInput class.
*/
void
{
return;
}
}
}
/**
* cr_input_ref:
*@a_this: the current instance of #CRInput.
*
*Increments the reference count of the current
*instance of #CRInput.
*/
void
{
}
/**
* cr_input_unref:
*@a_this: the current instance of #CRInput.
*
*Decrements the reference count of this instance
*of #CRInput. If the reference count goes down to
*zero, this instance is destroyed.
*
* Returns TRUE if the instance of #CRInput got destroyed, false otherwise.
*/
{
}
return TRUE;
}
return FALSE;
}
/**
* cr_input_end_of_input:
*@a_this: the current instance of #CRInput.
*@a_end_of_input: out parameter. Is set to TRUE if
*the current instance has reached the end of its input buffer,
*FALSE otherwise.
*
*Tests wether the current instance of
*#CRInput has reached its input buffer.
*
* Returns CR_OK upon successful completion, an error code otherwise.
* Note that all the out parameters of this method are valid if
* and only if this method returns CR_OK.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_get_nb_bytes_left:
*@a_this: the current instance of #CRInput.
*
*Returns the number of bytes left in the input stream
*before the end, -1 in case of error.
*/
{
return 0;
}
/**
* cr_input_read_byte:
*@a_this: the current instance of #CRInput.
*@a_byte: out parameter the returned byte.
*
*Gets the next byte of the input.
*Updates the state of the input so that
*the next invocation of this method returns
*the next coming byte.
*
*Returns CR_OK upon successful completion, an error code
*otherwise. All the out parameters of this method are valid if
*and only if this method returns CR_OK.
*/
enum CRStatus
{
&& a_byte, CR_BAD_PARAM_ERROR);
return CR_END_OF_INPUT_ERROR;
} else {
}
return CR_OK;
}
/**
* cr_input_read_char:
*@a_this: the current instance of CRInput.
*@a_char: out parameter. The read character.
*
*Reads an unicode character from the current instance of
*#CRInput.
*
*Returns CR_OK upon successful completion, an error code
*otherwise.
*/
enum CRStatus
{
nb_bytes_left = 0;
return CR_END_OF_INPUT_ERROR;
if (nb_bytes_left < 1) {
return CR_END_OF_INPUT_ERROR;
}
+
/*update next byte index */
/*update line and column number */
} else if (*a_char != '\n') {
}
if (*a_char == '\n') {
}
}
return status;
}
/**
* cr_input_set_line_num:
*@a_this: the "this pointer" of the current instance of #CRInput.
*@a_line_num: the new line number.
*
*Setter of the current line number.
*
*Return CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_get_line_num:
*@a_this: the "this pointer" of the current instance of #CRInput.
*@a_line_num: the returned line number.
*
*Getter of the current line number.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
&& a_line_num, CR_BAD_PARAM_ERROR);
return CR_OK;
}
/**
* cr_input_set_column_num:
*@a_this: the "this pointer" of the current instance of #CRInput.
*@a_col: the new column number.
*
*Setter of the current column number.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_get_column_num:
*@a_this: the "this pointer" of the current instance of #CRInput.
*@a_col: out parameter
*
*Getter of the current column number.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_increment_line_num:
*@a_this: the "this pointer" of the current instance of #CRInput.
*@a_increment: the increment to add to the line number.
*
*Increments the current line number.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_increment_col_num:
*@a_this: the "this pointer" of the current instance of #CRInput.
*@a_increment: the increment to add to the column number.
*
*Increments the current column number.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_consume_char:
*@a_this: the this pointer.
*@a_char: the character to consume. If set to zero,
*consumes any character.
*
*Consumes the next character of the input stream if
*and only if that character equals a_char.
*
*Returns CR_OK upon successful completion, CR_PARSING_ERROR if
*next char is different from a_char, an other error code otherwise
*/
enum CRStatus
{
guint32 c;
return status;
}
} else {
return CR_PARSING_ERROR;
}
return status;
}
/**
* cr_input_consume_chars:
*@a_this: the this pointer of the current instance of #CRInput.
*@a_char: the character to consume.
*If set to a negative value, the function will consume all the occurences
*of a_char found.
*After return, if the return value equals CR_OK, this variable contains
*the number of characters actually consumed.
*
*Consumes up to a_nb_char occurences of the next contiguous characters
*which equal a_char. Note that the next character of the input stream
**MUST* equal a_char to trigger the consumption, or else, the error
*code CR_PARSING_ERROR is returned.
*If the number of contiguous characters that equals a_char is less than
*a_nb_char, then this function consumes all the characters it can consume.
*
*Returns CR_OK if at least one character has been consumed, an error code
*otherwise.
*/
enum CRStatus
{
&& (*a_nb_char > 0
&& nb_consumed < *a_nb_char));
nb_consumed++) {
}
*a_nb_char = nb_consumed;
if ((nb_consumed > 0)
&& ((status == CR_PARSING_ERROR)
|| (status == CR_END_OF_INPUT_ERROR))) {
}
return status;
}
/**
* cr_input_consume_white_spaces:
*@a_this: the "this pointer" of the current instance of #CRInput.
*consume. After return, holds the number of white spaces actually consumed.
*
*Same as cr_input_consume_chars() but this one consumes white
*spaces.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
nb_consumed = 0;
for (nb_consumed = 0;
nb_consumed++) {
break;
/*if the next char is a white space, consume it ! */
break;
continue;
}
break;
}
}
return status;
}
/**
* cr_input_peek_char:
*@a_this: the current instance of #CRInput.
*@a_char: out parameter. The returned character.
*
*Same as cr_input_read_char() but does not update the
*internal state of the input stream. The next call
*to cr_input_peek_char() or cr_input_read_char() will thus
*return the same character as the current one.
*
*Returns CR_OK upon successful completion, an error code
*otherwise.
*/
enum CRStatus
{
nb_bytes_left = 0;
&& a_char, CR_BAD_PARAM_ERROR);
return CR_END_OF_INPUT_ERROR;
}
if (nb_bytes_left < 1) {
return CR_END_OF_INPUT_ERROR;
}
return status;
}
/**
* cr_input_peek_byte:
*@a_this: the current instance of #CRInput.
*@a_origin: the origin to consider in the calculation
*of the position of the byte to peek.
*@a_offset: the offset of the byte to peek, starting from
*the origin specified by a_origin.
*@a_byte: out parameter the peeked byte.
*
*Gets a byte from the input stream,
*starting from the current position in the input stream.
*Unlike cr_input_peek_next_byte() this method
*does not update the state of the current input stream.
*Subsequent calls to cr_input_peek_byte with the same arguments
*will return the same byte.
*
*Returns CR_OK upon successful completion or,
*CR_BAD_PARAM_ERROR if at least one of the parameters is invalid;
*CR_OUT_OF_BOUNDS_ERROR if the indexed byte is out of bounds.
*/
enum CRStatus
{
&& a_byte, CR_BAD_PARAM_ERROR);
switch (a_origin) {
case CR_SEEK_CUR:
break;
case CR_SEEK_BEGIN:
break;
case CR_SEEK_END:
break;
default:
return CR_BAD_PARAM_ERROR;
}
return CR_OK;
} else {
return CR_END_OF_INPUT_ERROR;
}
}
/**
* cr_input_peek_byte2:
*@a_this: the current byte input stream.
*@a_offset: the offset of the byte to peek, starting
*from the current input position pointer.
*@a_eof: out parameter. Is set to true is we reach end of
*stream. If set to NULL by the caller, this parameter is not taken
*in account.
*
*Same as cr_input_peek_byte() but with a simplified
*interface.
*
*Returns the read byte or 0 if something bad happened.
*/
{
if (a_eof)
if ((status == CR_END_OF_INPUT_ERROR)
&& a_eof)
return result;
}
/**
* cr_input_get_byte_addr:
*@a_this: the current instance of #CRInput.
*@a_offset: the offset of the byte in the input stream starting
*from the beginning of the stream.
*
*Gets the memory address of the byte located at a given offset
*in the input stream.
*
*Returns the address, otherwise NULL if an error occured.
*/
guchar *
{
return NULL;
}
}
/**
* cr_input_get_cur_byte_addr:
*@a_this: the current input stream
*@a_offset: out parameter. The returned address.
*
*Gets the address of the current character pointer.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_START_OF_INPUT_ERROR;
}
return CR_OK;
}
/**
* cr_input_seek_index:
*@a_this: the current instance of #CRInput.
*@a_origin: the origin to consider during the calculation
*of the absolute position of the new "current byte index".
*@a_pos: the relative offset of the new "current byte index."
*This offset is relative to the origin a_origin.
*
*Sets the "current byte index" of the current instance
*of #CRInput. Next call to cr_input_get_byte() will return
*the byte next after the new "current byte index".
*
*Returns CR_OK upon successful completion otherwise returns
*CR_BAD_PARAM_ERROR if at least one of the parameters is not valid
*or CR_OUT_BOUNDS_ERROR in case of error.
*/
enum CRStatus
{
switch (a_origin) {
case CR_SEEK_CUR:
break;
case CR_SEEK_BEGIN:
abs_offset = a_pos;
break;
case CR_SEEK_END:
break;
default:
return CR_BAD_PARAM_ERROR;
}
if ((abs_offset > 0)
/*update the input stream's internal state */
return CR_OK;
}
return CR_OUT_OF_BOUNDS_ERROR;
}
/**
* cr_input_get_cur_pos:
*@a_this: the current instance of #CRInput.
*@a_pos: out parameter. The returned position.
*
*Gets the position of the "current byte index" which
*is basically the position of the last returned byte in the
*input stream.
*
*Returns CR_OK upon successful completion. Otherwise,
*CR_BAD_PARAMETER_ERROR if at least one of the arguments is invalid.
*CR_START_OF_INPUT if no call to either cr_input_read_byte()
*or cr_input_seek_index() have been issued before calling
*cr_input_get_cur_pos()
*Note that the out parameters of this function are valid if and only if this
*function returns CR_OK.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_get_parsing_location:
*@a_this: the current instance of #CRInput
*@a_loc: the set parsing location.
*
*Gets the current parsing location.
*The Parsing location is a public datastructure that
*stream.
*
*Returns CR_OK upon successful completion, an error
*code otherwise.
*/
enum CRStatus
{
&& a_loc,
} else {
}
return CR_OK ;
}
/**
* cr_input_get_cur_index:
*@a_this: the "this pointer" of the current instance of
*#CRInput
*@a_index: out parameter. The returned index.
*
*Getter of the next byte index.
*It actually returns the index of the
*next byte to be read.
*
*Returns CR_OK upon successful completion, an error code
*otherwise.
*/
enum CRStatus
{
&& a_index, CR_BAD_PARAM_ERROR);
return CR_OK;
}
/**
* cr_input_set_cur_index:
*@a_this: the "this pointer" of the current instance
*of #CRInput .
*@a_index: the new index to set.
*
*Setter of the next byte index.
*It sets the index of the next byte to be read.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_set_end_of_file:
*@a_this: the current instance of #CRInput.
*@a_eof: the new end of file flag.
*
*Sets the end of file flag.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_get_end_of_file:
*@a_this: the current instance of #CRInput.
*@a_eof: out parameter the place to put the end of
*file flag.
*
*Gets the end of file flag.
*
*Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
&& a_eof, CR_BAD_PARAM_ERROR);
return CR_OK;
}
/**
* cr_input_set_end_of_line:
*@a_this: the current instance of #CRInput.
*@a_eol: the new end of line flag.
*
*Sets the end of line flag.
*
*Returns CR_OK upon successful completion, an error code
*otherwise.
*/
enum CRStatus
{
return CR_OK;
}
/**
* cr_input_get_end_of_line:
*@a_this: the current instance of #CRInput
*@a_eol: out parameter. The place to put
*the returned flag
*
*Gets the end of line flag of the current input.
*
*Returns CR_OK upon successful completion, an error code
*otherwise.
*/
enum CRStatus
{
&& a_eol, CR_BAD_PARAM_ERROR);
return CR_OK;
}
/**
* cr_input_set_cur_pos:
*@a_this: the "this pointer" of the current instance of
*#CRInput.
*@a_pos: the new position.
*
*Sets the current position in the input stream.
*
* Returns CR_OK upon successful completion, an error code otherwise.
*/
enum CRStatus
{
return CR_OK;
}