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); }