public List<String> applyDefines(String line) {
		for (Map.Entry<String, String> ent : values.entrySet()) {
			final String key = ent.getKey();
			if (ent.getValue() == null) {
				continue;
			}
			final String value = Matcher.quoteReplacement(ent.getValue());
			if (key.contains("(")) {
				final StringTokenizer st = new StringTokenizer(key, "(),");
				final String fctName = st.nextToken();
				String newValue = value;
				final StringBuilder regex = new StringBuilder("\\b" + fctName + "\\(");
				int i = 1;

				while (st.hasMoreTokens()) {
					if (st.hasMoreTokens()) {
						regex.append("([^,]*)");
					} else {
						regex.append("([^)]*)");
					}
					final String var1 = st.nextToken();
					final String var2 = "(##" + var1 + "\\b)|(\\b" + var1 + "##)|(\\b" + var1 + "\\b)";
					newValue = newValue.replaceAll(var2, "\\$" + i);
					i++;
					if (st.hasMoreTokens()) {
						regex.append(",");
					}
				}

				regex.append("\\)");
				line = line.replaceAll(regex.toString(), newValue);
			} else {
				final String regex = "\\b" + key + "\\b";
				line = line.replaceAll(regex, value);
			}
		}
		return Arrays.asList(line.split("\n"));
	}