/******************************************************************************* * Copyright (c) 2000, 2006 QNX Software Systems and others. * All rights reserved. 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 * * Contributors: * QNX Software Systems - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.utils.debug.stabs; import org.eclipse.cdt.core.CCorePlugin; /** * Format: string_field = name ':' symbol-descriptor type-information */ public class StringField { String name; char symbolDescriptor; String typeInformation; public StringField(String s) { parseStringField(s.toCharArray()); } public String getName() { return name; } public char getSymbolDescriptor() { return symbolDescriptor; } public String getTypeInformation() { return typeInformation; } /** * Format: string_field = name ':' symbol-descriptor type-information */ void parseStringField(char[] array) { int index = 0; // Some String field may contain format like: // "foo::bar::baz:t5=*6" in that case the name is "foo::bar::baz" char prev = 0; for (; index < array.length; index++) { char c = array[index]; if (c == ':' && prev != ':') { break; } prev = c; } if (index < array.length) { name = new String(array, 0, index); } else { name = new String(array); } /* FIXME: Sometimes the special C++ names start with '.'. */ if (name.length() > 1 && name.charAt(0) == '$') { switch (name.charAt(1)) { case 't' : name = "this"; //$NON-NLS-1$ break; case 'v' : /* Was: name = "vptr"; */ break; case 'e' : name = "eh_throw"; //$NON-NLS-1$ break; case '_' : /* This was an anonymous type that was never fixed up. */ break; case 'X' : /* SunPRO (3.0 at least) static variable encoding. */ break; default : name = CCorePlugin.getResourceString("Util.unknownName"); //$NON-NLS-1$ break; } } // get the symbol descriptor if (index < array.length) { index++; if (Character.isLetter(array[index])) { symbolDescriptor = array[index]; index++; } } // get the type-information if (index < array.length) { typeInformation = new String(array, index, array.length - index); } else { typeInformation = new String(); } } }