X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsrwutil.c;h=baac6a7d6135868b0ebe10a97514a54327814a35;hb=c6b8edd2312a4606cc014738266059a20e3b6e61;hp=5cc58e65aa9c031f8ea17b13ea3afef78e41c2e4;hpb=1aef63af06fa380247c91d12cd7288981985a406;p=yaz-moved-to-github.git diff --git a/src/srwutil.c b/src/srwutil.c index 5cc58e6..baac6a7 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2008 Index Data + * Copyright (C) 1995-2009 Index Data * See the file LICENSE for details. */ /** @@ -9,172 +9,10 @@ #include #include +#include #include -static int hex_digit (int ch) -{ - if (ch >= '0' && ch <= '9') - return ch - '0'; - else if (ch >= 'a' && ch <= 'f') - return ch - 'a'+10; - else if (ch >= 'A' && ch <= 'F') - return ch - 'A'+10; - return 0; -} - -void encode_uri_char(char *dst, char ch) -{ - if (ch == ' ') - strcpy(dst, "+"); - /* mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" */ - else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || - (ch >= '0' && ch <= '9') || strchr("-_.!~*'(|)", ch)) - { - dst[0] = ch; - dst[1] = '\0'; - } - else - { - dst[0] = '%'; - sprintf(dst+1, "%02X", (unsigned char ) ch); - } -} - -static void yaz_array_to_uri(char **path, ODR o, char **name, char **value) -{ - size_t i, szp = 0, sz = 1; - for(i = 0; name[i]; i++) - sz += strlen(name[i]) + 3 + strlen(value[i]) * 3; - *path = (char *) odr_malloc(o, sz); - - for(i = 0; name[i]; i++) - { - size_t j, ilen; - if (i) - (*path)[szp++] = '&'; - ilen = strlen(name[i]); - memcpy(*path+szp, name[i], ilen); - szp += ilen; - (*path)[szp++] = '='; - for (j = 0; value[i][j]; j++) - { - size_t vlen; - char vstr[5]; - encode_uri_char(vstr, value[i][j]); - vlen = strlen(vstr); - memcpy(*path+szp, vstr, vlen); - szp += vlen; - } - } - (*path)[szp] = '\0'; -} - -int yaz_uri_to_array(const char *path, ODR o, char ***name, char ***val) -{ - int no = 2; - const char *cp; - *name = 0; - if (*path == '?') - path++; - if (!*path) - return 0; - cp = path; - while ((cp = strchr(cp, '&'))) - { - cp++; - no++; - } - *name = (char **) odr_malloc(o, no * sizeof(char*)); - *val = (char **) odr_malloc(o, no * sizeof(char*)); - - for (no = 0; *path; no++) - { - const char *p1 = strchr(path, '='); - size_t i = 0; - char *ret; - if (!p1) - break; - - (*name)[no] = (char *) odr_malloc(o, (p1-path)+1); - memcpy((*name)[no], path, p1-path); - (*name)[no][p1-path] = '\0'; - - path = p1 + 1; - p1 = strchr(path, '&'); - if (!p1) - p1 = strlen(path) + path; - (*val)[no] = ret = (char *) odr_malloc(o, p1 - path + 1); - while (*path && *path != '&') - { - if (*path == '+') - { - ret[i++] = ' '; - path++; - } - else if (*path == '%' && path[1] && path[2]) - { - ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]); - path = path + 3; - } - else - ret[i++] = *path++; - } - ret[i] = '\0'; - - if (*path) - path++; - } - (*name)[no] = 0; - (*val)[no] = 0; - return no; -} - -char *yaz_uri_val(const char *path, const char *name, ODR o) -{ - size_t nlen = strlen(name); - if (*path != '?') - return 0; - path++; - while (path && *path) - { - const char *p1 = strchr(path, '='); - if (!p1) - break; - if ((size_t)(p1 - path) == nlen && !memcmp(path, name, nlen)) - { - size_t i = 0; - char *ret; - - path = p1 + 1; - p1 = strchr(path, '&'); - if (!p1) - p1 = strlen(path) + path; - ret = (char *) odr_malloc(o, p1 - path + 1); - while (*path && *path != '&') - { - if (*path == '+') - { - ret[i++] = ' '; - path++; - } - else if (*path == '%' && path[1] && path[2]) - { - ret[i++] = hex_digit (path[1])*16 + hex_digit (path[2]); - path = path + 3; - } - else - ret[i++] = *path++; - } - ret[i] = '\0'; - return ret; - } - path = strchr(p1, '&'); - if (path) - path++; - } - return 0; -} - +#if YAZ_HAVE_XML2 static int yaz_base64decode(const char *in, char *out) { const char *map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -220,6 +58,7 @@ static int yaz_base64decode(const char *in, char *out) *out = '\0'; return olen; } +#endif int yaz_srw_check_content_type(Z_HTTP_Response *hres) { @@ -239,6 +78,7 @@ int yaz_srw_check_content_type(Z_HTTP_Response *hres) * Look for authentication tokens in HTTP Basic parameters or in x-username/x-password * parameters. Added by SH. */ +#if YAZ_HAVE_XML2 static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, char *username, char *password, ODR decode) { @@ -273,8 +113,9 @@ static void yaz_srw_decodeauth(Z_SRW_PDU *sr, Z_HTTP_Request *hreq, sr->password = odr_strdup(decode, pbuf); } } +#endif -void yaz_uri_val_int(const char *path, const char *name, ODR o, int **intp) +void yaz_uri_val_int(const char *path, const char *name, ODR o, Odr_int **intp) { const char *v = yaz_uri_val(path, name, o); if (v) @@ -456,8 +297,9 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, return 2; } +#if YAZ_HAVE_XML2 static int yaz_sru_decode_integer(ODR odr, const char *pname, - const char *valstr, int **valp, + const char *valstr, Odr_int **valp, Z_SRW_diagnostic **diag, int *num_diag, int min_value) { @@ -479,6 +321,7 @@ static int yaz_sru_decode_integer(ODR odr, const char *pname, *valp = odr_intdup(odr, ival); return 1; } +#endif /** http://www.loc.gov/z3950/agency/zing/srw/service.html @@ -600,7 +443,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, Z_SRW_extra_arg **l = &extra_args; while (*l) l = &(*l)->next; - *l = odr_malloc(decode, sizeof(**l)); + *l = (Z_SRW_extra_arg *) odr_malloc(decode, sizeof(**l)); (*l)->name = odr_strdup(decode, n); (*l)->value = odr_strdup(decode, v); (*l)->next = 0; @@ -855,6 +698,8 @@ static Z_SRW_PDU *yaz_srw_get_core_ver(ODR o, const char *version) p->username = 0; p->password = 0; p->extra_args = 0; + p->extraResponseData_buf = 0; + p->extraResponseData_len = 0; return p; } @@ -1190,13 +1035,13 @@ int yaz_diag_srw_to_bib1(int code) } static void add_val_int(ODR o, char **name, char **value, int *i, - char *a_name, int *val) + char *a_name, Odr_int *val) { if (val) { name[*i] = a_name; - value[*i] = (char *) odr_malloc(o, 30); - sprintf(value[*i], "%d", *val); + value[*i] = (char *) odr_malloc(o, 40); + sprintf(value[*i], ODR_INT_PRINTF, *val); (*i)++; } } @@ -1448,7 +1293,7 @@ void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args) while (*name) { - *ea = odr_malloc(odr, sizeof(**ea)); + *ea = (Z_SRW_extra_arg *) odr_malloc(odr, sizeof(**ea)); (*ea)->name = *name; (*ea)->value = *val; ea = &(*ea)->next; @@ -1464,6 +1309,7 @@ void yaz_encode_sru_extra(Z_SRW_PDU *sr, ODR odr, const char *extra_args) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab