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;
}
Richard Osterloh
