]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/url.c
Added string functions for matching of prefixes and suffixes
[libucw.git] / ucw / url.c
index 39f13a5f2f31b72fa90923b155739a82f021fbc6..39e52946e2bd086cd3cbdaefa4985fe217b56fde 100644 (file)
--- a/ucw/url.c
+++ b/ucw/url.c
@@ -30,6 +30,7 @@ static uns url_min_repeat_count = 0x7fffffff;
 static uns url_max_repeat_length = 0;
 static uns url_max_occurences = ~0U;
 
+#ifndef TEST
 static struct cf_section url_config = {
   CF_ITEMS {
     CF_UNS("IgnoreSpaces", &url_ignore_spaces),
@@ -46,6 +47,7 @@ static void CONSTRUCTOR url_init_config(void)
 {
   cf_declare_section("URL", &url_config, 0);
 }
+#endif
 
 /* Escaping and de-escaping */
 
@@ -90,12 +92,14 @@ url_deescape(const char *s, char *d)
              val = NCC_AND; break;
            case '#':
              val = NCC_HASH; break;
+#ifndef CONFIG_URL_ESCAPE_COMPAT
            case '$':
              val = NCC_DOLLAR; break;
            case '+':
              val = NCC_PLUS; break;
            case ',':
              val = NCC_COMMA; break;
+#endif
            }
          *d++ = val;
          s += 3;
@@ -135,15 +139,18 @@ url_enescape(const char *s, char *d)
       if (d >= end)
        return URL_ERR_TOO_LONG;
       if (Calnum(c) ||                                                 /* RFC 2396 (2.1-2.3): Only alphanumerics ... */
-         c == '-' || c == '_' || c == '.' || c == '+' || c == '~' ||   /* ... and several other exceptions ... */
-         c == '!' || c == '*' || c == '\'' || c == '(' || c == ')' ||
-         c == '/' || c == '?' || c == ':' || c == '@' ||               /* ... and reserved chars used for reserved purpose */
-         c == '=' || c == '&' || c == '#' || c == ';' ||
-         c == '$' || c == '+' || c == ',')
+         c == '!' || c == '*' || c == '\'' || c == '(' || c == ')' ||  /* ... and some exceptions and reserved chars */
+         c == '$' || c == '-' || c == '_' || c == '.' || c == '+' ||
+         c == ',' || c == '=' || c == '&' || c == '#' || c == ';' ||
+         c == '/' || c == '?' || c == ':' || c == '@'
+#ifndef CONFIG_URL_ESCAPE_COMPAT
+         || c == '~'
+#endif
+       )
        *d++ = *s++;
       else
        {
-         uns val = ((byte)*s < NCC_MAX) ? NCC_CHARS[(byte)*s] : *s;
+         uns val = (byte)(((byte)*s < NCC_MAX) ? NCC_CHARS[(byte)*s] : *s);
          *d++ = '%';
          *d++ = enhex(val >> 4);
          *d++ = enhex(val & 0x0f);
@@ -163,14 +170,14 @@ url_enescape_friendly(const char *src, char *dest)
     {
       if (dest >= end)
        return URL_ERR_TOO_LONG;
-      if (*srcb < NCC_MAX)
+      if ((byte)*srcb < NCC_MAX)
        *dest++ = NCC_CHARS[*srcb++];
       else if (*srcb >= 0x20 && *srcb < 0x7f)
        *dest++ = *srcb++;
       else
        {
          *dest++ = '%';
-         *dest++ = enhex(*srcb >> 4);
+         *dest++ = enhex((byte)*srcb >> 4);
          *dest++ = enhex(*srcb++ & 0x0f);
        }
     }
@@ -184,7 +191,7 @@ char *url_proto_names[URL_PROTO_MAX] = URL_PNAMES;
 static int url_proto_path_flags[URL_PROTO_MAX] = URL_PATH_FLAGS;
 
 uns
-identify_protocol(const char *p)
+url_identify_protocol(const char *p)
 {
   uns i;
 
@@ -212,7 +219,7 @@ url_split(char *s, struct url *u, char *d)
          while (s < p)
            *d++ = *s++;
          *d++ = 0;
-         u->protoid = identify_protocol(u->protocol);
+         u->protoid = url_identify_protocol(u->protocol);
          s++;
          if (url_proto_path_flags[u->protoid] && (s[0] != '/' || s[1] != '/'))
            {
@@ -512,7 +519,7 @@ url_pack(struct url *u, char *d)
     {
       d = append(d, u->protocol, e);
       d = append(d, ":", e);
-      u->protoid = identify_protocol(u->protocol);
+      u->protoid = url_identify_protocol(u->protocol);
     }
   if (u->host)
     {
@@ -605,7 +612,7 @@ int main(int argc, char **argv)
   char buf1[MAX_URL_SIZE], buf2[MAX_URL_SIZE], buf3[MAX_URL_SIZE], buf4[MAX_URL_SIZE];
   int err;
   struct url url, url0;
-  char *base = "http://mj@www.hell.org/123/sub_dir/index.html;param?query&zzz/subquery#fragment";
+  char *base = "http://mj@www.hell.org/123/sub_dir;param/index.html;param?query&zzz/sub;query+#fragment?";
 
   if (argc != 2 && argc != 3)
     return 1;