/* inih -- simple .INI file parser

 inih is released under the New BSD license (see LICENSE.txt). Go to the project
 home page for more info:

 http://code.google.com/p/inih/

 */

#ifndef __INI_CORE_H__
#define __INI_CORE_H__

/* Make this header file easier to include in C++ code */
#ifdef __cplusplus
extern "C" {
#endif

#if (defined CC_COMPILE_IN_PC || defined CC_COMPILE_IN_ANDROID)

#include <stdio.h>

/* Parse given INI-style file. May have [section]s, name=value pairs
 (whitespace stripped), and comments starting with ';' (semicolon). Section
 is "" if name=value pair parsed before any section heading. name:value
 pairs are also supported as a concession to Python's ConfigParser.

 For each name=value pair parsed, call handler function with given user
 pointer as well as section, name, and value (data only valid for duration
 of handler call). Handler should return nonzero on success, zero on error.

 Returns 0 on success, line number of first error on parse error (doesn't
 stop on first error), -1 on file open error, or -2 on memory allocation
 error (only when INI_USE_STACK is zero).
 */
int ini_parse(const char* filename,
        int (*handler)(void* user, const char* section, const char* name,
                const char* value), void* user);

/* Same as ini_parse(), but takes a FILE* instead of filename. This doesn't
 close the file when it's finished -- the caller must do that. */
int ini_parse_file(FILE* file,
        int (*handler)(void* user, const char* section, const char* name,
                const char* value), void* user);
#endif

int ini_parse_mem(const char* buf,
        int (*handler)(void* user, const char* section, const char* name,
                const char* value), void* user);

/* Nonzero to allow multi-line value parsing, in the style of Python's
 ConfigParser. If allowed, ini_parse() will call the handler with the same
 name for each subsequent line parsed. */
#ifndef INI_ALLOW_MULTILINE
#define INI_ALLOW_MULTILINE 1
#endif

/* Nonzero to allow a UTF-8 BOM sequence (0xEF 0xBB 0xBF) at the start of
 the file. See http://code.google.com/p/inih/issues/detail?id=21 */
#ifndef INI_ALLOW_BOM
#define INI_ALLOW_BOM 1
#endif

/* Nonzero to use stack, zero to use heap (malloc/free). */
#ifndef INI_USE_STACK
#define INI_USE_STACK 1
#endif

/* Maximum line length for any line in INI file. */
#ifndef INI_MAX_LINE
#define INI_MAX_LINE 20000
#endif

#ifdef __cplusplus
}
#endif

#endif /* __INI_CORE_H__ */
