Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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));
        }