blob: 41b369b8d8f5c62abdbe26c86e8ac917faac04dc [file] [log] [blame]
/* Copyright (C) 2008 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_INI_H
#define _ANDROID_UTILS_INI_H
#include <stdint.h>
/* the emulator supports a simple .ini file format for its configuration
* files. Here's the BNF for it:
*
* file := <line>*
* line := <comment> | <LF> | <assignment>
* comment := (';'|'#') <noLF>* <LF>
* assignment := <space>* <keyName> <space>* '=' <space>* <valueString> <space>* <LF>
* keyName := <keyNameStartChar> <keyNameChar>*
* keyNameStartChar := [A-Za-z_]
* keyNameChar := [A-Za-z0-9_.]
* valueString := <noLF>*
* space := ' ' | '\t'
* LF := '\r\n' | '\n' | '\r'
* noLF := [^<LF>]
*
* Or, in English:
*
* - no support for sections
* - empty lines are ignored, as well as lines beginning with ';' or '#'
* - lines must be of the form: "<keyName> = <value>"
* - key names must start with a letter or an underscore
* - other key name characters can be letters, digits, underscores or dots
*
* - leading and trailing space are allowed and ignored before/after the key name
* and before/after the value
*
* - there is no restriction on the value, except that it can't contain
* leading/trailing space/tab characters or newline/charfeed characters
*
* - empty values are possible, and will be stored as an empty string.
* - any badly formatted line is discarded (and will print a warning)
*
*/
/* an opaque structure used to model an .ini configuration file */
typedef struct IniFile IniFile;
/* creates a new IniFile object from a config file loaded in memory.
* 'fileName' is only used when writing a warning to stderr in case
* of badly formed output
*/
IniFile* iniFile_newFromMemory( const char* text, const char* fileName );
/* creates a new IniFile object from a file path,
* returns NULL if the file cannot be opened.
*/
IniFile* iniFile_newFromFile( const char* filePath);
/* free an IniFile object */
void iniFile_free( IniFile* f );
/* returns the number of (key.value) pairs in an IniFile */
int iniFile_getPairCount( IniFile* f );
/* return a specific (key,value) pair from an IniFile.
* if the index is not correct, both '*pKey' and '*pValue' will be
* set to NULL.
*
* you should probably use iniFile_getValue() and its variants instead
*/
void iniFile_getPair( IniFile* f,
int index,
const char* *pKey,
const char* *pValue );
/* returns the value of a given key from an IniFile.
* NULL if the key is not assigned in the corresponding configuration file
*/
const char* iniFile_getValue( IniFile* f, const char* key );
/* returns a copy of the value of a given key, or NULL
*/
char* iniFile_getString( IniFile* f, const char* key );
/* returns an integer value, or a default in case the value string is
* missing or badly formatted
*/
int iniFile_getInteger( IniFile* f, const char* key, int defaultValue );
/* returns a double value, or a default in case the value string is
* missing or badly formatted
*/
double iniFile_getDouble( IniFile* f, const char* key, double defaultValue );
/* returns a copy of a given key's value, if any, or NULL if it is missing
* caller must call free() to release it */
char* iniFile_getString( IniFile* f, const char* key );
/* parses a key value as a boolean. Accepted values are "1", "0", "yes", "YES",
* "no" and "NO". Returns either 1 or 0.
* note that the default value must be provided as a string too
*/
int iniFile_getBoolean( IniFile* f, const char* key, const char* defaultValue );
/* parses a key value as a disk size. this means it can be an integer followed
* by a suffix that can be one of "mMkKgG" which correspond to KiB, MiB and GiB
* multipliers.
*
* NOTE: we consider that 1K = 1024, not 1000.
*/
int64_t iniFile_getDiskSize( IniFile* f, const char* key, const char* defaultValue );
/* */
#endif /* _ANDROID_UTILS_INI_H */