X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=reader.h;h=136fb4748cd45f9e0f5595f13e02f1e72b708339;hb=c71568094a35bbda781ac2070e50a59a3b5ac9f7;hp=208cf287a34875be20020ec159fe3fb44fb009fb;hpb=121a58d72f3b5e537007072f93397f6e6661fb90;p=odcread.git diff --git a/reader.h b/reader.h index 208cf28..136fb47 100644 --- a/reader.h +++ b/reader.h @@ -10,12 +10,11 @@ namespace odc { -class TypeEntry { - public: - SHORTCHAR *name; +struct TypeEntry { + const std::string name; INTEGER baseId; - TypeEntry(SHORTCHAR *typeName) : name(typeName), baseId(-1) {} + TypeEntry(const std::string &typeName) : name(typeName), baseId(-1) {} }; /** @@ -26,6 +25,9 @@ class TypeEntry { */ class Reader { private: + static const unsigned int TYPENOTFOUND = 1; + static const unsigned int ALIENVERSION = 2; + /* * rider-: Files.Reader * The file rider which links a Reader to a file. @@ -34,7 +36,7 @@ private: /* * cancelled-: BOOLEAN valid during a Store.Internalize call - * Tells whether the currently executing Internalize has been called by ReadVersion or TurnIntoAlien. + * Tells whether the currently executing Internalize has been cancelled by ReadVersion or TurnIntoAlien. */ bool d_cancelled; @@ -44,6 +46,11 @@ private: */ bool d_readAlien; + /** + * Cause of current read being alien. + */ + unsigned int d_cause; + std::vector d_typeList; std::vector d_elemList; // FIXME: WTH, why are these different? @@ -63,8 +70,6 @@ private: }; ReaderState *d_state; - INTEGER d_cause; - public: /** * Construct a reader from the istream rider. @@ -126,25 +131,32 @@ private: * Reads a short character (00X..0FFX). */ SHORTCHAR readSChar(); + void readSChar(SHORTCHAR *buf, size_t len); /* PROCEDURE (VAR rd: Reader) ReadXChar (OUT x: CHAR) * NEW * Same as ReadSChar, but has a CHAR-type parameter. * This procedure is provided to simplify migration from Release 1.2 to 1.3. */ - CHAR readXChar(); /** * PROCEDURE (VAR rd: Reader) ReadChar (OUT x: CHAR) * NEW * Reads a character (0000X..0FFFFX). - * + */ + CHAR readLChar(); + void readLChar(CHAR *buf, size_t len); + /** * PROCEDURE (VAR rd: Reader) ReadByte (OUT x: BYTE) * NEW * Reads a very short integer (-128..127). - * + */ + BYTE readByte(); + /** * PROCEDURE (VAR rd: Reader) ReadSInt (OUT x: SHORTINT) * NEW * Reads a short integer (-32768..32767). - * + */ + SHORTINT readSInt(); + /** * PROCEDURE (VAR rd: Reader) ReadXInt (OUT x: INTEGER) * NEW * Same as ReadSInt, but has an INTEGER-type parameter. @@ -245,7 +257,9 @@ private: * rd.cause = alienVersion * rd.cancelled * rd.readAlien - * + */ + INTEGER readVersion(INTEGER min, INTEGER max); + /* * PROCEDURE (VAR rd: Reader) TurnIntoAlien (cause: INTEGER) * NEW * A store which is currently being internalized can turn itself into an alien, e.g., if it has read a component store which is an alien. @@ -253,6 +267,9 @@ private: * Pre * 20 cause > 0 */ + void turnIntoAlien(int cause); + + bool isCancelled(); private: Store *readStoreOrElemStore(bool isElem); @@ -261,26 +278,12 @@ private: Store *readNewLinkStore(); void internalizeAlien(Alien *alien, std::streampos down, std::streampos end); - /* - TypeName* = ARRAY 64 OF CHAR; - TypePath* = ARRAY 16 OF TypeName; - OpName* = ARRAY 32 OF CHAR; - */ - inline SHORTCHAR *newTypeName() { - return new SHORTCHAR[64]; - } - inline SHORTCHAR **newTypePath() { - SHORTCHAR **out = new SHORTCHAR*[16]; - for (int i = 0; i < 16; ++i) { - out[i] = newTypeName(); - } - return out; - } - void readPath(SHORTCHAR **path); + std::string &fixTypeName(std::string &name); + TypePath readPath(); /** * Add another component to the current path. If first==true, start a new path. */ - void addPathComponent(bool first, SHORTCHAR *typeName); + void addPathComponent(bool first, const std::string &typeName); }; } // namespace odc