/*******************************************************************************
* Copyright (c) 2009, Adobe Systems Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Adobe Systems Incorporated nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
package com.adobe.dp.office.vml;
import java.util.Vector;
public class VMLPathSegment {
final public String command;
final public Object[] args;
private final static int INIT = 0;
private final static int CALLOUT = 1;
private final static int ARG = 2;
private final static int COMMAND = 3;
private final static int COMMA = 4;
public VMLPathSegment(String command, Object[] args) {
this.command = command;
this.args = args;
}
public static VMLPathSegment[] parse(String path) {
if (path == null)
return null;
Vector segments = new Vector();
Vector args = new Vector();
StringBuffer command = new StringBuffer();
int index = 0;
int len = path.length();
int state = INIT;
while (index <= len) {
char c = (index == len ? 'e' : path.charAt(index));
if (('0' <= c && c <= '9') || c == '-') {
// read numerical arg
int start = index;
while (index < len) {
c = path.charAt(++index);
if ('0' > c || c > '9')
break;
}
int arg = Integer.parseInt(path.substring(start, index));
if (state == CALLOUT)
args.add(new VMLCallout('@', arg));
else
args.add(new Integer(arg));
state = ARG;
} else if (c == ',') {
index++;
if (state == COMMA || state == COMMAND)
args.add(new Integer(0));
state = COMMA;
} else if ('a' <= c && c <= 'z') {
if (command.length() > 0) {
char f = command.charAt(0);
if (command.length() == 2 || (f != 'h' && f != 'n' && f != 'a' && f != 'w' && f != 'q')) {
String cmd = command.toString();
if (state == COMMA)
args.add(new Integer(0));
Object[] cmdargs = new Object[args.size()];
args.copyInto(cmdargs);
segments.add(new VMLPathSegment(cmd, cmdargs));
args.setSize(0);
command.delete(0, command.length());
}
}
command.append(c);
state = COMMAND;
index++;
} else if (c == '@') {
state = CALLOUT;
index++;
} else if (c == ' ') {
index++;
} else {
index++;
System.out.println("unknown char in path string: " + c);
}
}
VMLPathSegment[] segs = new VMLPathSegment[segments.size()];
segments.copyInto(segs);
return segs;
}
}