From 897fb63ec8ac9b18add6a61e46807309a28668b0 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Wed, 21 Jul 2004 13:46:42 +0000 Subject: New plugin library framework for loading and saving .cfg files git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4912 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/lib/configfile.c | 108 ++++++++++++++++++++++++++++++++++++++++++ apps/plugins/lib/configfile.h | 44 +++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 apps/plugins/lib/configfile.c create mode 100644 apps/plugins/lib/configfile.h diff --git a/apps/plugins/lib/configfile.c b/apps/plugins/lib/configfile.c new file mode 100644 index 0000000000..ffa325038c --- /dev/null +++ b/apps/plugins/lib/configfile.c @@ -0,0 +1,108 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "plugin.h" +#include "configfile.h" + +static struct plugin_api *cfg_rb; + +void configfile_init(struct plugin_api* newrb) +{ + cfg_rb = newrb; +} + +int configfile_save(char *filename, struct configdata *cfg, int num_items) +{ + int fd; + int i; + char buf[MAX_PATH]; + + cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename); + fd = cfg_rb->creat(buf, 0); + if(fd < 0) + return fd*10 - 1; + + for(i = 0;i < num_items;i++) { + switch(cfg[i].type) { + case TYPE_INT: + cfg_rb->fprintf(fd, "%s: %d\n", + cfg[i].name, + *cfg[i].val); + break; + + case TYPE_ENUM: + cfg_rb->fprintf(fd, "%s: %s\n", + cfg[i].name, + cfg[i].values[*cfg[i].val]); + break; + + case TYPE_STRING: + cfg_rb->fprintf(fd, "%s: %s\n", + cfg[i].name, + cfg[i].string); + break; + + } + } + + cfg_rb->close(fd); + return 0; +} + +int configfile_load(char *filename, struct configdata *cfg, int num_items) +{ + int fd; + int i, j; + char *name; + char *val; + char buf[MAX_PATH]; + + cfg_rb->snprintf(buf, MAX_PATH, "/.rockbox/rocks/%s", filename); + fd = cfg_rb->open(buf, O_RDONLY); + if(fd < 0) + return fd*10 - 1; + + while(cfg_rb->read_line(fd, buf, MAX_PATH) > 0) { + cfg_rb->settings_parseline(buf, &name, &val); + + for(i = 0;i < num_items;i++) { + if(!cfg_rb->strcmp(cfg[i].name, name)) { + switch(cfg[i].type) { + case TYPE_INT: + *cfg[i].val = cfg_rb->atoi(val); + break; + + case TYPE_ENUM: + for(j = 0;j < cfg[i].max;j++) { + if(!cfg_rb->strcmp(cfg[i].values[j], val)) { + *cfg[i].val = j; + } + } + break; + + case TYPE_STRING: + cfg_rb->strncpy(cfg[i].string, val, cfg[i].max); + break; + } + } + } + } + + cfg_rb->close(fd); + return 0; +} diff --git a/apps/plugins/lib/configfile.h b/apps/plugins/lib/configfile.h new file mode 100644 index 0000000000..78cc8b1b6c --- /dev/null +++ b/apps/plugins/lib/configfile.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 Linus Nielsen Feltzing + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef CONFIGFILE_H +#define CONFIGFILE_H + +#define TYPE_INT 1 +#define TYPE_ENUM 2 +#define TYPE_STRING 3 + +struct configdata +{ + int type; /* See TYPE_ macros above */ + int min; /* Min value for integers, should be 0 for enums */ + int max; /* Max value for enums and integers, + buffer size for strings */ + int *val; /* Pointer to integer/enum value, + NULL if the item is a string */ + char *name; /* Pointer to the name of the item */ + char **values; /* List of strings for enums, NULL if not enum */ + char *string; /* Pointer to a string buffer if the item is a string, + NULL otherwise */ +}; + +void configfile_init(struct plugin_api* newrb); +int configfile_save(char *filename, struct configdata *cfg, int num_items); +int configfile_load(char *filename, struct configdata *cfg, int num_items); + +#endif -- cgit v1.2.3