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; }
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; }
void ccDefineMacro(const char *macro, const char *definition) { predefinedMacros.add((char*)macro, (char*)definition); }