284 lines
7.2 KiB
Java
284 lines
7.2 KiB
Java
// PART OF THE MACHINE SIMULATION. DO NOT CHANGE.
|
|
|
|
package nachos.machine;
|
|
|
|
import java.util.HashMap;
|
|
import java.io.File;
|
|
import java.io.FileReader;
|
|
import java.io.Reader;
|
|
import java.io.StreamTokenizer;
|
|
|
|
/**
|
|
* Provides routines to access the Nachos configuration.
|
|
*/
|
|
public final class Config {
|
|
/**
|
|
* Load configuration information from the specified file. Must be called
|
|
* before the Nachos security manager is installed.
|
|
*
|
|
* @param fileName the name of the file containing the
|
|
* configuration to use.
|
|
*/
|
|
public static void load(String fileName) {
|
|
System.out.print(" config");
|
|
|
|
Lib.assertTrue(!loaded);
|
|
loaded = true;
|
|
|
|
configFile = fileName;
|
|
|
|
try {
|
|
config = new HashMap<String, String>();
|
|
|
|
File file = new File(configFile);
|
|
Reader reader = new FileReader(file);
|
|
StreamTokenizer s = new StreamTokenizer(reader);
|
|
|
|
s.resetSyntax();
|
|
s.whitespaceChars(0x00, 0x20);
|
|
s.wordChars(0x21, 0xFF);
|
|
s.eolIsSignificant(true);
|
|
s.commentChar('#');
|
|
s.quoteChar('"');
|
|
|
|
int line = 1;
|
|
|
|
s.nextToken();
|
|
|
|
while (true) {
|
|
if (s.ttype == StreamTokenizer.TT_EOF)
|
|
break;
|
|
|
|
if (s.ttype == StreamTokenizer.TT_EOL) {
|
|
line++;
|
|
s.nextToken();
|
|
continue;
|
|
}
|
|
|
|
if (s.ttype != StreamTokenizer.TT_WORD)
|
|
loadError(line);
|
|
|
|
String key = s.sval;
|
|
|
|
if (s.nextToken() != StreamTokenizer.TT_WORD ||
|
|
!s.sval.equals("="))
|
|
loadError(line);
|
|
|
|
if (s.nextToken() != StreamTokenizer.TT_WORD && s.ttype != '"')
|
|
loadError(line);
|
|
|
|
String value = s.sval;
|
|
|
|
// ignore everything after first string
|
|
while (s.nextToken() != StreamTokenizer.TT_EOL &&
|
|
s.ttype != StreamTokenizer.TT_EOF);
|
|
|
|
if (config.get(key) != null)
|
|
loadError(line);
|
|
|
|
config.put(key, value);
|
|
line++;
|
|
}
|
|
}
|
|
catch (Throwable e) {
|
|
System.err.println("Error loading " + configFile);
|
|
System.exit(1);
|
|
}
|
|
}
|
|
|
|
private static void loadError(int line) {
|
|
System.err.println("Error in " + configFile + " line " + line);
|
|
System.exit(1);
|
|
}
|
|
|
|
private static void configError(String message) {
|
|
System.err.println("");
|
|
System.err.println("Error in " + configFile + ": " + message);
|
|
System.exit(1);
|
|
}
|
|
|
|
/**
|
|
* Get the value of a key in <tt>nachos.conf</tt>.
|
|
*
|
|
* @param key the key to look up.
|
|
* @return the value of the specified key, or <tt>null</tt> if it is not
|
|
* present.
|
|
*/
|
|
public static String getString(String key) {
|
|
return (String) config.get(key);
|
|
}
|
|
|
|
/**
|
|
* Get the value of a key in <tt>nachos.conf</tt>, returning the specified
|
|
* default if the key does not exist.
|
|
*
|
|
* @param key the key to look up.
|
|
* @param defaultValue the value to return if the key does not exist.
|
|
* @return the value of the specified key, or <tt>defaultValue</tt> if it
|
|
* is not present.
|
|
*/
|
|
public static String getString(String key, String defaultValue) {
|
|
String result = getString(key);
|
|
|
|
if (result == null)
|
|
return defaultValue;
|
|
|
|
return result;
|
|
}
|
|
|
|
private static Integer requestInteger(String key) {
|
|
try {
|
|
String value = getString(key);
|
|
if (value == null)
|
|
return null;
|
|
|
|
return new Integer(value);
|
|
}
|
|
catch (NumberFormatException e) {
|
|
configError(key + " should be an integer");
|
|
|
|
Lib.assertNotReached();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the value of an integer key in <tt>nachos.conf</tt>.
|
|
*
|
|
* @param key the key to look up.
|
|
* @return the value of the specified key.
|
|
*/
|
|
public static int getInteger(String key) {
|
|
Integer result = requestInteger(key);
|
|
|
|
if (result == null)
|
|
configError("missing int " + key);
|
|
|
|
return result.intValue();
|
|
}
|
|
|
|
/**
|
|
* Get the value of an integer key in <tt>nachos.conf</tt>, returning the
|
|
* specified default if the key does not exist.
|
|
*
|
|
* @param key the key to look up.
|
|
* @param defaultValue the value to return if the key does not exist.
|
|
* @return the value of the specified key, or <tt>defaultValue</tt> if the
|
|
* key does not exist.
|
|
*/
|
|
public static int getInteger(String key, int defaultValue) {
|
|
Integer result = requestInteger(key);
|
|
|
|
if (result == null)
|
|
return defaultValue;
|
|
|
|
return result.intValue();
|
|
}
|
|
|
|
private static Double requestDouble(String key) {
|
|
try {
|
|
String value = getString(key);
|
|
if (value == null)
|
|
return null;
|
|
|
|
return new Double(value);
|
|
}
|
|
catch (NumberFormatException e) {
|
|
configError(key + " should be a double");
|
|
|
|
Lib.assertNotReached();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the value of a double key in <tt>nachos.conf</tt>.
|
|
*
|
|
* @param key the key to look up.
|
|
* @return the value of the specified key.
|
|
*/
|
|
public static double getDouble(String key) {
|
|
Double result = requestDouble(key);
|
|
|
|
if (result == null)
|
|
configError("missing double " + key);
|
|
|
|
return result.doubleValue();
|
|
}
|
|
|
|
/**
|
|
* Get the value of a double key in <tt>nachos.conf</tt>, returning the
|
|
* specified default if the key does not exist.
|
|
*
|
|
* @param key the key to look up.
|
|
* @param defaultValue the value to return if the key does not exist.
|
|
* @return the value of the specified key, or <tt>defaultValue</tt> if the
|
|
* key does not exist.
|
|
*/
|
|
public static double getDouble(String key, double defaultValue) {
|
|
Double result = requestDouble(key);
|
|
|
|
if (result == null)
|
|
return defaultValue;
|
|
|
|
return result.doubleValue();
|
|
}
|
|
|
|
private static Boolean requestBoolean(String key) {
|
|
String value = getString(key);
|
|
|
|
if (value == null)
|
|
return null;
|
|
|
|
if (value.equals("1") || value.toLowerCase().equals("true")) {
|
|
return Boolean.TRUE;
|
|
}
|
|
else if (value.equals("0") || value.toLowerCase().equals("false")) {
|
|
return Boolean.FALSE;
|
|
}
|
|
else {
|
|
configError(key + " should be a boolean");
|
|
|
|
Lib.assertNotReached();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the value of a boolean key in <tt>nachos.conf</tt>.
|
|
*
|
|
* @param key the key to look up.
|
|
* @return the value of the specified key.
|
|
*/
|
|
public static boolean getBoolean(String key) {
|
|
Boolean result = requestBoolean(key);
|
|
|
|
if (result == null)
|
|
configError("missing boolean " + key);
|
|
|
|
return result.booleanValue();
|
|
}
|
|
|
|
/**
|
|
* Get the value of a boolean key in <tt>nachos.conf</tt>, returning the
|
|
* specified default if the key does not exist.
|
|
*
|
|
* @param key the key to look up.
|
|
* @param defaultValue the value to return if the key does not exist.
|
|
* @return the value of the specified key, or <tt>defaultValue</tt> if the
|
|
* key does not exist.
|
|
*/
|
|
public static boolean getBoolean(String key, boolean defaultValue) {
|
|
Boolean result = requestBoolean(key);
|
|
|
|
if (result == null)
|
|
return defaultValue;
|
|
|
|
return result.booleanValue();
|
|
}
|
|
|
|
private static boolean loaded = false;
|
|
private static String configFile;
|
|
private static HashMap<String, String> config;
|
|
}
|