00001 #ifndef __XROOTD_XPATH__
00002 #define __XROOTD_XPATH__
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 <strings.h>
00034 #include <stdlib.h>
00035
00036 #define XROOTDXP_OK 1
00037 #define XROOTDXP_NOLK 2
00038 #define XROOTDXP_NOCGI 4
00039 #define XROOTDXP_NOSLASH 8
00040 #define XROOTDXP_NOMWCHK 16
00041
00042 class XrdXrootdXPath
00043 {
00044 public:
00045
00046 inline XrdXrootdXPath *Next() {return next;}
00047 inline int Opts() {return pathopt;}
00048 inline char *Path() {return path;}
00049 inline char *Path(int &PLen)
00050 {PLen = pathlen; return path;}
00051 void Set(int opts, const char *pathdata=0)
00052 {pathopt = opts;
00053 if (pathdata)
00054 {if (path) free(path);
00055 pathlen = strlen(pathdata);
00056 path = strdup(pathdata);
00057 }
00058 }
00059
00060 void Insert(const char *pd, int popt=0, int flags=XROOTDXP_OK)
00061 {XrdXrootdXPath *pp = 0, *p = next;
00062 XrdXrootdXPath *newp = new XrdXrootdXPath(pd,popt,flags);
00063 if (popt & ~XROOTDXP_OK)
00064 {while(p && newp->pathlen < p->pathlen)
00065 {pp = p; p = p->next;}
00066 } else {
00067 while(p && newp->pathlen >= p->pathlen)
00068 {pp = p; p = p->next;}
00069 }
00070 newp->next = p;
00071 if (pp) pp->next = newp;
00072 else next = newp;
00073 }
00074
00075 inline int Validate(const char *pd, const int pl=0)
00076 {int plen = (pl ? pl : strlen(pd));
00077 XrdXrootdXPath *p = next;
00078 while(p && plen >= p->pathlen)
00079 {if (!strncmp(pd, p->path, p->pathlen))
00080 return p->pathopt;
00081 p=p->next;
00082 }
00083 return 0;
00084 }
00085
00086 XrdXrootdXPath(const char *pathdata="",int popt=0,int flags=XROOTDXP_OK)
00087 {next = 0;
00088 pathopt = popt | flags;
00089 pathlen = strlen(pathdata);
00090 path = strdup(pathdata);
00091 }
00092
00093 ~XrdXrootdXPath() {if (path) free(path);}
00094
00095 private:
00096
00097 XrdXrootdXPath *next;
00098 int pathlen;
00099 int pathopt;
00100 char *path;
00101 };
00102 #endif