A simple .ini file interface.

Dependents:   Smart-WiFly-WebServer SignalGenerator WattEye X10Svr

Revision:
15:3fc2b87a234d
Parent:
13:d5957065d066
Child:
18:282ed56d983b
--- a/IniManager.cpp	Sun Nov 13 02:04:16 2016 +0000
+++ b/IniManager.cpp	Sun Dec 11 14:05:17 2016 +0000
@@ -45,6 +45,105 @@
 }
 
 
+bool INI::GetNextSection(const char * after, char * buffer, size_t bufferSize) {
+    bool returnNext = false;
+    bool found = false;
+    
+    if (!iniFile)
+        return found;
+    CleanUp();
+    INFO("GetNextSection after [%s]", after);
+    FILE * fp = fopen(iniFile,"rt");
+    if (fp) {
+        char buf[INTERNAL_BUF_SIZE];
+
+        if (after == NULL || *after == '\0')
+            returnNext = true;
+        while(fgets(buf, sizeof(buf), fp)) {
+            int x = strlen(buf) - 1;        // remove trailing \r\n combinations
+            while (x >= 0 && buf[x] < ' ')
+                buf[x--] = '\0';
+            INFO("  reading \"%s\"", buf);
+            if (buf[0] == '[') {
+                char * pStart = buf + 1;
+                char * pRBrkt = strchr(buf, ']');
+                if (pRBrkt) {
+                    *pRBrkt = '\0';
+                    if (returnNext) {
+                        if (strlen(pStart) < bufferSize) {
+                            strcpy(buffer, pStart);
+                            found = true;
+                            break;
+                        }
+                    } else if (strcmp(after, pStart) == 0) {
+                        returnNext = true;
+                    }
+                }
+            }
+        }
+        fclose(fp);
+    }
+    return found;
+}
+
+
+bool INI::GetNextKey(const char * Section, const char * after, char * buffer, size_t bufferSize) {
+    bool returnNext = false;
+    bool inSection = false;
+    bool found = false;
+    
+    if (!iniFile)
+        return found;
+    CleanUp();
+    INFO("GetNextLey after [%s]", after);
+    FILE * fp = fopen(iniFile,"rt");
+    if (fp) {
+        char buf[INTERNAL_BUF_SIZE];
+
+        if (after == NULL || *after == '\0')
+            returnNext = true;
+        while(fgets(buf, sizeof(buf), fp)) {
+            int x = strlen(buf) - 1;        // remove trailing \r\n combinations
+            while (x >= 0 && buf[x] < ' ')
+                buf[x--] = '\0';
+            INFO("  reading \"%s\"", buf);
+            if (!(buf[0] == '[' || (buf[0] >= 'A' && buf[0] <= 'Z') || (buf[0] >= 'a' && buf[0] <= 'z')))
+                continue;
+            if (buf[0] == '[') {
+                char * pStart = buf + 1;
+                char * pRBrkt = strchr(buf, ']');
+                if (pRBrkt) {
+                    *pRBrkt = '\0';
+                    if (inSection == true) {        // section after wanted, so done.
+                        break;
+                    } else if (strcmp(pStart, Section) == 0) {
+                        inSection = true;
+                        continue;
+                    }
+                }
+            } else if (inSection) {
+                char * pStart = buf;
+                char * pEqual = strchr(pStart, '=');
+                if (pEqual) {
+                    *pEqual = '\0';
+                    if (returnNext) {
+                        if (strlen(pStart) < bufferSize) {
+                            strcpy(buffer, pStart);
+                            found = true;
+                            break;
+                        }
+                    } else if (strcmp(after, pStart) == 0) {
+                        returnNext = true;
+                    }
+                }
+            }
+        }
+        fclose(fp);
+    }
+    return found;
+}
+
+
 bool INI::Exists(const char * file)
 {
     if (file == NULL)
@@ -99,6 +198,9 @@
             while (x >= 0 && buf[x] < ' ')
                 buf[x--] = '\0';
             INFO("  reading \"%s\"", buf);
+            if (!(buf[0] == '[' || (buf[0] >= 'A' && buf[0] <= 'Z') || (buf[0] >= 'a' && buf[0] <= 'z')))
+                continue;
+            
             if (inSection && buf[0] != '[') {
                 char * eq = strchr(buf, '=');
                 if (eq) {