// effort doubles for each extra token static int magicQuotes_maxTokens = 10; static Set magicQuotes(S input) { new LinkedHashSet out; LS tok = javaTok(input); if (l(tok) <= magicQuotes_maxTokens) magicQuotes_impl(new L, asLinkedList(tok), false, out); ret out; } // Q: do remainingTokens start with an N or C token? svoid magicQuotes_impl(LS tokens, LS remainingTokens, bool inQuote, Set out) { ping(); if (l(remainingTokens) < 2) out.add(inQuote ? join(tokens) + "\"" + join(remainingTokens) : join(tokens) + join(remainingTokens)); else { // case 1: don't insert a quote tokens.addAll(popFirst(2, remainingTokens)); magicQuotes_impl(tokens, remainingTokens, inQuote, out); remainingTokens.addAll(0, popLast(2, tokens)); // case 2: insert quote LS t = cloneTakeFirst(2, remainingTokens); if (inQuote) addAll(tokens, "\"" + first(t), second(t)); else addAll(tokens, first(t), "\"" + second(t)); removeFirst(2, remainingTokens); magicQuotes_impl(tokens, remainingTokens, !inQuote, out); removeLast(2, tokens); remainingTokens.addAll(0, t); } }