blob: 359ef237cf17e6a0f9c07b40346a4d7d11f62a32 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 University of Illinois at Urbana-Champaign and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* UIUC - Initial API and implementation
*******************************************************************************/
package org.eclipse.photran.internal.core.lexer;
import java.io.IOException;
import java.io.Reader;
import org.eclipse.core.resources.IFile;
import org.eclipse.photran.internal.core.preprocessor.c.CppHelper;
import org.eclipse.photran.internal.core.preprocessor.c.IToken;
import org.eclipse.photran.internal.core.preprocessor.c.OffsetLimitReachedException;
/**
* An InputStream to read tokens obtained from the CPP. This class will
* also make a ProducerMap when constructed that can be used to find
* directives and macros.
*
* @author Matthew Michelotti
*/
public class CPreprocessingReader extends SingleCharReader
{
/**ProducerMap constructed from the CPP tokens*/
private ProducerMap producerMap;
private IncludeMap includeMap;
/**current CPP token being read*/
private IToken curToken;
/**full image of curToken*/
private String curTokenImage;
/**the offset in curTokenImage to be read next*/
private int curTokenOffset = 0;
/**
* Basic constructor. Parses the whole file in the constructor
* and turns the result into CPP tokens. A ProducerMap is made
* from these tokens. The tokens are remembered, so that they
* can be read as an input stream.
* @param filename - name of file that inputStream corresponds to
* @param reader - Reader to read file data from
* @throws IOException
*/
public CPreprocessingReader(IFile file, String filename, Reader reader) throws IOException
{
try
{
CppHelper cpp = new CppHelper(file, filename, reader);
curToken = cpp.getRemainingTokens();
curTokenImage = CppHelper.getFullImage(curToken);
producerMap = new ProducerMap(curToken);
includeMap = new IncludeMap(curToken, file);
}catch(OffsetLimitReachedException e) {throw new Error(e);}
}
@Override public int read() throws IOException
{
if(curToken == null) return -1;
while(curTokenOffset >= curTokenImage.length()) {
curToken = curToken.getNext();
if(curToken == null) return -1;
curTokenImage = CppHelper.getFullImage(curToken);
curTokenOffset = 0;
}
char result = curTokenImage.charAt(curTokenOffset);
curTokenOffset++;
return result;
}
/**@return the ProducerMap object made at construction*/
public ProducerMap getProducerMap() {
return producerMap;
}
public IncludeMap getIncludeMap() {
return includeMap;
}
@Override
public void close() throws IOException
{
}
}