deep-c-rsc/JCGO/jtrsrc/com/ivmaisoft/jcgo/JavaSrcFiles.java
2021-07-16 17:12:20 -05:00

240 lines
9.0 KiB
Java

/*
* @(#) $(JCGO)/jtrsrc/com/ivmaisoft/jcgo/JavaSrcFiles.java --
* a part of JCGO translator.
**
* Project: JCGO (http://www.ivmaisoft.com/jcgo/)
* Copyright (C) 2001-2012 Ivan Maidanski <ivmai@mail.ru>
* All rights reserved.
*/
/*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
**
* This software 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 (GPL) for more details.
**
* Linking this library statically or dynamically with other modules is
* making a combined work based on this library. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
**
* As a special exception, the copyright holders of this library give you
* permission to link this library with independent modules to produce an
* executable, regardless of the license terms of these independent
* modules, and to copy and distribute the resulting executable under
* terms of your choice, provided that you also meet, for each linked
* independent module, the terms and conditions of the license of that
* module. An independent module is a module which is not derived from
* or based on this library. If you modify this library, you may extend
* this exception to your version of the library, but you are not
* obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*/
package com.ivmaisoft.jcgo;
import java.io.File;
/**
* This class contains routines related to java file names processing.
*/
final class JavaSrcFiles {
static final String JAVA_EXT = ".java".toString();
private String classPathList = "";
private final ObjHashtable knownFolders = new ObjHashtable();
private final ObjHashSet foldersTable = new ObjHashSet();
private final ObjHashSet filesTable = new ObjHashSet();
JavaSrcFiles() {
}
String toClassName(String name) {
if (name.endsWith(JAVA_EXT)) {
String fName = (new File(name)).getPath();
int nameLen = fName.lastIndexOf('.');
if (nameLen > 0) {
fName = fName.replace(File.separatorChar, '.');
int namePos = -1;
while (++namePos < nameLen) {
if (fName.charAt(namePos) != '.')
break;
}
if (namePos < nameLen) {
name = fName.substring(namePos, nameLen);
}
}
}
return name;
}
static String adjustPathPrefix(String path, String progBasePath) {
path = path.replace('/', File.separatorChar);
return path.startsWith("$~" + File.separator) ? progBasePath
+ path.substring(2) : path;
}
void setClassPath(String pathList, String progBasePath) {
if (pathList != null && pathList.length() > 0) {
int i = 0;
do {
int j = pathList.indexOf(File.pathSeparatorChar, i);
if (j < 0) {
j = pathList.length();
}
if (i < j) {
String origPath = pathList.substring(i, j);
String path = adjustPathPrefix(origPath, progBasePath);
String realPath = path;
int k = path.indexOf(File.separator + "$%", 0);
if (k >= 0 && path.length() > k + 3
&& path.indexOf("..", k + 3) < 0
&& path.charAt(k + 3) != '.'
&& path.charAt(path.length() - 1) != '.'
&& path.indexOf(File.separatorChar, k + 3) < 0) {
realPath = path.substring(0, k + 1)
+ path.substring(k + 3).replace('.',
File.separatorChar);
}
if (!(new File(realPath)).isDirectory()
&& (realPath == path || !(new File(realPath
+ JAVA_EXT)).isFile())) {
System.err.println("Source path does not exist: "
+ realPath);
if (!Main.dict.ignoreErrs) {
System.exit(2);
}
}
if (path != origPath) {
pathList = pathList.substring(0, i) + path
+ pathList.substring(j);
j += path.length() - origPath.length();
}
}
i = j + 1;
} while (i < pathList.length());
setClassPathInner(pathList);
}
}
void setClassPath() {
String userDir = ".";
try {
userDir = System.getProperty("user.dir", userDir);
} catch (SecurityException e) {
}
setClassPathInner(userDir);
if (Main.dict.verbose) {
System.out.println("Source search path: " + classPathList);
}
}
private void setClassPathInner(String pathList) {
if (classPathList.length() > 0) {
int i = 0;
int len = pathList.length();
do {
int j = classPathList.indexOf(File.pathSeparatorChar, i);
if (j < 0) {
j = classPathList.length();
}
if (j - i == len
&& classPathList.regionMatches(i, pathList, 0, len))
return;
i = j + 1;
} while (i < classPathList.length());
classPathList = classPathList + File.pathSeparator + pathList;
} else {
classPathList = pathList;
}
}
String classFilename(String className, boolean allowInner) {
String pathName = className.replace('.', File.separatorChar) + JAVA_EXT;
int i = 0;
String outerName = null;
int j;
if (allowInner
&& (j = className.indexOf('$', className.lastIndexOf('.') + 1)) > 0) {
outerName = pathName.substring(0, j) + JAVA_EXT;
}
do {
j = classPathList.indexOf(File.pathSeparatorChar, i);
if (j < 0) {
j = classPathList.length();
}
if (i < j) {
String prefix = classPathList.substring(i, j);
String condOfPrefix = "";
int k = prefix.indexOf(File.separator + "$%", 0);
if (k >= 0) {
condOfPrefix = prefix.substring(k + 3).replace('.',
File.separatorChar);
prefix = prefix.substring(0, k + 1);
}
String name = pathName;
do {
if ((k < 0
|| name.startsWith(condOfPrefix
+ File.separatorChar) || name
.equals(condOfPrefix + JAVA_EXT))
&& pathExists(prefix, name)) {
File file = new File(prefix, name);
String path = file.getPath();
if (!foldersTable.contains(path)) {
if (filesTable.contains(path))
return path;
if (file.isFile()) {
filesTable.add(path);
return path;
}
foldersTable.add(path);
}
}
if (outerName == null || name == outerName)
break;
name = outerName;
} while (true);
}
i = j + 1;
} while (i < classPathList.length());
return null;
}
private boolean pathExists(String prefix, String name) {
int i = name.lastIndexOf(File.separatorChar);
String path = prefix;
if (i >= 0) {
path = (new File(prefix, name.substring(0, i))).getPath();
}
ObjHashtable folder = (ObjHashtable) knownFolders.get(path);
if (folder == null) {
String[] list = null;
if (i < 0 || pathExists(prefix, name.substring(0, i))) {
list = (new File(path)).list();
}
if (list == null) {
list = new String[0];
}
folder = new ObjHashtable();
for (int j = 0; j < list.length; j++) {
if (list[j].endsWith(JAVA_EXT) || list[j].indexOf('.', 0) < 0) {
folder.put(list[j], "");
}
}
knownFolders.put(path, folder);
}
return folder.get(name.substring(i + 1)) != null;
}
}