public OtpErlangObject read_any()
{
// calls one of the above functions, depending on o
int tag = peek1skip_version();
switch (tag)
{
case OtpExternal.smallIntTag:
case OtpExternal.intTag:
case OtpExternal.smallBigTag:
case OtpExternal.largeBigTag:
return new OtpErlangLong(this);
case OtpExternal.atomTag:
return new OtpErlangAtom(this);
case OtpExternal.floatTag:
case OtpExternal.newFloatTag:
return new OtpErlangDouble(this);
case OtpExternal.refTag:
case OtpExternal.newRefTag:
return new OtpErlangRef(this);
case OtpExternal.portTag:
return new OtpErlangPort(this);
case OtpExternal.pidTag:
return new OtpErlangPid(this);
case OtpExternal.stringTag:
return new OtpErlangString(this);
case OtpExternal.listTag:
case OtpExternal.nilTag:
if ((flags & DECODE_INT_LISTS_AS_STRINGS) != 0)
{
int savePos = getPos();
try
{
return new OtpErlangString(this);
}
catch (OtpErlangDecodeException)
{
}
setPos(savePos);
}
return new OtpErlangList(this);
case OtpExternal.smallTupleTag:
case OtpExternal.largeTupleTag:
return new OtpErlangTuple(this);
case OtpExternal.binTag:
return new OtpErlangBinary(this);
case OtpExternal.bitBinTag:
return new OtpErlangBitstr(this);
case OtpExternal.compressedTag:
return read_compressed();
case OtpExternal.newFunTag:
case OtpExternal.funTag:
return new OtpErlangFun(this);
default:
throw new OtpErlangDecodeException("Unknown data type: " + tag);
}
}
/** * Create a tuple from a stream containing an tuple encoded in Erlang * external format. * * @param buf * the stream containing the encoded tuple. * * @exception OtpErlangDecodeException * if the buffer does not contain a valid external * representation of an Erlang tuple. */ public OtpErlangTuple(OtpInputStream buf) { int arity = buf.read_tuple_head(); if (arity > 0) { elems = new OtpErlangObject[arity]; for (int i = 0; i < arity; i++) { elems[i] = buf.read_any(); } } else { elems = NO_ELEMENTS; } }