blob: 9c5a57c29f716bfbf95b3891f475a4c7f02114d2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, this program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.debug.internal.core.pdi.aif;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ptp.debug.core.pdi.model.aif.AIFFactory;
import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFType;
import org.eclipse.ptp.debug.core.pdi.model.aif.ITypeAggregate;
/**
* @author Clement chu
*
*/
public abstract class TypeAggregate extends AIFType implements ITypeAggregate {
protected List<String> fields = new ArrayList<String>();
protected List<IAIFType> types = new ArrayList<IAIFType>();
protected String name;
private int size = 0;
public TypeAggregate(String format) {
parse(format);
}
public String getName() {
return name;
}
public String[] getFields() {
return (String[])fields.toArray(new String[0]);
}
public IAIFType[] getTypes() {
return (IAIFType[])types.toArray(new IAIFType[0]);
}
public String getField(int index) {
return (String)fields.get(index);
}
public IAIFType getType(int index) {
return (IAIFType)types.get(index);
}
public int getNumberOfChildren() {
return fields.size();
}
public int sizeof() {
return size;
}
protected void parse(String fmt) {
fmt = parseName(fmt);
while (fmt.length() > 0) {
fmt = parseField(fmt);
fmt = parseType(fmt);
}
}
protected String parseName(String fmt) {
int pos = fmt.indexOf(AIFFactory.SIGN_STROKE);
name = fmt.substring(0, pos);
return fmt.substring(pos+1);
}
protected String parseField(String fmt) {
int pos = fmt.indexOf(AIFFactory.SIGN_EQUAL);
fields.add(fmt.substring(0, pos));
return fmt.substring(pos+1);
}
protected String parseType(String fmt) {
int pos = getSeperatePosition(fmt);
if (pos > -1) {
String tmp_fmt = fmt.substring(0, pos);
if (tmp_fmt.indexOf(AIFFactory.FDS_STRUCT_CLASS) > -1) {
pos = getSeperatePosition(fmt, AIFFactory.FDS_STRUCT_END);
if (pos == -1) {
pos = getSeperatePosition(fmt, AIFFactory.FDS_CLASS_END);
}
}
else if (tmp_fmt.indexOf(AIFFactory.FDS_UNION) > -1) {
pos = getSeperatePosition(fmt, AIFFactory.FDS_UNION_END);
}
}
if (pos == -1) {
pos = fmt.length();
}
IAIFType aifType = AIFFactory.getAIFType(fmt.substring(0, pos));
size += aifType.sizeof();
types.add(aifType);
if (pos == fmt.length())
return "";
return fmt.substring(pos+1);
}
protected int getSeperatePosition(String fmt) {
return getSeperatePosition(fmt, "");
}
protected int getSeperatePosition(String fmt, String regex) {
int regex_len = regex.length();
int pos = fmt.indexOf(regex+AIFFactory.SIGN_COMMA);
if (pos == -1) {
if (regex_len > 0)
pos = fmt.indexOf(regex);
}
if (pos > -1) {
pos += regex_len;
}
return pos;
}
public String toString() {
String content = getName() + AIFFactory.SIGN_STROKE;
for (int i=0; i<fields.size(); i++) {
content += (String)fields.get(i) + "=" + ((IAIFType)types.get(i)).toString();
if (i < fields.size()-1) {
content += ",";
}
}
return content;
}
}