blob: fb61f8f28e557b71d0ea5ef624690d70bc78848a [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2002,2003 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.make.internal.core.makefile;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
/**
*/
public class MakefileReader extends LineNumberReader {
public MakefileReader(Reader reader) {
super(reader);
}
public MakefileReader(Reader reader, int sz) {
super(reader, sz);
}
public String readLine() throws IOException {
boolean done = false;
StringBuffer buffer = new StringBuffer();
boolean escapedLine = false;
boolean escapedCommand = false;
while (!done) {
String line = super.readLine();
if (line == null) {
return null;
}
if (escapedLine && line.length() > 0) {
// Eat the spaces at the beginning.
int i = 0;
while (i < line.length() && (Util.isSpace(line.charAt(i)))) {
i++ ;
}
line = line.substring(i);
} else if (escapedCommand && line.length() > 0) {
// Only eat the first tab
if (line.charAt(0) == '\t') {
line.substring(1);
}
}
// According to POSIX rules:
// When an escaped <newline>(one preceded by a backslash) is found
// anywhere in the makefile except in a command line, it shall be replaced,
// along with any leading white space on the following line, with a single <space>
//
// When an escaped <newline> is found in a command line in a makefile,
// the command line shall contain the backslash, the <newline>, and the next line,
// except that the first character of the next line shall not be included if it is a <tab>
if (Util.isEscapedLine(line)) {
int index = line.lastIndexOf('\\');
if (index > 0) {
if (!escapedLine && Util.isCommand(line)) {
escapedCommand = true;
buffer.append(line);
} else {
escapedLine = true;
buffer.append(line.substring(0, index));
buffer.append(' ');
}
}
} else {
done = true;
escapedLine = false;
escapedCommand = false;
buffer.append(line);
}
}
return buffer.toString();
}
}