private static IRNode ReadItem(InputReader reader) { int flags = reader.ReadInt32(); UnpackFlags(flags, out SEXPTYPE type, out int levels, out bool isObject, out bool hasAttribute, out bool hasTag); switch (type) { case SEXPTYPE.NILVALUE_SXP: return(null); case SEXPTYPE.EMPTYENV_SXP: return(RObject.EmptyEnvironment); case SEXPTYPE.BASEENV_SXP: return(RObject.BaseEnvironment); case SEXPTYPE.GLOBALENV_SXP: return(RObject.GlobalEnvironment); case SEXPTYPE.UNBOUNDVALUE_SXP: return(RObject.UnboundValue); case SEXPTYPE.MISSINGARG_SXP: return(RObject.MissingArg); case SEXPTYPE.BASENAMESPACE_SXP: return(RObject.BaseNamespace); case SEXPTYPE.REFSXP: int refIndex = ReadRefIndex(reader, flags); // return GetReadRef(ref_table, InRefIndex(stream, flags)); return(null); case SEXPTYPE.PERSISTSXP: // return PersistentRestore(reader, InStringVec(reader)); ThrowTypeNotSupported("PERSISTSXP"); break; case SEXPTYPE.SYMSXP: return(ReadItem(reader)); // return installChar(ReadItem(reader)); case SEXPTYPE.PACKAGESXP: // return R_FindPackageEnv(InStringVec(reader)); ThrowTypeNotSupported("PACKAGESXP"); break; case SEXPTYPE.NAMESPACESXP: // return R_FindNamespace1(InStringVec(reader)); ThrowTypeNotSupported("NAMESPACESXP"); break; case SEXPTYPE.ENVSXP: { /*int locked = reader.ReadInt32(); * RObject s = allocSExp(SEXPTYPE.ENVSXP); * SET_ENCLOS(s, ReadItem(reader)); * SET_FRAME(s, ReadItem(reader)); * SET_HASHTAB(s, ReadItem(reader)); * SET_ATTRIB(s, ReadItem(reader)); * * if (Attribute(s) != R_NilValue && getAttrib(s, R_ClassSymbol) != R_NilValue) * { * SET_OBJECTS(s, 1); * } * * if (locked != null) * { * R_LockEnvironment(s, false); * } * * if (ENCLOS(s) == R_NilValue) * { * SET_ENCLOS(s, R_BaseEnv); * } * * return s;*/ ThrowTypeNotSupported("ENVSXP"); break; } case SEXPTYPE.LISTSXP: case SEXPTYPE.LANGSXP: case SEXPTYPE.CLOSXP: case SEXPTYPE.PROMSXP: case SEXPTYPE.DOTSXP: IRList s = new RList((RNodeType)type) { Levels = levels, IsObject = isObject, Attribute = hasAttribute ? ReadItem(reader) : null, Tag = hasTag ? ReadItem(reader) : null, Head = ReadItem(reader), Tail = (IRList)ReadItem(reader), }; /*if (type == CLOSXP && CLOENV(s) == R_NilValue) SET_CLOENV(s, R_BaseEnv); * else if (type == PROMSXP && PRENV(s) == R_NilValue) SET_PRENV(s, R_BaseEnv);*/ return(s); default: IRNode result; switch (type) { case SEXPTYPE.CHARSXP: { int length = reader.ReadInt32(); if (length == -1) { return(RString.NotAvailable); } else { RString.CharEncoding encoding = RString.CharEncoding.Native; if ((levels & (1 << 3)) != 0) { encoding = RString.CharEncoding.Utf8; } else if ((levels & (1 << 2)) != 0) { encoding = RString.CharEncoding.Latin1; } else if ((levels & (1 << 1)) != 0) { encoding = RString.CharEncoding.Bytes; } return(reader.ReadString(length, encoding)); } } case SEXPTYPE.REALSXP: { long length = ReadLength(reader); IRRealVector vector = new RRealVector(length); reader.ReadRealVector(vector); result = vector; break; } case SEXPTYPE.INTSXP: { long length = ReadLength(reader); IRIntegerVector vector = new RIntegerVector(length); reader.ReadIntegerVector(vector); result = vector; break; } case SEXPTYPE.STRSXP: { long length = ReadLength(reader); IRStringVector vector = new RStringVector(length); for (long i = 0; i < length; i++) { vector[i] = ((IRString)ReadItem(reader)).String; } result = vector; break; } case SEXPTYPE.VECSXP: case SEXPTYPE.EXPRSXP: { long length = ReadLength(reader); IRVector vector = RVector.AllocateVector((RNodeType)type, length); for (long i = 0; i < length; i++) { vector[i] = ReadItem(reader); } result = vector; break; } default: throw new NotSupportedException(); } if (result.ObjectType != RNodeType.Char) { result.Levels = levels; } result.IsObject = isObject; if (result.ObjectType == RNodeType.Char) { if (hasAttribute) { ReadItem(reader); } } else { result.Attribute = hasAttribute ? ReadItem(reader) : null; } return(result); } throw new NotSupportedException(); }
public override IRString ReadString(int length, RString.CharEncoding encoding) { byte[] buffer = Reader.ReadBytes(length); return(new RString(buffer, encoding)); }
public override IRString ReadString(int length, RString.CharEncoding encoding) { if (encoding != RString.CharEncoding.Native) { throw new ArgumentOutOfRangeException(); } char[] buffer = new char[length]; char last = (char)Reader.ReadByte(); do { last = (char)Reader.ReadByte(); }while (char.IsWhiteSpace(last)); for (int i = 0; i < length; i++) { if (last == '\\') { last = (char)Reader.ReadByte(); switch (last) { case 'n': buffer[i] = '\n'; last = (char)Reader.ReadByte(); break; case 't': buffer[i] = '\t'; last = (char)Reader.ReadByte(); break; case 'v': buffer[i] = '\v'; last = (char)Reader.ReadByte(); break; case 'b': buffer[i] = '\b'; last = (char)Reader.ReadByte(); break; case 'r': buffer[i] = '\r'; last = (char)Reader.ReadByte(); break; case 'f': buffer[i] = '\f'; last = (char)Reader.ReadByte(); break; case 'a': buffer[i] = '\a'; last = (char)Reader.ReadByte(); break; case '\\': buffer[i] = '\\'; last = (char)Reader.ReadByte(); break; case '?': buffer[i] = '?'; last = (char)Reader.ReadByte(); break; case '\'': buffer[i] = '\''; last = (char)Reader.ReadByte(); break; case '\"': /* closing " for emacs */ buffer[i] = '\"'; last = (char)Reader.ReadByte(); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': int d = 0; for (int j = 0; last >= '0' && last < '8' && j < 3; j++) { d = (d * 8) + (last - '0'); last = (char)Reader.ReadByte(); } buffer[i] = (char)d; break; } } else { buffer[i] = last; last = (char)Reader.ReadByte(); } } return(new RString(new string(buffer))); }
public abstract IRString ReadString(int length, RString.CharEncoding encoding);