
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef GUTHTHILA_READER_H
#define GUTHTHILA_READER_H

#include <stdio.h>
#include <guththila_defines.h>
#include <axutil_utils.h>

EXTERN_C_START()  

typedef int(GUTHTHILA_CALL * GUTHTHILA_READ_INPUT_CALLBACK)(
        guththila_char_t *buffer,
        int size,
        void *ctx);

enum guththila_reader_type
{
    GUTHTHILA_FILE_READER = 1, 
	GUTHTHILA_IO_READER, 
	GUTHTHILA_MEMORY_READER
};

typedef struct guththila_reader_s
{
    int type;				/* Type of reader */
    FILE *fp;				/* File pointer */
    guththila_char_t *buff;	/* Buffer */
    int buff_size;			/* Buff size */
	GUTHTHILA_READ_INPUT_CALLBACK input_read_callback;	/* Call back */
    void *context;			/* Context */
} guththila_reader_t;

#ifndef GUTHTHILA_READER_SET_LAST_START
#define GUTHTHILA_READER_SET_LAST_START(_reader, _start) ((_reader)->start = _start)
#endif  

#ifndef GUTHTHILA_READER_STEP_BACK
#define GUTHTHILA_READER_STEP_BACK(_reader) ((_reader->next--))
#endif  

/* 
 * Reading a file.
 * @param filename	name of the file
 * @param env environment
 */
GUTHTHILA_EXPORT guththila_reader_t * GUTHTHILA_CALL
guththila_reader_create_for_file(
    guththila_char_t *filename,
    const axutil_env_t * env);

/*
 * Reading from a call back function.
 * @param input_read_callback function pointer to read data
 * @param ctx context
 * @param env environment
 */
GUTHTHILA_EXPORT guththila_reader_t * GUTHTHILA_CALL
guththila_reader_create_for_io(
    GUTHTHILA_READ_INPUT_CALLBACK input_read_callback,
    void *ctx,
    const axutil_env_t * env);

/*
 * Reading from memory buffer.
 * @param buffer buffer
 * @param size	size of the buffer
 * @param env environment
 */
GUTHTHILA_EXPORT guththila_reader_t * GUTHTHILA_CALL
guththila_reader_create_for_memory(
    void *buffer,
    int size,
    const axutil_env_t * env);

/* 
 * Read the specified number of character to the given buffer.
 * @param r reader
 * @param buffer buffer to place the read data
 * @param offset position to place the data on the given buffer
 * @param length number of bytes to read
 * @param env environment
 * @return number of bytes put in to the buffer. -1 if end of the read. 
 */
GUTHTHILA_EXPORT int GUTHTHILA_CALL
guththila_reader_read(
    guththila_reader_t * r,
    guththila_char_t * buffer,
    int offset,
    int length,
    const axutil_env_t * env);

/* 
 * Free the reader.
 * @param r reader
 * @param env environment
 */
GUTHTHILA_EXPORT void GUTHTHILA_CALL
guththila_reader_free(
    guththila_reader_t * r,
    const axutil_env_t * env);

EXTERN_C_END() 
#endif  /*  */

