/*
 *   Copyright 2003-2004 The Apache Software Foundation.
// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */
package org.apache.axis.tools.common;


/**
 * A C or C++ macro as it is used in the source code
 */
class MacroPart extends FilePart {
	/**
	 * Factory method to create a MacroPart.
	 * @param s unparsed source code which may start with a define or macro.
	 */
	static MacroPart create(String s) {
		String orig = getOriginalText(s);
		if (null == orig)
			return null;
		return new MacroPart(orig);
	}

	MacroPart(String s) {
		super(s, FilePart.MACRO);
	}

	/**
	 * @param s unparsed source code which may start with a define or macro.
	 * @return all of s up to the end of the define or macro.
	 */
	private static String getOriginalText(String s) {
		String name = getName(s);
		int len = name.length();
		if (null == name)
			return null;
		else if (Configuration.isDefine(name)) {
			return s.substring(0, len);
		} else if (Configuration.isMacro(name)) {
			String rest = s.substring(len);
			len += Utils.findMatching(rest, '(', ')');
			return s.substring(0, len + 1);
		} else
			return null;
	}

	static boolean isAMacro(String s) {
		if (s == null || 0 == s.length())
			return false;
		String name = getName(s);
		return Configuration.isMacro(name) || Configuration.isDefine(name);
	}

	private static String getName(String s) {
		int i;
		for (i = 0; i < s.length(); i++)
			if (!Character.isLetterOrDigit(s.charAt(i)) && '_' != s.charAt(i))
				break;
		if (s.length() == i)
			return null;
		return s.substring(0, i);
	}
}
