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);
}
}