public String readLine() throws IOException {
		final String s = source.readLine();
		if (s == null) {
			return null;
		}

		Matcher m = definePattern.matcher(s);
		if (m.find()) {
			return manageDefine(m);
		}

		m = definelongPattern.matcher(s);
		if (m.find()) {
			return manageDefineLong(m);
		}

		m = undefPattern.matcher(s);
		if (m.find()) {
			return manageUndef(m);
		}

		final List<String> result = defines.applyDefines(s);
		if (result.size() > 1) {
			source.insert(result.subList(1, result.size() - 1));
		}
		return result.get(0);
	}