| 'use strict'; | |
| var path = require('path'); | |
| var inspect = require('util').inspect; | |
| function assertPath(path) { | |
| if (typeof path !== 'string') { | |
| throw new TypeError('Path must be a string. Received ' + inspect(path)); | |
| } | |
| } | |
| function posix(path) { | |
| assertPath(path); | |
| if (path.length === 0) | |
| return '.'; | |
| var code = path.charCodeAt(0); | |
| var hasRoot = (code === 47/*/*/); | |
| var end = -1; | |
| var matchedSlash = true; | |
| for (var i = path.length - 1; i >= 1; --i) { | |
| code = path.charCodeAt(i); | |
| if (code === 47/*/*/) { | |
| if (!matchedSlash) { | |
| end = i; | |
| break; | |
| } | |
| } else { | |
| // We saw the first non-path separator | |
| matchedSlash = false; | |
| } | |
| } | |
| if (end === -1) | |
| return hasRoot ? '/' : '.'; | |
| if (hasRoot && end === 1) | |
| return '//'; | |
| return path.slice(0, end); | |
| } | |
| function win32(path) { | |
| assertPath(path); | |
| var len = path.length; | |
| if (len === 0) | |
| return '.'; | |
| var rootEnd = -1; | |
| var end = -1; | |
| var matchedSlash = true; | |
| var offset = 0; | |
| var code = path.charCodeAt(0); | |
| // Try to match a root | |
| if (len > 1) { | |
| if (code === 47/*/*/ || code === 92/*\*/) { | |
| // Possible UNC root | |
| rootEnd = offset = 1; | |
| code = path.charCodeAt(1); | |
| if (code === 47/*/*/ || code === 92/*\*/) { | |
| // Matched double path separator at beginning | |
| var j = 2; | |
| var last = j; | |
| // Match 1 or more non-path separators | |
| for (; j < len; ++j) { | |
| code = path.charCodeAt(j); | |
| if (code === 47/*/*/ || code === 92/*\*/) | |
| break; | |
| } | |
| if (j < len && j !== last) { | |
| // Matched! | |
| last = j; | |
| // Match 1 or more path separators | |
| for (; j < len; ++j) { | |
| code = path.charCodeAt(j); | |
| if (code !== 47/*/*/ && code !== 92/*\*/) | |
| break; | |
| } | |
| if (j < len && j !== last) { | |
| // Matched! | |
| last = j; | |
| // Match 1 or more non-path separators | |
| for (; j < len; ++j) { | |
| code = path.charCodeAt(j); | |
| if (code === 47/*/*/ || code === 92/*\*/) | |
| break; | |
| } | |
| if (j === len) { | |
| // We matched a UNC root only | |
| return path; | |
| } | |
| if (j !== last) { | |
| // We matched a UNC root with leftovers | |
| // Offset by 1 to include the separator after the UNC root to | |
| // treat it as a "normal root" on top of a (UNC) root | |
| rootEnd = offset = j + 1; | |
| } | |
| } | |
| } | |
| } | |
| } else if ((code >= 65/*A*/ && code <= 90/*Z*/) || | |
| (code >= 97/*a*/ && code <= 122/*z*/)) { | |
| // Possible device root | |
| code = path.charCodeAt(1); | |
| if (path.charCodeAt(1) === 58/*:*/) { | |
| rootEnd = offset = 2; | |
| if (len > 2) { | |
| code = path.charCodeAt(2); | |
| if (code === 47/*/*/ || code === 92/*\*/) | |
| rootEnd = offset = 3; | |
| } | |
| } | |
| } | |
| } else if (code === 47/*/*/ || code === 92/*\*/) { | |
| return path[0]; | |
| } | |
| for (var i = len - 1; i >= offset; --i) { | |
| code = path.charCodeAt(i); | |
| if (code === 47/*/*/ || code === 92/*\*/) { | |
| if (!matchedSlash) { | |
| end = i; | |
| break; | |
| } | |
| } else { | |
| // We saw the first non-path separator | |
| matchedSlash = false; | |
| } | |
| } | |
| if (end === -1) { | |
| if (rootEnd === -1) | |
| return '.'; | |
| else | |
| end = rootEnd; | |
| } | |
| return path.slice(0, end); | |
| } | |
| module.exports = process.platform === 'win32' ? win32 : posix; | |
| module.exports.posix = posix; | |
| module.exports.win32 = win32; |