summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-01-16 09:25:15 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-01-16 09:25:15 -0600
commit700b980dd2122c52e1ba0b2f2715145e3f292353 (patch)
treef5dfcd4c7e44c41bf4e0873d8850f9285d61d878
parent9364f0d5d4690a108567a124c8c52613eb96307a (diff)
downloadnuttx-700b980dd2122c52e1ba0b2f2715145e3f292353.tar.gz
nuttx-700b980dd2122c52e1ba0b2f2715145e3f292353.tar.bz2
nuttx-700b980dd2122c52e1ba0b2f2715145e3f292353.zip
INI parser update
-rwxr-xr-xapps/system/inifile/README.txt145
-rw-r--r--apps/system/inifile/inifile.c54
-rw-r--r--nuttx/Documentation/README.html3
-rw-r--r--nuttx/README.txt2
4 files changed, 165 insertions, 39 deletions
diff --git a/apps/system/inifile/README.txt b/apps/system/inifile/README.txt
new file mode 100755
index 000000000..f9fe74d10
--- /dev/null
+++ b/apps/system/inifile/README.txt
@@ -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
diff --git a/apps/system/inifile/inifile.c b/apps/system/inifile/inifile.c
index ebd0ea993..9f196e558 100644
--- a/apps/system/inifile/inifile.c
+++ b/apps/system/inifile/inifile.c
@@ -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.
- */
-
- while (*sectend != ']' && *sectend != '\0')
- {
- /* Perform the conversion to lower case, if appropriate */
-
- int ch = (int)*sectend;
- if ((ch >= 'A') && ( ch <= 'Z'))
- {
- *sectend = (char)(ch - 'A' + 'a');
- }
+ /* The section name should extend to the right bracket. */
- /* Skip to the next character */
+ sectend = strchr(&priv->line[1], ']');
- sectend++;
- }
-
- /* Add NULL termination (This is unnecessary in the case where
- * the line was truncated
+ /* Replace the right bracket (if found) with a NULL
+ * terminator.
*/
- *sectend = '\0';
+ if (sectend)
+ {
+ *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)
{
diff --git a/nuttx/Documentation/README.html b/nuttx/Documentation/README.html
index 4d46777ec..705e2b91d 100644
--- a/nuttx/Documentation/README.html
+++ b/nuttx/Documentation/README.html
@@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX README Files</i></font></big></h1>
- <p>Last Updated: November 23, 2013</p>
+ <p>Last Updated: January 16, 2014</p>
</td>
</tr>
</table>
@@ -291,6 +291,7 @@
| `- system/
| |- <a href="http://sourceforge.net/p/nuttx/git/ci/master/tree/apps/system/cdcacm/README.txt"><b><i>cdcacm/README.txt</i></b></a>
| |- <a href="http://sourceforge.net/p/nuttx/git/ci/master/tree/apps/system/i2c/README.txt"><b><i>i2c/README.txt</i></b></a>
+ | |- <a href="http://sourceforge.net/p/nuttx/git/ci/master/tree/apps/system/inifile/README.txt">inifile/README.txt</a>
| |- <a href="http://sourceforge.net/p/nuttx/git/ci/master/tree/apps/system/install/README.txt">install/README.txt</a>
| |- <a href="http://sourceforge.net/p/nuttx/git/ci/master/tree/apps/system/nxplayer/README.txt"><b><i>nxplayer/README.txt</i></b></a>
| |- <a href="http://sourceforge.net/p/nuttx/git/ci/master/tree/apps/system/usbmsc/README.txt">usbmsc/README.txt</a>
diff --git a/nuttx/README.txt b/nuttx/README.txt
index 60262d619..a16583f3f 100644
--- a/nuttx/README.txt
+++ b/nuttx/README.txt
@@ -1248,6 +1248,8 @@ apps
| | `- README.txt
| |- i2c
| | `- README.txt
+ | |- inifile
+ | | `- README.txt
| |- install
| | `- README.txt
| |- nxplayer