package org.erlide.ui.editors.erl.scanner; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IPredicateRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; public class EscapeRule implements IPredicateRule { private final IToken token; public EscapeRule(final IToken token) { this.token = token; } @Override public IToken evaluate(final ICharacterScanner scanner) { int c = scanner.read(); if (c == '\\') { c = scanner.read(); if (c == 'x') { c = scanner.read(); if (c == '{') { c = scanner.read(); int hex = 0; while (isHexChar(c)) { hex++; c = scanner.read(); } if (c != '}') { while (hex > 0) { scanner.unread(); hex--; } scanner.unread(); scanner.unread(); } return token; } else if (c != ICharacterScanner.EOF) { int hex = 0; while (isHexChar(c)) { hex++; c = scanner.read(); } while (hex > 2) { scanner.unread(); hex--; } if (hex > 0 && c != ICharacterScanner.EOF) { scanner.unread(); } return token; } return token; } else if (c != ICharacterScanner.EOF) { int octal = 0; while (c >= '0' && c <= '7') { octal++; c = scanner.read(); } while (octal > 3) { scanner.unread(); octal--; } if (octal > 0 && c != ICharacterScanner.EOF) { scanner.unread(); } return token; } } scanner.unread(); return Token.UNDEFINED; } public boolean isHexChar(final int c) { return c >= '0' && c <= '7' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F'; } @Override public IToken getSuccessToken() { return token; } @Override public IToken evaluate(final ICharacterScanner scanner, final boolean resume) { return evaluate(scanner); } }