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