void sitool::onAsysisSlots()
{
QString strSiProDir = ui.PathSiProLineEdit->text();
QString strProRootDir = ui.PathProRootLineEdit->text();
QString strMakeFileDir = ui.pathMakeFileLineEdit->text();
QString strFlag = ui.flagLineEdit->text();
QStringList strListFlag = strFlag.split(QString(";"));
QString strFileType = ui.fileTypeLineEdit->text();
QStringList strListFileType = strFileType.split(QString(";"));
//找目录下的所有文件匹配到类型的文件
QString text = "";
QDirIterator it(strProRootDir, strListFileType, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
QStringList files;
while (it.hasNext())
{
files << it.next();
}
if (!text.isEmpty())
{
files = findFiles(files, text);
}
//删除临时文件
if (QFile::exists(GREP_DEFINE_OUTPUT_FILE))
{
QFile::remove(GREP_DEFINE_OUTPUT_FILE);
}
//找上面过滤出来所有文件类型中匹配到的#if #ifdef #ifndef #elif行并重定向到指定文件,方便后续处理
if (!processGrep1(files))
{
return;
}
#if 0
//删除# //xxx中的//xxx
if (!processGrep2())
{
return;
}
if (!processSed3())
{
return;
}
//
if (!processSed4())
{
return;
}
#else
//全部使用QStringList操作
QFile file(GREP_DEFINE_OUTPUT_FILE);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QByteArray t = file.readAll();
file.close();
QString str(t);
//将||替换为换行
str.replace("\|\|","\n");
//将&&替换为换行
str.replace("&&", "\n");
//使用\n进行分割
QStringList list = str.split("\n");
//去除注释//及其后面的内容
list.replaceInStrings(QRegExp("[/]+.*"), "");
//去除#if,#ifdef,#ifndef,#elif
list.replaceInStrings(QRegExp("^\s*#[a-z]*\s*"), "");
//删除defined
list.replaceInStrings("defined", "");
//删除undef
list.replaceInStrings("undef", "");
//删除(,),!
list.replaceInStrings("(", "");
list.replaceInStrings(")", "");
list.replaceInStrings("!", "");
//删除比较符号
list.replaceInStrings(QRegExp(">|<|=|<=|>=|=="), "");
//删除数字
list.replaceInStrings(QRegExp("[0-9]*\s*|\s*[0-9]*"), "");
//删除多余的空格
list.replaceInStrings(QRegExp(" "), "");
//删除空行
list.removeAll(QString(""));
//去重复
list.removeDuplicates();
//做一下排序
list.sort();
str.clear();
str = list.join('\n');
file.open(QIODevice::Truncate | QIODevice::WriteOnly | QIODevice::Text);
file.write(str.toUtf8());
file.close();
#endif
}
//查找使用宏的行
bool sitool::processGrep1(QStringList& files)
{
QProcess process(0);
process.setStandardOutputFile(GREP_DEFINE_OUTPUT_FILE, QIODevice::Append);
for (int k = 0; k < files.size(); k++)
{
QString program = "grep.exe -E ";
program.append("\"^\\s*#if|^\\s*#ifdef|^\\s*#ifndef|^\\s*#elif\"");
program.append(" ");
QString str = files.at(k);
str.replace(QString("/"), QString("//"));
program.append(str);
program.append("\r\n");
process.start(program);
process.waitForStarted();
process.waitForFinished();
}
return true;
}
//找目录下的所有文件
QStringList sitool::findFiles(const QStringList &files, const QString &text)
{
QMimeDatabase mimeDatabase;
QStringList foundFiles;
for (int i = 0; i < files.size(); ++i) {
const QString fileName = files.at(i);
const QMimeType mimeType = mimeDatabase.mimeTypeForFile(fileName);
if (mimeType.isValid() && !mimeType.inherits(QStringLiteral("text/plain"))) {
qWarning() << "Not searching binary file " << QDir::toNativeSeparators(fileName);
continue;
}
QFile file(fileName);
if (file.open(QIODevice::ReadOnly)) {
QString line;
QTextStream in(&file);
while (!in.atEnd()) {
break;
line = in.readLine();
if (line.contains(text, Qt::CaseInsensitive)) {
foundFiles << files[i];
break;
}
}
}
}
return foundFiles;
}