content: /*******************************************************************************
   * Copyright (c) 2000, 2007 IBM Corporation 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:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  
  
  package org.eclipse.wst.jsdt.internal.ui.text.correction;
  
  public class NameMatcher {
  
  	/**
  	 * Returns a similarity value of the two names.
  	 * The range of is from 0 to 256. no similarity is negative
  	 */
  	public static boolean isSimilarName(String name1, String name2) {
  		return getSimilarity(name1, name2) >= 0;
  	}
  
  	/**
  	 * Returns a similarity value of the two names.
  	 * The range of is from 0 to 256. no similarity is negative
  	 */
  	public static int getSimilarity(String name1, String name2) {
  		if (name1.length() > name2.length()) {
  			String tmp= name1;
  			name1= name2;
  			name2= tmp;
  		}
  		int name1len= name1.length();
  		int name2len= name2.length();
  
  		int nMatched= 0;
  
  		int i= 0;
  		while (i < name1len && isSimilarChar(name1.charAt(i), name2.charAt(i))) {
  			i++;
  			nMatched++;
  		}
  
  		int k= name1len;
  		int diff= name2len - name1len;
  		while (k > i && isSimilarChar(name1.charAt(k - 1), name2.charAt(k + diff - 1))) {
  			k--;
  			nMatched++;
  		}
  
  		if (nMatched == name2len) {
  			return 200;
  		}
  
  		if (name2len - nMatched > nMatched) {
  			return -1;
  		}
  
  		int tolerance= name2len / 4 + 1;
  		return (tolerance - (k - i)) * 256 / tolerance;
  	}
  
  	private static boolean isSimilarChar(char ch1, char ch2) {
  		return Character.toLowerCase(ch1) == Character.toLowerCase(ch2);
  	}
  
  }
  