37 _name.reserve( name_r.size() );
49 if ( name_r[0] !=
'/' )
61 auto goParent_f = [&](){
64 else if (
_name.size() == 1 )
69 if ( pos ==
_name.size() - 3 &&
_name[pos+1] ==
'.' &&
_name[pos+2] ==
'.' )
76 for (
char ch : name_r )
83 case P_none: pending = P_slash;
break;
85 case P_dot1: pending = P_slash;
break;
86 case P_dot2: goParent_f(); pending = P_slash;
break;
93 case P_none:
_name +=
'.';
break;
94 case P_slash: pending = P_dot1;
break;
95 case P_dot1: pending = P_dot2;
break;
96 case P_dot2:
_name +=
"/..."; pending = P_none;
break;
104 case P_slash:
_name +=
'/'; pending = P_none;
break;
105 case P_dot1:
_name +=
"/."; pending = P_none;
break;
106 case P_dot2:
_name +=
"/.."; pending = P_none;
break;
116 case P_slash:
if (
_name.empty() )
_name =
"/";
break;
117 case P_dot1:
if (
_name.empty() )
_name =
"/";
break;
118 case P_dot2: goParent_f();
if (
_name.empty() )
_name =
"/";
break;
130 if ( name_r.
empty() )
136 if ( idx == string::npos ) {
138 }
else if ( idx == 0 ) {
141 ret_t.
_name.erase( idx );
154 if ( name_r.
empty() )
159 if ( idx != string::npos && ( idx != 0 || ret_t.size() != 1 ) ) {
160 ret_t.erase( 0, idx+1 );
180 {
return asUrl(
"dir" ); }
183 {
return asUrl(
"dir" ); }
186 {
return asUrl(
"file" ); }
191 return str::Str() <<
"(" << root_r <<
")" << path_r;
196 if ( root_r.
empty() || root_r ==
"/" )
208 if ( name_r.
empty() )
216 if ( base.size() == 1 )
220 if ( base.size() == 2 && base[0] ==
'.' )
227 return base.substr( pos );
241 return root_r / path_r;
248 if ( root_r == path_r )
251 if ( rest[0] ==
'/' )
263 if ( add_tv.
empty() )
265 if ( name_r.
empty() )
268 string ret_ti( name_r.
_name );
269 if( add_tv.
_name[0] !=
'/' )
271 return ret_ti + add_tv.
_name;