diff --git a/ArcFormats/ArcCommon.cs b/ArcFormats/ArcCommon.cs
index ad096345..8cd66218 100644
--- a/ArcFormats/ArcCommon.cs
+++ b/ArcFormats/ArcCommon.cs
@@ -93,6 +93,66 @@ namespace GameRes.Formats
}
}
+ public static class StringExtensions
+ {
+ ///
+ /// Check if has specified extension .
+ ///
+ public static bool HasExtension (this string filename, string ext)
+ {
+ bool ext_is_empty = string.IsNullOrEmpty (ext);
+ if (!ext_is_empty && '.' == ext[0])
+ return filename.EndsWith (ext, StringComparison.InvariantCultureIgnoreCase);
+ int ext_start = GetExtensionIndex (filename);
+ // filename extension length
+ int l_ext_length = filename.Length - ext_start;
+ if (ext_is_empty)
+ return 0 == l_ext_length;
+ return (l_ext_length == ext.Length
+ && filename.EndsWith (ext, StringComparison.InvariantCultureIgnoreCase));
+ }
+
+ ///
+ /// Check if filename ends with any of the extensions from the .
+ ///
+ public static bool HasAnyOfExtensions (this string filename, params string[] ext_list)
+ {
+ int ext_start = GetExtensionIndex (filename);
+ int l_ext_length = filename.Length - ext_start;
+ foreach (string ext in ext_list)
+ {
+ if (string.IsNullOrEmpty (ext) || "." == ext)
+ {
+ if (0 == l_ext_length)
+ return true;
+ }
+ else if ('.' == ext[0] || l_ext_length == ext.Length)
+ {
+ if (filename.EndsWith (ext, StringComparison.InvariantCultureIgnoreCase))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ internal static int GetExtensionIndex (string filename)
+ {
+ int name_start = filename.LastIndexOfAny (VFS.PathSeparatorChars);
+ if (-1 == name_start)
+ name_start = 0;
+ else
+ name_start++;
+ if (filename.Length == name_start) // path ends with '\'
+ return name_start;
+
+ int ext_start = filename.LastIndexOf ('.', filename.Length-1, filename.Length - name_start);
+ if (-1 == ext_start)
+ return filename.Length;
+ else
+ return ext_start + 1;
+ }
+ }
+
public class HuffmanDecoder
{
byte[] m_src;