Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Smart-WiFly-WebServer SignalGenerator WattEye X10Svr
Diff: IniManager.cpp
- Revision:
- 8:f128b10dfab1
- Parent:
- 7:60f5dc3467ff
- Child:
- 9:4947b8c244e9
diff -r 60f5dc3467ff -r f128b10dfab1 IniManager.cpp
--- a/IniManager.cpp Thu May 22 16:09:43 2014 +0000
+++ b/IniManager.cpp Mon Jul 07 15:19:16 2014 +0000
@@ -10,13 +10,14 @@
#include "IniManager.h"
-//#define DEBUG //Debug is disabled by default
+//#define DEBUG "INI " //Debug is disabled by default
+#include <cstdio>
#if (defined(DEBUG) && !defined(TARGET_LPC11U24))
-#define DBG(x, ...) std::printf("[DBG INI%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
-#define WARN(x, ...) std::printf("[WRN INI%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
-#define ERR(x, ...) std::printf("[ERR INI%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
-#define INFO(x, ...) std::printf("[INF INI%4d] "x"\r\n", __LINE__, ##__VA_ARGS__);
+#define DBG(x, ...) std::printf("[DBG %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
+#define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
+#define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
+#define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
#else
#define DBG(x, ...)
#define WARN(x, ...)
@@ -28,15 +29,6 @@
: iniFile(0)
{
SetFile(file);
-#if 0
- if (file) {
- iniFile = (char *)malloc(strlen(file)+1);
- if (iniFile)
- strcpy(iniFile, file);
- else
- iniFile = NULL;
- }
-#endif
}
@@ -47,18 +39,39 @@
}
+bool INI::Exists(const char * file)
+{
+ if (file == NULL)
+ file = iniFile;
+ INFO("Exists(%s)", file);
+ FILE * fp = fopen(file, "r");
+ if (fp) {
+ fclose(fp);
+ INFO(" [%s] exists", file);
+ return true;
+ } else {
+ INFO(" [%s] does not exist", file);
+ return false;
+ }
+}
+
+
bool INI::SetFile(const char * file)
{
+ INFO("SetFile(%s)", file);
if (file) {
if (iniFile)
free(iniFile);
iniFile = (char *)malloc(strlen(file)+1);
if (iniFile) {
strcpy(iniFile, file);
+ INFO(" SetFile(%s) success", iniFile);
return true;
}
- else
- iniFile = NULL;
+ else {
+ iniFile = NULL;
+ ERR(" SetFile(%s) failed to allocate memory", file);
+ }
}
return false;
}
@@ -68,8 +81,8 @@
bool found = false;
if (!iniFile)
return found;
- CrashRecover();
- INFO("ReadString from %s\r\n", iniFile);
+ CleanUp();
+ INFO("ReadString from %s", iniFile);
FILE * fp = fopen(iniFile,"rt");
if (fp) {
char buf[INTERNAL_BUF_SIZE];
@@ -79,7 +92,7 @@
int x = strlen(buf) - 1; // remove trailing \r\n combinations
while (x >= 0 && buf[x] < ' ')
buf[x--] = '\0';
- INFO("read in [%s]\r\n", buf);
+ INFO(" reading \"%s\"", buf);
if (inSection && buf[0] != '[') {
char * eq = strchr(buf, '=');
if (eq) {
@@ -108,37 +121,37 @@
if (!found && defaultString != NULL && *defaultString) {
strncpy(buffer, defaultString, bufferSize);
buffer[bufferSize-1] = '\0';
- INFO("sub %s.\r\n", buffer);
+ INFO(" sub %s.", buffer);
found = true;
}
return found;
}
-bool INI::CrashRecover()
+bool INI::CleanUp()
{
char * newFile = (char *)malloc(strlen(iniFile)+1);
char * bakFile = (char *)malloc(strlen(iniFile)+1);
if (newFile && bakFile) {
- WARN("*** CrashRecover\r\n");
+ INFO("CleanUp");
strcpy(bakFile, iniFile);
strcpy(newFile, iniFile);
strcpy(bakFile + strlen(bakFile) - 4, ".bak");
strcpy(newFile + strlen(newFile) - 4, ".new");
- FILE * repair = fopen(newFile, "rt");
- if (repair) {
+ if (Exists(newFile)) {
int i;
- i = i; // suppress warning about i not used when !DEBUG
+ (void)i; // suppress warning about i not used when !DEBUG
// helps recover if the system crashed before it could swap in the new file
- INFO("*** repairing\r\n");
- fclose(repair);
+ INFO(" *** found %s, repairing ...", newFile);
i = remove(bakFile); // remove an old .bak
- INFO("remove(%s) returned %d\r\n", bakFile, i);
+ INFO(" remove(%s) returned %d", bakFile, i);
i = Rename(iniFile, bakFile); // move the existing .ini to .bak
- INFO("rename(%s,%s) returned %d\r\n", iniFile, bakFile, i);
+ INFO(" rename(%s,%s) returned %d", iniFile, bakFile, i);
i = Rename(newFile, iniFile); // move the new .new to .ini
- INFO("rename(%s,%s) returned %d\r\n", newFile, iniFile, i);
+ INFO(" rename(%s,%s) returned %d", newFile, iniFile, i);
+ } else {
+ // nothing to do, move on silently.
}
}
free(newFile);
@@ -155,6 +168,7 @@
bool found = false;
bool fileChanged = false;
+ INFO("WriteString(%s,%s,%s)", section, key, value);
if (!iniFile || (value != NULL && strlen(value) > INTERNAL_BUF_SIZE))
return found;
@@ -171,9 +185,9 @@
strcpy(bakFile + strlen(bakFile) - 4, ".bak");
strcpy(newFile + strlen(newFile) - 4, ".new");
- CrashRecover();
+ CleanUp();
- INFO("Opening [%s] and [%s]\r\n", iniFile, newFile);
+ INFO(" Opening [%s] and [%s]", iniFile, newFile);
FILE * fi = fopen(iniFile, "rt");
FILE * fo = fopen(newFile, "wt");
if (fo) {
@@ -181,6 +195,7 @@
bool inSection = (section == NULL) ? true : false;
if (fi) {
+ INFO(" %s opened for reading", iniFile);
while(fgets(buf, sizeof(buf), fi)) {
// if not inSection, copy across
// if inSection and not key, copy across
@@ -188,6 +203,7 @@
int x = strlen(buf) - 1; // remove trailing \r\n combinations
while (x >= 0 && buf[x] < ' ')
buf[x--] = '\0';
+
if (inSection && buf[0] != '[') {
char * eq = strchr(buf, '=');
if (eq) {
@@ -198,6 +214,7 @@
if (value != NULL) {
fprintf(fo, "%s=%s\n", key, value);
printf("write: %s=%s\r\n", key, value);
+ INFO(" write: %s=%s", key, value);
}
}
fileChanged = true;
@@ -206,7 +223,7 @@
} else {
// write old record
fprintf(fo, "%s=%s\n", buf, eq);
- INFO("write: %s=%s\r\n", buf, eq);
+ INFO(" write: %s=%s", buf, eq);
}
} else {
// what to do with unknown record(s)?
@@ -219,7 +236,7 @@
// Append new record to desired section
if (value != NULL) {
fprintf(fo, "%s=%s\r\n", key, value);
- INFO("write: %s=%s\r\n", key, value);
+ INFO(" write: %s=%s", key, value);
fileChanged = true;
}
found = true;
@@ -227,7 +244,7 @@
inSection = false;
// write old record
fprintf(fo, "%s\r\n", buf);
- INFO("write: %s\r\n", buf);
+ INFO(" write: %s", buf);
if (br) {
*br = '\0';
if (strcmp(buf+1, section) == 0)
@@ -237,40 +254,48 @@
// copy unaltered records across
if (buf[0]) {
fprintf(fo, "%s\r\n", buf);
- INFO("write: %s\r\n", buf);
+ INFO(" write: %s", buf);
}
}
}
}
- INFO("close %s\r\n", iniFile);
+ INFO("close %s", iniFile);
fclose(fi);
+ } else {
+ INFO(" %s did not previously exist.", iniFile);
}
if (!found) {
// No old file, just create it now
if (value != NULL) {
if (!inSection) {
fprintf(fo, "[%s]\r\n", section);
- INFO("write: [%s]\r\n", section);
+ INFO(" write: [%s]", section);
}
fprintf(fo, "%s=%s\r\n", key, value);
- INFO("write: %s=%s\r\n", key, value);
+ INFO(" write: %s=%s", key, value);
fileChanged = true;
}
found = true;
}
- INFO("close %s\r\n", newFile);
+ INFO(" close %s", newFile);
fclose(fo);
+ } else {
+ ERR("*** Failed to open %s", newFile);
}
if (fileChanged) {
- INFO("remove bak, rename ini to bak, rename new to ini\r\n");
+ INFO(" File changed: remove bak, rename ini to bak, rename new to ini");
remove(bakFile); // remove an old .bak
+ INFO(" a");
Rename(iniFile, bakFile); // move the existing .ini to .bak
+ INFO(" b");
Rename(newFile, iniFile); // move the new .new to .ini
+ INFO(" c");
#ifdef RTOS_H
Thread::wait(1000);
#else
wait(1);
#endif
+ INFO(" d");
}
free(newFile);
free(bakFile);
@@ -280,32 +305,19 @@
//***********************************************************
// Private version that also works with local file system
+// by copying one file to the other.
// Returns -1 = error; 0 = success
//***********************************************************
int INI::Rename(const char *oldfname, const char *newfname)
{
int retval = 0;
- int ch;
- FILE *fpold = fopen(oldfname, "r"); // src file
- FILE *fpnew = fopen(newfname, "w"); // dest file
-
- while (1) { // Copy src to dest
- ch = fgetc(fpold); // until src EOF read.
- if (ch == EOF) break;
- fputc(ch, fpnew);
- }
-
- fclose(fpnew);
- fclose(fpold);
-
- fpnew = fopen(newfname, "r"); // Reopen dest to insure
- if(fpnew == NULL) { // that it was created.
- retval = (-1); // Return Error.
+ INFO("Rename(%s,%s)", oldfname, newfname);
+ if (Copy(oldfname, newfname) == 0) {
+ remove(oldfname);
+ retval = 0;
} else {
- fclose(fpnew);
- remove(oldfname); // Remove original file.
- retval = (0); // Return Success.
+ retval = -1;
}
return (retval);
}
@@ -319,24 +331,32 @@
int retval = 0;
int ch;
+ INFO("Copy(%s,%s)", src, dst);
FILE *fpsrc = fopen(src, "r"); // src file
FILE *fpdst = fopen(dst, "w"); // dest file
- while (1) { // Copy src to dest
- ch = fgetc(fpsrc); // until src EOF read.
- if (ch == EOF) break;
- fputc(ch, fpdst);
+ if (fpsrc) {
+ INFO(" c1a");
+ if (fpdst) {
+ INFO(" c1b");
+ while (1) { // Copy src to dest
+ ch = fgetc(fpsrc); // until src EOF read.
+ if (ch == EOF) break;
+ fputc(ch, fpdst);
+ }
+ INFO(" c2");
+ fclose(fpsrc);
+ fclose(fpdst);
+ }
}
- fclose(fpsrc);
- fclose(fpdst);
+ INFO(" c3");
- fpdst = fopen(dst, "r"); // Reopen dest to insure
- if(fpdst == NULL) { // that it was created.
- retval = (-1); // Return error.
+ if (Exists(dst)) {
+ retval = 0;
} else {
- fclose(fpdst);
- retval = (0); // Return success.
+ retval = -1;
}
+ INFO(" c4");
return (retval);
}