/**
* File: FirstTokenizer.java
* Content: Retrieves the methods with body in a program, returning the line number and
* the method signature in a ordered list.
* The method to obtain the methods is quite simplistic, that's the reason because
* the logic is implemented on a different file, to make it easier to change the
* logic to some better algorithm
* Author: LuisM Pena
* Date: 21st March 2001
* Version: 0.60.00
* Last change:
*
*
**/
package preprocessors;
import sensei.util.Parameters;
import sensei.util.ParameterException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.LineNumberReader;
import java.util.Iterator;
import java.util.Vector;
public class IncludeTraceCode
{
IncludeTraceCode(String init)
{
this.init=init;
}
void process(File file) throws IOException
{
getLinesToChange(file);
LineNumberReader reader=null;
PrintWriter writer = null;
try
{
File backup=new File(file.toString()+SecExtension);
File orig=new File(file.toString());
if (!orig.renameTo(backup))
System.out.println("Error: could not rename file " + orig + " into " + backup);
else
{
reader=new LineNumberReader(new InputStreamReader(new FileInputStream(backup)));
writer = new PrintWriter(new FileOutputStream(file));
String traceLine=prepareTraceLine(init, file);
String line=reader.readLine();
while(line!=null)
{
if (lineNumberToChange(reader.getLineNumber()))
{
writer.println(createTraceLine(traceLine));
if (isNotTraceCodeLine(line))
writer.println(line);
}
else
writer.println(line);
line=reader.readLine();
}
}
}
finally
{
if (writer!=null) try {writer.close();}catch(Exception ex){}
if (reader!=null) try {reader.close();}catch(Exception ex){}
}
}
String createTraceLine(String start)
{
String ret = start + lineInfo.signature + "\");";
getNextLineInfo();
return ret;
}
String prepareTraceLine(String init, File file)
{
return init + "Trace.code(\"" + file.getName() + " -> ";
}
boolean isNotTraceCodeLine(String line)
{
return line.indexOf("Trace.code")==-1; //no perfect! regex, eh?
}
void getLinesToChange(File file) throws IOException
{
lines=tokenizer.process(file).iterator();
getNextLineInfo();
}
void getNextLineInfo()
{
lineInfo = lines.hasNext()? (FirstTokenizer.Line) lines.next() : null;
}
boolean lineNumberToChange(int line)
{
return (lineInfo!=null) && (lineInfo.line==line);
}
FirstTokenizer tokenizer = new FirstTokenizer();
Iterator lines;
FirstTokenizer.Line lineInfo;
String init;
//*************************************************************************************//
//**************************** MAIN ***************************************************//
//*************************************************************************************//
/**
* Main function, just checks the arguments and passes it to the PreprocessDebug class
**/
public static void main(String args[])
{
try
{
Vector validParams=new Vector();
validParams.add(TabParameter);
validParams.add(SpaceParameter);
validParams.add(NoBackupParameter);
Parameters param=new Parameters(args, validParams, new Vector(), 1, Integer.MAX_VALUE);
String init=" "; //ok, hardcoded so far
IncludeTraceCode prep = new IncludeTraceCode(init);
for (int i=0; i < param.getArgumentsLength() ; i++)
prep.process(new File(param.getArgument(i)));
}
catch(ParameterException ex)
{
System.out.println(ex.getMessage());
System.out.println("Use: [-tab tabuladores] [-sp spaces] [-nobackup] file [files]");
}
catch(IOException ex)
{
System.out.println(ex);
}
}
static final String TabParameter="tab";
static final String SpaceParameter="sp";
static final String NoBackupParameter="nobackup";
static final String SecExtension=".noprep";
}