internal static void EncodeStream(Stream inp, ArrayList planes) {
StreamReader rd = new StreamReader(inp, Encoding.ASCII);
String line = null;
int state = CIDNONE;
byte[] seqs = new byte[7];
while ((line = rd.ReadLine()) != null) {
if (line.Length < 6)
continue;
switch (state) {
case CIDNONE: {
if (line.IndexOf("begincidrange") >= 0)
state = CIDRANGE;
else if (line.IndexOf("begincidchar") >= 0)
state = CIDCHAR;
else if (line.IndexOf("usecmap") >= 0) {
StringTokenizer tk = new StringTokenizer(line);
String t = tk.NextToken();
ReadCmap(t.Substring(1), planes);
}
break;
}
case CIDRANGE: {
if (line.IndexOf("endcidrange") >= 0) {
state = CIDNONE;
break;
}
StringTokenizer tk = new StringTokenizer(line);
String t = tk.NextToken();
int size = t.Length / 2 - 1;
long start = long.Parse(t.Substring(1, t.Length - 2), NumberStyles.HexNumber);
t = tk.NextToken();
long end = long.Parse(t.Substring(1, t.Length - 2), NumberStyles.HexNumber);
t = tk.NextToken();
int cid = int.Parse(t);
for (long k = start; k <= end; ++k) {
BreakLong(k, size, seqs);
EncodeSequence(size, seqs, (char)cid, planes);
++cid;
}
break;
}
case CIDCHAR: {
if (line.IndexOf("endcidchar") >= 0) {
state = CIDNONE;
break;
}
StringTokenizer tk = new StringTokenizer(line);
String t = tk.NextToken();
int size = t.Length / 2 - 1;
long start = long.Parse(t.Substring(1, t.Length - 2), NumberStyles.HexNumber);
t = tk.NextToken();
int cid = int.Parse(t);
BreakLong(start, size, seqs);
EncodeSequence(size, seqs, (char)cid, planes);
break;
}
}
}
}