A simple .ini file interface.

Dependents:   Smart-WiFly-WebServer SignalGenerator WattEye X10Svr

Committer:
WiredHome
Date:
Mon Jul 07 15:22:19 2014 +0000
Revision:
9:4947b8c244e9
Parent:
8:f128b10dfab1
Child:
10:57b93035ad82
reduce compiler warnings

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:ae5bf432c249 1 // Simple INI file manager.
WiredHome 0:ae5bf432c249 2 //
WiredHome 0:ae5bf432c249 3 #ifdef WIN32
WiredHome 0:ae5bf432c249 4 #include "string.h"
WiredHome 0:ae5bf432c249 5 #include "stdlib.h"
WiredHome 0:ae5bf432c249 6 #include "stdio.h"
WiredHome 0:ae5bf432c249 7 #else
WiredHome 0:ae5bf432c249 8 #include "mbed.h"
WiredHome 0:ae5bf432c249 9 #endif
WiredHome 0:ae5bf432c249 10
WiredHome 0:ae5bf432c249 11 #include "IniManager.h"
WiredHome 0:ae5bf432c249 12
WiredHome 8:f128b10dfab1 13 //#define DEBUG "INI " //Debug is disabled by default
WiredHome 1:1e2ee9bbee40 14
WiredHome 8:f128b10dfab1 15 #include <cstdio>
WiredHome 1:1e2ee9bbee40 16 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 8:f128b10dfab1 17 #define DBG(x, ...) std::printf("[DBG %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 8:f128b10dfab1 18 #define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 8:f128b10dfab1 19 #define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 8:f128b10dfab1 20 #define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 1:1e2ee9bbee40 21 #else
WiredHome 1:1e2ee9bbee40 22 #define DBG(x, ...)
WiredHome 1:1e2ee9bbee40 23 #define WARN(x, ...)
WiredHome 1:1e2ee9bbee40 24 #define ERR(x, ...)
WiredHome 1:1e2ee9bbee40 25 #define INFO(x, ...)
WiredHome 1:1e2ee9bbee40 26 #endif
WiredHome 1:1e2ee9bbee40 27
WiredHome 0:ae5bf432c249 28 INI::INI(const char * file)
WiredHome 0:ae5bf432c249 29 : iniFile(0)
WiredHome 0:ae5bf432c249 30 {
WiredHome 7:60f5dc3467ff 31 SetFile(file);
WiredHome 0:ae5bf432c249 32 }
WiredHome 0:ae5bf432c249 33
WiredHome 0:ae5bf432c249 34
WiredHome 0:ae5bf432c249 35 INI::~INI(void)
WiredHome 0:ae5bf432c249 36 {
WiredHome 0:ae5bf432c249 37 if (iniFile)
WiredHome 0:ae5bf432c249 38 free(iniFile);
WiredHome 0:ae5bf432c249 39 }
WiredHome 0:ae5bf432c249 40
WiredHome 0:ae5bf432c249 41
WiredHome 8:f128b10dfab1 42 bool INI::Exists(const char * file)
WiredHome 8:f128b10dfab1 43 {
WiredHome 8:f128b10dfab1 44 if (file == NULL)
WiredHome 8:f128b10dfab1 45 file = iniFile;
WiredHome 8:f128b10dfab1 46 INFO("Exists(%s)", file);
WiredHome 8:f128b10dfab1 47 FILE * fp = fopen(file, "r");
WiredHome 8:f128b10dfab1 48 if (fp) {
WiredHome 8:f128b10dfab1 49 fclose(fp);
WiredHome 8:f128b10dfab1 50 INFO(" [%s] exists", file);
WiredHome 8:f128b10dfab1 51 return true;
WiredHome 8:f128b10dfab1 52 } else {
WiredHome 8:f128b10dfab1 53 INFO(" [%s] does not exist", file);
WiredHome 8:f128b10dfab1 54 return false;
WiredHome 8:f128b10dfab1 55 }
WiredHome 8:f128b10dfab1 56 }
WiredHome 8:f128b10dfab1 57
WiredHome 8:f128b10dfab1 58
WiredHome 5:bfeb0882bd82 59 bool INI::SetFile(const char * file)
WiredHome 5:bfeb0882bd82 60 {
WiredHome 8:f128b10dfab1 61 INFO("SetFile(%s)", file);
WiredHome 5:bfeb0882bd82 62 if (file) {
WiredHome 5:bfeb0882bd82 63 if (iniFile)
WiredHome 5:bfeb0882bd82 64 free(iniFile);
WiredHome 5:bfeb0882bd82 65 iniFile = (char *)malloc(strlen(file)+1);
WiredHome 5:bfeb0882bd82 66 if (iniFile) {
WiredHome 5:bfeb0882bd82 67 strcpy(iniFile, file);
WiredHome 8:f128b10dfab1 68 INFO(" SetFile(%s) success", iniFile);
WiredHome 5:bfeb0882bd82 69 return true;
WiredHome 5:bfeb0882bd82 70 }
WiredHome 8:f128b10dfab1 71 else {
WiredHome 8:f128b10dfab1 72 iniFile = NULL;
WiredHome 8:f128b10dfab1 73 ERR(" SetFile(%s) failed to allocate memory", file);
WiredHome 8:f128b10dfab1 74 }
WiredHome 5:bfeb0882bd82 75 }
WiredHome 5:bfeb0882bd82 76 return false;
WiredHome 5:bfeb0882bd82 77 }
WiredHome 5:bfeb0882bd82 78
WiredHome 0:ae5bf432c249 79 bool INI::ReadString(const char * section, const char * key, char * buffer, size_t bufferSize, const char * defaultString)
WiredHome 0:ae5bf432c249 80 {
WiredHome 0:ae5bf432c249 81 bool found = false;
WiredHome 0:ae5bf432c249 82 if (!iniFile)
WiredHome 0:ae5bf432c249 83 return found;
WiredHome 8:f128b10dfab1 84 CleanUp();
WiredHome 8:f128b10dfab1 85 INFO("ReadString from %s", iniFile);
WiredHome 0:ae5bf432c249 86 FILE * fp = fopen(iniFile,"rt");
WiredHome 0:ae5bf432c249 87 if (fp) {
WiredHome 0:ae5bf432c249 88 char buf[INTERNAL_BUF_SIZE];
WiredHome 0:ae5bf432c249 89 bool inSection = (section == NULL) ? true : false;
WiredHome 0:ae5bf432c249 90
WiredHome 0:ae5bf432c249 91 while(fgets(buf, sizeof(buf), fp)) {
WiredHome 0:ae5bf432c249 92 int x = strlen(buf) - 1; // remove trailing \r\n combinations
WiredHome 0:ae5bf432c249 93 while (x >= 0 && buf[x] < ' ')
WiredHome 0:ae5bf432c249 94 buf[x--] = '\0';
WiredHome 8:f128b10dfab1 95 INFO(" reading \"%s\"", buf);
WiredHome 0:ae5bf432c249 96 if (inSection && buf[0] != '[') {
WiredHome 0:ae5bf432c249 97 char * eq = strchr(buf, '=');
WiredHome 0:ae5bf432c249 98 if (eq) {
WiredHome 0:ae5bf432c249 99 *eq++ = '\0';
WiredHome 0:ae5bf432c249 100 if ( (strcmp(buf,key) == 0) && (strlen(eq) <= bufferSize) ) {
WiredHome 0:ae5bf432c249 101 strcpy(buffer, eq);
WiredHome 0:ae5bf432c249 102 memset(buf, 0, INTERNAL_BUF_SIZE); // secure the memory space
WiredHome 0:ae5bf432c249 103 found = true;
WiredHome 0:ae5bf432c249 104 break;
WiredHome 0:ae5bf432c249 105 }
WiredHome 0:ae5bf432c249 106 }
WiredHome 0:ae5bf432c249 107 } else {
WiredHome 0:ae5bf432c249 108 if (buf[0] == '[') {
WiredHome 0:ae5bf432c249 109 char * br = strchr(buf, ']');
WiredHome 0:ae5bf432c249 110 inSection = false;
WiredHome 0:ae5bf432c249 111 if (br) {
WiredHome 0:ae5bf432c249 112 *br = '\0';
WiredHome 0:ae5bf432c249 113 if (strcmp(buf+1, section) == 0)
WiredHome 0:ae5bf432c249 114 inSection = true;
WiredHome 0:ae5bf432c249 115 }
WiredHome 0:ae5bf432c249 116 }
WiredHome 0:ae5bf432c249 117 }
WiredHome 0:ae5bf432c249 118 }
WiredHome 0:ae5bf432c249 119 fclose(fp);
WiredHome 0:ae5bf432c249 120 }
WiredHome 0:ae5bf432c249 121 if (!found && defaultString != NULL && *defaultString) {
WiredHome 0:ae5bf432c249 122 strncpy(buffer, defaultString, bufferSize);
WiredHome 0:ae5bf432c249 123 buffer[bufferSize-1] = '\0';
WiredHome 8:f128b10dfab1 124 INFO(" sub %s.", buffer);
WiredHome 0:ae5bf432c249 125 found = true;
WiredHome 0:ae5bf432c249 126 }
WiredHome 0:ae5bf432c249 127 return found;
WiredHome 0:ae5bf432c249 128 }
WiredHome 0:ae5bf432c249 129
WiredHome 8:f128b10dfab1 130 bool INI::CleanUp()
WiredHome 0:ae5bf432c249 131 {
WiredHome 0:ae5bf432c249 132 char * newFile = (char *)malloc(strlen(iniFile)+1);
WiredHome 0:ae5bf432c249 133 char * bakFile = (char *)malloc(strlen(iniFile)+1);
WiredHome 0:ae5bf432c249 134
WiredHome 0:ae5bf432c249 135 if (newFile && bakFile) {
WiredHome 8:f128b10dfab1 136 INFO("CleanUp");
WiredHome 0:ae5bf432c249 137 strcpy(bakFile, iniFile);
WiredHome 0:ae5bf432c249 138 strcpy(newFile, iniFile);
WiredHome 0:ae5bf432c249 139 strcpy(bakFile + strlen(bakFile) - 4, ".bak");
WiredHome 0:ae5bf432c249 140 strcpy(newFile + strlen(newFile) - 4, ".new");
WiredHome 0:ae5bf432c249 141
WiredHome 8:f128b10dfab1 142 if (Exists(newFile)) {
WiredHome 2:c63a794c1fee 143 int i;
WiredHome 9:4947b8c244e9 144 i = i; // suppress warning about i not used when !DEBUG
WiredHome 0:ae5bf432c249 145 // helps recover if the system crashed before it could swap in the new file
WiredHome 8:f128b10dfab1 146 INFO(" *** found %s, repairing ...", newFile);
WiredHome 0:ae5bf432c249 147 i = remove(bakFile); // remove an old .bak
WiredHome 8:f128b10dfab1 148 INFO(" remove(%s) returned %d", bakFile, i);
WiredHome 0:ae5bf432c249 149 i = Rename(iniFile, bakFile); // move the existing .ini to .bak
WiredHome 8:f128b10dfab1 150 INFO(" rename(%s,%s) returned %d", iniFile, bakFile, i);
WiredHome 0:ae5bf432c249 151 i = Rename(newFile, iniFile); // move the new .new to .ini
WiredHome 8:f128b10dfab1 152 INFO(" rename(%s,%s) returned %d", newFile, iniFile, i);
WiredHome 8:f128b10dfab1 153 } else {
WiredHome 8:f128b10dfab1 154 // nothing to do, move on silently.
WiredHome 0:ae5bf432c249 155 }
WiredHome 0:ae5bf432c249 156 }
WiredHome 0:ae5bf432c249 157 free(newFile);
WiredHome 0:ae5bf432c249 158 free(bakFile);
WiredHome 0:ae5bf432c249 159 return true;
WiredHome 0:ae5bf432c249 160 }
WiredHome 0:ae5bf432c249 161
WiredHome 0:ae5bf432c249 162 // Create the new version as .new
WiredHome 0:ae5bf432c249 163 // once complete, if something actually changed, then rename the .ini to .bak and rename the .new to .ini
WiredHome 0:ae5bf432c249 164 // once complete, if nothing actually changed, then delete the .new
WiredHome 0:ae5bf432c249 165 //
WiredHome 0:ae5bf432c249 166 bool INI::WriteString(const char * section, const char * key, char * value)
WiredHome 0:ae5bf432c249 167 {
WiredHome 0:ae5bf432c249 168 bool found = false;
WiredHome 0:ae5bf432c249 169 bool fileChanged = false;
WiredHome 0:ae5bf432c249 170
WiredHome 8:f128b10dfab1 171 INFO("WriteString(%s,%s,%s)", section, key, value);
WiredHome 0:ae5bf432c249 172 if (!iniFile || (value != NULL && strlen(value) > INTERNAL_BUF_SIZE))
WiredHome 0:ae5bf432c249 173 return found;
WiredHome 0:ae5bf432c249 174
WiredHome 0:ae5bf432c249 175 char * newFile = (char *)malloc(strlen(iniFile)+1);
WiredHome 0:ae5bf432c249 176 char * bakFile = (char *)malloc(strlen(iniFile)+1);
WiredHome 0:ae5bf432c249 177 if (!newFile)
WiredHome 0:ae5bf432c249 178 return found; // no memory
WiredHome 0:ae5bf432c249 179 if (!bakFile) {
WiredHome 0:ae5bf432c249 180 free(newFile);
WiredHome 0:ae5bf432c249 181 return found;
WiredHome 0:ae5bf432c249 182 }
WiredHome 0:ae5bf432c249 183 strcpy(bakFile, iniFile);
WiredHome 0:ae5bf432c249 184 strcpy(newFile, iniFile);
WiredHome 0:ae5bf432c249 185 strcpy(bakFile + strlen(bakFile) - 4, ".bak");
WiredHome 0:ae5bf432c249 186 strcpy(newFile + strlen(newFile) - 4, ".new");
WiredHome 0:ae5bf432c249 187
WiredHome 8:f128b10dfab1 188 CleanUp();
WiredHome 0:ae5bf432c249 189
WiredHome 8:f128b10dfab1 190 INFO(" Opening [%s] and [%s]", iniFile, newFile);
WiredHome 0:ae5bf432c249 191 FILE * fi = fopen(iniFile, "rt");
WiredHome 0:ae5bf432c249 192 FILE * fo = fopen(newFile, "wt");
WiredHome 0:ae5bf432c249 193 if (fo) {
WiredHome 0:ae5bf432c249 194 char buf[INTERNAL_BUF_SIZE];
WiredHome 0:ae5bf432c249 195 bool inSection = (section == NULL) ? true : false;
WiredHome 0:ae5bf432c249 196
WiredHome 0:ae5bf432c249 197 if (fi) {
WiredHome 8:f128b10dfab1 198 INFO(" %s opened for reading", iniFile);
WiredHome 0:ae5bf432c249 199 while(fgets(buf, sizeof(buf), fi)) {
WiredHome 0:ae5bf432c249 200 // if not inSection, copy across
WiredHome 0:ae5bf432c249 201 // if inSection and not key, copy across
WiredHome 0:ae5bf432c249 202 // if InSection and key, write new value (or skip if value is null)
WiredHome 0:ae5bf432c249 203 int x = strlen(buf) - 1; // remove trailing \r\n combinations
WiredHome 0:ae5bf432c249 204 while (x >= 0 && buf[x] < ' ')
WiredHome 0:ae5bf432c249 205 buf[x--] = '\0';
WiredHome 8:f128b10dfab1 206
WiredHome 0:ae5bf432c249 207 if (inSection && buf[0] != '[') {
WiredHome 0:ae5bf432c249 208 char * eq = strchr(buf, '=');
WiredHome 0:ae5bf432c249 209 if (eq) {
WiredHome 0:ae5bf432c249 210 *eq++ = '\0';
WiredHome 0:ae5bf432c249 211 if (strcmp(buf,key) == 0) {
WiredHome 0:ae5bf432c249 212 if (value != NULL && strcmp(eq, value) != 0) {
WiredHome 0:ae5bf432c249 213 // replace the old record
WiredHome 0:ae5bf432c249 214 if (value != NULL) {
WiredHome 0:ae5bf432c249 215 fprintf(fo, "%s=%s\n", key, value);
WiredHome 0:ae5bf432c249 216 printf("write: %s=%s\r\n", key, value);
WiredHome 8:f128b10dfab1 217 INFO(" write: %s=%s", key, value);
WiredHome 0:ae5bf432c249 218 }
WiredHome 0:ae5bf432c249 219 }
WiredHome 0:ae5bf432c249 220 fileChanged = true;
WiredHome 0:ae5bf432c249 221 inSection = false;
WiredHome 0:ae5bf432c249 222 found = true;
WiredHome 0:ae5bf432c249 223 } else {
WiredHome 0:ae5bf432c249 224 // write old record
WiredHome 0:ae5bf432c249 225 fprintf(fo, "%s=%s\n", buf, eq);
WiredHome 8:f128b10dfab1 226 INFO(" write: %s=%s", buf, eq);
WiredHome 0:ae5bf432c249 227 }
WiredHome 0:ae5bf432c249 228 } else {
WiredHome 0:ae5bf432c249 229 // what to do with unknown record(s)?
WiredHome 0:ae5bf432c249 230 // fprintf(fo, "%s\n", buf); // eliminate them
WiredHome 0:ae5bf432c249 231 }
WiredHome 0:ae5bf432c249 232 } else {
WiredHome 0:ae5bf432c249 233 if (buf[0] == '[') {
WiredHome 0:ae5bf432c249 234 char * br = strchr(buf, ']');
WiredHome 0:ae5bf432c249 235 if (inSection) { // found next section while in good section
WiredHome 0:ae5bf432c249 236 // Append new record to desired section
WiredHome 0:ae5bf432c249 237 if (value != NULL) {
WiredHome 0:ae5bf432c249 238 fprintf(fo, "%s=%s\r\n", key, value);
WiredHome 8:f128b10dfab1 239 INFO(" write: %s=%s", key, value);
WiredHome 0:ae5bf432c249 240 fileChanged = true;
WiredHome 0:ae5bf432c249 241 }
WiredHome 0:ae5bf432c249 242 found = true;
WiredHome 0:ae5bf432c249 243 }
WiredHome 0:ae5bf432c249 244 inSection = false;
WiredHome 0:ae5bf432c249 245 // write old record
WiredHome 0:ae5bf432c249 246 fprintf(fo, "%s\r\n", buf);
WiredHome 8:f128b10dfab1 247 INFO(" write: %s", buf);
WiredHome 0:ae5bf432c249 248 if (br) {
WiredHome 0:ae5bf432c249 249 *br = '\0';
WiredHome 0:ae5bf432c249 250 if (strcmp(buf+1, section) == 0)
WiredHome 0:ae5bf432c249 251 inSection = true;
WiredHome 0:ae5bf432c249 252 }
WiredHome 0:ae5bf432c249 253 } else {
WiredHome 0:ae5bf432c249 254 // copy unaltered records across
WiredHome 0:ae5bf432c249 255 if (buf[0]) {
WiredHome 0:ae5bf432c249 256 fprintf(fo, "%s\r\n", buf);
WiredHome 8:f128b10dfab1 257 INFO(" write: %s", buf);
WiredHome 0:ae5bf432c249 258 }
WiredHome 0:ae5bf432c249 259 }
WiredHome 0:ae5bf432c249 260 }
WiredHome 0:ae5bf432c249 261 }
WiredHome 8:f128b10dfab1 262 INFO("close %s", iniFile);
WiredHome 0:ae5bf432c249 263 fclose(fi);
WiredHome 8:f128b10dfab1 264 } else {
WiredHome 8:f128b10dfab1 265 INFO(" %s did not previously exist.", iniFile);
WiredHome 0:ae5bf432c249 266 }
WiredHome 0:ae5bf432c249 267 if (!found) {
WiredHome 0:ae5bf432c249 268 // No old file, just create it now
WiredHome 0:ae5bf432c249 269 if (value != NULL) {
WiredHome 0:ae5bf432c249 270 if (!inSection) {
WiredHome 0:ae5bf432c249 271 fprintf(fo, "[%s]\r\n", section);
WiredHome 8:f128b10dfab1 272 INFO(" write: [%s]", section);
WiredHome 0:ae5bf432c249 273 }
WiredHome 0:ae5bf432c249 274 fprintf(fo, "%s=%s\r\n", key, value);
WiredHome 8:f128b10dfab1 275 INFO(" write: %s=%s", key, value);
WiredHome 0:ae5bf432c249 276 fileChanged = true;
WiredHome 0:ae5bf432c249 277 }
WiredHome 0:ae5bf432c249 278 found = true;
WiredHome 0:ae5bf432c249 279 }
WiredHome 8:f128b10dfab1 280 INFO(" close %s", newFile);
WiredHome 0:ae5bf432c249 281 fclose(fo);
WiredHome 8:f128b10dfab1 282 } else {
WiredHome 8:f128b10dfab1 283 ERR("*** Failed to open %s", newFile);
WiredHome 0:ae5bf432c249 284 }
WiredHome 0:ae5bf432c249 285 if (fileChanged) {
WiredHome 8:f128b10dfab1 286 INFO(" File changed: remove bak, rename ini to bak, rename new to ini");
WiredHome 0:ae5bf432c249 287 remove(bakFile); // remove an old .bak
WiredHome 8:f128b10dfab1 288 INFO(" a");
WiredHome 0:ae5bf432c249 289 Rename(iniFile, bakFile); // move the existing .ini to .bak
WiredHome 8:f128b10dfab1 290 INFO(" b");
WiredHome 0:ae5bf432c249 291 Rename(newFile, iniFile); // move the new .new to .ini
WiredHome 8:f128b10dfab1 292 INFO(" c");
WiredHome 4:70042853d43b 293 #ifdef RTOS_H
WiredHome 4:70042853d43b 294 Thread::wait(1000);
WiredHome 4:70042853d43b 295 #else
WiredHome 0:ae5bf432c249 296 wait(1);
WiredHome 4:70042853d43b 297 #endif
WiredHome 8:f128b10dfab1 298 INFO(" d");
WiredHome 0:ae5bf432c249 299 }
WiredHome 0:ae5bf432c249 300 free(newFile);
WiredHome 0:ae5bf432c249 301 free(bakFile);
WiredHome 0:ae5bf432c249 302 return found;
WiredHome 0:ae5bf432c249 303 }
WiredHome 0:ae5bf432c249 304
WiredHome 0:ae5bf432c249 305
WiredHome 0:ae5bf432c249 306 //***********************************************************
WiredHome 0:ae5bf432c249 307 // Private version that also works with local file system
WiredHome 8:f128b10dfab1 308 // by copying one file to the other.
WiredHome 0:ae5bf432c249 309 // Returns -1 = error; 0 = success
WiredHome 0:ae5bf432c249 310 //***********************************************************
WiredHome 0:ae5bf432c249 311 int INI::Rename(const char *oldfname, const char *newfname)
WiredHome 0:ae5bf432c249 312 {
WiredHome 0:ae5bf432c249 313 int retval = 0;
WiredHome 0:ae5bf432c249 314
WiredHome 8:f128b10dfab1 315 INFO("Rename(%s,%s)", oldfname, newfname);
WiredHome 8:f128b10dfab1 316 if (Copy(oldfname, newfname) == 0) {
WiredHome 8:f128b10dfab1 317 remove(oldfname);
WiredHome 8:f128b10dfab1 318 retval = 0;
WiredHome 0:ae5bf432c249 319 } else {
WiredHome 8:f128b10dfab1 320 retval = -1;
WiredHome 0:ae5bf432c249 321 }
WiredHome 0:ae5bf432c249 322 return (retval);
WiredHome 0:ae5bf432c249 323 }
WiredHome 0:ae5bf432c249 324
WiredHome 0:ae5bf432c249 325 //***********************************************************
WiredHome 0:ae5bf432c249 326 // Private version that also works with local file system
WiredHome 0:ae5bf432c249 327 // Returns -1 = error; 0 = success
WiredHome 0:ae5bf432c249 328 //***********************************************************
WiredHome 0:ae5bf432c249 329 int INI::Copy(const char *src, const char *dst)
WiredHome 0:ae5bf432c249 330 {
WiredHome 0:ae5bf432c249 331 int retval = 0;
WiredHome 0:ae5bf432c249 332 int ch;
WiredHome 0:ae5bf432c249 333
WiredHome 8:f128b10dfab1 334 INFO("Copy(%s,%s)", src, dst);
WiredHome 0:ae5bf432c249 335 FILE *fpsrc = fopen(src, "r"); // src file
WiredHome 0:ae5bf432c249 336 FILE *fpdst = fopen(dst, "w"); // dest file
WiredHome 0:ae5bf432c249 337
WiredHome 8:f128b10dfab1 338 if (fpsrc) {
WiredHome 8:f128b10dfab1 339 INFO(" c1a");
WiredHome 8:f128b10dfab1 340 if (fpdst) {
WiredHome 8:f128b10dfab1 341 INFO(" c1b");
WiredHome 8:f128b10dfab1 342 while (1) { // Copy src to dest
WiredHome 8:f128b10dfab1 343 ch = fgetc(fpsrc); // until src EOF read.
WiredHome 8:f128b10dfab1 344 if (ch == EOF) break;
WiredHome 8:f128b10dfab1 345 fputc(ch, fpdst);
WiredHome 8:f128b10dfab1 346 }
WiredHome 8:f128b10dfab1 347 INFO(" c2");
WiredHome 8:f128b10dfab1 348 fclose(fpsrc);
WiredHome 8:f128b10dfab1 349 fclose(fpdst);
WiredHome 8:f128b10dfab1 350 }
WiredHome 0:ae5bf432c249 351 }
WiredHome 8:f128b10dfab1 352 INFO(" c3");
WiredHome 0:ae5bf432c249 353
WiredHome 8:f128b10dfab1 354 if (Exists(dst)) {
WiredHome 8:f128b10dfab1 355 retval = 0;
WiredHome 0:ae5bf432c249 356 } else {
WiredHome 8:f128b10dfab1 357 retval = -1;
WiredHome 0:ae5bf432c249 358 }
WiredHome 8:f128b10dfab1 359 INFO(" c4");
WiredHome 0:ae5bf432c249 360 return (retval);
WiredHome 0:ae5bf432c249 361 }
WiredHome 0:ae5bf432c249 362
WiredHome 0:ae5bf432c249 363
WiredHome 0:ae5bf432c249 364 #if 0
WiredHome 0:ae5bf432c249 365 // Test code for basic regression testing
WiredHome 0:ae5bf432c249 366 //
WiredHome 0:ae5bf432c249 367 #include <stdio.h>
WiredHome 0:ae5bf432c249 368 #include <assert.h>
WiredHome 0:ae5bf432c249 369 #include <string.h>
WiredHome 0:ae5bf432c249 370
WiredHome 0:ae5bf432c249 371 #include "INI.h"
WiredHome 0:ae5bf432c249 372
WiredHome 0:ae5bf432c249 373 #define TESTFILE "test.ini"
WiredHome 0:ae5bf432c249 374
WiredHome 0:ae5bf432c249 375 int main(int argc, char * argv[])
WiredHome 0:ae5bf432c249 376 {
WiredHome 0:ae5bf432c249 377 FILE * fp;
WiredHome 0:ae5bf432c249 378 char buffer[100];
WiredHome 0:ae5bf432c249 379 INI ini(TESTFILE);
WiredHome 0:ae5bf432c249 380
WiredHome 0:ae5bf432c249 381 // Start testing
WiredHome 0:ae5bf432c249 382 _unlink(TESTFILE);
WiredHome 0:ae5bf432c249 383 assert(ini.ReadString("Section 1", "Name 1", buffer, sizeof(buffer)) == false);
WiredHome 0:ae5bf432c249 384
WiredHome 0:ae5bf432c249 385 fp = fopen(TESTFILE, "wt");
WiredHome 0:ae5bf432c249 386 assert(fp);
WiredHome 0:ae5bf432c249 387 fprintf(fp, "[Section 1]\n");
WiredHome 0:ae5bf432c249 388 fprintf(fp, "Name 1=Value 1\n");
WiredHome 0:ae5bf432c249 389 fprintf(fp, "Name 2=Value 2\n");
WiredHome 0:ae5bf432c249 390 fprintf(fp, "\n");
WiredHome 0:ae5bf432c249 391 fprintf(fp, "[Section 2]\n");
WiredHome 0:ae5bf432c249 392 fprintf(fp, "Name 1=Value 2\n");
WiredHome 0:ae5bf432c249 393 fprintf(fp, "Name 2=Value 2\n");
WiredHome 0:ae5bf432c249 394 fprintf(fp, "Name 3=Value 3\n");
WiredHome 0:ae5bf432c249 395 fprintf(fp, "\n");
WiredHome 0:ae5bf432c249 396 fclose(fp);
WiredHome 0:ae5bf432c249 397
WiredHome 0:ae5bf432c249 398 assert(ini.ReadString("Section 2", "Name 2", buffer, sizeof(buffer)) == true);
WiredHome 0:ae5bf432c249 399 assert(strcmp("Value 2", buffer) == 0);
WiredHome 0:ae5bf432c249 400
WiredHome 0:ae5bf432c249 401 assert(ini.ReadString("Section 3", "Name", buffer, sizeof(buffer)) == false);
WiredHome 0:ae5bf432c249 402 assert(ini.ReadString("Section 1", "Name 3", buffer, sizeof(buffer)) == false);
WiredHome 0:ae5bf432c249 403
WiredHome 0:ae5bf432c249 404 assert(ini.WriteString("Section 1", "Name 4", "Value 4") == true);
WiredHome 0:ae5bf432c249 405 assert(ini.ReadString("Section 1", "Name 2", buffer, sizeof(buffer)) == true);
WiredHome 0:ae5bf432c249 406 assert(ini.ReadString("Section 1", "Name 3", buffer, sizeof(buffer)) == false);
WiredHome 0:ae5bf432c249 407 assert(ini.ReadString("Section 1", "Name 4", buffer, sizeof(buffer)) == true);
WiredHome 0:ae5bf432c249 408 assert(strcmp("Value 4", buffer) == 0);
WiredHome 0:ae5bf432c249 409
WiredHome 0:ae5bf432c249 410 assert(ini.WriteString("Section 1", "Name 4", NULL) == true);
WiredHome 0:ae5bf432c249 411 assert(ini.ReadString("Section 1", "Name 4", buffer, sizeof(buffer)) == false);
WiredHome 0:ae5bf432c249 412
WiredHome 0:ae5bf432c249 413 return 0;
WiredHome 0:ae5bf432c249 414 }
WiredHome 0:ae5bf432c249 415 #endif