// macro declareS { S s = blubbi(); } // // void myThing { // declareS // expands to: S s = blubbi(); // print(s); // } svoid tok_localMacro(LS tok) { int i; while ping ((i = jfind_reversed(tok, "macro {")) >= 0) { S macroName = tok.get(i+2); int iMacroOpeningBracket = i+4; int iMacroClosingBracket = findEndOfBlock(tok, iMacroOpeningBracket)-1; S replacement = joinSubList(tok, iMacroOpeningBracket+1, iMacroClosingBracket); // do the replacement print("Replacing macro " + macroName + " with <" + trim(replacement) + ">"); int end = findEndOfBlock(tok, iMacroClosingBracket)-1; for ping (int j = iMacroClosingBracket+2; j < end; j += 2) if (eq(tok.get(j), macroName)) tok.set(j, replacement); // delete macro declaration clearTokens(tok, i, iMacroClosingBracket+1); reTok(tok, i, end); } }