13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright 2015 Rockchip Electronics Co. LTD
33d0407baSopenharmony_ci *
43d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
53d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
63d0407baSopenharmony_ci * You may obtain a copy of the License at
73d0407baSopenharmony_ci *
83d0407baSopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
93d0407baSopenharmony_ci *
103d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
113d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
123d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d0407baSopenharmony_ci * See the License for the specific language governing permissions and
143d0407baSopenharmony_ci * limitations under the License.
153d0407baSopenharmony_ci */
163d0407baSopenharmony_ci
173d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
183d0407baSopenharmony_ci/**
193d0407baSopenharmony_ci   @file    iniparser.h
203d0407baSopenharmony_ci   @author  N. Devillard
213d0407baSopenharmony_ci   @brief   Parser for ini files.
223d0407baSopenharmony_ci*/
233d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
243d0407baSopenharmony_ci
253d0407baSopenharmony_ci#ifndef _INIPARSER_H_
263d0407baSopenharmony_ci#define _INIPARSER_H_
273d0407baSopenharmony_ci
283d0407baSopenharmony_ci/*---------------------------------------------------------------------------
293d0407baSopenharmony_ci                                Includes
303d0407baSopenharmony_ci ---------------------------------------------------------------------------*/
313d0407baSopenharmony_ci
323d0407baSopenharmony_ci#include <stdio.h>
333d0407baSopenharmony_ci#include <stdlib.h>
343d0407baSopenharmony_ci#include <string.h>
353d0407baSopenharmony_ci
363d0407baSopenharmony_ci/*
373d0407baSopenharmony_ci * The following #include is necessary on many Unixes but not Linux.
383d0407baSopenharmony_ci * It is not needed for Windows platforms.
393d0407baSopenharmony_ci * Uncomment it if needed.
403d0407baSopenharmony_ci */
413d0407baSopenharmony_ci/* #include <unistd.h> */
423d0407baSopenharmony_ci
433d0407baSopenharmony_ci#include "dictionary.h"
443d0407baSopenharmony_ci
453d0407baSopenharmony_ci#ifdef __cplusplus
463d0407baSopenharmony_ciextern "C" {
473d0407baSopenharmony_ci#endif
483d0407baSopenharmony_ci
493d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
503d0407baSopenharmony_ci/**
513d0407baSopenharmony_ci  @brief    Configure a function to receive the error messages.
523d0407baSopenharmony_ci  @param    errback  Function to call.
533d0407baSopenharmony_ci
543d0407baSopenharmony_ci  By default, the error will be printed on stderr. If a null pointer is passed
553d0407baSopenharmony_ci  as errback the error callback will be switched back to default.
563d0407baSopenharmony_ci */
573d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
583d0407baSopenharmony_ci
593d0407baSopenharmony_civoid iniparser_set_error_callback(int (*errback)(const char *, ...));
603d0407baSopenharmony_ci
613d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
623d0407baSopenharmony_ci/**
633d0407baSopenharmony_ci  @brief    Get number of sections in a dictionary
643d0407baSopenharmony_ci  @param    d   Dictionary to examine
653d0407baSopenharmony_ci  @return   int Number of sections found in dictionary
663d0407baSopenharmony_ci
673d0407baSopenharmony_ci  This function returns the number of sections found in a dictionary.
683d0407baSopenharmony_ci  The test to recognize sections is done on the string stored in the
693d0407baSopenharmony_ci  dictionary: a section name is given as "section" whereas a key is
703d0407baSopenharmony_ci  stored as "section:key", thus the test looks for entries that do not
713d0407baSopenharmony_ci  contain a colon.
723d0407baSopenharmony_ci
733d0407baSopenharmony_ci  This clearly fails in the case a section name contains a colon, but
743d0407baSopenharmony_ci  this should simply be avoided.
753d0407baSopenharmony_ci
763d0407baSopenharmony_ci  This function returns -1 in case of error.
773d0407baSopenharmony_ci */
783d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
793d0407baSopenharmony_ci
803d0407baSopenharmony_ciint iniparser_getnsec(const dictionary * d);
813d0407baSopenharmony_ci
823d0407baSopenharmony_ci
833d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
843d0407baSopenharmony_ci/**
853d0407baSopenharmony_ci  @brief    Get name for section n in a dictionary.
863d0407baSopenharmony_ci  @param    d   Dictionary to examine
873d0407baSopenharmony_ci  @param    n   Section number (from 0 to nsec-1).
883d0407baSopenharmony_ci  @return   Pointer to char string
893d0407baSopenharmony_ci
903d0407baSopenharmony_ci  This function locates the n-th section in a dictionary and returns
913d0407baSopenharmony_ci  its name as a pointer to a string statically allocated inside the
923d0407baSopenharmony_ci  dictionary. Do not free or modify the returned string!
933d0407baSopenharmony_ci
943d0407baSopenharmony_ci  This function returns NULL in case of error.
953d0407baSopenharmony_ci */
963d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
973d0407baSopenharmony_ci
983d0407baSopenharmony_ciconst char * iniparser_getsecname(const dictionary * d, int n);
993d0407baSopenharmony_ci
1003d0407baSopenharmony_ci
1013d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
1023d0407baSopenharmony_ci/**
1033d0407baSopenharmony_ci  @brief    Save a dictionary to a loadable ini file
1043d0407baSopenharmony_ci  @param    d   Dictionary to dump
1053d0407baSopenharmony_ci  @param    f   Opened file pointer to dump to
1063d0407baSopenharmony_ci  @return   void
1073d0407baSopenharmony_ci
1083d0407baSopenharmony_ci  This function dumps a given dictionary into a loadable ini file.
1093d0407baSopenharmony_ci  It is Ok to specify @c stderr or @c stdout as output files.
1103d0407baSopenharmony_ci */
1113d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
1123d0407baSopenharmony_ci
1133d0407baSopenharmony_civoid iniparser_dump_ini(const dictionary * d, FILE * f);
1143d0407baSopenharmony_ci
1153d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
1163d0407baSopenharmony_ci/**
1173d0407baSopenharmony_ci  @brief    Save a dictionary section to a loadable ini file
1183d0407baSopenharmony_ci  @param    d   Dictionary to dump
1193d0407baSopenharmony_ci  @param    s   Section name of dictionary to dump
1203d0407baSopenharmony_ci  @param    f   Opened file pointer to dump to
1213d0407baSopenharmony_ci  @return   void
1223d0407baSopenharmony_ci
1233d0407baSopenharmony_ci  This function dumps a given section of a given dictionary into a loadable ini
1243d0407baSopenharmony_ci  file.  It is Ok to specify @c stderr or @c stdout as output files.
1253d0407baSopenharmony_ci */
1263d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
1273d0407baSopenharmony_ci
1283d0407baSopenharmony_civoid iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f);
1293d0407baSopenharmony_ci
1303d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
1313d0407baSopenharmony_ci/**
1323d0407baSopenharmony_ci  @brief    Dump a dictionary to an opened file pointer.
1333d0407baSopenharmony_ci  @param    d   Dictionary to dump.
1343d0407baSopenharmony_ci  @param    f   Opened file pointer to dump to.
1353d0407baSopenharmony_ci  @return   void
1363d0407baSopenharmony_ci
1373d0407baSopenharmony_ci  This function prints out the contents of a dictionary, one element by
1383d0407baSopenharmony_ci  line, onto the provided file pointer. It is OK to specify @c stderr
1393d0407baSopenharmony_ci  or @c stdout as output files. This function is meant for debugging
1403d0407baSopenharmony_ci  purposes mostly.
1413d0407baSopenharmony_ci */
1423d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
1433d0407baSopenharmony_civoid iniparser_dump(const dictionary * d, FILE * f);
1443d0407baSopenharmony_ci
1453d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
1463d0407baSopenharmony_ci/**
1473d0407baSopenharmony_ci  @brief    Get the number of keys in a section of a dictionary.
1483d0407baSopenharmony_ci  @param    d   Dictionary to examine
1493d0407baSopenharmony_ci  @param    s   Section name of dictionary to examine
1503d0407baSopenharmony_ci  @return   Number of keys in section
1513d0407baSopenharmony_ci */
1523d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
1533d0407baSopenharmony_ciint iniparser_getsecnkeys(const dictionary * d, const char * s);
1543d0407baSopenharmony_ci
1553d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
1563d0407baSopenharmony_ci/**
1573d0407baSopenharmony_ci  @brief    Get the number of keys in a section of a dictionary.
1583d0407baSopenharmony_ci  @param    d    Dictionary to examine
1593d0407baSopenharmony_ci  @param    s    Section name of dictionary to examine
1603d0407baSopenharmony_ci  @param    keys Already allocated array to store the keys in
1613d0407baSopenharmony_ci  @return   The pointer passed as `keys` argument or NULL in case of error
1623d0407baSopenharmony_ci
1633d0407baSopenharmony_ci  This function queries a dictionary and finds all keys in a given section.
1643d0407baSopenharmony_ci  The keys argument should be an array of pointers which size has been
1653d0407baSopenharmony_ci  determined by calling `iniparser_getsecnkeys` function prior to this one.
1663d0407baSopenharmony_ci
1673d0407baSopenharmony_ci  Each pointer in the returned char pointer-to-pointer is pointing to
1683d0407baSopenharmony_ci  a string allocated in the dictionary; do not free or modify them.
1693d0407baSopenharmony_ci */
1703d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
1713d0407baSopenharmony_ciconst char ** iniparser_getseckeys(const dictionary * d, const char * s, const char ** keys);
1723d0407baSopenharmony_ci
1733d0407baSopenharmony_ci
1743d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
1753d0407baSopenharmony_ci/**
1763d0407baSopenharmony_ci  @brief    Get the string associated to a key
1773d0407baSopenharmony_ci  @param    d       Dictionary to search
1783d0407baSopenharmony_ci  @param    key     Key string to look for
1793d0407baSopenharmony_ci  @param    def     Default value to return if key not found.
1803d0407baSopenharmony_ci  @return   pointer to statically allocated character string
1813d0407baSopenharmony_ci
1823d0407baSopenharmony_ci  This function queries a dictionary for a key. A key as read from an
1833d0407baSopenharmony_ci  ini file is given as "section:key". If the key cannot be found,
1843d0407baSopenharmony_ci  the pointer passed as 'def' is returned.
1853d0407baSopenharmony_ci  The returned char pointer is pointing to a string allocated in
1863d0407baSopenharmony_ci  the dictionary, do not free or modify it.
1873d0407baSopenharmony_ci */
1883d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
1893d0407baSopenharmony_ciconst char * iniparser_getstring(const dictionary * d, const char * key, const char * def);
1903d0407baSopenharmony_ci
1913d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
1923d0407baSopenharmony_ci/**
1933d0407baSopenharmony_ci  @brief    Get the string associated to a key, convert to an int
1943d0407baSopenharmony_ci  @param    d Dictionary to search
1953d0407baSopenharmony_ci  @param    key Key string to look for
1963d0407baSopenharmony_ci  @param    notfound Value to return in case of error
1973d0407baSopenharmony_ci  @return   integer
1983d0407baSopenharmony_ci
1993d0407baSopenharmony_ci  This function queries a dictionary for a key. A key as read from an
2003d0407baSopenharmony_ci  ini file is given as "section:key". If the key cannot be found,
2013d0407baSopenharmony_ci  the notfound value is returned.
2023d0407baSopenharmony_ci
2033d0407baSopenharmony_ci  Supported values for integers include the usual C notation
2043d0407baSopenharmony_ci  so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
2053d0407baSopenharmony_ci  are supported. Examples:
2063d0407baSopenharmony_ci
2073d0407baSopenharmony_ci  - "42"      ->  42
2083d0407baSopenharmony_ci  - "042"     ->  34 (octal -> decimal)
2093d0407baSopenharmony_ci  - "0x42"    ->  66 (hexa  -> decimal)
2103d0407baSopenharmony_ci
2113d0407baSopenharmony_ci  Warning: the conversion may overflow in various ways. Conversion is
2123d0407baSopenharmony_ci  totally outsourced to strtol(), see the associated man page for overflow
2133d0407baSopenharmony_ci  handling.
2143d0407baSopenharmony_ci
2153d0407baSopenharmony_ci  Credits: Thanks to A. Becker for suggesting strtol()
2163d0407baSopenharmony_ci */
2173d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
2183d0407baSopenharmony_ciint iniparser_getint(const dictionary * d, const char * key, int notfound);
2193d0407baSopenharmony_ci
2203d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
2213d0407baSopenharmony_ci/**
2223d0407baSopenharmony_ci  @brief    Get the string associated to a key, convert to an long int
2233d0407baSopenharmony_ci  @param    d Dictionary to search
2243d0407baSopenharmony_ci  @param    key Key string to look for
2253d0407baSopenharmony_ci  @param    notfound Value to return in case of error
2263d0407baSopenharmony_ci  @return   integer
2273d0407baSopenharmony_ci
2283d0407baSopenharmony_ci  This function queries a dictionary for a key. A key as read from an
2293d0407baSopenharmony_ci  ini file is given as "section:key". If the key cannot be found,
2303d0407baSopenharmony_ci  the notfound value is returned.
2313d0407baSopenharmony_ci
2323d0407baSopenharmony_ci  Supported values for integers include the usual C notation
2333d0407baSopenharmony_ci  so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
2343d0407baSopenharmony_ci  are supported. Examples:
2353d0407baSopenharmony_ci
2363d0407baSopenharmony_ci  - "42"      ->  42
2373d0407baSopenharmony_ci  - "042"     ->  34 (octal -> decimal)
2383d0407baSopenharmony_ci  - "0x42"    ->  66 (hexa  -> decimal)
2393d0407baSopenharmony_ci
2403d0407baSopenharmony_ci  Warning: the conversion may overflow in various ways. Conversion is
2413d0407baSopenharmony_ci  totally outsourced to strtol(), see the associated man page for overflow
2423d0407baSopenharmony_ci  handling.
2433d0407baSopenharmony_ci */
2443d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
2453d0407baSopenharmony_cilong int iniparser_getlongint(const dictionary * d, const char * key, long int notfound);
2463d0407baSopenharmony_ci
2473d0407baSopenharmony_ci
2483d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
2493d0407baSopenharmony_ci/**
2503d0407baSopenharmony_ci  @brief    Get the string associated to a key, convert to a double
2513d0407baSopenharmony_ci  @param    d Dictionary to search
2523d0407baSopenharmony_ci  @param    key Key string to look for
2533d0407baSopenharmony_ci  @param    notfound Value to return in case of error
2543d0407baSopenharmony_ci  @return   double
2553d0407baSopenharmony_ci
2563d0407baSopenharmony_ci  This function queries a dictionary for a key. A key as read from an
2573d0407baSopenharmony_ci  ini file is given as "section:key". If the key cannot be found,
2583d0407baSopenharmony_ci  the notfound value is returned.
2593d0407baSopenharmony_ci */
2603d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
2613d0407baSopenharmony_cidouble iniparser_getdouble(const dictionary * d, const char * key, double notfound);
2623d0407baSopenharmony_ci
2633d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
2643d0407baSopenharmony_ci/**
2653d0407baSopenharmony_ci  @brief    Get the string associated to a key, convert to a boolean
2663d0407baSopenharmony_ci  @param    d Dictionary to search
2673d0407baSopenharmony_ci  @param    key Key string to look for
2683d0407baSopenharmony_ci  @param    notfound Value to return in case of error
2693d0407baSopenharmony_ci  @return   integer
2703d0407baSopenharmony_ci
2713d0407baSopenharmony_ci  This function queries a dictionary for a key. A key as read from an
2723d0407baSopenharmony_ci  ini file is given as "section:key". If the key cannot be found,
2733d0407baSopenharmony_ci  the notfound value is returned.
2743d0407baSopenharmony_ci
2753d0407baSopenharmony_ci  A true boolean is found if one of the following is matched:
2763d0407baSopenharmony_ci
2773d0407baSopenharmony_ci  - A string starting with 'y'
2783d0407baSopenharmony_ci  - A string starting with 'Y'
2793d0407baSopenharmony_ci  - A string starting with 't'
2803d0407baSopenharmony_ci  - A string starting with 'T'
2813d0407baSopenharmony_ci  - A string starting with '1'
2823d0407baSopenharmony_ci
2833d0407baSopenharmony_ci  A false boolean is found if one of the following is matched:
2843d0407baSopenharmony_ci
2853d0407baSopenharmony_ci  - A string starting with 'n'
2863d0407baSopenharmony_ci  - A string starting with 'N'
2873d0407baSopenharmony_ci  - A string starting with 'f'
2883d0407baSopenharmony_ci  - A string starting with 'F'
2893d0407baSopenharmony_ci  - A string starting with '0'
2903d0407baSopenharmony_ci
2913d0407baSopenharmony_ci  The notfound value returned if no boolean is identified, does not
2923d0407baSopenharmony_ci  necessarily have to be 0 or 1.
2933d0407baSopenharmony_ci */
2943d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
2953d0407baSopenharmony_ciint iniparser_getboolean(const dictionary * d, const char * key, int notfound);
2963d0407baSopenharmony_ci
2973d0407baSopenharmony_ci
2983d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
2993d0407baSopenharmony_ci/**
3003d0407baSopenharmony_ci  @brief    Set an entry in a dictionary.
3013d0407baSopenharmony_ci  @param    ini     Dictionary to modify.
3023d0407baSopenharmony_ci  @param    entry   Entry to modify (entry name)
3033d0407baSopenharmony_ci  @param    val     New value to associate to the entry.
3043d0407baSopenharmony_ci  @return   int     0 if Ok, -1 otherwise.
3053d0407baSopenharmony_ci
3063d0407baSopenharmony_ci  If the given entry can be found in the dictionary, it is modified to
3073d0407baSopenharmony_ci  contain the provided value. If it cannot be found, the entry is created.
3083d0407baSopenharmony_ci  It is Ok to set val to NULL.
3093d0407baSopenharmony_ci */
3103d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
3113d0407baSopenharmony_ciint iniparser_set(dictionary * ini, const char * entry, const char * val);
3123d0407baSopenharmony_ci
3133d0407baSopenharmony_ci
3143d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
3153d0407baSopenharmony_ci/**
3163d0407baSopenharmony_ci  @brief    Delete an entry in a dictionary
3173d0407baSopenharmony_ci  @param    ini     Dictionary to modify
3183d0407baSopenharmony_ci  @param    entry   Entry to delete (entry name)
3193d0407baSopenharmony_ci  @return   void
3203d0407baSopenharmony_ci
3213d0407baSopenharmony_ci  If the given entry can be found, it is deleted from the dictionary.
3223d0407baSopenharmony_ci */
3233d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
3243d0407baSopenharmony_civoid iniparser_unset(dictionary * ini, const char * entry);
3253d0407baSopenharmony_ci
3263d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
3273d0407baSopenharmony_ci/**
3283d0407baSopenharmony_ci  @brief    Finds out if a given entry exists in a dictionary
3293d0407baSopenharmony_ci  @param    ini     Dictionary to search
3303d0407baSopenharmony_ci  @param    entry   Name of the entry to look for
3313d0407baSopenharmony_ci  @return   integer 1 if entry exists, 0 otherwise
3323d0407baSopenharmony_ci
3333d0407baSopenharmony_ci  Finds out if a given entry exists in the dictionary. Since sections
3343d0407baSopenharmony_ci  are stored as keys with NULL associated values, this is the only way
3353d0407baSopenharmony_ci  of querying for the presence of sections in a dictionary.
3363d0407baSopenharmony_ci */
3373d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
3383d0407baSopenharmony_ciint iniparser_find_entry(const dictionary * ini, const char * entry) ;
3393d0407baSopenharmony_ci
3403d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
3413d0407baSopenharmony_ci/**
3423d0407baSopenharmony_ci  @brief    Parse an ini file and return an allocated dictionary object
3433d0407baSopenharmony_ci  @param    ininame Name of the ini file to read.
3443d0407baSopenharmony_ci  @return   Pointer to newly allocated dictionary
3453d0407baSopenharmony_ci
3463d0407baSopenharmony_ci  This is the parser for ini files. This function is called, providing
3473d0407baSopenharmony_ci  the name of the file to be read. It returns a dictionary object that
3483d0407baSopenharmony_ci  should not be accessed directly, but through accessor functions
3493d0407baSopenharmony_ci  instead.
3503d0407baSopenharmony_ci
3513d0407baSopenharmony_ci  The returned dictionary must be freed using iniparser_freedict().
3523d0407baSopenharmony_ci */
3533d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
3543d0407baSopenharmony_cidictionary * iniparser_load(const char * ininame);
3553d0407baSopenharmony_ci
3563d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/
3573d0407baSopenharmony_ci/**
3583d0407baSopenharmony_ci  @brief    Free all memory associated to an ini dictionary
3593d0407baSopenharmony_ci  @param    d Dictionary to free
3603d0407baSopenharmony_ci  @return   void
3613d0407baSopenharmony_ci
3623d0407baSopenharmony_ci  Free all memory associated to an ini dictionary.
3633d0407baSopenharmony_ci  It is mandatory to call this function before the dictionary object
3643d0407baSopenharmony_ci  gets out of the current context.
3653d0407baSopenharmony_ci */
3663d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/
3673d0407baSopenharmony_civoid iniparser_freedict(dictionary * d);
3683d0407baSopenharmony_ci
3693d0407baSopenharmony_ci#ifdef __cplusplus
3703d0407baSopenharmony_ci}
3713d0407baSopenharmony_ci#endif
3723d0407baSopenharmony_ci
3733d0407baSopenharmony_ci#endif
374