00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "unidefgen.h"
00010 #include "wvmoniker.h"
00011
00012 #include <ctype.h>
00013 #include <stdlib.h>
00014
00015
00016
00017 static UniConfGen *creator(WvStringParm s, IObject *obj, void *)
00018 {
00019 UniConfGen *gen = NULL;
00020
00021 if (obj)
00022 gen = mutate<UniConfGen>(obj);
00023 if (!gen)
00024 gen = wvcreate<UniConfGen>(s);
00025
00026 return new UniDefGen(gen);
00027 }
00028
00029 static WvMoniker<UniConfGen> reg("default", creator);
00030
00031
00032 WvString UniDefGen::get(const UniConfKey &key)
00033 {
00034 WvString tmp_key(key), tmp("");
00035 char *p = tmp_key.edit();
00036
00037 tmp.setsize(strlen(tmp_key) * 2);
00038 char *q = tmp.edit();
00039 *q = '\0';
00040
00041 WvString result;
00042 finddefault(key, p, q, result);
00043 return result;
00044 }
00045
00046
00047 void UniDefGen::finddefault(const UniConfKey &key, char *p, char *q,
00048 WvString &result)
00049 {
00050 if (!p)
00051 {
00052 result = UniFilterGen::get(++q);
00053 if (!result.isnull())
00054 replacewildcard(key, q, result);
00055 return;
00056 }
00057
00058
00059 char *r = strchr(p, '/');
00060 if (r)
00061 *r++ = '\0';
00062
00063
00064 char *s = strchr(q, '\0');
00065 *s++ = '/';
00066 *s = 0;
00067 q = strcat(q, p);
00068
00069
00070 finddefault(key, r, q, result);
00071
00072 if (!result.isnull())
00073 return;
00074
00075
00076 *s++ = '*';
00077 *s = '\0';
00078 finddefault(key, r, q, result);
00079
00080 if (r)
00081 *--r = '/';
00082 }
00083
00084
00085 void UniDefGen::replacewildcard(const UniConfKey &key, char *p,
00086 WvString &result)
00087 {
00088
00089 const char *s = result.cstr();
00090 if (strlen(s) < 2 || s[0] != '*')
00091 return;
00092
00093 int idx = atoi(s+1);
00094 if (idx == 0)
00095 return;
00096
00097
00098 UniConfKey k(p);
00099 int loc = key.numsegments();
00100 for (int i = 0; i < idx; i++)
00101 {
00102 if (i != 0)
00103 {
00104 k = k.removelast();
00105 loc--;
00106 }
00107 while (!k.last().iswild())
00108 {
00109 k = k.removelast();
00110 loc--;
00111 if (k.isempty())
00112 {
00113
00114 result = WvString::null;
00115 return;
00116 }
00117 }
00118 }
00119
00120
00121 result = key.segment(loc-1);
00122 }