Example #1
0
void SpinCompiler::run()
{
    Preferences pref;
    errors.clear();
    QFile sf;
    QFile df;

    QString tmpName;
    CompilerTempFile tmpFile;
    if (!tmpFile.status()) {
        SpinError err(tr("Cannot create temp directory %1").arg(tmpName), "", -1, -1);
        err.severity = SpinError::Error;
        errors.append(err);
        status = CompileError;
        return;
    }
    tmpName = tmpFile.name();

    QString topFile;
    SpinPreprocessor prepro(srcFileName, pref.getEncoding());
    prepro.setSearchPath(pref.getSearchPath());
    PreprocessedFiles files = prepro.findFiles();
    for (int i = 0; i < files.size(); i++) {
        QString src = files.at(i).fileName;
        QFileInfo info(src);
        QString dst = tmpName + info.fileName();
        if (i == 0) topFile = dst;
        df.setFileName(dst);
        df.open(QIODevice::WriteOnly);
        df.write(files.at(i).data);
        sf.close();
        df.close();
    }

    binaryFileContent.clear();
    eepromFileContent.clear();
    listing = "";
    bstcOutput.clear();
    QString baseName;
    QStringList args;
    QFileInfo info(srcFileName);
    baseName = QDir::toNativeSeparators(tmpName + info.completeBaseName());

    QStringList defines = pref.getDefines().split(QRegExp("\\s+"));
    args << defines;

    if (pref.getInfo()) args << "-w2";
    else if (pref.getWarnings()) args << "-w1";
    else args << "-w0";

    QString opt("");
    if (pref.getFastConstants()) opt += "b";
    if (pref.getFoldConstants()) opt += "c";
    if (pref.getGenericSafe()) opt += "g";
    if (pref.getEliminateUnused()) opt += "r";
    if (pref.getFoldUnary()) opt += "u";
    if (pref.getNonParallaxExt()) opt += "x";

    if (!opt.isEmpty()) args << (QString("-O") + opt);

    QStringList paths = pref.getSearchPath();
    for (int i=0; i < paths.size(); i++) {
        args << "-L" << paths[i];
    }

    args << "-q";
    if (dest & EEPROM) args << "-e";
    args << "-b";
    args << "-lm";
    args << topFile;
    bstc = runCompiler(tmpName, args);
    if (!bstc) return;

    while (bstc->bytesAvailable()) bstcOutput.append(bstc->readLine());
    parseOutput();
    qSort(errors);
    if (bstc->exitCode()) {
        status = CompileError;
        return;
    }
    if (dest & EEPROM) {
        QFile f(baseName + ".eeprom");
        f.open(QIODevice::ReadOnly);
        eepromFileContent = f.readAll();
    }
    {
        QFile f(baseName + ".binary");
        f.open(QIODevice::ReadOnly);
        binaryFileContent = f.readAll();
    }
    QFile f(baseName + ".list");
    f.open(QIODevice::ReadOnly);
    listing = QString(f.readAll());
    f.close();
    parseListFile();
}