diff options
Diffstat (limited to 'android/utils/ini.h')
-rw-r--r-- | android/utils/ini.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/android/utils/ini.h b/android/utils/ini.h new file mode 100644 index 0000000..41b369b --- /dev/null +++ b/android/utils/ini.h @@ -0,0 +1,121 @@ +/* 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 */ |