head 1.12; access; symbols FSL_1_7_0:1.12 CFG_0_9_11:1.12 FSL_1_6_1:1.11 CFG_0_9_10:1.11 FSL_1_6_0:1.11 FSL_1_6b2:1.11 CFG_0_9_9:1.11 FSL_1_6b1:1.11 CFG_0_9_8:1.11 CFG_0_9_7:1.10 CFG_0_9_6:1.10 CFG_0_9_5:1.9 CFG_0_9_4:1.9 FSL_1_5_0:1.8 FSL_1_5a3:1.8 CFG_0_9_3:1.8 FSL_1_5a2:1.8 FSL_1_5a1:1.8 FSL_1_4_0:1.8 FSL_1_4b1:1.8 CFG_0_9_2:1.8 CFG_0_9_1:1.8 FSL_1_4a1:1.8 FSL_1_3_0:1.8 FSL_1_3b1:1.8 FSL_1_2_1:1.8 FSL_1_2_0:1.8 FSL_1_1_0:1.8 FSL_1_1b1:1.8 FSL_1_0_8:1.8 FSL_1_0_7:1.8 FSL_1_0_6:1.5 FSL_1_0_5:1.5 FSL_1_0_4:1.5 FSL_1_0_3:1.5 FSL_1_0_2:1.5 FSL_1_0_1:1.4 FSL_1_0_0:1.4 FSL_0_9_0:1.4 CFG_0_9_0:1.4 FSL_0_1_12:1.4 FSL_0_1_11:1.4 FSL_0_1_10:1.4 FSL_0_1_9:1.4 FSL_0_1_8:1.4 FSL_0_1_7:1.4 FSL_0_1_6:1.4 FSL_0_1_5:1.4 FSL_0_1_1:1.4; locks; strict; comment @ * @; 1.12 date 2006.08.10.19.35.56; author rse; state Exp; branches; next 1.11; commitid Isy241gp4yykKkIr; 1.11 date 2004.12.31.19.16.25; author rse; state Exp; branches; next 1.10; 1.10 date 2004.11.29.07.09.33; author rse; state Exp; branches; next 1.9; 1.9 date 2004.07.17.07.37.55; author rse; state Exp; branches; next 1.8; 1.8 date 2003.01.06.11.17.43; author rse; state Exp; branches; next 1.7; 1.7 date 2002.11.18.09.51.29; author rse; state Exp; branches; next 1.6; 1.6 date 2002.11.10.12.12.23; author rse; state Exp; branches; next 1.5; 1.5 date 2002.08.09.20.37.12; author rse; state Exp; branches; next 1.4; 1.4 date 2002.07.17.15.04.08; author rse; state Exp; branches; next 1.3; 1.3 date 2002.07.10.19.26.32; author rse; state Exp; branches; next 1.2; 1.2 date 2002.07.10.12.00.23; author rse; state Exp; branches; next 1.1; 1.1 date 2002.07.04.06.16.13; author rse; state Exp; branches; next ; desc @@ 1.12 log @cleanup source tree for status as of 2006 @ text @/* ** OSSP cfg - Configuration Parsing ** Copyright (c) 2002-2006 Ralf S. Engelschall ** Copyright (c) 2002-2006 The OSSP Project (http://www.ossp.org/) ** ** This file is part of OSSP cfg, a configuration parsing ** library which can be found at http://www.ossp.org/pkg/lib/cfg/. ** ** Permission to use, copy, modify, and distribute this software for ** any purpose with or without fee is hereby granted, provided that ** the above copyright notice and this permission notice appear in all ** copies. ** ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF ** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ** SUCH DAMAGE. ** ** cfg_data.c: configuration annotational data */ #include #include #include #include "cfg.h" #include "cfg_data.h" #include "cfg_global.h" cfg_rc_t cfg_data_create(cfg_data_t **data) { cfg_rc_t rc; if (data == NULL) return CFG_ERR_ARG; if ((*data = (cfg_data_t *)malloc(sizeof(cfg_data_t))) == NULL) return CFG_ERR_SYS; if ((rc = cfg_data_init(*data)) != CFG_OK) { free(*data); return rc; } return CFG_OK; } cfg_rc_t cfg_data_init(cfg_data_t *data) { if (data == NULL) return CFG_ERR_ARG; data->type = CFG_DATA_TYPE_INT; data->value.i = 0; data->ctrl = cfg_data_ctrl; return CFG_OK; } cfg_rc_t cfg_data_kill(cfg_data_t *data) { cfg_rc_t rc; if (data == NULL) return CFG_ERR_ARG; if (data->ctrl != NULL) if ((rc = data->ctrl(data, CFG_DATA_CTRL_DESTROY)) != CFG_OK) return rc; return CFG_OK; } cfg_rc_t cfg_data_destroy(cfg_data_t *data) { cfg_rc_t rc; if (data == NULL) return CFG_ERR_ARG; if ((rc = cfg_data_kill(data)) != CFG_OK) return rc; free(data); return CFG_OK; } cfg_rc_t cfg_data_copy(cfg_data_t *data, cfg_data_t *copy) { cfg_rc_t rc; if (data == NULL || copy == NULL) return CFG_ERR_ARG; copy->type = data->type; copy->ctrl = data->ctrl; if ((rc = data->ctrl(data, CFG_DATA_CTRL_CLONE, copy)) != CFG_OK) return rc; return CFG_OK; } cfg_rc_t cfg_data_clone(cfg_data_t *data, cfg_data_t **clone) { cfg_rc_t rc; if (data == NULL || clone == NULL) return CFG_ERR_ARG; if ((*clone = (cfg_data_t *)malloc(sizeof(cfg_data_t))) == NULL) return CFG_ERR_SYS; if ((rc = cfg_data_copy(data, *clone)) != CFG_OK) return rc; return CFG_OK; } cfg_rc_t cfg_data_ctrl(cfg_data_t *data, cfg_data_ctrl_t ctrl, ...) { cfg_data_t *data2; va_list ap; va_start(ap, ctrl); if (data == NULL) return CFG_ERR_ARG; if (ctrl == CFG_DATA_CTRL_CLONE) { if ((data2 = (cfg_data_t *)va_arg(ap, void *)) == NULL) return CFG_ERR_ARG; if (data->type == CFG_DATA_TYPE_STR) { if (data->value.s != NULL) data2->value.s = strdup(data->value.s); else data2->value.s = NULL; } else { memcpy((void *)&(data2->value), (void *)&(data->value), sizeof(cfg_data_value_t)); } } else if (ctrl == CFG_DATA_CTRL_DESTROY) { if (data->type == CFG_DATA_TYPE_STR) if (data->value.s != NULL) free(data->value.s); } va_end(ap); return CFG_OK; } cfg_rc_t cfg_data_set(cfg_data_t *data, cfg_data_attr_t id, ...) { va_list ap; if (data == NULL) return CFG_ERR_ARG; va_start(ap, id); switch (id) { case CFG_DATA_ATTR_TYPE: { cfg_data_type_t t = (cfg_data_type_t)va_arg(ap, int); if (!( t == CFG_DATA_TYPE_PTR || t == CFG_DATA_TYPE_STR || t == CFG_DATA_TYPE_INT || t == CFG_DATA_TYPE_FLT)) return CFG_ERR_ARG; data->type = t; break; } case CFG_DATA_ATTR_VALUE: { switch (data->type) { case CFG_DATA_TYPE_PTR: { data->value.p = (void *)va_arg(ap, void *); break; } case CFG_DATA_TYPE_STR: { char *s = (char *)va_arg(ap, void *); if (data->value.s != NULL) free(data->value.s); if (s != NULL) s = strdup(s); data->value.s = s; break; } case CFG_DATA_TYPE_INT: { data->value.i = (int)va_arg(ap, int); break; } case CFG_DATA_TYPE_FLT: { data->value.f = (double)va_arg(ap, double); break; } } break; } case CFG_DATA_ATTR_CTRL: { cfg_data_cb_t ctrl = (cfg_data_cb_t)va_arg(ap, cfg_data_cb_t); data->ctrl = ctrl; break; } } va_end(ap); return CFG_OK; } cfg_rc_t cfg_data_get(cfg_data_t *data, cfg_data_attr_t id, ...) { va_list ap; if (data == NULL) return CFG_ERR_ARG; va_start(ap, id); switch (id) { case CFG_DATA_ATTR_TYPE: { cfg_data_type_t *pt = (cfg_data_type_t *)va_arg(ap, int *); if (pt == NULL) return CFG_ERR_ARG; *pt = data->type; break; } case CFG_DATA_ATTR_VALUE: { switch (data->type) { case CFG_DATA_TYPE_PTR: { void **p = (void **)va_arg(ap, void *); if (p == NULL) return CFG_ERR_ARG; *p = data->value.p; break; } case CFG_DATA_TYPE_STR: { char **p = (char **)va_arg(ap, void *); if (p == NULL) return CFG_ERR_ARG; *p = data->value.s; break; } case CFG_DATA_TYPE_INT: { int *p = (int *)va_arg(ap, void *); if (p == NULL) return CFG_ERR_ARG; *p = data->value.i; break; } case CFG_DATA_TYPE_FLT: { double *p = (double *)va_arg(ap, void *); if (p == NULL) return CFG_ERR_ARG; *p = data->value.f; break; } } break; } case CFG_DATA_ATTR_CTRL: { cfg_data_cb_t *pcb = (cfg_data_cb_t *)va_arg(ap, void *); if (pcb == NULL) return CFG_ERR_ARG; *pcb = data->ctrl; break; } } va_end(ap); return CFG_OK; } @ 1.11 log @Adjust copyright messages for new year 2005. @ text @d3 2 a4 3 ** Copyright (c) 2002-2005 Ralf S. Engelschall ** Copyright (c) 2002-2005 The OSSP Project (http://www.ossp.org/) ** Copyright (c) 2002-2005 Cable & Wireless (http://www.cw.com/) @ 1.10 log @Fix optional DMalloc build support. @ text @d3 3 a5 3 ** Copyright (c) 2002-2004 Ralf S. Engelschall ** Copyright (c) 2002-2004 The OSSP Project (http://www.ossp.org/) ** Copyright (c) 2002-2004 Cable & Wireless (http://www.cw.com/) @ 1.9 log @Adjust copyright messages for new year 2004. @ text @d36 1 a37 1 #include "cfg_data.h" @ 1.8 log @update copyright messages for new year @ text @d3 3 a5 3 ** Copyright (c) 2002-2003 Ralf S. Engelschall ** Copyright (c) 2002-2003 The OSSP Project (http://www.ossp.org/) ** Copyright (c) 2002-2003 Cable & Wireless Deutschland (http://www.cw.com/de/) @ 1.7 log @add Dmalloc support @ text @d3 3 a5 3 ** Copyright (c) 1999-2002 Ralf S. Engelschall ** Copyright (c) 1999-2002 The OSSP Project (http://www.ossp.org/) ** Copyright (c) 2001-2002 Cable & Wireless Deutschland (http://www.cw.com/de/) @ 1.6 log @remove trailing whitespaces @ text @d36 1 @ 1.5 log @workaround for GCC <= 3.0 @ text @d131 1 a131 1 memcpy((void *)&(data2->value), d165 1 a165 1 data->value.p = (void *)va_arg(ap, void *); @ 1.4 log @Ops, fix a typo I cannot imagine where it comes from... @ text @d189 1 a189 1 cfg_data_cb_t ctrl = (cfg_data_cb_t)va_arg(ap, void (*)(void)); @ 1.3 log @implement cfg_node_clone @ text @d23 1 a23 1 ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRCFG, STRICT LIABILITY, @ 1.2 log @Mega-change: full API overhauling. @ text @d87 13 d108 1 a108 4 (*clone)->type = data->type; (*clone)->ctrl = data->ctrl; if ((rc = data->ctrl(data, CFG_DATA_CTRL_CLONE, *clone)) != CFG_OK) { free(*clone); a109 1 } @ 1.1 log @split out cfg_data_t stuff into seperate object to get better abstraction for this @ text @d59 1 a59 1 data->ctrl = cfg_data_ctrl_default; d104 1 a104 1 cfg_rc_t cfg_data_ctrl_default(cfg_data_t *data, cfg_data_ctrl_t ctrl, ...) d135 1 a135 1 cfg_rc_t cfg_data_set(cfg_data_t *data, cfg_data_id_t id, ...) d143 1 a143 1 case CFG_DATA_TYPE: { d153 1 a153 1 case CFG_DATA_VALUE: { d179 2 a180 2 case CFG_DATA_CTRL: { cfg_data_ctrl_cb_t ctrl = (cfg_data_ctrl_cb_t)va_arg(ap, void (*)(void)); d189 1 a189 1 cfg_rc_t cfg_data_get(cfg_data_t *data, cfg_data_id_t id, ...) d197 1 a197 1 case CFG_DATA_TYPE: { d204 1 a204 1 case CFG_DATA_VALUE: { d237 2 a238 2 case CFG_DATA_CTRL: { cfg_data_ctrl_cb_t *pcb = (cfg_data_ctrl_cb_t *)va_arg(ap, void *); @