import java.io.FileNotFoundException;
public class CommentRemover {
private StringBuffer fileContent;
public void Run(StringBuffer buf) {
fileContent = buf;
//Remove Comments
RemoveComments();
//Leere Zeilen
RemoveEmptyLines();
}
private boolean bInString = false;
private boolean bInChar = false;
private boolean bInSingleLineComment = false;
private boolean bInMultiLineComment = false;
char actChar = 0;
char lastChar = 0;
int actPos = 0;
int deleteBegin = 0; //Anfang des zu l�schenden Bereichs
private boolean InAnything()
{
return bInString || bInChar || bInSingleLineComment || bInMultiLineComment;
}
private void OnSlash()
{
//ende eines MultiLine-Kommentars (*/)
if (bInMultiLineComment && lastChar=='*')
{
bInMultiLineComment = false;
//den abschlie�enden / auch noch l�schen
actPos++;
Delete();
//aktuelles zeichen zur�cksetzen, damit daraus kein //, oder �hnliches wird
actChar = 0;
}
//begin eines SingleLine-Kommentars (//)
else if (lastChar=='/' && !InAnything())
{
bInSingleLineComment = true;
//ab erstem / alles l�schen
deleteBegin = actPos-1;
}
}
//Beginn eines MultiLine-Kommentars?
private void OnStar()
{
if (lastChar=='/' && !InAnything())
{
bInMultiLineComment = true;
// ab / alles l�schen
deleteBegin = actPos-1;
}
}
//Zeilenende -> Ende eines einfachen Kommentars?
private void OnEOL()
{
if (bInSingleLineComment)
{
bInSingleLineComment = false;
//Bei Windows-Zeilenumbruch \r\n nicht l�schen
if (lastChar == '\r')
actPos--;
Delete();
}
}
//Anfang oder Ende eines Strings?
private void OnDoubleQuote()
{
//Ende?
if (bInString)
{
//nur wenn vorher kein '\' war
if (lastChar!='\\')
bInString = false;
}
else if (!InAnything())
{
bInString = true;
}
}
//Anfang oder Ende eines char?
private void OnQuote()
{
//Ende?
if (bInChar)
{
//nur wenn vorher kein '\' war
if (lastChar!='\\')
bInChar = false;
}
else if (!InAnything())
{
bInChar = true;
}
}
//L�scht den aktuellen Bereich
private void Delete()
{
fileContent.delete(deleteBegin, actPos);
//danach den cursor auf das letzte g�ltige zeichen setzen
actPos = deleteBegin + 1;
//lastChar wieder zur�cksetzen
lastChar = 0;
}
private void RemoveComments()
{
actPos = -1;
deleteBegin = 0;
bInString = false;
bInChar = false;
bInSingleLineComment = false;
bInMultiLineComment = false;
actChar = 0;
lastChar = 0;
//�ber alle zeichen iterieren
while (actPos < fileContent.length()-1)
{
actPos++;
lastChar = actChar;
actChar = fileContent.charAt(actPos);
switch (actChar)
{
case '/' : OnSlash();break;
case '\n': OnEOL();break;
case '"' : OnDoubleQuote();break;
case '\'': OnQuote();break;
case '*': OnStar();break;
}
}
}
//leere Zeilen l�schen (inkl. Tabs, etc)
private void RemoveEmptyLines()
{
int start = 0;
int end = 0;
while (end!=-1)
{
start = fileContent.indexOf("\n",start);
end = fileContent.indexOf("\n",start+1);
if (start!=-1 && end!=-1)
{
String mid = fileContent.substring(start, end);
mid = mid.trim();
if (mid.length()==0)
{
fileContent.delete(start, end);
start = 0; //von vorn
}
}
if (start >= 0)
start++;
}
//Zum Schluss ist u.U. noch die erste Zeile nur '\n'
if (fileContent.substring(0, 1).equals("\n"))
fileContent.delete(0, 1);
else if (fileContent.substring(0, 2).equals("\r\n"))
fileContent.delete(0, 2);
}
}