Allow PrologControl to cap the internal database size

Setting the size permits the application to avoid creating an array
of 100,000 entries, but also allows the array to be capped to some
reasonable limit preventing the Prolog code from expanding it on
the fly during execution.
diff --git a/src/lang/InternalDatabase.java b/src/lang/InternalDatabase.java
index a70862a..13676d0 100644
--- a/src/lang/InternalDatabase.java
+++ b/src/lang/InternalDatabase.java
@@ -9,8 +9,10 @@
  * @version 1.1
  */
 public class InternalDatabase implements Serializable {
+    protected static final int DEFAULT_SIZE = 100000;
+
     /** Maximum size of enties. Initial size is <code>100000</code>. */
-    protected int maxContents = 100000;
+    protected int maxContents;
 
     /** An array of <code>Term</code> entries. */
     protected Term[] buffer;
@@ -24,14 +26,13 @@
 
     /** Constructs a new internal dababase. */
     public InternalDatabase() {
-	buffer = new Term[maxContents];
-	top = -1;
+	this(DEFAULT_SIZE);
     }
 
     /** Constructs a new internal dababase with the given size. */
     public InternalDatabase(int n) {
 	maxContents = n;
-	buffer = new Term[maxContents];
+	buffer = new Term[Math.min(maxContents, DEFAULT_SIZE)];
 	top = -1;
     }
 
@@ -51,15 +52,15 @@
 		return i;
 	    }
 	} catch (ArrayIndexOutOfBoundsException e) {
-	    System.out.println("{expanding internal database...}");
+	    if (maxContents == buffer.length)
+	      throw new SystemException("internal database capacity reached");
 	    int len = buffer.length;
-	    Term[] new_buffer = new Term[len+10000];
+	    Term[] new_buffer = new Term[Math.min(len+10000, maxContents)];
 	    for(int i=0; i<len; i++){
 		new_buffer[i] = buffer[i];
 	    }
 	    buffer = new_buffer;
 	    buffer[top] = t;
-	    maxContents = len+20000;
 	    return top;
 	}
     }
diff --git a/src/lang/Prolog.java b/src/lang/Prolog.java
index 4388e32..f9b3d5e 100644
--- a/src/lang/Prolog.java
+++ b/src/lang/Prolog.java
@@ -117,7 +117,6 @@
 	trail      = new Trail(this);
 	//	pdl        = new PushDownList();
 	pcl        = new PrologClassLoader();
-	internalDB = new InternalDatabase();
     }
 
     /** 
@@ -135,6 +134,9 @@
      */
     protected void initOnce() {
 	aregs      = new Term[maxArity];
+	if (internalDB == null)
+	  internalDB = new InternalDatabase();
+
 	userInput   = new PushbackReader(new BufferedReader(new InputStreamReader(System.in)), PUSHBACK_SIZE);
 	userOutput  = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)), true);
 	userError   = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.err)), true);
diff --git a/src/lang/PrologControl.java b/src/lang/PrologControl.java
index 564a46e..875c096 100644
--- a/src/lang/PrologControl.java
+++ b/src/lang/PrologControl.java
@@ -32,6 +32,17 @@
     public boolean getEnableReflection() { return enableReflection; }
     public void setEnableReflection(boolean on) { enableReflection = on; }
 
+    public int getMaxDatabaseSize() {
+      if (engine.internalDB != null)
+        return engine.internalDB.maxContents;
+      return InternalDatabase.DEFAULT_SIZE;
+    }
+    public void setMaxDatabaseSize(int size) {
+      if (engine.aregs != null)
+        throw new IllegalStateException("Prolog already initialized");
+      engine.internalDB = new InternalDatabase(size);
+    }
+
     public int getMaxArity() { return engine.getMaxArity(); }
     public void setMaxArity(int max) {
       if (max < 8)