diff options
author | Martin Odersky <odersky@gmail.com> | 2003-02-13 14:41:36 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-02-13 14:41:36 +0000 |
commit | 4177daab2f54bdb20c71f623296a8bb32616fd12 (patch) | |
tree | 23f08b43f3758e825d5965b336030603a65bbcf7 /sources/scalac/util/ClassPath.java | |
parent | 33d6e170c97ca7b2f991896a0729941a7240b6d6 (diff) | |
download | scala-4177daab2f54bdb20c71f623296a8bb32616fd12.tar.gz scala-4177daab2f54bdb20c71f623296a8bb32616fd12.tar.bz2 scala-4177daab2f54bdb20c71f623296a8bb32616fd12.zip |
Initial version.
Diffstat (limited to 'sources/scalac/util/ClassPath.java')
-rw-r--r-- | sources/scalac/util/ClassPath.java | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/sources/scalac/util/ClassPath.java b/sources/scalac/util/ClassPath.java new file mode 100644 index 0000000000..b083c5485b --- /dev/null +++ b/sources/scalac/util/ClassPath.java @@ -0,0 +1,161 @@ +/* ____ ____ ____ ____ ______ *\ +** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala ** +** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL ** +** /_____/\____/\___/\____/____/ ** +** ** +** $Id$ +\* */ + +package scalac.util; + +import java.io.*; +import java.util.*; + + +public class ClassPath { + + /** the character separating files + */ + protected static String FILE_SEP = File.separator; + + /** the separator in class path specifications + */ + protected static String PATH_SEP = + System.getProperty("path.separator"); + + /** the default class path + */ + public static String CLASS_PATH = + System.getProperty("scala.class.path", + System.getProperty("java.class.path")); + + /** the default source path + */ + public static String SOURCE_PATH = null; + + /** the default boot class path + */ + public static String BOOT_PATH = + appendPath(appendPath("", System.getProperty("sun.boot.class.path")), + System.getProperty("scala.boot.class.path")).substring(1); + + /** the default extension path + */ + public static String EXTENSION_PATH = + System.getProperty("java.ext.dirs"); + + /** the various class path roots + */ + protected String[] root; + + /** print searches in the class path + */ + public boolean printSearch; + + + /** classpath constructor + */ + public ClassPath() { + this(CLASS_PATH); + } + + public ClassPath(String classpath) { + this(classpath, SOURCE_PATH, BOOT_PATH, EXTENSION_PATH); + } + + public ClassPath(String classpath, String sourcepath, + String bootclasspath, String extdirs) + { + String path = ""; + path = appendPath(path, bootclasspath); + path = appendExtDirs(path, extdirs); + path = appendPath(path, classpath); + path = appendPath(path, sourcepath); + root = parse(path.substring(1)); + } + + /** append an additional path + */ + protected static String appendPath(String path, String addpath) { + return addpath == null ? path : path + PATH_SEP + addpath; + } + + /** append files from the extension directories + */ + protected String appendExtDirs(String path, String extdirs) { + if (extdirs != null) { + extdirs += PATH_SEP; + int length = extdirs.length(); + int i = 0; + while (i < length) { + int k = extdirs.indexOf(PATH_SEP, i); + String dirname = extdirs.substring(i, k); + String[] ext; + if ((dirname != null) && + (dirname.length() > 0) && + ((ext = new File(dirname).list()) != null)) { + if (!dirname.endsWith(FILE_SEP)) + dirname += FILE_SEP; + for (int j = 0; j < ext.length; j++) + if (ext[j].endsWith(".jar") || + ext[j].endsWith(".zip")) + path = appendPath(path, dirname + ext[j]); + } + i = k + 1; + } + } + return path; + } + + /** parse a class path specification and return an array + * of existing class file locations + */ + protected String[] parse(String path) { + path += PATH_SEP; + Vector components = new Vector(); + int i = 0; + while (i < path.length()) { + int j = path.indexOf(PATH_SEP, i); + String subpath = path.substring(i, j); + if (new File(subpath).exists()) + components.add(subpath); + i = j + 1; + } + return (String[])components.toArray( + new String[components.size()]); + } + + /** find file with given name in class path and return an abstract + * file representation + */ + public AbstractFile openFile(String name) throws FileNotFoundException { + if (printSearch) + System.out.println("looking for " + name); + for (int i = 0; i < root.length; i++) { + if (printSearch) + System.out.println(" in " + root[i]); + AbstractFile f = AbstractFile.open(root[i], name); + if (f != null) + return f; + } + throw new FileNotFoundException("file '" + name + + "' not found in classpath"); + } + + public String[] components() { + return root; + } + + /** return a textual representation of this class path + */ + public String toString() { + if (root.length == 0) + return ""; + else if (root.length == 1) + return root[0]; + String path = root[0]; + for (int i = 1; i < root.length; i++) + path += PATH_SEP + root[i]; + return path; + } +} |