Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
223 lines
6.5 KiB
Java
223 lines
6.5 KiB
Java
/**
|
|
* A system for calculating nwscript dependencies. Makes some assumptions specific
|
|
* to the PRC setup.
|
|
*/
|
|
package prc.makedep;
|
|
|
|
import java.util.*;
|
|
import java.io.*;
|
|
|
|
import static prc.Main.*;
|
|
|
|
|
|
/**
|
|
* Calculates nwscript dependencies.
|
|
*
|
|
* Usage: makedep [-aio?] targetlist
|
|
* Options:
|
|
* -a Append to outputfile. This option must be defined before -o
|
|
* -n Ignore include file if not found
|
|
* -sPATH[,PATH...] List of source directories
|
|
* -oFILE Use FILE as outputfile, stdout assumed
|
|
* -?, --help This text
|
|
*
|
|
*
|
|
* @author Ornedan
|
|
*/
|
|
public class Main {
|
|
|
|
static Map<String, NSSNode> scripts = new LinkedHashMap<String, NSSNode>();
|
|
|
|
protected static boolean append = false,
|
|
ignoreMissing = false,
|
|
error = false;
|
|
static PrintStream oStrm = System.out;
|
|
|
|
/**
|
|
* Main method. Entrypoint to the program
|
|
*
|
|
* @param args The arguments. See readMe() for accepted ones
|
|
*/
|
|
public static void main(String[] args) {
|
|
HashMap<String, String> targetList = new LinkedHashMap<String, String>();
|
|
List<String> targetListFileNames = new ArrayList<String>();
|
|
boolean targetsFromStdin = false;
|
|
|
|
// Parse arguments
|
|
for(int i = 0; i < args.length; i++) {//[-aio?] targetslist+
|
|
// Parameter parseage
|
|
String param = args[i];
|
|
if(param.startsWith("-")) {
|
|
if(param.startsWith("-s")) {
|
|
getFiles(param.substring(2));
|
|
}
|
|
else if(param.startsWith("-o")) {
|
|
setOutput(param.substring(2));
|
|
}
|
|
else {
|
|
if(param.equals("--help")) readMe();
|
|
else if(param.equals("-")) {
|
|
targetsFromStdin = true;
|
|
}
|
|
else {
|
|
for(char c : param.substring(1).toCharArray()){
|
|
switch(c) {
|
|
case 'a':
|
|
append = true;
|
|
break;
|
|
case 'n':
|
|
ignoreMissing = true;
|
|
break;
|
|
|
|
default:
|
|
System.out.println("Unknown parameter: " + c);
|
|
case '?':
|
|
readMe();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// It's a targets list file
|
|
targetListFileNames.add(param);
|
|
}
|
|
}
|
|
|
|
// Read targets from stdin if so specified
|
|
Scanner scan;
|
|
String targetName;
|
|
if(targetsFromStdin) {
|
|
scan = new Scanner(System.in);
|
|
while(scan.hasNextLine()) {
|
|
targetName = scan.nextLine().toLowerCase();
|
|
// Strip everything after the .ncs from the line
|
|
targetName = targetName.substring(0, targetName.indexOf(".ncs") + 4);
|
|
targetList.put(NSSNode.getScriptName(targetName), targetName);
|
|
}
|
|
}
|
|
|
|
// Parse the target file list
|
|
File targetListFile;
|
|
for(String fileName : targetListFileNames) {
|
|
targetListFile = new File(fileName);
|
|
// Read the contents
|
|
try {
|
|
scan = new Scanner(targetListFile);
|
|
} catch (FileNotFoundException e) {
|
|
err_pr.println("Error: Could not find file: " + fileName);
|
|
error = true;
|
|
continue;
|
|
}
|
|
|
|
while(scan.hasNextLine()) {
|
|
targetName = scan.nextLine().toLowerCase();
|
|
// Strip everything after the .ncs from the line
|
|
targetName = targetName.substring(0, targetName.indexOf(".ncs") + 4);
|
|
targetList.put(NSSNode.getScriptName(targetName), targetName);
|
|
}
|
|
}
|
|
|
|
// Input sanity checks
|
|
if(targetList.size() == 0) {
|
|
err_pr.println("Error: No targets specified.");
|
|
error = true;
|
|
}
|
|
for(String target : targetList.keySet()) {
|
|
if(scripts.get(target.toLowerCase()) == null) {
|
|
err_pr.println("Error: Script file for target " + target + " not found in given source directories.");
|
|
error = true;
|
|
}
|
|
}
|
|
|
|
// Terminate if errored
|
|
if(error) System.exit(1);
|
|
|
|
// TODO: Load the files concurrently. I suspect it will give a slight performance boost
|
|
//NSSNode[] debugArr = debugMap.values().toArray(new NSSNode[0]);
|
|
for(NSSNode script: scripts.values())
|
|
script.linkDirect();
|
|
|
|
// Check for errors again
|
|
if(error) System.exit(1);
|
|
|
|
|
|
// Start a depth-first-search to find all the include trees
|
|
for(NSSNode node : scripts.values()){
|
|
node.linkFullyAndGetIncludes(null);
|
|
//node.printSelf(oStrm, append);
|
|
}
|
|
|
|
// Do the printing
|
|
for(String target : targetList.keySet()) {
|
|
scripts.get(target.toLowerCase()).printSelf(oStrm, append, targetList.get(target));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prints usage and terminates.
|
|
*/
|
|
private static void readMe() {
|
|
// 0 1 2 3 4 5 6 7 8
|
|
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
|
System.out.println("Usage: makedep [-aio?] targetslist+\n" +
|
|
"Options:\n" +
|
|
"-a Append to outputfile. This option must be defined before -o\n"+
|
|
"-n Ignore include file if not found\n"+
|
|
"-sPATH[,PATH...] List of source directories\n"+
|
|
"-oFILE Use FILE as outputfile, stdout assumed\n" +
|
|
"- Read targets from stdin. Same format as targets list files\n"+
|
|
"-?, --help This text\n"+
|
|
"\n"+
|
|
"targetslist Name of a file containing a list of object (.ncs) files to\n"+
|
|
" generate a make targets for.\n" +
|
|
" File format is one path-to-target per line."
|
|
);
|
|
System.exit(0);
|
|
}
|
|
|
|
/**
|
|
* Looks in the directories specified by the given list for .nss
|
|
* files and adds them to the sources list.
|
|
*
|
|
* @param pathList comma-separated list of directories to look in
|
|
*/
|
|
private static void getFiles(String pathList){
|
|
String[] paths = pathList.split(",");
|
|
File[] files;
|
|
String temp;
|
|
for(String path : paths){
|
|
files = new File(path).listFiles(new FileFilter(){
|
|
public boolean accept(File file){
|
|
return file.getName().endsWith(".nss");
|
|
}
|
|
});
|
|
for(File file: files){
|
|
temp = NSSNode.getScriptName(file.getName()).toLowerCase();
|
|
if(!scripts.containsKey(temp))
|
|
scripts.put(temp, new NSSNode(file.getPath()));
|
|
else{
|
|
err_pr.println("Error: Duplicate script file: " + temp);
|
|
error = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets the output to write the results to to a file specified by the
|
|
* given filename.
|
|
* If the file is not found, the program terminates.
|
|
*
|
|
* @param outFileName Name of the file to print results to
|
|
*/
|
|
private static void setOutput(String outFileName){
|
|
try{
|
|
oStrm = new PrintStream(new FileOutputStream(outFileName, append), true);
|
|
}catch(FileNotFoundException e){
|
|
err_pr.println("Error: Missing output file " + outFileName + "\nTerminating!");
|
|
System.exit(1);
|
|
}
|
|
}
|
|
}
|