/* Copyright (C) 2011 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** 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.
*/
#ifndef _ANDROID_UTILS_LINEINPUT_H
#define _ANDROID_UTILS_LINEINPUT_H

#include <stdio.h>

#include "android/utils/compiler.h"

ANDROID_BEGIN_HEADER

/* A LineInput is used to read input text, one line at a time,
 * into a temporary buffer owner by the LineInput object.
 */
typedef struct LineInput LineInput;

/* Create a LineInput object that reads from a FILE* object */
LineInput*  lineInput_newFromStdFile( FILE* file );

/* Read next line from input. The result is zero-terminated with
 * all newlines removed (\n, \r or \r\n) automatically.
 *
 * Returns NULL in case of error, or when the end of file is reached.
 * See lineInput_isEof() and lineInput_getError()
 *
 * The returned string is owned by the LineInput object and its
 * value will not persist any other call to any LineInput functions.
 */
const char* lineInput_getLine( LineInput* input );

/* Same as lineInput_getLine(), but also returns the line size into
 * '*pSize' to save you a strlen() call.
 */
const char* lineInput_getLineAndSize( LineInput* input, size_t *pSize );

/* Returns the number of the last line read by lineInput_getLine */
int lineInput_getLineNumber( LineInput* input );

/* Returns TRUE iff the end of file was reached */
int lineInput_isEof( LineInput* input );

/* Return the error condition of a LineInput object.
 * These are standard errno code for the last operation.
 * Note: EOF corresponds to 0 here.
 */
int lineInput_getError( LineInput* input );

/* Free a LineInput object. */
void lineInput_free( LineInput* input );

ANDROID_END_HEADER

#endif /* _ANDROID_UTILS_LINEINPUT_H */
