Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

path.C

Go to the documentation of this file.
00001 // $Id: path.C,v 1.1 2001/04/12 12:27:44 dvermeir Exp $
00002 #include "path.h"
00003 
00004 // Construct path containing the first n components of p.
00005 Path::Path(const Path& p,unsigned int n) {
00006 unsigned int m(min(p.size(),n));
00007 path_.resize(m);
00008 for (unsigned int i=0; i<m; ++i) 
00009   path_[i] = p[i];
00010 }
00011 
00012 bool
00013 Path::parse(const string& ps) {
00014 path_.clear();
00015 /* Decode the parts of the ps into a vector. The first component of the
00016    vector will be empty if the ps starts with '/'. 
00017    We also refuse to append empty strings to path_. This handles cases like
00018    "/a//b" which will result in <"","a","b">.
00019 
00020   We use n0 to indicate the start position of a component and
00021   n1 to indicate the position just after the end of the component.
00022 */
00023 string::size_type n0(ps.find_first_not_of('/',0));
00024 
00025 if (n0!=0) // the path starts with '/' which we encode as a first "/" component.
00026   path_.push_back("");
00027 
00028 if (n0==string::npos) // ps must be "/"
00029   return true;
00030 
00031 string::size_type n1(string::npos);
00032 
00033 /* The variable n0 points to the start of a component. We make n1 point to
00034    the next '/', if any. The component then is the substring starting at
00035    n0 and ending before n1.
00036 */
00037 while ((n1=ps.find_first_of('/',n0))!=string::npos) {
00038   if (n1>n0) // only non-empty parts are stored.
00039     path_.push_back(ps.substr(n0,n1-n0));
00040   n0 = n1+1;
00041   }
00042 // If ps does not end with '/', we must still add the final component.
00043 if (n0<ps.size())
00044   path_.push_back(ps.substr(n0));
00045 
00046 return true;
00047 }
00048 
00049 ostream& 
00050 operator<<(ostream& os,const Path& path) {
00051 // E.g. <"","a","b"> is printed as "/a/b".
00052 for (unsigned int j=0; j<path.size() ; ++j) {
00053   if ((j>0)||(path.size()==1))
00054     os << "/";
00055   os << path[j];
00056   }
00057 return os;
00058 }
00059 

httpstats-stage02b [ 7 April, 2001]