p1/machine/Config.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;
}