From 5f0b3ca4e21db7b0f0de939e956bd5f34fec3746 Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Tue, 12 Feb 2013 18:18:59 +0200 Subject: [PATCH] each option's values are string arrays and can be converted to int if they contain numerical values --- src/cfg.c | 75 +++++++++++++++++++++++++++++++++++++++++++++-------------- src/cfg.h | 17 ++++++++------ src/gliar.c | 47 +++++++++++++++++++------------------ 3 files changed, 92 insertions(+), 47 deletions(-) diff --git a/src/cfg.c b/src/cfg.c index 124449e..50c4f9c 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -11,11 +11,11 @@ the Free Software Foundation, either version 3 of the License, or This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program. If not, see . +along with this program. If not, see . Author: Eleni Maria Stea */ @@ -27,7 +27,7 @@ Author: Eleni Maria Stea #include "cfg.h" static char *stripspace(char *s); - +static void concat_values(struct cfgopt *opt); struct cfgopt *gliar_load_cfg(const char *fname) { @@ -59,46 +59,58 @@ struct cfgopt *gliar_load_cfg(const char *fname) if(opt) { opt->next = optlist; optlist = opt; + concat_values(opt); } if((opt = malloc(sizeof *opt))) { if((opt->key = malloc(strlen(line) + 1))) { strcpy(opt->key, line); opt->str_val = 0; - opt->num_val = 0; - opt->type = unknown; + opt->num_val = 0; + opt->str_count = 0; + opt->type = GLIAR_STRING; } else { free(opt); opt = 0; } } } else { - char *tmp; - int prev_len = opt->str_val ? strlen(opt->str_val) : 0; + int new_sz = opt->str_count + 1; + char **tmp; + + char *end; + int num = strtol(line, &end, 10); - if(opt && (tmp = realloc(opt->str_val, prev_len + strlen(line) + 2))) { - opt->type = str; + if(!*end) { + opt->num_val = line; + opt->type = GLIAR_NUMBER; + } + + if(opt && (tmp = realloc(opt->str_val, new_sz * sizeof(char*)))) { opt->str_val = tmp; - if(prev_len) { - strcat(opt->str_val, " "); - strcat(opt->str_val, line); - } else { - strcpy(opt->str_val, line); + if((opt->str_val[new_sz - 1] = malloc(strlen(line) + 1))) { + strcpy(opt->str_val[new_sz -1], line); + opt->str_count = new_sz; } } + + if(new_sz > 1) { + opt->type = GLIAR_STRING; + } } } if(opt) { opt->next = optlist; optlist = opt; + concat_values(opt); } fclose(fp); return optlist; } -const char *gliar_find_opt(struct cfgopt *list, const char *name) +const struct cfgopt *gliar_find_opt(struct cfgopt *list, const char *name) { if(!list || !name) { return 0; @@ -106,7 +118,7 @@ const char *gliar_find_opt(struct cfgopt *list, const char *name) while(list) { if(strcmp(list->key, name) == 0) { - return list->str_val; + return list; } list = list->next; } @@ -117,7 +129,15 @@ void gliar_print_opt(struct cfgopt *list) { printf("OPTIONS\n"); while(list) { - printf("\"%s\" -> \"%s\"\n", list->key, list->str_val); + if(list->type == GLIAR_NUMBER) { + printf("\"%s\" -> %d\n", list->key, list->num_val); + } + else { + int i; + for(i=0; istr_count; i++) { + printf("\"%s\" -> \"%s\"\n", list->key, list->str_val[i]); + } + } list = list->next; } } @@ -133,3 +153,24 @@ static char *stripspace(char *s) } return s; } + +static void concat_values(struct cfgopt *opt) +{ + int i; + int sz = opt->str_count - 1; + + for(i=0; istr_count; i++) { + sz += strlen(opt->str_val[i]); + } + + if(!(opt->conc_vals = malloc(sz + 1))) { + return; + } + + *opt->conc_vals = 0; + for(i=0; istr_count - 1; i++) { + strcat(opt->conc_vals, opt->str_val[i]); + strcat(opt->conc_vals, " "); + } + strcat(opt->conc_vals, opt->str_val[i]); +} diff --git a/src/cfg.h b/src/cfg.h index 4f18d2d..c665782 100644 --- a/src/cfg.h +++ b/src/cfg.h @@ -11,11 +11,11 @@ the Free Software Foundation, either version 3 of the License, or This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program. If not, see . +along with this program. If not, see . Author: Eleni Maria Stea */ @@ -23,21 +23,24 @@ Author: Eleni Maria Stea #ifndef CFG_H_ #define CFG_H_ -enum TYPE {unknown, flt, dbl, boolean, integer, str}; +enum type {GLIAR_NUMBER, GLIAR_STRING}; struct cfgopt { char *key; - char *str_val; + char **str_val; + int str_count; - double num_val; - enum TYPE type; + char* conc_vals; + + int num_val; + enum type type; struct cfgopt *next; }; struct cfgopt *gliar_load_cfg(const char *fname); -const char *gliar_find_opt(struct cfgopt *list, const char *name); +const struct cfgopt *gliar_find_opt(struct cfgopt *list, const char *name); void gliar_print_opt(struct cfgopt *list); diff --git a/src/gliar.c b/src/gliar.c index 0508a10..1173a43 100644 --- a/src/gliar.c +++ b/src/gliar.c @@ -11,11 +11,11 @@ the Free Software Foundation, either version 3 of the License, or This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program. If not, see . +along with this program. If not, see . Author: Eleni Maria Stea */ @@ -38,7 +38,7 @@ static const void* (*gl_get_booleanv)(GLenum, GLboolean*); static const void* (*gl_get_doublev)(GLenum, GLdouble*); static const void* (*gl_get_floatv)(GLenum, GLfloat*); static const void* (*gl_get_integerv)(GLenum, GLint*); -static const void* (*gl_get_integer64v)(GLenum, GLint64*); +static const void* (*gl_get_integer64v)(GLenum, GLint64*); static const void* (*gl_get_booleani_v)(GLenum, GLuint, GLboolean*); static const void* (*gl_get_doublei_v)(GLenum, GLuint, GLdouble*); @@ -73,19 +73,19 @@ static int init(void) } gl_get_string = dlsym(RTLD_NEXT, "glGetString"); -/* gl_get_stringi = dlsym(RTLD_NEXT, "glGetStringi"); +/* gl_get_stringi = dlsym(RTLD_NEXT, "glGetStringi"); - gl_get_booleanv = dlsym(RTLD_NEXT, "glGetBooleanv"); - gl_get_doublev = dlsym(RTLD_NEXT, "glGetDoublev"); - gl_get_floatv = dlsym(RTLD_NEXT, "glGetFloatv"); - gl_get_integerv = dlsym(RTLD_NEXT, "glGetIntegerv"); - gl_get_integer64v = dlsym(RTLD_NEXT, "glGetInteger64v"); + gl_get_booleanv = dlsym(RTLD_NEXT, "glGetBooleanv"); + gl_get_doublev = dlsym(RTLD_NEXT, "glGetDoublev"); + gl_get_floatv = dlsym(RTLD_NEXT, "glGetFloatv"); + gl_get_integerv = dlsym(RTLD_NEXT, "glGetIntegerv"); + gl_get_integer64v = dlsym(RTLD_NEXT, "glGetInteger64v"); - gl_get_booleani_v = dlsym(RTLD_NEXT, "glGetBooleani_v"); - gl_get_doublei_v = dlsym(RTLD_NEXT, "glGetDoublei_v"); - gl_get_floati_v = dlsym(RTLD_NEXT, "glGetFloati_v"); - gl_get_integeri_v = dlsym(RTLD_NEXT, "glGetIntegeri_v"); - gl_get_integer64i_v = dlsym(RTLD_NEXT, "glGetInteger64i_v");*/ + gl_get_booleani_v = dlsym(RTLD_NEXT, "glGetBooleani_v"); + gl_get_doublei_v = dlsym(RTLD_NEXT, "glGetDoublei_v"); + gl_get_floati_v = dlsym(RTLD_NEXT, "glGetFloati_v"); + gl_get_integeri_v = dlsym(RTLD_NEXT, "glGetIntegeri_v"); + gl_get_integer64i_v = dlsym(RTLD_NEXT, "glGetInteger64i_v");*/ done_init = 1; return 0; @@ -93,7 +93,8 @@ static int init(void) const GLubyte *glGetString(GLenum name) { - const char *key, *value; + const char *key; + const struct cfgopt *option; init(); @@ -110,20 +111,20 @@ const GLubyte *glGetString(GLenum name) key = "extensions"; break; - case GL_RENDERER: - key = "renderer"; - break; + case GL_RENDERER: + key = "renderer"; + break; - case GL_SHADING_LANGUAGE_VERSION: - key = "sl version"; - break; + case GL_SHADING_LANGUAGE_VERSION: + key = "sl version"; + break; default: key = 0; } - if(key && (value = gliar_find_opt(cfglist, key))) { - return value; + if(key && (option = gliar_find_opt(cfglist, key))) { + return (const GLubyte*)option->conc_vals; } return gl_get_string(name); -- 1.7.10.4