string getmacrofun(string id, string &s) {
    string ns=id+s;
    if (mactab.emit(ns,0,true)) {
        s=ns;
        return stop._retval;
    }
    return "";
}
bool MakefileFactory::apply(const QStringList& commandLineArguments, Options **outopt)
{
    if (m_makefile)
        clear();

    Options *options = new Options;
    if (outopt)
        *outopt = options;
    MacroTable *macroTable = new MacroTable;
    macroTable->setEnvironment(m_environment);

    QString filename;
    if (!options->readCommandLineArguments(commandLineArguments, filename, m_activeTargets, *macroTable)) {
        m_errorType = CommandLineError;
        return false;
    }
    if (options->showUsageAndExit || options->showVersionAndExit)
        return true;

    if (!options->stderrFile.isEmpty()) {
        // Try to open the file for writing.
        const wchar_t *wszFileName = reinterpret_cast<const wchar_t*>(options->stderrFile.utf16());
        FILE *f = _wfopen(wszFileName, L"w");
        if (!f) {
            m_errorString = QLatin1String("Cannot open stderr file for writing.");
            m_errorType = IOError;
            return false;
        }
        fclose(f);
        if (!_wfreopen(wszFileName, L"w", stderr)) {
            m_errorString = QLatin1String("Cannot reopen stderr handle for writing.");
            m_errorType = IOError;
            return false;
        }
    }

    options->fullAppPath = QDir::toNativeSeparators(QCoreApplication::applicationFilePath());

    readEnvironment(m_environment, macroTable, options->overrideEnvVarMacros);
    if (!options->ignorePredefinedRulesAndMacros) {
        macroTable->setMacroValue("MAKE", encloseInDoubleQuotesIfNeeded(options->fullAppPath));
        macroTable->setMacroValue("MAKEDIR", encloseInDoubleQuotesIfNeeded(QDir::currentPath()));
        macroTable->setMacroValue("AS", "ml");       // Macro Assembler
        macroTable->setMacroValue("ASFLAGS", QString());
        macroTable->setMacroValue("BC", "bc");       // Basic Compiler
        macroTable->setMacroValue("BCFLAGS", QString());
        macroTable->setMacroValue("CC", "cl");       // C Compiler
        macroTable->setMacroValue("CCFLAGS", QString());
        macroTable->setMacroValue("COBOL", "cobol"); // COBOL Compiler
        macroTable->setMacroValue("COBOLFLAGS", QString());
        macroTable->setMacroValue("CPP", "cl");      // C++ Compiler
        macroTable->setMacroValue("CPPFLAGS", QString());
        macroTable->setMacroValue("CXX", "cl");      // C++ Compiler
        macroTable->setMacroValue("CXXFLAGS", QString());
        macroTable->setMacroValue("FOR", "fl");      // FORTRAN Compiler
        macroTable->setMacroValue("FORFLAGS", QString());
        macroTable->setMacroValue("PASCAL", "pl");   // Pascal Compiler
        macroTable->setMacroValue("PASCALFLAGS", QString());
        macroTable->setMacroValue("RC", "rc");       // Resource Compiler
        macroTable->setMacroValue("RCFLAGS", QString());
    }

    try {
        m_makefile = new Makefile(filename);
        m_makefile->setOptions(options);
        m_makefile->setMacroTable(macroTable);
        Preprocessor preprocessor;
        preprocessor.setMacroTable(macroTable);
        preprocessor.openFile(filename);
        Parser parser;
        parser.apply(&preprocessor, m_makefile, m_activeTargets);
    } catch (Exception &e) {
        m_errorType = ParserError;
        m_errorString = e.toString();
    }

    return m_errorType == NoError;
}
Example #3
0
void ccClearAllMacros() {
    predefinedMacros.shutdown();
    predefinedMacros.init();
}
int pregetmacro(string &line, bool icase, RawSource *rs, bool list, bool recursive) {
    Macro mac;
    mac._list=list;
    mac._recursive=recursive;
    string d,name=getid(line);
    if (name.empty()) {
        error1("Illegal macroname");
        return 0;
    }
    while('>') {
        skipblanks(line);
        if (!line[0]) break;
        if (isalpha(line[0])) {
            d=getid(line);
            mac._namParam.push_back(d);
            if (sbcneed(line,'+')) mac._greedy=true;
            if (sbcneed(line,':')) {
                d=getargument(line,mac._greedy);
            } else d="\01";
            mac._namDefaults.push_back(d);
            if (mac._greedy) break;
            if (comma(line)) continue;
            break;
        }
        if (isdigit(line[0])) {
            if (!getConstant(line,mac._minnum)) {
                error1("constant expected");
                return 0;
            }
            if (need(line,"..")) {
                skipblanks(line);
                if (sbcneed(line,'*'))
                    mac._maxnum=BIGVALUE;
                else {
                    if (!getConstant(line,mac._maxnum)) {
                        error1("constant expected");
                        return 0;
                    }
                }
            } else mac._maxnum=mac._minnum;
            if (mac._minnum<0 || mac._maxnum<mac._minnum) {
                error1("Illegal parameter");
                return 0;
            }
            if (sbcneed(line,'+'))
                if (mac._maxnum<BIGVALUE) mac._greedy=true;
                else error1("No greedy stars allowed!");
            break;
        }
        if (sbcneed(line,'*')) {
            mac._minnum=0;
            mac._maxnum=BIGVALUE;
            if (sbcneed(line,'+')) error1("No greedy stars allowed!");
            break;
        }
        error1("Syntax error");
        break;
    }
    if (mac._maxnum>mac._minnum && line[0]) {
        int i=mac._maxnum-mac._minnum;
        bool gr=false;
        while (i--) {
            if (!line[0]) break;
            if (!i) gr=mac._greedy;
            d=getargument(line,gr);
            mac._numDefaults.push_back(d);
        }
    }
    if (mac._minnum)
        mac._minparam=(int)mac._namParam.size()+mac._minnum;
    else {
        int i=(int)mac._namParam.size();
        mac._minparam=0;
        while (i--) if (mac._namDefaults[i]=="\01") {
                mac._minparam=i+1;
                break;
            }
    }
    if (mac._greedy || mac._maxnum==BIGVALUE) mac._maxparam=BIGVALUE;
    else mac._maxparam=(int)mac._namParam.size()+mac._maxnum;
    if (listopt._macroname.empty()) mac._line=curlin;
    else mac._line=listopt._macrocurlin;
    mac._filename=listopt._filename;
    mac._body=rs->ReadUntil(macronl,macroel,"macro");
    if (!listopt._macroname.empty()) listopt._macrocurlin+=(int)mac._body.size()+1;
    mactab.add(name,icase,mac);
    return 1;
}
Example #5
0
void ccDefineMacro(const char *macro, const char *definition) {
    predefinedMacros.add((char*)macro, (char*)definition);
}