field.c
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "klone_conf.h"
00012 #include <string.h>
00013 #include <klone/field.h>
00014 #include <klone/utils.h>
00015 #include <u/libu.h>
00016
00017 int field_set(field_t*, const char *name, const char *value);
00018 int field_set_from_line(field_t*, const char *line);
00019 const char* field_get_name(field_t *f);
00020 const char* field_get_value(field_t *f);
00021
00034 int field_set(field_t *f, const char *name, const char *value)
00035 {
00036 char *n = NULL, *v = NULL;
00037
00038 dbg_err_if (f == NULL);
00039 dbg_err_if (name == NULL);
00040 dbg_err_if (value == NULL);
00041
00042 n = u_strdup(name);
00043 dbg_err_if(n == NULL);
00044
00045 v = u_strdup(value);
00046 dbg_err_if(v == NULL);
00047
00048 U_FREE(f->name);
00049 U_FREE(f->value);
00050
00051 f->name = n;
00052 f->value = v;
00053
00054 return 0;
00055 err:
00056 U_FREE(n);
00057 U_FREE(v);
00058
00059 return ~0;
00060 }
00061
00074 int field_set_from_line(field_t *f, const char *ln)
00075 {
00076 enum { BUFSZ = 256 };
00077 char *p, *name = NULL;
00078
00079 dbg_err_if (f == NULL);
00080 dbg_err_if (ln == NULL);
00081 dbg_err_if (!strlen(ln));
00082
00083 dbg_err_if((p = strchr(ln, ':')) == NULL);
00084
00085 name = u_strndup(ln, p-ln);
00086 dbg_err_if(name == NULL);
00087
00088
00089 for(++p; u_isblank(*p); ++p)
00090 ;
00091
00092 dbg_err_if(field_set(f, name, p));
00093
00094 U_FREE(name);
00095
00096 return 0;
00097 err:
00098 u_dbg("failed setting field from line: %s", ln);
00099 U_FREE(name);
00100 return ~0;
00101 }
00102
00113 const char* field_get_name(field_t *f)
00114 {
00115 dbg_return_if (f == NULL, NULL);
00116
00117 return f->name;
00118 }
00119
00130 const char* field_get_value(field_t *f)
00131 {
00132 dbg_return_if (f == NULL, NULL);
00133
00134 return f->value;
00135 }
00136
00149 int field_create(const char *name, const char *value, field_t **pf)
00150 {
00151 field_t *f = NULL;
00152
00153
00154 dbg_err_if (pf == NULL);
00155
00156 f = u_zalloc(sizeof(field_t));
00157 dbg_err_if(f == NULL);
00158
00159 if(name)
00160 dbg_err_if((f->name = u_strdup(name)) == NULL);
00161
00162 if(value)
00163 dbg_err_if((f->value = u_strdup(value)) == NULL);
00164
00165 *pf = f;
00166
00167 return 0;
00168 err:
00169 if(f)
00170 field_free(f);
00171 return ~0;
00172 }
00173
00184 int field_free(field_t *f)
00185 {
00186 if(f)
00187 {
00188 U_FREE(f->name);
00189 U_FREE(f->value);
00190 U_FREE(f);
00191 }
00192
00193 return 0;
00194 }