From c694ebe16c2b830856197e483d2a3e3cc01f9385 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Tue, 16 Feb 2010 12:45:52 +0000 Subject: [PATCH] Improve binary detection for numeric extensions, related to bug 194194 --- .../internal/core/model/CModelManager.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java index ca89c6cbb9a..bf5bd30d1e9 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java @@ -80,6 +80,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.ISafeRunnable; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.content.IContentType; @@ -641,25 +642,30 @@ public class CModelManager implements IResourceChangeListener, IContentTypeChang // Only if file has no extension, has an extension that is an integer // or is a binary file content type String ext = file.getFileExtension(); - if (ext != null) { + if (ext != null && ext.length() > 0) { // shared libraries often have a version number - boolean isNumber = true; - for (int i = 0; i < ext.length(); ++i) - if (!Character.isDigit(ext.charAt(i))) { - isNumber = false; - break; - } - if (!isNumber) { - boolean isBinary= false; - final IContentTypeManager ctm = Platform.getContentTypeManager(); - final IContentType ctbin = ctm.getContentType(CCorePlugin.CONTENT_TYPE_BINARYFILE); - final IContentType[] cts= ctm.findContentTypesFor(file.getName()); - for (int i=0; !isBinary && i < cts.length; i++) { - isBinary= cts[i].isKindOf(ctbin); - } - if (!isBinary) { - return null; + // strip version extension: libc.so.3.2.1 -> libc.so + IPath baseFileName = new Path(file.getName()); + outer: do { + for (int i = 0; i < ext.length(); ++i) { + if (!Character.isDigit(ext.charAt(i))) { + break outer; + } } + // extension is a number -> remove it + baseFileName = baseFileName.removeFileExtension(); + ext = baseFileName.getFileExtension(); + } while (ext != null && ext.length() > 0); + + boolean isBinary= false; + final IContentTypeManager ctm = Platform.getContentTypeManager(); + final IContentType ctbin = ctm.getContentType(CCorePlugin.CONTENT_TYPE_BINARYFILE); + final IContentType[] cts= ctm.findContentTypesFor(baseFileName.toString()); + for (int i=0; !isBinary && i < cts.length; i++) { + isBinary= cts[i].isKindOf(ctbin); + } + if (!isBinary) { + return null; } }