blob: 7621859151ad89bdbed899a0d37f51b30345b177 [file] [log] [blame]
/*
* Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* COMPONENT_NAME: idl.parser
*
* ORIGINS: 27
*
* Licensed Materials - Property of IBM
* 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
* RMI-IIOP v1.0
*
*/
package com.sun.tools.corba.se.idl;
// NOTES:
// -capitalize and parseTypeModifier should probably be in the
// generators package.
// -D58319<daz> Add version() method.
// -D62023<daz> Add absDelta() method to support float computations.
import java.io.DataInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import java.util.Vector;
import com.sun.tools.corba.se.idl.som.cff.FileLocator;
public class Util
{
// <d58319>
/**
* Fetch the version number of this build of the IDL Parser Framework
* from the appropriate properties file.
* @return the version number contained within the appropriate properties
* file, which indicates the build of this IDL Parser Framework.
**/
public static String getVersion ()
{
return getVersion ("com/sun/tools/corba/se/idl/idl.prp");
} // getVersion
/**
* Fetch the version number of this build of the IDL Parser Framework.
* This method may be called before or after the framework has been
* initialized. If the framework is inititialized, the version information
* is extracted from the message properties object; otherwise, it is extracted
* from the indicated messages file.
* @return the version number.
**/
public static String getVersion (String filename)
{
String version = "";
if (messages == null) // Use supplied file
{
Vector oldMsgFiles = msgFiles;
if (filename == null || filename.equals (""))
filename = "com/sun/tools/corba/se/idl/idl.prp";
filename = filename.replace ('/', File.separatorChar);
registerMessageFile (filename);
version = getMessage ("Version.product", getMessage ("Version.number"));
msgFiles = oldMsgFiles;
messages = null;
}
else
{
version = getMessage ("Version.product", getMessage ("Version.number"));
}
return version;
} // getVersion
public static boolean isAttribute (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof AttributeEntry;
} // isAttribute
public static boolean isConst (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof ConstEntry;
} // isConst
public static boolean isEnum (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof EnumEntry;
} // isEnum
public static boolean isException (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof ExceptionEntry;
} // isException
public static boolean isInterface (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof InterfaceEntry;
} // isInterface
public static boolean isMethod (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof MethodEntry;
} // isMethod
public static boolean isModule (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof ModuleEntry;
} // isModule
public static boolean isParameter (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof ParameterEntry;
} // isParameter
public static boolean isPrimitive (String name, Hashtable symbolTable)
{
// Distinguish "string" because the name could be something like:
// string(25 + 1)
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
if (entry == null)
{
// If it is null then it may be of the form string(<exp>).
// Don't just check for string because the name "string" may
// have been overridden.
int parenIndex = name.indexOf ('(');
if (parenIndex >= 0)
entry = (SymtabEntry)symbolTable.get (name.substring (0, parenIndex));
}
return entry == null ? false : entry instanceof PrimitiveEntry;
} // isPrimitive
public static boolean isSequence (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof SequenceEntry;
} // isSequence
public static boolean isStruct (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof StructEntry;
} // isStruct
public static boolean isString (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof StringEntry;
} // isString
public static boolean isTypedef (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof TypedefEntry;
} // isTypedef
public static boolean isUnion (String name, Hashtable symbolTable)
{
SymtabEntry entry = (SymtabEntry)symbolTable.get (name);
return entry == null ? false : entry instanceof UnionEntry;
} // isUnion
//////////////
// Message-related methods
public static String getMessage (String key)
{
if (messages == null)
readMessages ();
String message = messages.getProperty (key);
if (message == null)
message = getDefaultMessage (key);
return message;
} // getMessage
public static String getMessage (String key, String fill)
{
if (messages == null)
readMessages ();
String message = messages.getProperty (key);
if (message == null)
message = getDefaultMessage (key);
else
{
int index = message.indexOf ("%0");
if (index >= 0)
message = message.substring (0, index) + fill + message.substring (index + 2);
}
return message;
} // getMessage
public static String getMessage (String key, String[] fill)
{
if (messages == null)
readMessages ();
String message = messages.getProperty (key);
if (message == null)
message = getDefaultMessage (key);
else
for (int i = 0; i < fill.length; ++i)
{
int index = message.indexOf ("%" + i);
if (index >= 0)
message = message.substring (0, index) + fill[i] + message.substring (index + 2);
}
return message;
} // getMessage
private static String getDefaultMessage (String keyNotFound)
{
String message = messages.getProperty (defaultKey);
int index = message.indexOf ("%0");
if (index > 0)
message = message.substring (0, index) + keyNotFound;
return message;
} // getDefaultMessage
/*
findFile is no longer used now that FileLocator has been provided
by Larry Raper of the Shasta team.
static File findFile (String name) throws FileNotFoundException
{
String classpath = System.getProperty ("java.class.path");
String separator = System.getProperty ("path.separator");
int end = -separator.length (); // so the first pass classpath == original classpath
File file;
do
{
classpath = classpath.substring (end + separator.length ());
end = classpath.indexOf (separator);
if (end < 0) end = classpath.length ();
file = new File (classpath.substring (0, end) + File.separator + "com" + File.separator + "ibm" + File.separator + "idl" + File.separator + name);
} while (!file.exists () && end != classpath.length ());
if (!file.exists ()) throw new FileNotFoundException ();
return file;
} // findFile
*/
private static void readMessages ()
{
messages = new Properties ();
Enumeration fileList = msgFiles.elements ();
DataInputStream stream;
while (fileList.hasMoreElements ())
try
{
stream = FileLocator.locateLocaleSpecificFileInClassPath ((String)fileList.nextElement ());
messages.load (stream);
}
catch (IOException e)
{
}
if (messages.size () == 0)
messages.put (defaultKey, "Error reading Messages File.");
} // readMessages
/** Register a message file. This file will be searched for
in the CLASSPATH. */
public static void registerMessageFile (String filename)
{
if (filename != null)
if (messages == null)
msgFiles.addElement (filename);
else
try
{
DataInputStream stream = FileLocator.locateLocaleSpecificFileInClassPath (filename);
messages.load (stream);
}
catch (IOException e)
{
}
} // registerMessageFile
private static Properties messages = null;
private static String defaultKey = "default";
private static Vector msgFiles = new Vector ();
static
{
msgFiles.addElement ("com/sun/tools/corba/se/idl/idl.prp");
}
// Message-related methods
///////////////
public static String capitalize (String lc)
{
String first = new String (lc.substring (0, 1));
first = first.toUpperCase ();
return first + lc.substring (1);
} // capitalize
///////////////
// General file methods
/** Searches the current user directory and a list of directories for
a given short file name and returns its absolute file specification.
@return Absolute file name of a given short filename
@throws FileNotFoundException The file does not exist in the
current user or specified directories.
@see java.io.File.getAbsolutePath */
public static String getAbsolutePath (String filename, Vector includePaths) throws FileNotFoundException
{
String filepath = null;
File file = new File (filename);
if (file.canRead ())
filepath = file.getAbsolutePath ();
else
{
String fullname = null;
Enumeration pathList = includePaths.elements ();
while (!file.canRead () && pathList.hasMoreElements ())
{
fullname = (String)pathList.nextElement () + File.separatorChar + filename;
file = new File (fullname);
}
if (file.canRead ())
filepath = file.getPath ();
else
throw new FileNotFoundException (filename);
}
return filepath;
} // getAbsolutePath
// General file methods
///////////////
///////////////
// Numeric computations
// <d62023>
/**
* Compute the absolute value of the difference between two floating-point
* numbers having single precision.
* @return the absolute value of the difference between two floats.
**/
public static float absDelta (float f1, float f2)
{
double delta = f1 - f2;
return (float)((delta < 0) ? delta * -1.0 : delta);
} // absDelta
// Numeric computations
///////////////
static RepositoryID emptyID = new RepositoryID ();
} // class Util