most functionality to splashdwon, find neutral and start mission. short timeouts still in code for testing, will adjust to go directly to sit_idle after splashdown

Dependencies:   mbed MODSERIAL FATFileSystem

Committer:
joel_ssc
Date:
Mon May 13 19:25:26 2019 +0000
Revision:
92:52a91656458a
Parent:
9:d5fcdcb3c89d
version for first flight test, timeouts not yet set correctly

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mkelly10 9:d5fcdcb3c89d 1 /**
mkelly10 9:d5fcdcb3c89d 2 * Configuration file interface class (Version 0.0.1)
mkelly10 9:d5fcdcb3c89d 3 *
mkelly10 9:d5fcdcb3c89d 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
mkelly10 9:d5fcdcb3c89d 5 * http://shinta.main.jp/
mkelly10 9:d5fcdcb3c89d 6 */
mkelly10 9:d5fcdcb3c89d 7 #include "ConfigFile.h"
mkelly10 9:d5fcdcb3c89d 8
mkelly10 9:d5fcdcb3c89d 9 #define NEWLINE_UNIX "\n"
mkelly10 9:d5fcdcb3c89d 10 #define NEWLINE_DOS "\r\n"
mkelly10 9:d5fcdcb3c89d 11 #define NEWLINE_MAC "\r"
mkelly10 9:d5fcdcb3c89d 12
mkelly10 9:d5fcdcb3c89d 13 /**
mkelly10 9:d5fcdcb3c89d 14 * Create a configuration file class.
mkelly10 9:d5fcdcb3c89d 15 */
mkelly10 9:d5fcdcb3c89d 16 ConfigFile::ConfigFile() {
mkelly10 9:d5fcdcb3c89d 17 /*
mkelly10 9:d5fcdcb3c89d 18 * Allocation for a config_t list.
mkelly10 9:d5fcdcb3c89d 19 */
mkelly10 9:d5fcdcb3c89d 20 configlist = (config_t **)malloc(sizeof(config_t *) * MAXCONFIG);
mkelly10 9:d5fcdcb3c89d 21 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 22 configlist[i] = NULL;
mkelly10 9:d5fcdcb3c89d 23 }
mkelly10 9:d5fcdcb3c89d 24 }
mkelly10 9:d5fcdcb3c89d 25
mkelly10 9:d5fcdcb3c89d 26 /**
mkelly10 9:d5fcdcb3c89d 27 * Destroy a configuration file class.
mkelly10 9:d5fcdcb3c89d 28 */
mkelly10 9:d5fcdcb3c89d 29 ConfigFile::~ConfigFile() {
mkelly10 9:d5fcdcb3c89d 30 /*
mkelly10 9:d5fcdcb3c89d 31 * Remove all storage and the contents.
mkelly10 9:d5fcdcb3c89d 32 */
mkelly10 9:d5fcdcb3c89d 33 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 34 config_t *cfg = configlist[i];
mkelly10 9:d5fcdcb3c89d 35 if (cfg != NULL) {
mkelly10 9:d5fcdcb3c89d 36 free(cfg->key);
mkelly10 9:d5fcdcb3c89d 37 free(cfg->value);
mkelly10 9:d5fcdcb3c89d 38 free(cfg);
mkelly10 9:d5fcdcb3c89d 39 }
mkelly10 9:d5fcdcb3c89d 40 configlist[i] = NULL;
mkelly10 9:d5fcdcb3c89d 41 }
mkelly10 9:d5fcdcb3c89d 42
mkelly10 9:d5fcdcb3c89d 43 /*
mkelly10 9:d5fcdcb3c89d 44 * Remove cnofig_t list.
mkelly10 9:d5fcdcb3c89d 45 */
mkelly10 9:d5fcdcb3c89d 46 free(configlist);
mkelly10 9:d5fcdcb3c89d 47 configlist = NULL;
mkelly10 9:d5fcdcb3c89d 48 }
mkelly10 9:d5fcdcb3c89d 49
mkelly10 9:d5fcdcb3c89d 50 /**
mkelly10 9:d5fcdcb3c89d 51 * Get a value for a key.
mkelly10 9:d5fcdcb3c89d 52 *
mkelly10 9:d5fcdcb3c89d 53 * @param key A target key name.
mkelly10 9:d5fcdcb3c89d 54 * @param value A pointer to a value storage.
mkelly10 9:d5fcdcb3c89d 55 * @param siz A size of a value storage.
mkelly10 9:d5fcdcb3c89d 56 * @return A value or NULL.
mkelly10 9:d5fcdcb3c89d 57 */
mkelly10 9:d5fcdcb3c89d 58 bool ConfigFile::getValue(char *key, char *value, size_t siz) {
mkelly10 9:d5fcdcb3c89d 59 /*
mkelly10 9:d5fcdcb3c89d 60 * Null check.
mkelly10 9:d5fcdcb3c89d 61 */
mkelly10 9:d5fcdcb3c89d 62 if (key == NULL) {
mkelly10 9:d5fcdcb3c89d 63 return false;
mkelly10 9:d5fcdcb3c89d 64 }
mkelly10 9:d5fcdcb3c89d 65
mkelly10 9:d5fcdcb3c89d 66 /*
mkelly10 9:d5fcdcb3c89d 67 * Search a config_t object from the key.
mkelly10 9:d5fcdcb3c89d 68 */
mkelly10 9:d5fcdcb3c89d 69 config_t *p = search(key);
mkelly10 9:d5fcdcb3c89d 70 if (p == NULL) {
mkelly10 9:d5fcdcb3c89d 71 return false;
mkelly10 9:d5fcdcb3c89d 72 }
mkelly10 9:d5fcdcb3c89d 73
mkelly10 9:d5fcdcb3c89d 74 /*
mkelly10 9:d5fcdcb3c89d 75 * Check the storage size.
mkelly10 9:d5fcdcb3c89d 76 */
mkelly10 9:d5fcdcb3c89d 77 if (siz <= strlen(p->value)) {
mkelly10 9:d5fcdcb3c89d 78 return false;
mkelly10 9:d5fcdcb3c89d 79 }
mkelly10 9:d5fcdcb3c89d 80
mkelly10 9:d5fcdcb3c89d 81 /*
mkelly10 9:d5fcdcb3c89d 82 * Copy the value to the storage.
mkelly10 9:d5fcdcb3c89d 83 */
mkelly10 9:d5fcdcb3c89d 84 strcpy(value, p->value);
mkelly10 9:d5fcdcb3c89d 85 return true;
mkelly10 9:d5fcdcb3c89d 86 }
mkelly10 9:d5fcdcb3c89d 87
mkelly10 9:d5fcdcb3c89d 88 /**
mkelly10 9:d5fcdcb3c89d 89 * Set a set of a key and value.
mkelly10 9:d5fcdcb3c89d 90 *
mkelly10 9:d5fcdcb3c89d 91 * @param key A key.
mkelly10 9:d5fcdcb3c89d 92 * @param value A value.
mkelly10 9:d5fcdcb3c89d 93 *
mkelly10 9:d5fcdcb3c89d 94 * @return True if it succeed.
mkelly10 9:d5fcdcb3c89d 95 */
mkelly10 9:d5fcdcb3c89d 96 bool ConfigFile::setValue(char *key, char *value) {
mkelly10 9:d5fcdcb3c89d 97 /*
mkelly10 9:d5fcdcb3c89d 98 * Null check.
mkelly10 9:d5fcdcb3c89d 99 */
mkelly10 9:d5fcdcb3c89d 100 if ((key == NULL) || (value == NULL)) {
mkelly10 9:d5fcdcb3c89d 101 return false;
mkelly10 9:d5fcdcb3c89d 102 }
mkelly10 9:d5fcdcb3c89d 103
mkelly10 9:d5fcdcb3c89d 104 /*
mkelly10 9:d5fcdcb3c89d 105 * Size check.
mkelly10 9:d5fcdcb3c89d 106 */
mkelly10 9:d5fcdcb3c89d 107 if ((MAXLEN_KEY < strlen(key)) || (MAXLEN_VALUE < strlen(value))) {
mkelly10 9:d5fcdcb3c89d 108 return false;
mkelly10 9:d5fcdcb3c89d 109 }
mkelly10 9:d5fcdcb3c89d 110
mkelly10 9:d5fcdcb3c89d 111 /*
mkelly10 9:d5fcdcb3c89d 112 * Search a config_t object from the key.
mkelly10 9:d5fcdcb3c89d 113 */
mkelly10 9:d5fcdcb3c89d 114 config_t *p = search(key);
mkelly10 9:d5fcdcb3c89d 115 if (p == NULL) {
mkelly10 9:d5fcdcb3c89d 116 /*
mkelly10 9:d5fcdcb3c89d 117 * Allocation a memory for a new key.
mkelly10 9:d5fcdcb3c89d 118 */
mkelly10 9:d5fcdcb3c89d 119 char *k = (char *)malloc(sizeof(char) * (strlen(key) + 1));
mkelly10 9:d5fcdcb3c89d 120 if (k == NULL) {
mkelly10 9:d5fcdcb3c89d 121 return false;
mkelly10 9:d5fcdcb3c89d 122 }
mkelly10 9:d5fcdcb3c89d 123 strcpy(k, key);
mkelly10 9:d5fcdcb3c89d 124
mkelly10 9:d5fcdcb3c89d 125 /*
mkelly10 9:d5fcdcb3c89d 126 * Allocation a memory for a new value.
mkelly10 9:d5fcdcb3c89d 127 */
mkelly10 9:d5fcdcb3c89d 128 char *v = (char *)malloc(sizeof(char) * (strlen(value) + 1));
mkelly10 9:d5fcdcb3c89d 129 if (v == NULL) {
mkelly10 9:d5fcdcb3c89d 130 free(k);
mkelly10 9:d5fcdcb3c89d 131 return false;
mkelly10 9:d5fcdcb3c89d 132 }
mkelly10 9:d5fcdcb3c89d 133 strcpy(v, value);
mkelly10 9:d5fcdcb3c89d 134
mkelly10 9:d5fcdcb3c89d 135 /*
mkelly10 9:d5fcdcb3c89d 136 * Allocation a memory for a new configuration.
mkelly10 9:d5fcdcb3c89d 137 */
mkelly10 9:d5fcdcb3c89d 138 config_t *cfg = (config_t *)malloc(sizeof(config_t) * 1);
mkelly10 9:d5fcdcb3c89d 139 if (cfg == NULL) {
mkelly10 9:d5fcdcb3c89d 140 free(k);
mkelly10 9:d5fcdcb3c89d 141 free(v);
mkelly10 9:d5fcdcb3c89d 142 return false;
mkelly10 9:d5fcdcb3c89d 143 }
mkelly10 9:d5fcdcb3c89d 144 cfg->key = k;
mkelly10 9:d5fcdcb3c89d 145 cfg->value = v;
mkelly10 9:d5fcdcb3c89d 146
mkelly10 9:d5fcdcb3c89d 147 /*
mkelly10 9:d5fcdcb3c89d 148 * Add the new configuration.
mkelly10 9:d5fcdcb3c89d 149 */
mkelly10 9:d5fcdcb3c89d 150 if (!add(cfg)) {
mkelly10 9:d5fcdcb3c89d 151 free(k);
mkelly10 9:d5fcdcb3c89d 152 free(v);
mkelly10 9:d5fcdcb3c89d 153 free(cfg);
mkelly10 9:d5fcdcb3c89d 154 return false;
mkelly10 9:d5fcdcb3c89d 155 }
mkelly10 9:d5fcdcb3c89d 156
mkelly10 9:d5fcdcb3c89d 157 return true;
mkelly10 9:d5fcdcb3c89d 158 } else {
mkelly10 9:d5fcdcb3c89d 159 /*
mkelly10 9:d5fcdcb3c89d 160 * The value is same.
mkelly10 9:d5fcdcb3c89d 161 */
mkelly10 9:d5fcdcb3c89d 162 if (strcmp(value, p->value) == 0) {
mkelly10 9:d5fcdcb3c89d 163 return true;
mkelly10 9:d5fcdcb3c89d 164 }
mkelly10 9:d5fcdcb3c89d 165
mkelly10 9:d5fcdcb3c89d 166 /*
mkelly10 9:d5fcdcb3c89d 167 * Free a memory for the value.
mkelly10 9:d5fcdcb3c89d 168 */
mkelly10 9:d5fcdcb3c89d 169 free(p->value);
mkelly10 9:d5fcdcb3c89d 170 p->value = NULL;
mkelly10 9:d5fcdcb3c89d 171
mkelly10 9:d5fcdcb3c89d 172 /*
mkelly10 9:d5fcdcb3c89d 173 * Allocation memory for the new value.
mkelly10 9:d5fcdcb3c89d 174 */
mkelly10 9:d5fcdcb3c89d 175 char *v = (char *)malloc(sizeof(char) * (strlen(value) + 1));
mkelly10 9:d5fcdcb3c89d 176 if (v == NULL) {
mkelly10 9:d5fcdcb3c89d 177 return false;
mkelly10 9:d5fcdcb3c89d 178 }
mkelly10 9:d5fcdcb3c89d 179
mkelly10 9:d5fcdcb3c89d 180 /*
mkelly10 9:d5fcdcb3c89d 181 * Store it.
mkelly10 9:d5fcdcb3c89d 182 */
mkelly10 9:d5fcdcb3c89d 183 strcpy(v, value);
mkelly10 9:d5fcdcb3c89d 184 p->value = v;
mkelly10 9:d5fcdcb3c89d 185
mkelly10 9:d5fcdcb3c89d 186 return true;
mkelly10 9:d5fcdcb3c89d 187 }
mkelly10 9:d5fcdcb3c89d 188 }
mkelly10 9:d5fcdcb3c89d 189
mkelly10 9:d5fcdcb3c89d 190 /**
mkelly10 9:d5fcdcb3c89d 191 * Remove a config.
mkelly10 9:d5fcdcb3c89d 192 *
mkelly10 9:d5fcdcb3c89d 193 * @param key A key.
mkelly10 9:d5fcdcb3c89d 194 *
mkelly10 9:d5fcdcb3c89d 195 * @return True if it succeed.
mkelly10 9:d5fcdcb3c89d 196 */
mkelly10 9:d5fcdcb3c89d 197 bool ConfigFile::remove(char *key) {
mkelly10 9:d5fcdcb3c89d 198 if (key == NULL) {
mkelly10 9:d5fcdcb3c89d 199 return false;
mkelly10 9:d5fcdcb3c89d 200 }
mkelly10 9:d5fcdcb3c89d 201 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 202 config_t *cfg = configlist[i];
mkelly10 9:d5fcdcb3c89d 203 if (cfg != NULL) {
mkelly10 9:d5fcdcb3c89d 204 if (strcmp(cfg->key, key) == 0) {
mkelly10 9:d5fcdcb3c89d 205 free(cfg->key);
mkelly10 9:d5fcdcb3c89d 206 free(cfg->value);
mkelly10 9:d5fcdcb3c89d 207 free(cfg);
mkelly10 9:d5fcdcb3c89d 208 configlist[i] = NULL;
mkelly10 9:d5fcdcb3c89d 209 return true;
mkelly10 9:d5fcdcb3c89d 210 }
mkelly10 9:d5fcdcb3c89d 211 }
mkelly10 9:d5fcdcb3c89d 212 }
mkelly10 9:d5fcdcb3c89d 213 return false;
mkelly10 9:d5fcdcb3c89d 214 }
mkelly10 9:d5fcdcb3c89d 215
mkelly10 9:d5fcdcb3c89d 216 /**
mkelly10 9:d5fcdcb3c89d 217 * Remove all config.
mkelly10 9:d5fcdcb3c89d 218 *
mkelly10 9:d5fcdcb3c89d 219 * @return True if it succeed.
mkelly10 9:d5fcdcb3c89d 220 */
mkelly10 9:d5fcdcb3c89d 221 bool ConfigFile::removeAll(void) {
mkelly10 9:d5fcdcb3c89d 222 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 223 config_t *p = configlist[i];
mkelly10 9:d5fcdcb3c89d 224 if (p != NULL) {
mkelly10 9:d5fcdcb3c89d 225 free(p->key);
mkelly10 9:d5fcdcb3c89d 226 free(p->value);
mkelly10 9:d5fcdcb3c89d 227 }
mkelly10 9:d5fcdcb3c89d 228 free(p);
mkelly10 9:d5fcdcb3c89d 229 configlist[i] = NULL;
mkelly10 9:d5fcdcb3c89d 230 }
mkelly10 9:d5fcdcb3c89d 231 return true;
mkelly10 9:d5fcdcb3c89d 232 }
mkelly10 9:d5fcdcb3c89d 233
mkelly10 9:d5fcdcb3c89d 234 /**
mkelly10 9:d5fcdcb3c89d 235 * Get a number of configuration sets.
mkelly10 9:d5fcdcb3c89d 236 *
mkelly10 9:d5fcdcb3c89d 237 * @return number of configuration sets.
mkelly10 9:d5fcdcb3c89d 238 */
mkelly10 9:d5fcdcb3c89d 239 int ConfigFile::getCount() {
mkelly10 9:d5fcdcb3c89d 240 int cnt = 0;
mkelly10 9:d5fcdcb3c89d 241 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 242 config_t *p = configlist[i];
mkelly10 9:d5fcdcb3c89d 243 if (p != NULL) {
mkelly10 9:d5fcdcb3c89d 244 cnt++;
mkelly10 9:d5fcdcb3c89d 245 }
mkelly10 9:d5fcdcb3c89d 246 }
mkelly10 9:d5fcdcb3c89d 247 return cnt;
mkelly10 9:d5fcdcb3c89d 248 }
mkelly10 9:d5fcdcb3c89d 249
mkelly10 9:d5fcdcb3c89d 250 /**
mkelly10 9:d5fcdcb3c89d 251 * Get a key and a value.
mkelly10 9:d5fcdcb3c89d 252 *
mkelly10 9:d5fcdcb3c89d 253 * @param index Index number of this list.
mkelly10 9:d5fcdcb3c89d 254 * @param key A pointer to a buffer for key.
mkelly10 9:d5fcdcb3c89d 255 * @param keybufsiz A size of the key buffer.
mkelly10 9:d5fcdcb3c89d 256 * @param value A pointer to a buffer for value.
mkelly10 9:d5fcdcb3c89d 257 * @param valuebufsiz A size of the value buffer.
mkelly10 9:d5fcdcb3c89d 258 *
mkelly10 9:d5fcdcb3c89d 259 * @return true if it succeed.
mkelly10 9:d5fcdcb3c89d 260 */
mkelly10 9:d5fcdcb3c89d 261 bool ConfigFile::getKeyAndValue(int index, char *key, size_t keybufsiz, char *value, size_t valuebufsiz) {
mkelly10 9:d5fcdcb3c89d 262 int cnt = 0;
mkelly10 9:d5fcdcb3c89d 263 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 264 config_t *p = configlist[i];
mkelly10 9:d5fcdcb3c89d 265 if (p != NULL) {
mkelly10 9:d5fcdcb3c89d 266 if (cnt == index) {
mkelly10 9:d5fcdcb3c89d 267 if ((strlen(p->key) < keybufsiz) && (strlen(p->value) < valuebufsiz)) {
mkelly10 9:d5fcdcb3c89d 268 strcpy(key, p->key);
mkelly10 9:d5fcdcb3c89d 269 strcpy(value, p->value);
mkelly10 9:d5fcdcb3c89d 270 return true;
mkelly10 9:d5fcdcb3c89d 271 }
mkelly10 9:d5fcdcb3c89d 272 return false;
mkelly10 9:d5fcdcb3c89d 273 }
mkelly10 9:d5fcdcb3c89d 274 cnt++;
mkelly10 9:d5fcdcb3c89d 275 }
mkelly10 9:d5fcdcb3c89d 276 }
mkelly10 9:d5fcdcb3c89d 277 return false;
mkelly10 9:d5fcdcb3c89d 278 }
mkelly10 9:d5fcdcb3c89d 279
mkelly10 9:d5fcdcb3c89d 280 /**
mkelly10 9:d5fcdcb3c89d 281 * Read from the target file.
mkelly10 9:d5fcdcb3c89d 282 *
mkelly10 9:d5fcdcb3c89d 283 * @param file A target file name.
mkelly10 9:d5fcdcb3c89d 284 */
mkelly10 9:d5fcdcb3c89d 285 bool ConfigFile::read(char *file) {
mkelly10 9:d5fcdcb3c89d 286 /*
mkelly10 9:d5fcdcb3c89d 287 * Open the target file.
mkelly10 9:d5fcdcb3c89d 288 */
mkelly10 9:d5fcdcb3c89d 289 FILE *fp = fopen(file, "r");
mkelly10 9:d5fcdcb3c89d 290 if (fp == NULL) {
mkelly10 9:d5fcdcb3c89d 291 return false;
mkelly10 9:d5fcdcb3c89d 292 }
mkelly10 9:d5fcdcb3c89d 293
mkelly10 9:d5fcdcb3c89d 294 /*
mkelly10 9:d5fcdcb3c89d 295 * Remove all configuration.
mkelly10 9:d5fcdcb3c89d 296 */
mkelly10 9:d5fcdcb3c89d 297 removeAll();
mkelly10 9:d5fcdcb3c89d 298
mkelly10 9:d5fcdcb3c89d 299 /*
mkelly10 9:d5fcdcb3c89d 300 * Read from a file.
mkelly10 9:d5fcdcb3c89d 301 */
mkelly10 9:d5fcdcb3c89d 302 char buf[MAXLEN_KEY + 8 + MAXLEN_VALUE];
mkelly10 9:d5fcdcb3c89d 303 while (fgets(buf, sizeof(buf), fp) != NULL) {
mkelly10 9:d5fcdcb3c89d 304 /*
mkelly10 9:d5fcdcb3c89d 305 * Ignore a comment.
mkelly10 9:d5fcdcb3c89d 306 */
mkelly10 9:d5fcdcb3c89d 307 if (buf[0] == '#') {
mkelly10 9:d5fcdcb3c89d 308 continue;
mkelly10 9:d5fcdcb3c89d 309 }
mkelly10 9:d5fcdcb3c89d 310
mkelly10 9:d5fcdcb3c89d 311 /*
mkelly10 9:d5fcdcb3c89d 312 * Trim a return.
mkelly10 9:d5fcdcb3c89d 313 */
mkelly10 9:d5fcdcb3c89d 314 const size_t len = strlen(buf);
mkelly10 9:d5fcdcb3c89d 315 for (int i = 0; i < len; i++) {
mkelly10 9:d5fcdcb3c89d 316 if ((buf[i] == '\r') || (buf[i] == '\n')) {
mkelly10 9:d5fcdcb3c89d 317 buf[i] = '\0';
mkelly10 9:d5fcdcb3c89d 318 }
mkelly10 9:d5fcdcb3c89d 319 }
mkelly10 9:d5fcdcb3c89d 320
mkelly10 9:d5fcdcb3c89d 321 /*
mkelly10 9:d5fcdcb3c89d 322 * Separate key and value.
mkelly10 9:d5fcdcb3c89d 323 */
mkelly10 9:d5fcdcb3c89d 324 char k[MAXLEN_KEY];
mkelly10 9:d5fcdcb3c89d 325 char v[MAXLEN_VALUE];
mkelly10 9:d5fcdcb3c89d 326 char *sp = strchr(buf, SEPARATOR);
mkelly10 9:d5fcdcb3c89d 327 if (sp != NULL) {
mkelly10 9:d5fcdcb3c89d 328 strcpy(v, sp + 1);
mkelly10 9:d5fcdcb3c89d 329 *sp = '\0';
mkelly10 9:d5fcdcb3c89d 330 strcpy(k, buf);
mkelly10 9:d5fcdcb3c89d 331 setValue(k, v);
mkelly10 9:d5fcdcb3c89d 332 }
mkelly10 9:d5fcdcb3c89d 333 }
mkelly10 9:d5fcdcb3c89d 334 fclose(fp);
mkelly10 9:d5fcdcb3c89d 335 return true;
mkelly10 9:d5fcdcb3c89d 336 }
mkelly10 9:d5fcdcb3c89d 337
mkelly10 9:d5fcdcb3c89d 338 /**
mkelly10 9:d5fcdcb3c89d 339 * Write from the target file.
mkelly10 9:d5fcdcb3c89d 340 *
mkelly10 9:d5fcdcb3c89d 341 * @param file A pointer to a file name.
mkelly10 9:d5fcdcb3c89d 342 * @param header A pointer to a header.
mkelly10 9:d5fcdcb3c89d 343 * @param ff File format.
mkelly10 9:d5fcdcb3c89d 344 */
mkelly10 9:d5fcdcb3c89d 345 bool ConfigFile::write(char *file, char *header, FileFormat ff) {
mkelly10 9:d5fcdcb3c89d 346 /*
mkelly10 9:d5fcdcb3c89d 347 * Open the target file.
mkelly10 9:d5fcdcb3c89d 348 */
mkelly10 9:d5fcdcb3c89d 349 FILE *fp = fopen(file, "w");
mkelly10 9:d5fcdcb3c89d 350 if (fp == NULL) {
mkelly10 9:d5fcdcb3c89d 351 return false;
mkelly10 9:d5fcdcb3c89d 352 }
mkelly10 9:d5fcdcb3c89d 353
mkelly10 9:d5fcdcb3c89d 354 /*
mkelly10 9:d5fcdcb3c89d 355 * Set a type of new line.
mkelly10 9:d5fcdcb3c89d 356 */
mkelly10 9:d5fcdcb3c89d 357 char *newline = NEWLINE_UNIX;
mkelly10 9:d5fcdcb3c89d 358 switch (ff) {
mkelly10 9:d5fcdcb3c89d 359 case UNIX:
mkelly10 9:d5fcdcb3c89d 360 newline = NEWLINE_UNIX;
mkelly10 9:d5fcdcb3c89d 361 break;
mkelly10 9:d5fcdcb3c89d 362 case MAC:
mkelly10 9:d5fcdcb3c89d 363 newline = NEWLINE_MAC;
mkelly10 9:d5fcdcb3c89d 364 break;
mkelly10 9:d5fcdcb3c89d 365 case DOS:
mkelly10 9:d5fcdcb3c89d 366 newline = NEWLINE_DOS;
mkelly10 9:d5fcdcb3c89d 367 break;
mkelly10 9:d5fcdcb3c89d 368 default:
mkelly10 9:d5fcdcb3c89d 369 newline = NEWLINE_UNIX;
mkelly10 9:d5fcdcb3c89d 370 break;
mkelly10 9:d5fcdcb3c89d 371 }
mkelly10 9:d5fcdcb3c89d 372
mkelly10 9:d5fcdcb3c89d 373 /*
mkelly10 9:d5fcdcb3c89d 374 * Write the header.
mkelly10 9:d5fcdcb3c89d 375 */
mkelly10 9:d5fcdcb3c89d 376 if (header != NULL) {
mkelly10 9:d5fcdcb3c89d 377 fprintf(fp, "%s%s", header, newline);
mkelly10 9:d5fcdcb3c89d 378 }
mkelly10 9:d5fcdcb3c89d 379
mkelly10 9:d5fcdcb3c89d 380 /*
mkelly10 9:d5fcdcb3c89d 381 * Write the data.
mkelly10 9:d5fcdcb3c89d 382 */
mkelly10 9:d5fcdcb3c89d 383 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 384 config_t *cfg = configlist[i];
mkelly10 9:d5fcdcb3c89d 385 if (cfg != NULL) {
mkelly10 9:d5fcdcb3c89d 386 fprintf(fp, "%s=%s%s", cfg->key, cfg->value, newline);
mkelly10 9:d5fcdcb3c89d 387 }
mkelly10 9:d5fcdcb3c89d 388 }
mkelly10 9:d5fcdcb3c89d 389 fclose(fp);
mkelly10 9:d5fcdcb3c89d 390 return true;
mkelly10 9:d5fcdcb3c89d 391 }
mkelly10 9:d5fcdcb3c89d 392
mkelly10 9:d5fcdcb3c89d 393 ConfigFile::config_t *ConfigFile::search(char *key) {
mkelly10 9:d5fcdcb3c89d 394 if (key == NULL) {
mkelly10 9:d5fcdcb3c89d 395 return NULL;
mkelly10 9:d5fcdcb3c89d 396 }
mkelly10 9:d5fcdcb3c89d 397 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 398 if (configlist[i] != NULL) {
mkelly10 9:d5fcdcb3c89d 399 if (strcmp(configlist[i]->key, key) == 0) {
mkelly10 9:d5fcdcb3c89d 400 return configlist[i];
mkelly10 9:d5fcdcb3c89d 401 }
mkelly10 9:d5fcdcb3c89d 402 }
mkelly10 9:d5fcdcb3c89d 403 }
mkelly10 9:d5fcdcb3c89d 404 return NULL;
mkelly10 9:d5fcdcb3c89d 405 }
mkelly10 9:d5fcdcb3c89d 406
mkelly10 9:d5fcdcb3c89d 407 bool ConfigFile::add(config_t *cfg) {
mkelly10 9:d5fcdcb3c89d 408 for (int i = 0; i < MAXCONFIG; i++) {
mkelly10 9:d5fcdcb3c89d 409 if (configlist[i] == NULL) {
mkelly10 9:d5fcdcb3c89d 410 configlist[i] = cfg;
mkelly10 9:d5fcdcb3c89d 411 return true;
mkelly10 9:d5fcdcb3c89d 412 }
mkelly10 9:d5fcdcb3c89d 413 }
mkelly10 9:d5fcdcb3c89d 414 return false;
mkelly10 9:d5fcdcb3c89d 415 }