static boolean findFunctionInvocations_debug; // these prefix tokens mark a non-invocation (TODO: expand) static Set findFunctionInvocations_pre = new HashSet(litlist(".", "void", "S", "String", "int", "bool", "boolean", "A", "Object", "O")); static Set findFunctionInvocations(L tok, SS sf) { ret findFunctionInvocations(tok, sf, null); } // sf = set of functions to search for or null for any function static Set findFunctionInvocations(L tok, SS sf, Collection hardReferences) { ret findFunctionInvocations(tok, sf, hardReferences, null); } static Set findFunctionInvocations(L tok, SS sf, Collection hardReferences, Set haveFunctions) { int i; Set l = new HashSet(); while ((i = jfind(tok, "please include function *.")) >= 0) { String fname = tok.get(i+6); l.add(fname); hardReferences.add(fname); clearAllTokens(tok.subList(i, i+10)); } boolean result = false; for (i = 1; i+2 < tok.size(); i += 2) { String f = tok.get(i); if (!isIdentifier(f)) continue; if (findFunctionInvocations_debug) System.out.println("Testing identifier " + f); if (!tok.get(i+2).equals("(")) continue; if (i == 1 || !findFunctionInvocations_pre.contains(tok.get(i-2)) || eq(get(tok, i-2), ".") && eq(get(tok, i-4), "main")) { boolean inSF = sf == null || sf.containsKey(f); if (findFunctionInvocations_debug) System.out.println("Possible invocation: " + f + ", inSF: " + inSF); if (inSF && !contains(haveFunctions, f) && l.add(f)) print("Found standard function reference: " + lineAroundToken(tok, i)); } } return l; }