9 #include "uniconfkey.h"
17 int numsegs = k.right - k.left;
25 result = WvHash(k.store->segments[k.left]);
28 result = WvHash(k.store->segments[k.left])
29 ^ WvHash(k.store->segments[k.right - 1])
38 UniConfKey::Store UniConfKey::EMPTY_store(1, 1);
39 UniConfKey::Store UniConfKey::ANY_store(1, 1,
"*");
40 UniConfKey::Store UniConfKey::RECURSIVE_ANY_store(1, 1,
"...");
47 UniConfKey::Store::Store(
int size,
int _ref_count,
58 segments.resize(parts.count());
59 WvStringList::Iter part(parts);
60 for (part.rewind(); part.next(); )
64 segments.append(*part);
66 if (!!
key &&
key[
key.len()-1] ==
'/' && segments.used() > 0)
67 segments.append(Segment());
73 if ((right - left == 1 && !store->segments[right-1])
76 if (--store->ref_count == 0)
86 void UniConfKey::unique()
88 if (store->ref_count == 1)
91 Store *old_store = store;
92 store =
new Store(right - left, 1);
93 for (
int i=left; i<right; ++i)
94 store->segments.append(old_store->segments[i]);
100 store(new Store(_path.numsegments() + _key.numsegments() + 1, 1)),
105 for (
int i=_path.left; i<_path.right; ++i)
107 const Segment &
segment = _path.store->segments[i];
110 store->segments.append(
segment);
113 for (
int j=_key.left; j<_key.right; ++j)
115 const Segment &
segment = _key.store->segments[j];
118 store->segments.append(
segment);
123 store->segments.append(
"");
134 store->segments.resize(right - left + _key.right - _key.left + 1);
135 for (
int j=_key.left; j<_key.right; ++j)
137 const Segment &
segment = _key.store->segments[j];
140 store->segments.replace(right,
segment);
145 store->segments.replace(right,
"");
156 for (
int j=_key.left; j<_key.right; ++j)
158 if (!!_key.store->segments[j])
161 store->segments.resize(shift + right - left, shift);
162 for (
int j=_key.left; j<_key.right; ++j)
164 const Segment &
segment = _key.store->segments[j];
167 store->segments.replace(left + j - _key.left,
segment);
176 for (
int i=left; i<right; ++i)
177 if (store->segments[i].iswild())
188 if (n > right - left)
196 return result.collapse();
202 if (j > right - left)
208 return UniConfKey(store, left + i, left + j).collapse();
214 switch (right - left)
217 return WvString::empty;
219 return store->segments[left];
223 for (
int i=left; i<right; ++i)
225 buf.
putstr(store->segments[i]);
238 for (i=left, j=other.left; i<right && j<other.right; ++i, ++j)
240 int val = strcasecmp(store->segments[i], other.store->segments[j]);
246 if (j == other.right)
259 if (*
this == pattern)
278 for (
int n = 0; ; ++n)
328 "this = '%s'\nkey = '%s'",
printable(), key);