/* * Copyright (C) 2010-2016 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ package com.jpexs.decompiler.flash.importers.svg; /** * * @author JPEXS */ public class SvgPathReader { private final String str; private int pos; public SvgPathReader(String str) { this.str = str; } public boolean hasNext() { return pos < str.length(); } public char peek() { return str.charAt(pos); } public char readChar() { char ch = str.charAt(pos); pos++; return ch; } public char readCommand() { if (!hasNext()) { return 0; } readWhiteSpaces(); char ch = peek(); char command = 0; if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { command = ch; pos++; readSeparators(); } return command; } private void digitSequence() { while (hasNext()) { char ch = str.charAt(pos); if (ch >= '0' && ch <= '9') { } else { break; } pos++; } } public double readDouble() { int startPos = pos; readWhiteSpaces(); char ch; ch = str.charAt(pos); if (ch == '-') { pos++; } digitSequence(); if (hasNext()) { ch = str.charAt(pos); if (ch == '.') { pos++; digitSequence(); } } if (hasNext()) { ch = str.charAt(pos); if (ch == 'e') { pos++; ch = str.charAt(pos); if (ch == '-') { pos++; } digitSequence(); } } boolean ok = false; try { double result = Double.parseDouble(str.substring(startPos, pos)); readSeparators(); ok = true; return result; } finally { if (!ok) { pos = startPos; } } } private void readWhiteSpaces() { while (hasNext()) { char ch = peek(); if (ch != ' ' && ch != '\r' && ch != '\n') { return; } readChar(); } } private void readSeparators() { while (hasNext()) { char ch = peek(); if (ch != ' ' && ch != ',' && ch != '\r' && ch != '\n') { return; } readChar(); } } }