00001 #ifndef __OUC_PLIST__
00002 #define __OUC_PLIST__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <stdio.h>
00034 #include <strings.h>
00035 #include <stdlib.h>
00036
00037 class XrdOucPList
00038 {
00039 public:
00040
00041 inline int Attr() {return attrs;}
00042 inline unsigned long long Flag() {return flags;}
00043 inline const char *Name() {return name;}
00044 inline XrdOucPList *Next() {return next;}
00045 inline char *Path() {return path;}
00046 inline int Plen() {return pathlen;}
00047
00048 inline int PathOK(const char *pd, const int pl)
00049 {return pl >= pathlen && !strncmp(pd, path, pathlen);}
00050
00051 inline void Set(int aval) {attrs = aval;}
00052 inline void Set(unsigned long long fval) {flags = fval;}
00053 inline void Set(const char *pd, const char *pn)
00054 {if (path) free(path);
00055 pathlen = strlen(pd);
00056 int n = strlen(pn) + 1 + pathlen + 1;
00057 path = (char *)malloc(n);
00058 n = snprintf(path, n, "%s", pd);
00059 name = path+pathlen+1;
00060 strcpy(name, pn);
00061 }
00062
00063 XrdOucPList(const char *pd="", unsigned long long fv=0)
00064 : flags(fv), next(0), path(strdup(pd)),
00065 pathlen(strlen(pd)), attrs(0) {}
00066
00067 XrdOucPList(const char *pd, const char *pn)
00068 : next(0), path(0), attrs(0)
00069 {Set(pd, pn);}
00070
00071 ~XrdOucPList()
00072 {if (path) free(path);}
00073
00074 friend class XrdOucPListAnchor;
00075
00076 private:
00077
00078 union{
00079 unsigned long long flags;
00080 char *name;
00081 };
00082 XrdOucPList *next;
00083 char *path;
00084 int pathlen;
00085 int attrs;
00086 };
00087
00088 class XrdOucPListAnchor : public XrdOucPList
00089 {
00090 public:
00091
00092 inline XrdOucPList *About(const char *pathname)
00093 {int plen = strlen(pathname);
00094 XrdOucPList *p = next;
00095 while(p) {if (p->PathOK(pathname, plen)) break;
00096 p=p->next;
00097 }
00098 return p;
00099 }
00100
00101 inline void Default(unsigned long long x) {dflts = x;}
00102 inline
00103 unsigned long long Default() {return dflts;}
00104 inline void Defstar(unsigned long long x) {dstrs = x;}
00105
00106 inline void Empty(XrdOucPList *newlist=0)
00107 {XrdOucPList *p = next;
00108 while(p) {next = p->next; delete p; p = next;}
00109 next = newlist;
00110 }
00111
00112 inline unsigned long long Find(const char *pathname)
00113 {int plen = strlen(pathname);
00114 XrdOucPList *p = next;
00115 while(p) {if (p->PathOK(pathname, plen)) break;
00116 p=p->next;
00117 }
00118 if (p) return p->flags;
00119 return (*pathname == '/' ? dflts : dstrs);
00120 }
00121
00122 inline XrdOucPList *Match(const char *pathname)
00123 {int plen = strlen(pathname);
00124 XrdOucPList *p = next;
00125 while(p) {if (p->pathlen == plen
00126 && !strcmp(p->path, pathname)) break;
00127 p=p->next;
00128 }
00129 return p;
00130 }
00131
00132 inline XrdOucPList *First() {return next;}
00133
00134 inline void Insert(XrdOucPList *newitem)
00135 {XrdOucPList *pp = 0, *cp = next;
00136 while(cp && newitem->pathlen < cp->pathlen) {pp=cp;cp=cp->next;}
00137 if (pp) {newitem->next = pp->next; pp->next = newitem;}
00138 else {newitem->next = next; next = newitem;}
00139 }
00140
00141 inline int NotEmpty() {return next != 0;}
00142
00143 XrdOucPListAnchor(unsigned long long dfx=0)
00144 : dflts(dfx), dstrs(dfx) {}
00145 ~XrdOucPListAnchor() {}
00146
00147 private:
00148
00149 unsigned long long dflts;
00150 unsigned long long dstrs;
00151 };
00152 #endif