36 if ( name_tv.empty() )
38 name_t.reserve( name_tv.size() );
50 if ( name_tv[0] !=
'/' )
62 auto goParent_f = [&](){
65 else if (
name_t.size() == 1 )
77 for (
auto ch : name_tv )
84 case P_none: pending = P_slash;
break;
86 case P_dot1: pending = P_slash;
break;
87 case P_dot2: goParent_f(); pending = P_slash;
break;
94 case P_none:
name_t +=
'.';
break;
95 case P_slash: pending = P_dot1;
break;
96 case P_dot1: pending = P_dot2;
break;
97 case P_dot2:
name_t +=
"/..."; pending = P_none;
break;
105 case P_slash:
name_t +=
'/'; pending = P_none;
break;
106 case P_dot1:
name_t +=
"/."; pending = P_none;
break;
107 case P_dot2:
name_t +=
"/.."; pending = P_none;
break;
117 case P_slash:
if (
name_t.empty() )
name_t =
"/";
break;
119 case P_dot2: goParent_f();
if (
name_t.empty() )
name_t =
"/";
break;
131 if ( name_tv.
empty() )
137 if ( idx == string::npos ) {
139 }
else if ( idx == 0 ) {
142 ret_t.
name_t.erase( idx );
155 if ( name_tv.
empty() )
160 if ( idx != string::npos && ( idx != 0 || ret_t.size() != 1 ) ) {
161 ret_t.erase( 0, idx+1 );
174 Url ret(
"dir:///" );
181 return str::Str() <<
"(" << root_r <<
")" << path_r;
186 if ( root_r.
empty() || root_r ==
"/" )
198 if ( name_tv.
empty() )
206 if ( base.size() == 1 )
210 if ( base.size() == 2 && base[0] ==
'.' )
217 return base.substr( pos );
231 return root_r / path_r;
241 if ( add_tv.
empty() )
243 if ( name_tv.
empty() )
246 string ret_ti( name_tv.
name_t );
247 if( add_tv.
name_t[0] !=
'/' )
249 return ret_ti + add_tv.
name_t;