INI parser update
This commit is contained in:
parent
9cfd315dbf
commit
682325b524
145
system/inifile/README.txt
Executable file
145
system/inifile/README.txt
Executable file
@ -0,0 +1,145 @@
|
||||
README.txt
|
||||
==========
|
||||
|
||||
Syntax
|
||||
======
|
||||
|
||||
This directory contains a very simple INI file parser. An INI file consists
|
||||
of a sequence of lines up to the end of file. A line may be one of the
|
||||
following:
|
||||
|
||||
1) A blank line.
|
||||
|
||||
2) A comment line. Any line beginning with ';'
|
||||
|
||||
3) A section header. Definitions are divided into sections. Each
|
||||
section begins with a line containing the section name enclosed in
|
||||
square brackets. For example, "[section1]". The left bracket must
|
||||
be the first character on the line. Section names are case
|
||||
insensitive, i.e., "SECTION1" and "Section1" refer to the same
|
||||
section.
|
||||
|
||||
4) Variable assignments. A variable assignment is a variable name
|
||||
followed by the '=' sign and then the value of the variable. For
|
||||
example, "A=B": "A" is the variable name; "B" is the variable value.
|
||||
All variables following the section header belong in the section.
|
||||
|
||||
Variable names may be preceded with white space. Whitespace is not
|
||||
permitted before the '=' sign. Variable names are case insensitive,
|
||||
i.e., "A" and "a" refer to the same variable name.
|
||||
|
||||
Variable values may be numeric (any base) or a string. The case of
|
||||
string arguments is preserved.
|
||||
|
||||
Programming Interfaces
|
||||
======================
|
||||
|
||||
See apps/include/inifile.h for interfaces supported by the INI file parser.
|
||||
|
||||
Test Program
|
||||
============
|
||||
|
||||
Below is a simple test program:
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
INIHANDLE handle;
|
||||
FILE *stream;
|
||||
FAR char *ptr;
|
||||
long value;
|
||||
|
||||
stream = fopen("/tmp/file.ini", "w");
|
||||
fprintf(stream, "; Test INI file\n");
|
||||
fprintf(stream, "[section1]\n");
|
||||
fprintf(stream, "VAR1=1\n");
|
||||
fprintf(stream, "VAR2=2\n");
|
||||
fprintf(stream, "VAR3=3\n");
|
||||
fprintf(stream, "\n");
|
||||
fprintf(stream, "[section2]\n");
|
||||
fprintf(stream, "VAR4=4\n");
|
||||
fprintf(stream, "VAR5=5\n");
|
||||
fprintf(stream, "VAR6=6\n");
|
||||
fprintf(stream, "\n");
|
||||
fclose(stream);
|
||||
|
||||
handle = inifile_initialize("/tmp/file.ini");
|
||||
|
||||
ptr = inifile_read_string(handle, "section2", "VAR5", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section2", "VAR5", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
ptr = inifile_read_string(handle, "section1", "VAR2", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section1", "VAR2", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
ptr = inifile_read_string(handle, "section3", "VAR3", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section3", "VAR3", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
ptr = inifile_read_string(handle, "section1", "VAR3", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section1", "VAR3", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
ptr = inifile_read_string(handle, "section1", "VAR1", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section1", "VAR1", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
ptr = inifile_read_string(handle, "section1", "VAR42", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section1", "VAR42", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
ptr = inifile_read_string(handle, "section2", "VAR6", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section2", "VAR6", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
ptr = inifile_read_string(handle, "section2", "VAR4", "OOPS");
|
||||
printf("Section: %s Variable: %s String: %s\n", "section2", "VAR4", ptr);
|
||||
inifile_free_string(ptr);
|
||||
|
||||
value = inifile_read_integer(handle, "section1", "VAR3", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section1", "VAR3", value);
|
||||
|
||||
value = inifile_read_integer(handle, "section3", "VAR3", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section3", "VAR3", value);
|
||||
|
||||
value = inifile_read_integer(handle, "section1", "VAR1", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section1", "VAR1", value);
|
||||
|
||||
value = inifile_read_integer(handle, "section2", "VAR5", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section2", "VAR5", value);
|
||||
|
||||
value = inifile_read_integer(handle, "section2", "VAR6", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section2", "VAR6", value);
|
||||
|
||||
value = inifile_read_integer(handle, "section1", "VAR42", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section1", "VAR42", value);
|
||||
|
||||
value = inifile_read_integer(handle, "section1", "VAR2", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section1", "VAR2", value);
|
||||
|
||||
value = inifile_read_integer(handle, "section2", "VAR4", 0);
|
||||
printf("Section: %s Variable: %s Value: %ld\n", "section2", "VAR4", value);
|
||||
|
||||
inifile_uninitialize(handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Test program output:
|
||||
|
||||
Section: section2 Variable: VAR5 String: 5
|
||||
Section: section1 Variable: VAR2 String: 2
|
||||
Section: section3 Variable: VAR3 String: OOPS
|
||||
Section: section1 Variable: VAR3 String: 3
|
||||
Section: section1 Variable: VAR1 String: 1
|
||||
Section: section1 Variable: VAR42 String: OOPS
|
||||
Section: section2 Variable: VAR6 String: 6
|
||||
Section: section2 Variable: VAR4 String: 4
|
||||
|
||||
Section: section1 Variable: VAR3 Value: 3
|
||||
Section: section3 Variable: VAR3 Value: 0
|
||||
Section: section1 Variable: VAR1 Value: 1
|
||||
Section: section2 Variable: VAR5 Value: 5
|
||||
Section: section2 Variable: VAR6 Value: 6
|
||||
Section: section1 Variable: VAR42 String: 0
|
||||
Section: section1 Variable: VAR2 Value: 2
|
||||
Section: section2 Variable: VAR4 Value: 4
|
@ -178,7 +178,7 @@ static int inifile_read_line(FAR struct inifile_state_s *priv)
|
||||
|
||||
/* Assuming that the file pointer is correctly positioned at the beginning
|
||||
* of the next line, read until the end of line indication is found (or
|
||||
* until the line buffer is full).
|
||||
* until the line buffer is full). This is basically fgets().
|
||||
*/
|
||||
|
||||
nbytes = 0;
|
||||
@ -299,37 +299,24 @@ static bool inifile_seek_to_section(FAR struct inifile_state_s *priv,
|
||||
* after the left bracket.
|
||||
*/
|
||||
|
||||
FAR char *sectend = &priv->line[1];
|
||||
FAR char *sectend;
|
||||
|
||||
/* The section name should extend to the right bracket. While
|
||||
* we are looking for the end of the section name, we'll also
|
||||
* perform a conversion to lower case.
|
||||
/* The section name should extend to the right bracket. */
|
||||
|
||||
sectend = strchr(&priv->line[1], ']');
|
||||
|
||||
/* Replace the right bracket (if found) with a NULL
|
||||
* terminator.
|
||||
*/
|
||||
|
||||
while (*sectend != ']' && *sectend != '\0')
|
||||
if (sectend)
|
||||
{
|
||||
/* Perform the conversion to lower case, if appropriate */
|
||||
|
||||
int ch = (int)*sectend;
|
||||
if ((ch >= 'A') && ( ch <= 'Z'))
|
||||
{
|
||||
*sectend = (char)(ch - 'A' + 'a');
|
||||
}
|
||||
|
||||
/* Skip to the next character */
|
||||
|
||||
sectend++;
|
||||
*sectend = '\0';
|
||||
}
|
||||
|
||||
/* Add NULL termination (This is unnecessary in the case where
|
||||
* the line was truncated
|
||||
*/
|
||||
|
||||
*sectend = '\0';
|
||||
|
||||
/* Then compare the section name to the one we are looking for */
|
||||
|
||||
if (strcmp(&priv->line[1], section) == 0)
|
||||
if (strcasecmp(&priv->line[1], section) == 0)
|
||||
{
|
||||
/* The section names match! Return success */
|
||||
|
||||
@ -386,20 +373,11 @@ static bool inifile_read_variable(FAR struct inifile_state_s *priv,
|
||||
* be NULL terminated by inifile_read_noncomment_line().
|
||||
*/
|
||||
|
||||
for (ptr = (char*)priv->line; *ptr && *ptr != '='; ptr++)
|
||||
{
|
||||
/* Force the variable name to lower case */
|
||||
|
||||
int ch = *ptr;
|
||||
if ((ch >= 'A') && (ch <= 'Z'))
|
||||
{
|
||||
*ptr = (char)(ch - 'A' + 'a');
|
||||
}
|
||||
}
|
||||
ptr = strchr(&priv->line[1], '=');
|
||||
|
||||
/* If the delimiter was found, return success */
|
||||
|
||||
if (*ptr == '=')
|
||||
if (ptr)
|
||||
{
|
||||
/* Put NUL termination between the variable name and the
|
||||
* variable value (replacing the equal sign).
|
||||
@ -459,9 +437,9 @@ static FAR char *
|
||||
|
||||
/* Does the the variable name match the one we are looking for? */
|
||||
|
||||
if (strcmp(varinfo.variable, variable) == 0)
|
||||
if (strcasecmp(varinfo.variable, variable) == 0)
|
||||
{
|
||||
/* Yes... then we got it! */
|
||||
/* Yes... then we have it! */
|
||||
|
||||
inivdbg("Returning \"%s\"\n", varinfo.value);
|
||||
return varinfo.value;
|
||||
@ -495,7 +473,7 @@ static FAR char *inifile_find_variable(FAR struct inifile_state_s *priv,
|
||||
*/
|
||||
|
||||
FAR char *value = inifile_find_section_variable(priv, variable);
|
||||
inivdbg("ariable_value=0x%p\n", value);
|
||||
inivdbg("variable_value=0x%p\n", value);
|
||||
|
||||
if (value && *value)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user