X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=util%2Fres.c;h=efb6473806a4dc26c503fee9d13c204e9566f855;hp=5e4a73073d14a363e3a5cc226d5ebcdb4baed8b6;hb=96e4c5479e111511f5df3531b6648931251b9e5d;hpb=543289d9a87cbcac45a5456714cbb9f55725253a diff --git a/util/res.c b/util/res.c index 5e4a730..efb6473 100644 --- a/util/res.c +++ b/util/res.c @@ -1,8 +1,5 @@ -/* $Id: res.c,v 1.54 2006-12-06 10:26:40 adam Exp $ - Copyright (C) 1995-2006 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 1994-2011 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -20,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -31,6 +31,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #endif +#include #include #include @@ -144,12 +145,8 @@ static char *xstrdup_env(const char *src) ZEBRA_RES res_read_file(Res r, const char *fname) { - struct res_entry *resp; - char *line; - char *val_buf; - int val_size, val_max = 256; - char fr_buf[1024]; FILE *fr; + int errors = 0; assert(r); @@ -157,81 +154,80 @@ ZEBRA_RES res_read_file(Res r, const char *fname) if (!fr) { yaz_log(YLOG_WARN|YLOG_ERRNO, "Cannot open `%s'", fname); - return ZEBRA_FAIL; + errors++; } - val_buf = (char*) xmalloc(val_max); - while (1) + else { - line = fgets(fr_buf, sizeof(fr_buf)-1, fr); - if (!line) - break; - if (*line != '#') + char fr_buf[1024]; + char *line; + int lineno = 1; + WRBUF wrbuf_val = wrbuf_alloc(); + yaz_tok_cfg_t yt = yaz_tok_cfg_create(); + + while ((line = fgets(fr_buf, sizeof(fr_buf)-1, fr))) { - int no = 0; - while (1) + yaz_tok_parse_t tp = yaz_tok_parse_buf(yt, line); + int t = yaz_tok_move(tp); + + if (t == YAZ_TOK_STRING) { - if (fr_buf[no] == 0 || fr_buf[no] == '\n' ) + size_t sz; + struct res_entry *resp; + const char *cp = yaz_tok_parse_string(tp); + const char *cp1 = strchr(cp, ':'); + + if (!cp1) { - no = 0; + yaz_log(YLOG_FATAL, "%s:%d missing colon after '%s'", + fname, lineno, cp); + errors++; break; } - if (strchr(": \t", fr_buf[no])) - break; - no++; - } - if (!no) - continue; - fr_buf[no++] = '\0'; - resp = add_entry(r); - resp->name = (char*) xmalloc(no); - strcpy(resp->name, fr_buf); - - while (strchr(" \t", fr_buf[no])) - no++; - val_size = 0; - while (1) - { - if (fr_buf[no] == '\0' || strchr("\n\r\f", fr_buf[no])) + resp = add_entry(r); + sz = cp1 - cp; + resp->name = xmalloc(sz + 1); + memcpy(resp->name, cp, sz); + resp->name[sz] = '\0'; + + wrbuf_rewind(wrbuf_val); + + if (cp1[1]) { - while (val_size > 0 && - (val_buf[val_size-1] == ' ' || - val_buf[val_size-1] == '\t')) - val_size--; - val_buf[val_size] = '\0'; - resp->value = xstrdup_env(val_buf); - yaz_log(YLOG_DEBUG, "(name=%s,value=%s)", - resp->name, resp->value); - break; + /* name:value */ + wrbuf_puts(wrbuf_val, cp1+1); } - else if (fr_buf[no] == '\\' && strchr("\n\r\f", fr_buf[no+1])) + else { - line = fgets(fr_buf, sizeof(fr_buf)-1, fr); - if (!line) + /* name: value */ + t = yaz_tok_move(tp); + + if (t != YAZ_TOK_STRING) { - val_buf[val_size] = '\0'; - resp->value = xstrdup_env(val_buf); + resp->value = xstrdup(""); + yaz_log(YLOG_FATAL, "%s:%d missing value after '%s'", + fname, lineno, resp->name); + errors++; break; } - no = 0; + wrbuf_puts(wrbuf_val, yaz_tok_parse_string(tp)); } - else + while ((t=yaz_tok_move(tp)) == YAZ_TOK_STRING) { - val_buf[val_size++] = fr_buf[no++]; - if (val_size+1 >= val_max) - { - char *nb; - - nb = (char*) xmalloc(val_max+=1024); - memcpy(nb, val_buf, val_size); - xfree(val_buf); - val_buf = nb; - } + wrbuf_putc(wrbuf_val, ' '); + wrbuf_puts(wrbuf_val, yaz_tok_parse_string(tp)); } + resp->value = xstrdup_env(wrbuf_cstr(wrbuf_val)); + /* printf("name=%s value=%s\n", resp->name, resp->value); */ } - } - } - xfree(val_buf); - fclose(fr); + lineno++; + yaz_tok_parse_destroy(tp); + } + fclose(fr); + yaz_tok_cfg_destroy(yt); + wrbuf_destroy(wrbuf_val); + } + if (errors) + return ZEBRA_FAIL; return ZEBRA_OK; } @@ -344,6 +340,8 @@ void res_set(Res r, const char *name, const char *value) struct res_entry *re; assert(r); + if (!value) + return; for (re = r->first; re; re=re->next) if (re->value && !yaz_matchstr(re->name, name)) { @@ -357,7 +355,7 @@ void res_set(Res r, const char *name, const char *value) } int res_trav(Res r, const char *prefix, void *p, - void (*f)(void *p, const char *name, const char *value)) + void (*f)(void *p, const char *name, const char *value)) { struct res_entry *re; int l = 0; @@ -443,97 +441,20 @@ ZEBRA_RES res_get_int(Res r, const char *name, int *val) return ZEBRA_FAIL; } -/* == pop ================================================================= */ -Res res_add_over (Res p, Res t) -{ - if ((!p) || (!t)) - return (0); - - while (p->over_res) - p = p->over_res; - - p->over_res = t; - return (p); -} - -void res_remove_over (Res r) -{ - if (!r) - return; - r->over_res = 0; -} -void res_close_over (Res r) -{ - if (!r) - return; - if (r->over_res) - res_close(r->over_res); - r->over_res = 0; -} - -void res_add (Res r, const char *name, const char *value) +void res_add(Res r, const char *name, const char *value) { struct res_entry *re; assert(r); assert(name); assert(value); - yaz_log (YLOG_RES, "res_add res=%p, name=%s, value=%s", r, name, value); - re = add_entry (r); - re->name = xstrdup (name); - re->value = xstrdup_env (value); -} - -char **res_2_array (Res r) -{ - struct res_entry *re; - int i = 0; - char **list; - - if (!r) - return 0; - - list = xmalloc(sizeof(char *)); - - for (re = r->first; re; re=re->next) { - list = xrealloc(list, ((i+3) * sizeof(char *))); - list[i++] = strdup(re->name); - if (re->value) - list[i++] = strdup(re->value); - else - list[i++] = strdup(""); - yaz_log(YLOG_RES, "res2array: %s=%s",re->name, re->value); - } - list[i++] = 0; - return (list); -} - -char **res_get_array(Res r, const char* name) -{ - struct res_entry *re; - int i = 0; - char **list; - - if (!r) - return 0; - - list = xmalloc(sizeof(char *)); - - for (re = r->first; re; re=re->next) - if (re->value && !yaz_matchstr (re->name, name)) - { - list = xrealloc(list, (i+2) * sizeof(char *)); - list[i++] = xstrdup(re->value); - } - - if (i == 0) - return (res_get_array(r->def_res, name)); - - list[i++] = 0; - return (list); + yaz_log(YLOG_RES, "res_add res=%p, name=%s, value=%s", r, name, value); + re = add_entry(r); + re->name = xstrdup(name); + re->value = xstrdup_env(value); } -void res_dump (Res r, int level) +void res_dump(Res r, int level) { struct res_entry *re; @@ -545,13 +466,13 @@ void res_dump (Res r, int level) } if (r->def_res) { - printf ("%*s DEF ",level * 4,""); - res_dump (r->def_res, level + 1); + printf("%*s DEF ",level * 4,""); + res_dump(r->def_res, level + 1); } if (r->over_res) { - printf ("%*s OVER ",level * 4,""); - res_dump (r->over_res, level + 1); + printf("%*s OVER ",level * 4,""); + res_dump(r->over_res, level + 1); } } @@ -623,6 +544,7 @@ int res_check(Res r_i, Res r_v) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab