Changed general file descriptors to specific for CDU

Dependents:   CDUFinal CDU_Mbed_36

Fork of ConfigFile by Shinichiro Nakamura

ConfigFile.cpp

Committer:
shintamainjp
Date:
2010-09-12
Revision:
0:6b4ba48753b9
Child:
1:f02e081afe42

File content as of revision 0:6b4ba48753b9:

#include "ConfigFile.h"

ConfigFile::ConfigFile() {
    /*
     * Allocation for a config_t list.
     */
    configlist = (config_t **)malloc(sizeof(config_t *) * MAXCONFIG);
    for (int i = 0; i < MAXCONFIG; i++) {
        configlist[i] = NULL;
    }
}

ConfigFile::~ConfigFile() {
    /*
     * Remove all storage and the contents.
     */
    for (int i = 0; i < MAXCONFIG; i++) {
        config_t *cfg = configlist[i];
        if (cfg != NULL) {
            free(cfg->key);
            free(cfg->value);
            free(cfg);
        }
        configlist[i] = NULL;
    }

    /*
     * Remove cnofig_t list.
     */
    free(configlist);
    configlist = NULL;
}

char *ConfigFile::getValue(char *key) {
    /*
     * Null check.
     */
    if (key == NULL) {
        return NULL;
    }

    /*
     * Search a config_t object from the key.
     */
    config_t *p = search(key);
    if (p == NULL) {
        return NULL;
    }

    /*
     * Return the value.
     */
    return p->value;
}

bool ConfigFile::setValue(char *key, char *value) {
    /*
     * Null check.
     */
    if ((key == NULL) || (value == NULL)) {
        return false;
    }

    /*
     * Size check.
     */
    if ((MAXLEN_KEY < strlen(key)) || (MAXLEN_VALUE < strlen(value))) {
        return false;
    }

    /*
     * Search a config_t object from the key.
     */
    config_t *p = search(key);
    if (p == NULL) {
        /*
         * Allocation a memory for a new key.
         */
        char *k = (char *)malloc(sizeof(char) * (strlen(key) + 1));
        if (k == NULL) {
            return false;
        }
        strcpy(k, key);

        /*
         * Allocation a memory for a new value.
         */
        char *v = (char *)malloc(sizeof(char) * (strlen(value) + 1));
        if (v == NULL) {
            free(k);
            return false;
        }
        strcpy(v, value);

        /*
         * Allocation a memory for a new configuration.
         */
        config_t *cfg = (config_t *)malloc(sizeof(config_t) * 1);
        if (cfg == NULL) {
            free(k);
            free(v);
            return false;
        }
        cfg->key = k;
        cfg->value = v;

        /*
         * Add the new configuration.
         */
        if (!add(cfg)) {
            free(k);
            free(v);
            free(cfg);
            return false;
        }

        return true;
    } else {
        /*
         * The value is same.
         */
        if (strcmp(value, p->value) == 0) {
            return true;
        }

        /*
         * Free a memory for the value.
         */
        free(p->value);
        p->value = NULL;

        /*
         * Allocation memory for the new value.
         */
        char *v = (char *)malloc(sizeof(char) * (strlen(value) + 1));
        if (v == NULL) {
            return false;
        }

        /*
         * Store it.
         */
        strcpy(v, value);
        p->value = v;

        return true;
    }
}

bool ConfigFile::remove(char *key) {
    if (key == NULL) {
        return false;
    }
    for (int i = 0; i < MAXCONFIG; i++) {
        config_t *cfg = configlist[i];
        if (cfg != NULL) {
            if (strcmp(cfg->key, key) == 0) {
                free(cfg->key);
                free(cfg->value);
                free(cfg);
                configlist[i] = NULL;
                return true;
            }
        }
    }
    return false;
}

bool ConfigFile::removeAll(void) {
    for (int i = 0; i < MAXCONFIG; i++) {
        config_t *p = configlist[i];
        if (p != NULL) {
            free(p->key);
            free(p->value);
        }
        free(p);
        configlist[i] = NULL;
    }
    return true;
}

bool ConfigFile::read(char *file) {
    /*
     * Open the target file.
     */
    FILE *fp = fopen(file, "r");
    if (fp == NULL) {
        return false;
    }

    /*
     * Remove all configuration.
     */
    removeAll();

    /*
     * Read from a file.
     */
    char buf[MAXLEN_KEY + 8 + MAXLEN_VALUE];
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        /*
         * Ignore a comment.
         */
        if (buf[0] == '#') {
            continue;
        }
        
        /*
         * Trim a return.
         */
        const size_t len = strlen(buf);
        for (int i = 0; i < len; i++) {
            if ((buf[i] == '\r') || (buf[i] == '\n')) {
                buf[i] = '\0';
            }
        }

        /*
         * Separate key and value.
         */        
        char k[MAXLEN_KEY];
        char v[MAXLEN_VALUE];
        char *sp = strchr(buf, SEPARATOR);
        if (sp != NULL) {
            strcpy(v, sp + 1);
            *sp = '\0';
            strcpy(k, buf);
            setValue(k, v);
        }
    }
    fclose(fp);
    return true;
}

bool ConfigFile::write(char *file) {
    FILE *fp = fopen(file, "w");
    if (fp == NULL) {
        return false;
    }

    static const char *NEWLINE_UNIX = "\n";
    static const char *NEWLINE_DOS = "\r\n";
    static const char *NEWLINE_MAC = "\r";
    for (int i = 0; i < MAXCONFIG; i++) {
        config_t *cfg = configlist[i];
        if (cfg != NULL) {
            fprintf(fp, "%s=%s%s", cfg->key, cfg->value, NEWLINE_UNIX);
        }
    }
    fclose(fp);
    return true;
}

ConfigFile::config_t *ConfigFile::search(char *key) {
    if (key == NULL) {
        return NULL;
    }
    for (int i = 0; i < MAXCONFIG; i++) {
        if (configlist[i] != NULL) {
            if (strcmp(configlist[i]->key, key) == 0) {
                return configlist[i];
            }
        }
    }
    return NULL;
}

bool ConfigFile::add(config_t *cfg) {
    for (int i = 0; i < MAXCONFIG; i++) {
        if (configlist[i] == NULL) {
            configlist[i] = cfg;
            return true;
        }
    }
    return false;
}