config.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 219 行
C
219 行
/*************************************************************************** begin : Fri Feb 11 2005 copyright : (C) 2005 by Alper Akcan email : distchx@yahoo.com ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 2.1 of the * * License, or (at your option) any later version. * * * ***************************************************************************/#include "xynth_.h"char * s_config_strip (char *buf){ char *start; /* Strip off trailing whitespace, returns, etc */ while ((*buf != '\0') && (buf[strlen(buf) - 1] < 33)) { buf[strlen(buf) - 1] = '\0'; } start = buf; /* Strip off leading whitespace, returns, etc */ while (*start && (*start < 33)) { start++; } return start;}int s_config_parse (s_config_t *cfg, char *name){ FILE *fp; char buf[8192]; s_config_cat_t *category; s_config_var_t *variable; fp = fopen(name, "r"); if (fp == NULL) { debugf(DSYS, "Unable to open file : %s", name); goto err0; } while (!feof(fp)) { if (fgets(buf, sizeof(buf), fp)) { char *c; char *cur; /* strip comments */ c = strchr(buf, ';'); while (c) { if ((c == buf) || (*(c - 1) != '\\')) { *c = '\0'; } else { *(c - 1) = ';'; memmove(c, c + 1, strlen(c + 1)); } c = strchr(c + 1, ';'); } cur = s_config_strip(buf); if (*buf != '\0') { if (cur[0] == '[') { /* A category header */ c = strchr(cur, ']'); if (c) { *c = 0; if (!s_config_category_init(&category, cur + 1)) { s_list_add(cfg->category, category, -1); } } else { debugf(0, "parse error: no closing ']' for category %s of %s", cur + 1, name); goto err1; } } else if (cur[0] == '#') { /* A directive */ } else { /* variable = value */ category = (s_config_cat_t *) s_list_get(cfg->category, cfg->category->nb_elt - 1); if (category == NULL) { debugf(0, "parse error: There is no category context for %s", name); goto err1; } c = strchr(cur, '='); if (c) { *c = 0; c++; if (!s_config_variable_init(&variable, s_config_strip(cur), s_config_strip(c))) { s_list_add(category->variable, variable, -1); } } else { debugf(0, "parse error: No '=' (equal sign) in %s of %s", cur, name); goto err1; } } } else { } } } fclose(fp); return 0;err1: fclose(fp);err0: return -1;}int s_config_init (s_config_t **cfg){ (*cfg) = (s_config_t *) s_malloc(sizeof(s_config_t)); (*cfg)->category = (s_list_t *) s_malloc(sizeof(s_list_t)); if (s_list_init((*cfg)->category)) { goto err0; } return 0;err0: s_free((*cfg)->category); s_free(*cfg); return -1;}int s_config_category_init (s_config_cat_t **cat, char *name){ (*cat) = (s_config_cat_t *) s_malloc(sizeof(s_config_cat_t)); (*cat)->variable = (s_list_t *) s_malloc(sizeof(s_list_t)); (*cat)->name = strdup(name); if (s_list_init((*cat)->variable)) { goto err0; } return 0;err0: s_free((*cat)->variable); s_free(*cat); return -1;}int s_config_variable_init (s_config_var_t **var, char *name, char *value){ (*var) = (s_config_var_t *) s_malloc(sizeof(s_config_var_t)); (*var)->name = strdup(name); (*var)->value = strdup(value); return 0;}int s_config_variable_uninit (s_config_var_t *var){ s_free(var->name); s_free(var->value); s_free(var); return 0;}int s_config_category_uninit (s_config_cat_t *cat){ while (!s_list_eol(cat->variable, 0)) { s_config_var_t *var = (s_config_var_t *) s_list_get(cat->variable, 0); s_list_remove(cat->variable, 0); s_config_variable_uninit(var); } s_free(cat->variable); s_free(cat->name); s_free(cat); return 0;}int s_config_uninit (s_config_t *cfg){ while (!s_list_eol(cfg->category, 0)) { s_config_cat_t *cat = (s_config_cat_t *) s_list_get(cfg->category, 0); s_list_remove(cfg->category, 0); s_config_category_uninit(cat); } s_free(cfg->category); s_free(cfg); return 0;}#if 0#include <xynth.h>int main (void){ int i; int j; s_config_t *cfg; s_config_cat_t *cat; s_config_var_t *var; s_config_init(&cfg); s_config_parse(cfg, "/usr/local/share/xynth/config/xynth.conf"); i = 0; while (!s_list_eol(cfg->category, i)) { cat = s_list_get(cfg->category, i++); j = 0; while (!s_list_eol(cat->variable, j)) { var = s_list_get(cat->variable, j++); printf("%s->%s = %s\n", cat->name, var->name, var->value); } } s_config_uninit(cfg); return 0;}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?