// -*- mode: Java; c-basic-offset: 3; tab-width: 8; indent-tabs-mode: nil -*-
// Copyright (C) 2008 Andreas Krey, Ulm, Germany <a.krey@gmx.de>
package gloop;
import java.util.Vector;
import java.io.ByteArrayOutputStream;
public class CodeStore {
private Vector<String> strings = new Vector<String> ();
ByteArrayOutputStream bytes = new ByteArrayOutputStream ();
private int last_take = 0;
public int take (ByteArrayOutputStream s) {
// return passfirst (bytes.size(), s.writeTo (bytes));
int p = bytes.size ();
try {
s.writeTo (bytes);
} catch (java.io.IOException e) {
throw new IllegalArgumentException ("can't happen");
}
last_take = p;
return p;
}
public int putStr (String s) {
int i;
for (i = 0; i < strings.size (); i ++) {
if (strings.elementAt (i).equals (s)) return i;
}
strings.addElement (s);
return i;
}
public void dump () {
for (int i = 0; i < strings.size (); i ++) {
System.out.println ("" + i + ": '" + strings.elementAt (i) + "'");
}
System.out.println ("Entry: " + last_take);
byte [] a = bytes.toByteArray ();
for (int i = 0; i < a.length; i ++) {
int v = 255 & a [i];
if (v >= 240) {
System.out.println ("" + i + ": " + (v - 240));
} else {
String n = Code.getCode (v);
if (n != null) {
System.out.println ("" + i + ": " + n);
} else {
System.out.println ("" + i + ": ?" + v);
}
}
}
}
public Runner getProg () {
return new Runner (strings.toArray (new String [0]),
bytes.toByteArray (),
last_take);
}
}