+void PutSubstructUrlKey(HashList *list, urlcontent *u, char **keys, long *lengths, int max, int which){
+ void *vUrl;
+ urlcontent *subu;
+ HashList *thisList = list;
+ if (GetHash(list, keys[which], lengths[which], &vUrl) &&
+ (vUrl != NULL))
+ {
+ subu = (urlcontent*) vUrl;
+ if (subu->sub == NULL) {
+ subu->sub = NewHash(1, NULL);
+ }
+ thisList = subu->sub;
+ }
+ else if (which < max) {
+ subu = (urlcontent *) malloc(sizeof(urlcontent));
+
+ memcpy(subu->url_key, keys[which], lengths[which]);
+ subu->klen = lengths[which];
+ subu->url_data = NULL;
+ subu->sub = NewHash(1, NULL);
+
+ Put(list, subu->url_key, subu->klen, subu, free_url);
+ thisList = subu->sub;
+ }
+ if (which >= max) {
+ Put(thisList, keys[which], lengths[which], u, free_url);
+ }
+ else {
+ PutSubstructUrlKey(subu->sub, u, keys, lengths, max, which + 1);
+ }
+}
+
+void PutUrlKey(HashList *urlstrings, urlcontent *u, int have_colons) {
+ if (have_colons == 0) {
+ Put(urlstrings, u->url_key, u->klen, u, free_url);
+ }
+ else {
+ char *keys[10];
+ long lengths[10];
+ int i = 0;
+ char *pch;
+ char *pchs;
+ char *pche;
+
+ memset(&keys, 0, sizeof(keys));
+ memset(&lengths, 0, sizeof(lengths));
+ pchs = pch = u->url_key;
+ pche = u->url_key + u->klen;
+ while ((i < 10) && (pch <= pche)) {
+ if ((have_colons == 2) &&
+ (*pch == '%') &&
+ (*(pch + 1) == '3') &&
+ ((*(pch + 2) == 'A') ||
+ (*(pch + 1) == 'a')
+ ))
+ {
+ *pch = '\0';
+
+ if (i == 0) {
+ /* Separate the toplevel key : */
+ u->klen = pch - pchs;
+ }
+
+ /* sub-section: */
+ keys[i] = pchs;
+ lengths[i] = pch - pchs;
+
+ pch += 3;
+
+ pchs = pch;
+ i++;
+ }
+ else if ((have_colons == 1) &&
+ (*pch == ':')) {
+ *pch = '\0';
+ if (i == 0) {
+ /* Separate the toplevel key : */
+ u->klen = pch - pchs;
+ }
+ /* sub-section: */
+ keys[i] = pchs;
+ lengths[i] = pch - pchs;
+
+ pch++;
+ pchs = pch;
+ i++;
+ }
+ else if (pch == pche){
+ /* sub-section: */
+ keys[i] = pchs;
+ lengths[i] = pch - pchs;
+ i++;
+ break;
+ }
+ else {
+ pch ++;
+ }
+ }
+
+ PutSubstructUrlKey(urlstrings, u, keys, lengths, i - 1, 0);
+ }
+}
+