An application to log WiFi SSIDs for position lookup testing
Dependencies: C027_Support SWO mbed-rtos mbed picojson
Fork of lpc4088_ebb_ublox_Cellular_PubNubDemo_rtos by
device/DeviceConfiguration.cpp
- Committer:
- rosterloh84
- Date:
- 2015-02-15
- Revision:
- 1:cac9b2960637
File content as of revision 1:cac9b2960637:
#include "DeviceConfiguration.h" #include <stdlib.h> #include <stdio.h> #include <string.h> DeviceConfiguration::DeviceConfiguration() { size_t i; for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { _items[i].key = NULL; _items[i].value = NULL; } } DeviceConfiguration::~DeviceConfiguration() { clear(); } bool DeviceConfiguration::read(const char *str) { const char *ptr, *ptr2, *ptr3; size_t i, j, len1, len2; DeviceConfiguration::KeyValue items[DEVICE_CONFIGURATION_SIZE]; for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { items[i].key = NULL; items[i].value = NULL; } ptr = str; i = 0; while ((*ptr != '\0') && (i < DEVICE_CONFIGURATION_SIZE)) { if (((ptr2 = strchr(ptr, '=')) == NULL) || ((ptr3 = strchr(ptr2+1, ';')) == NULL)) goto failure; len1 = ptr2-ptr; len2 = ptr3-ptr2 - 1; if ((memchr(ptr, ';', len1) != NULL) || (memchr(ptr2+1, '=', len2) != NULL)) goto failure; for (j = 0; j < DEVICE_CONFIGURATION_SIZE; j++) { if ((items[j].key != NULL) && (strlen(items[j].key) == len1) && (strncmp(items[j].key, ptr, len1) == 0)) goto failure; } if ((items[i].key = (char*)malloc(len1+1)) == NULL) goto failure; if ((items[i].value = (char*)malloc(len2+1)) == NULL) { free(items[i].key); items[i].key = NULL; goto failure; } strncpy(items[i].key, ptr, len1); strncpy(items[i].value, ptr2+1, len2); items[i].key[len1] = '\0'; items[i].value[len2] = '\0'; i++; ptr = ptr3+1; } if (*ptr != '\0') goto failure; clear(); memcpy(_items, items, sizeof(DeviceConfiguration::KeyValue)*DEVICE_CONFIGURATION_SIZE); return true; failure: for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { if (items[i].key != NULL) { free(items[i].key); free(items[i].value); } } return false; } bool DeviceConfiguration::write(char *buf, size_t len) { char *ptr; size_t i; int ret, ln; ptr = buf; for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { if (_items[i].key == NULL) continue; ret = snprintf(ptr, len, "%s=%s;%n", _items[i].key, _items[i].value, &ln); if ((ret < 0) || (ret >= len)) return false; ptr += ln; len -= ln; } return true; } bool DeviceConfiguration::set(const char *key, const char *value) { KeyValue *item; size_t i; if ((item = search(key)) == NULL) { for (i = 0; (i < DEVICE_CONFIGURATION_SIZE) && (item == NULL); i++) { if (_items[i].key == NULL) item = &_items[i]; } } if (item == NULL) return false; if ((item->key = (char*)malloc(strlen(key)+1)) == NULL) return false; if ((item->value = (char*)malloc(strlen(value)+1)) == NULL) { free(item->key); item->key = NULL; return false; } strcpy(item->key, key); strcpy(item->value, value); return true; } const char * DeviceConfiguration::get(const char *key) { KeyValue *item; if ((item = search(key)) == NULL) return NULL; return item->value; } bool DeviceConfiguration::unset(const char *key) { KeyValue *item; if ((item = search(key)) == NULL) return false; free(item->key); free(item->value); item->key = NULL; item->value = NULL; return true; } bool DeviceConfiguration::has(const char *key) { return (search(key) != NULL); } void DeviceConfiguration::clear() { size_t i; for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { if (_items[i].key != NULL) { free(_items[i].key); free(_items[i].value); } } } DeviceConfiguration::KeyValue * DeviceConfiguration::search(const char *key) { size_t i; for (i = 0; i < DEVICE_CONFIGURATION_SIZE; i++) { if (strcmp(key, _items[i].key) == 0) return &_items[i]; } return NULL; }