package net.sourceforge.phpeclipse.mover.obfuscator; /** * Analyze the file with the PHP Scanner */ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; import net.sourceforge.phpdt.core.compiler.InvalidInputException; import net.sourceforge.phpdt.internal.compiler.parser.Scanner; import net.sourceforge.phpdt.internal.compiler.parser.SyntaxError; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.mover.DefaultMover; import net.sourceforge.phpeclipse.views.PHPConsole; import org.eclipse.jface.preference.IPreferenceStore; public class PHPAnalyzer extends DefaultMover implements ITerminalSymbols { protected Scanner fScanner; protected int fToken; protected HashMap fIdentifierMap; /** * buffer, for obvious reasons access to this buffer must * be synchronized */ protected byte[] bytes = new byte[1024]; /** * Creates a PHPAnalyzer * @param console reports error to the PHPConsole */ public PHPAnalyzer(PHPConsole console, Scanner scanner, HashMap identifierMap) { super(console); this.fScanner = scanner; this.fIdentifierMap = identifierMap; } /** * gets the next token from input */ private void getNextToken() { try { fToken = fScanner.getNextToken(); if (Scanner.DEBUG) { int currentEndPosition = fScanner.getCurrentTokenEndPosition(); int currentStartPosition = fScanner.getCurrentTokenStartPosition(); System.out.print(currentStartPosition + "," + currentEndPosition + ": "); System.out.println(fScanner.toStringAction(fToken)); } return; } catch (InvalidInputException e) { } fToken = TokenNameERROR; } private void parseIdentifiers(boolean goBack) { char[] ident; String identifier; PHPIdentifier value; int counter = 0; IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); try { while (fToken != TokenNameEOF && fToken != TokenNameERROR) { if (fToken == TokenNameVariable) { identifier = new String(fScanner.getCurrentIdentifierSource()); value = (PHPIdentifier) fIdentifierMap.get(identifier); if (value == null) { fIdentifierMap.put(identifier, new PHPIdentifier(null, PHPIdentifier.VARIABLE)); } getNextToken(); // } else if (fToken == TokenNamefunction) { // getNextToken(); // if (fToken == TokenNameAND) { // getNextToken(); // } // if (fToken == TokenNameIdentifier) { // ident = fScanner.getCurrentIdentifierSource(); // outlineInfo.addVariable(new String(ident)); // temp = new PHPFunctionDeclaration(current, new String(ident), fScanner.getCurrentTokenStartPosition()); // current.add(temp); // getNextToken(); // parseDeclarations(outlineInfo, temp, true); // } // } else if (fToken == TokenNameclass) { // getNextToken(); // if (fToken == TokenNameIdentifier) { // ident = fScanner.getCurrentIdentifierSource(); // outlineInfo.addVariable(new String(ident)); // temp = new PHPClassDeclaration(current, new String(ident), fScanner.getCurrentTokenStartPosition()); // current.add(temp); // getNextToken(); // // //skip fTokens for classname, extends and others until we have the opening '{' // while (fToken != TokenNameLBRACE && fToken != TokenNameEOF && fToken != TokenNameERROR) { // getNextToken(); // } // parseDeclarations(outlineInfo, temp, true); // // stack.pop(); // } } else if (fToken == TokenNameStringLiteral) { char currentCharacter; int i = fScanner.startPosition; ArrayList varList = new ArrayList(); while (i < fScanner.currentPosition) { currentCharacter = fScanner.source[i++]; if (currentCharacter == '$' && fScanner.source[i - 2] != '\\') { StringBuffer varName = new StringBuffer(); varName.append("$"); while (i < fScanner.currentPosition) { currentCharacter = fScanner.source[i++]; if (!Scanner.isPHPIdentifierPart(currentCharacter)) { break; // while loop } varName.append(currentCharacter); } varList.add(varName.toString()); } } for (i = 0; i < varList.size(); i++) { identifier = (String) varList.get(i); value = (PHPIdentifier) fIdentifierMap.get(identifier); if (value == null) { fIdentifierMap.put(identifier, new PHPIdentifier(null, PHPIdentifier.VARIABLE)); } } getNextToken(); } else if ((fToken == TokenNameLBRACE) || (fToken == TokenNameDOLLAR_LBRACE)) { getNextToken(); counter++; } else if (fToken == TokenNameRBRACE) { getNextToken(); --counter; if (counter == 0 && goBack) { return; } } else { getNextToken(); } } } catch (SyntaxError sytaxErr) { // do nothing } } /** * Move one file. * @param sourceFile the file to move * @param targetDir the directory to copy the result to * @return file or null if the file was ignored */ public File move(File sourceFile, File targetDir) { StringBuffer buf = new StringBuffer(); try { long filelen = sourceFile.length(); char[] charArray = new char[(int) filelen]; BufferedReader br = new BufferedReader(new FileReader(sourceFile.getAbsolutePath())); br.read(charArray, 0, (int) filelen); br.close(); // String input = buf.toString(); /* fScanner initialization */ fScanner.setSource(charArray); fScanner.setPHPMode(false); fToken = TokenNameEOF; getNextToken(); parseIdentifiers(false); return null; } catch (IOException e) { fConsole.write(e.toString()); } return null; } }