54 size_t traversal_root = 0;
55 size_t component_start = 0;
63 while (get < path.size()) {
66 if (c ==
'.' && (get == component_start || get == component_start + 1)) {
74 if (get == component_start || get == component_start + 1) {
77 component_start = get;
80 if (get == component_start + 2) {
83 if (put == traversal_root) {
89 put = ResolveParentDirectoryTraversal(path, put);
92 component_start = get;
97 size_t next_separator = path.find(
'/', get);
98 if (next_separator == std::string::npos) {
102 size_t next_component_start = next_separator + 1;
104 size_t component_size = next_component_start - component_start;
105 if (put != component_start && component_size > 0) {
106 path.replace(put, component_size,
107 path.substr(component_start, component_size));
109 put += component_size;
110 get = next_component_start;
111 component_start = next_component_start;
114 size_t last_component_size = path.size() - component_start;
115 if (last_component_size == 1 && path[component_start] ==
'.') {
117 }
else if (last_component_size == 2 && path[component_start] ==
'.' &&
118 path[component_start + 1] ==
'.') {
121 if (put == traversal_root) {
125 traversal_root = put;
127 put = ResolveParentDirectoryTraversal(path, put);
131 if (put != component_start && last_component_size > 0) {
132 path.replace(put, last_component_size,
133 path.substr(component_start, last_component_size));
135 put += last_component_size;
138 if (put >= 2 && path[put - 1] ==
'/')
static const uint8_t buffer[]