+ QStringList parts = path.simplified().replace("\\", "/").split("/", QString::SkipEmptyParts);
+
+ for(int i = 0; i < parts.count(); i++)
+ {
+ parts[i] = MUtils::clean_file_name(parts[i]);
+ }
+
+ return parts.join("/");
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// REGULAR EXPESSION HELPER
+///////////////////////////////////////////////////////////////////////////////
+
+bool MUtils::regexp_parse_uint32(const QRegExp ®exp, quint32 &value)
+{
+ return regexp_parse_uint32(regexp, &value, 1);
+}
+
+bool MUtils::regexp_parse_uint32(const QRegExp ®exp, quint32 *values, const size_t &count)
+{
+ const QStringList caps = regexp.capturedTexts();
+
+ if(caps.isEmpty() || (quint32(caps.count()) <= count))
+ {
+ return false;
+ }
+
+ for(size_t i = 0; i < count; i++)
+ {
+ bool ok = false;
+ values[i] = caps[i+1].toUInt(&ok);
+ if(!ok)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// AVAILABLE CODEPAGES
+///////////////////////////////////////////////////////////////////////////////
+
+QStringList MUtils::available_codepages(const bool &noAliases)
+{
+ QStringList codecList;
+ QList<QByteArray> availableCodecs = QTextCodec::availableCodecs();
+
+ while(!availableCodecs.isEmpty())
+ {
+ const QByteArray current = availableCodecs.takeFirst();
+ if(!current.toLower().startsWith("system"))
+ {
+ codecList << QString::fromLatin1(current.constData(), current.size());
+ if(noAliases)
+ {
+ if(QTextCodec *const currentCodec = QTextCodec::codecForName(current.constData()))
+ {
+ const QList<QByteArray> aliases = currentCodec->aliases();
+ for(QList<QByteArray>::ConstIterator iter = aliases.constBegin(); iter != aliases.constEnd(); iter++)
+ {
+ availableCodecs.removeAll(*iter);
+ }
+ }
+ }
+ }
+ }
+
+ return codecList;