/******************************************************************************* * Copyright (c) 2002, 2010 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.macho.parser; import java.io.IOException; import org.eclipse.cdt.core.AbstractCExtension; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IBinaryParser; import org.eclipse.cdt.core.settings.model.ICConfigExtensionReference; import org.eclipse.cdt.utils.CPPFilt; import org.eclipse.cdt.utils.macho.AR; import org.eclipse.cdt.utils.macho.MachO; import org.eclipse.cdt.utils.macho.MachO.Attribute; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; /** * @deprecated. Deprecated as of CDT 6.1. Use 64 bit version {@link MachOParser64}. * This class is planned for removal in next major release. */ @Deprecated public class MachOParser extends AbstractCExtension implements IBinaryParser { /* (non-Javadoc) * @see org.eclipse.cdt.core.IBinaryParser#getBinary(org.eclipse.core.runtime.IPath) */ public IBinaryFile getBinary(IPath path) throws IOException { return getBinary(null, path); } public IBinaryFile getBinary(byte[] hints, IPath path) throws IOException { if (path == null) { throw new IOException(CCorePlugin.getResourceString("Util.exception.nullPath")); //$NON-NLS-1$ } IBinaryFile binary = null; try { MachO.Attribute attribute = null; if (hints != null && hints.length > 0) { try { attribute = MachO.getAttributes(hints); } catch (IOException eof) { // continue, the array was to small. } } //Take a second run at it if the data array failed. if(attribute == null) { attribute = MachO.getAttributes(path.toOSString()); } if (attribute != null) { switch (attribute.getType()) { case Attribute.MACHO_TYPE_EXE : binary = createBinaryExecutable(path); break; case Attribute.MACHO_TYPE_SHLIB : binary = createBinaryShared(path); break; case Attribute.MACHO_TYPE_OBJ : binary = createBinaryObject(path); break; case Attribute.MACHO_TYPE_CORE : binary = createBinaryCore(path); break; } } } catch (IOException e) { binary = createBinaryArchive(path); } return binary; } /** * @see org.eclipse.cdt.core.IBinaryParser#getFormat() */ public String getFormat() { return "MACHO"; //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.cdt.core.IBinaryParser#isBinary(byte[], org.eclipse.core.runtime.IPath) */ public boolean isBinary(byte[] array, IPath path) { return MachO.isMachOHeader(array) || AR.isARHeader(array); } /* (non-Javadoc) * @see org.eclipse.cdt.core.IBinaryParser#getBufferSize() */ public int getHintBufferSize() { return 128; } /* (non-Javadoc) * @see org.eclipse.cdt.utils.IGnuToolProvider#getCPPFilt() */ public CPPFilt getCPPFilt() { IPath cppFiltPath = getCPPFiltPath(); CPPFilt cppfilt = null; if (cppFiltPath != null && ! cppFiltPath.isEmpty()) { try { cppfilt = new CPPFilt(cppFiltPath.toOSString()); } catch (IOException e2) { } } return cppfilt; } protected IPath getCPPFiltPath() { ICConfigExtensionReference ref = getConfigExtensionReference(); String value = ref.getExtensionData("c++filt"); //$NON-NLS-1$ if (value == null || value.length() == 0) { value = "c++filt"; //$NON-NLS-1$ } return new Path(value); } protected IBinaryArchive createBinaryArchive(IPath path) throws IOException { return new MachOBinaryArchive(this, path); } protected IBinaryObject createBinaryObject(IPath path) throws IOException { return new MachOBinaryObject(this, path, IBinaryFile.OBJECT); } protected IBinaryExecutable createBinaryExecutable(IPath path) throws IOException { return new MachOBinaryExecutable(this, path); } protected IBinaryShared createBinaryShared(IPath path) throws IOException { return new MachOBinaryShared(this, path); } protected IBinaryObject createBinaryCore(IPath path) throws IOException { return new MachOBinaryObject(this, path, IBinaryFile.CORE); } }