X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Furl.c;h=15a731fde164f2fab86a2707e77f0187d2a71927;hb=c4bf633211b0424492b5a3937d6a6d2e0d79a4cf;hp=ecc18b00936286600d8e891adedc0ca0617aaf81;hpb=6b475e1471242a1db6ee254f98501cc11c8bf1c4;p=libucw.git diff --git a/lib/url.c b/lib/url.c index ecc18b00..15a731fd 100644 --- a/lib/url.c +++ b/lib/url.c @@ -706,10 +706,10 @@ repeat_count(struct component *comp, uns count, uns len) int url_has_repeated_component(const byte *url) { - struct component *comp, **hash; - uns comps, comp_len, rep_prefix, hash_size; + struct component *comp; + uns comps, comp_len, rep_prefix, hash_size, *hash, *next; const byte *c; - uns i, j; + uns i, j, k; for (comps=0, c=url; c; comps++) { @@ -737,22 +737,26 @@ url_has_repeated_component(const byte *url) comp[i].hash = hashf(comp[i].start, comp[i].length); if (comps > url_max_occurences) { - hash_size = next_table_prime(comps * 2); + hash_size = next_table_prime(comps); hash = alloca(hash_size * sizeof(*hash)); - bzero(hash, hash_size * sizeof(*hash)); + next = alloca(comps * sizeof(*next)); + memset(hash, 255, hash_size * sizeof(*hash)); for (i=0; istart, comp[i].start, comp[i].length)) - if (++j == hash_size) - j = 0; - if (!hash[j]) + for (k = hash[j]; ~k && (comp[i].hash != comp[k].hash || comp[i].length != comp[k].length || + memcmp(comp[k].start, comp[i].start, comp[i].length)); k = next[k]); + if (!~k) { - hash[j] = &comp[i]; + next[i] = hash[j]; + hash[j] = i; comp[i].count = 1; } - else if (hash[j]->count++ >= url_max_occurences) - return 1; + else + { + if (comp[k].count++ >= url_max_occurences) + return 1; + } } } for (comp_len = 1; comp_len <= url_max_repeat_length && comp_len <= comps; comp_len++)