-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, "+");
- else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') ||
- (ch >= '0' && ch <= '9'))
- {
- dst[0] = ch;
- dst[1] = '\0';
- }
- else
- {
- dst[0] = '%';
- sprintf(dst+1, "%02X", (unsigned char ) ch);
- }
-}
-
-static void yaz_array_to_uri_ex(char **path, ODR o, char **name, char **value,
- const char *extra_args)
-{
- size_t i, szp = 0, sz = extra_args ? 1+strlen(extra_args) : 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;
- }
- }
- if (extra_args)
- {
- if (i)
- (*path)[szp++] = '&';
- memcpy(*path + szp, extra_args, strlen(extra_args));
- szp += strlen(extra_args);
- }
- (*path)[szp] = '\0';
-}
-
-void yaz_array_to_uri(char **path, ODR o, char **name, char **value)
+/** \brief decodes HTTP path (which should hold SRU database)
+ \param o memory for returned result
+ \param uri URI path (up to but not including ?)
+ \returns ODR allocated database
+*/
+static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len)