summaryrefslogtreecommitdiff
path: root/lib/path.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/path.js')
-rw-r--r--lib/path.js36
1 files changed, 20 insertions, 16 deletions
diff --git a/lib/path.js b/lib/path.js
index 24f6ed617f..9ac8a2450b 100644
--- a/lib/path.js
+++ b/lib/path.js
@@ -32,10 +32,10 @@ function assertPath(path) {
// Resolves . and .. elements in a path with directory names
function normalizeStringWin32(path, allowAboveRoot) {
var res = '';
+ var lastSegmentLength = 0;
var lastSlash = -1;
var dots = 0;
var code;
- var isAboveRoot = false;
for (var i = 0; i <= path.length; ++i) {
if (i < path.length)
code = path.charCodeAt(i);
@@ -47,7 +47,7 @@ function normalizeStringWin32(path, allowAboveRoot) {
if (lastSlash === i - 1 || dots === 1) {
// NOOP
} else if (lastSlash !== i - 1 && dots === 2) {
- if (res.length < 2 || !isAboveRoot ||
+ if (res.length < 2 || lastSegmentLength !== 2 ||
res.charCodeAt(res.length - 1) !== 46/*.*/ ||
res.charCodeAt(res.length - 2) !== 46/*.*/) {
if (res.length > 2) {
@@ -58,20 +58,22 @@ function normalizeStringWin32(path, allowAboveRoot) {
break;
}
if (j !== start) {
- if (j === -1)
+ if (j === -1) {
res = '';
- else
+ lastSegmentLength = 0;
+ } else {
res = res.slice(0, j);
+ lastSegmentLength = j;
+ }
lastSlash = i;
dots = 0;
- isAboveRoot = false;
continue;
}
} else if (res.length === 2 || res.length === 1) {
res = '';
+ lastSegmentLength = 0;
lastSlash = i;
dots = 0;
- isAboveRoot = false;
continue;
}
}
@@ -80,14 +82,14 @@ function normalizeStringWin32(path, allowAboveRoot) {
res += '\\..';
else
res = '..';
- isAboveRoot = true;
+ lastSegmentLength = 2;
}
} else {
if (res.length > 0)
res += '\\' + path.slice(lastSlash + 1, i);
else
res = path.slice(lastSlash + 1, i);
- isAboveRoot = false;
+ lastSegmentLength = i - lastSlash - 1;
}
lastSlash = i;
dots = 0;
@@ -103,10 +105,10 @@ function normalizeStringWin32(path, allowAboveRoot) {
// Resolves . and .. elements in a path with directory names
function normalizeStringPosix(path, allowAboveRoot) {
var res = '';
+ var lastSegmentLength = 0;
var lastSlash = -1;
var dots = 0;
var code;
- var isAboveRoot = false;
for (var i = 0; i <= path.length; ++i) {
if (i < path.length)
code = path.charCodeAt(i);
@@ -118,7 +120,7 @@ function normalizeStringPosix(path, allowAboveRoot) {
if (lastSlash === i - 1 || dots === 1) {
// NOOP
} else if (lastSlash !== i - 1 && dots === 2) {
- if (res.length < 2 || !isAboveRoot ||
+ if (res.length < 2 || lastSegmentLength !== 2 ||
res.charCodeAt(res.length - 1) !== 46/*.*/ ||
res.charCodeAt(res.length - 2) !== 46/*.*/) {
if (res.length > 2) {
@@ -129,20 +131,22 @@ function normalizeStringPosix(path, allowAboveRoot) {
break;
}
if (j !== start) {
- if (j === -1)
+ if (j === -1) {
res = '';
- else
+ lastSegmentLength = 0;
+ } else {
res = res.slice(0, j);
+ lastSegmentLength = j;
+ }
lastSlash = i;
dots = 0;
- isAboveRoot = false;
continue;
}
} else if (res.length === 2 || res.length === 1) {
res = '';
+ lastSegmentLength = 0;
lastSlash = i;
dots = 0;
- isAboveRoot = false;
continue;
}
}
@@ -151,14 +155,14 @@ function normalizeStringPosix(path, allowAboveRoot) {
res += '/..';
else
res = '..';
- isAboveRoot = true;
+ lastSegmentLength = 2;
}
} else {
if (res.length > 0)
res += '/' + path.slice(lastSlash + 1, i);
else
res = path.slice(lastSlash + 1, i);
- isAboveRoot = false;
+ lastSegmentLength = i - lastSlash - 1;
}
lastSlash = i;
dots = 0;