public static MutableString /*!*/ Basename(RubyClass /*!*/ self, [DefaultProtocol, NotNull] MutableString /*!*/ path, [DefaultProtocol, NotNull, Optional] MutableString extensionFilter) { if (path.IsEmpty) { return(path); } MutableString trimmedPath = TrimTrailingSlashes(path); // Special cases of drive letters C:\\ or C:/ if (trimmedPath.Length == 2) { if (Char.IsLetter(trimmedPath.GetChar(0)) && trimmedPath.GetChar(1) == ':') { var result = (path.Length > 2 ? MutableString.Create(path.GetChar(2).ToString()) : MutableString.CreateMutable()); return(result.TaintBy(path)); } } string trimmedPathAsString = trimmedPath.ConvertToString(); if (trimmedPathAsString == "/") { return(trimmedPath); } string filename = Path.GetFileName(trimmedPath.ConvertToString()); // Handle UNC host names correctly string root = Path.GetPathRoot(trimmedPath.ConvertToString()); if (MutableString.IsNullOrEmpty(extensionFilter)) { return(MutableString.Create(trimmedPathAsString == root ? root : filename)); } string fileExtension = Path.GetExtension(filename); string basename = Path.GetFileNameWithoutExtension(filename); string strResult = WildcardExtensionMatch(fileExtension, extensionFilter.ConvertToString()) ? basename : filename; return(Glob.CanonicalizePath(MutableString.Create(strResult)).TaintBy(path)); }
internal static RubyRegexOptions StringToRegexEncoding(MutableString encoding) { if (MutableString.IsNullOrEmpty(encoding)) { return(RubyRegexOptions.NONE); } switch (encoding.GetChar(0)) { case 'N': case 'n': return(RubyRegexOptions.FIXED); case 'E': case 'e': return(RubyRegexOptions.EUC); case 'S': case 's': return(RubyRegexOptions.SJIS); case 'U': case 'u': return(RubyRegexOptions.UTF8); } return(RubyRegexOptions.NONE); }
public static MutableString /*!*/ Basename(RubyClass /*!*/ self, [DefaultProtocol, NotNull] MutableString /*!*/ path, [DefaultProtocol, NotNull, Optional] MutableString suffix) { if (path.IsEmpty) { return(path); } string strPath = path.ConvertToString(); string[] parts = strPath.Split(new[] { DirectorySeparatorChar, AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 0) { return(MutableString.CreateMutable(path.Encoding).Append((char)path.GetLastChar()).TaintBy(path)); } if (Environment.OSVersion.Platform != PlatformID.Unix && Environment.OSVersion.Platform != PlatformID.MacOSX) { string first = parts[0]; if (strPath.Length >= 2 && IsDirectorySeparator(strPath[0]) && IsDirectorySeparator(strPath[1])) { // UNC: skip 2 parts if (parts.Length <= 2) { return(MutableString.CreateMutable(path.Encoding).Append(DirectorySeparatorChar).TaintBy(path)); } } else if (first.Length == 2 && Tokenizer.IsLetter(first[0]) && first[1] == ':') { // skip drive letter "X:" if (parts.Length <= 1) { var result = MutableString.CreateMutable(path.Encoding).TaintBy(path); if (strPath.Length > 2) { result.Append(strPath[2]); } return(result); } } } string last = parts[parts.Length - 1]; if (MutableString.IsNullOrEmpty(suffix)) { return(MutableString.CreateMutable(last, path.Encoding)); } StringComparison comparison = Environment.OSVersion.Platform == PlatformID.Unix ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; int matchLength = last.Length; if (suffix != null) { string strSuffix = suffix.ToString(); if (strSuffix.LastCharacter() == '*' && strSuffix.Length > 1) { int suffixIdx = last.LastIndexOf( strSuffix.Substring(0, strSuffix.Length - 1), comparison ); if (suffixIdx >= 0 && suffixIdx + strSuffix.Length <= last.Length) { matchLength = suffixIdx; } } else if (last.EndsWith(strSuffix, comparison)) { matchLength = last.Length - strSuffix.Length; } } return(MutableString.CreateMutable(path.Encoding).Append(last, 0, matchLength).TaintBy(path)); }