Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals

var.c

00001 /*
00002  * Copyright (c) 2005, 2006 by KoanLogic s.r.l. <http://www.koanlogic.com>
00003  * All rights reserved.
00004  *
00005  * This file is part of KLone, and as such it is subject to the license stated
00006  * in the LICENSE file which you have received as part of this distribution.
00007  *
00008  * $Id: var.c,v 1.19 2007/10/26 11:21:51 tho Exp $
00009  */
00010 
00011 #include "klone_conf.h"
00012 #include <sys/types.h>
00013 #include <stdlib.h>
00014 #include <u/libu.h>
00015 #include <klone/var.h>
00016 #include <klone/utils.h>
00017 #include <klone/varprv.h>
00018 
00029 u_string_t *var_get_name_s(var_t *v)
00030 {
00031     dbg_return_if (v == NULL, NULL);
00032 
00033     return v->sname; /* may be NULL */
00034 }
00035 
00046 u_string_t *var_get_value_s(var_t *v)
00047 {
00048     dbg_return_if (v == NULL, NULL);
00049 
00050     if(v->svalue == NULL)
00051         dbg_err_if(u_string_create(v->data, v->size, &v->svalue));
00052     
00053     return v->svalue;
00054 err:
00055     return NULL;
00056 }
00057 
00058 void var_set_opaque(var_t *v, void *opaque)
00059 {
00060     v->opaque = opaque;
00061 }
00062 
00063 void* var_get_opaque(var_t *v)
00064 {
00065     return v->opaque;
00066 }
00067 
00068 int var_bin_create(const char *name, const char *data, size_t size, var_t **pv)
00069 {
00070     var_t *v = NULL;
00071 
00072     dbg_return_if (name == NULL, ~0);
00073     dbg_return_if (data == NULL, ~0);
00074     dbg_return_if (pv == NULL, ~0);
00075 
00076     v = u_zalloc(sizeof(var_t));
00077     dbg_err_if(v == NULL);
00078 
00079     dbg_err_if(u_string_create(name, strlen(name), &v->sname));
00080 
00081     dbg_err_if(var_set_bin_value(v, data, size));
00082 
00083     *pv = v;
00084 
00085     return 0;
00086 err:
00087     if(v)
00088         var_free(v);
00089     return ~0;
00090 }
00091 
00092 int var_create(const char* name, const char *value, var_t**pv)
00093 {
00094     dbg_return_if (name == NULL, ~0);
00095     dbg_return_if (value == NULL, ~0);
00096 
00097     return var_bin_create(name, value, strlen(value), pv);
00098 }
00099 
00100 /*
00101  * \ingroup vars
00102  * \brief   Free a variable
00103  *
00104  * \return \c 0, always
00105  */
00106 int var_free(var_t *v)
00107 {
00108     if(v)
00109     {
00110         if(v->sname)
00111             u_string_free(v->sname);
00112 
00113         if(v->svalue)
00114             u_string_free(v->svalue);
00115 
00116         if(v->opaque)
00117             U_FREE(v->opaque);
00118 
00119         U_FREE(v->data);
00120         U_FREE(v);
00121     }
00122 
00123     return 0;
00124 }
00125 
00136 const char *var_get_name(var_t *v)
00137 {
00138     dbg_return_if (v == NULL, NULL);
00139 
00140     return u_string_c(v->sname);
00141 }
00142 
00153 const char *var_get_value(var_t *v)
00154 {
00155     dbg_return_if (v == NULL, NULL);
00156 
00157     return v->data;
00158 }
00159 
00170 size_t var_get_value_size(var_t *v)
00171 {
00172     dbg_return_if (v == NULL, 0);   /* XXX should be (ssize_t) '-1' */
00173 
00174     return v->size;
00175 }
00176 
00189 int var_set(var_t *var, const char *name, const char *value)
00190 {
00191     dbg_err_if (var == NULL);
00192     dbg_err_if (name == NULL);
00193     dbg_err_if (value == NULL);
00194     
00195     dbg_err_if(var_set_name(var, name));
00196     dbg_err_if(var_set_value(var, value));
00197 
00198     return 0;
00199 err:
00200     return ~0;
00201 }
00202 
00214 int var_set_name(var_t *v, const char *name)
00215 {
00216     dbg_err_if (v == NULL);
00217     dbg_err_if (name == NULL);
00218 
00219     dbg_err_if(u_string_set(v->sname, name, strlen(name)));
00220 
00221     return 0; 
00222 err:
00223     return ~0;
00224 }
00225 
00237 int var_set_value(var_t *v, const char *value)
00238 {
00239     dbg_return_if (v == NULL, ~0);
00240     dbg_return_if (value == NULL, ~0);
00241 
00242     /* copy the string and the trailing '\0' */
00243     return var_set_bin_value(v, value, strlen(value) + 1);
00244 }
00245 
00258 int var_set_bin_value(var_t *v, const char *data, size_t size)
00259 {
00260     dbg_err_if (v == NULL);
00261     dbg_err_if (data == NULL);
00262     
00263     U_FREE(v->data);
00264 
00265     if(data && size)
00266     {
00267         v->size = size;
00268         v->data = u_malloc(size+1);
00269         dbg_err_if(v->data == NULL);
00270 
00271         memcpy(v->data, data, size);
00272         v->data[size] = 0; /* zero-term v->data so it can be used as a string */
00273     } else {
00274         v->size = 0;
00275         v->data = NULL;
00276     }
00277 
00278     if(v->svalue)
00279         dbg_err_if(u_string_set(v->svalue, v->data, v->size));
00280 
00281     return 0; 
00282 err:
00283     return ~0;
00284 }