DEADSOFTWARE

small fix
[odcread.git] / reader.h
index cfd4fc53194f1242de4890a369e5765bc086bce5..e9b0234b4972c403099584334386b9d7cb137b62 100644 (file)
--- a/reader.h
+++ b/reader.h
@@ -2,12 +2,21 @@
 #define _READER_H_
 
 #include <iostream>
+#include <vector>
 
 #include <oberon.h>
 #include <store.h>
+#include <alien.h>
 
 namespace odc {
 
+struct TypeEntry {
+       const std::string name;
+       INTEGER baseId;
+
+       TypeEntry(const std::string &typeName) : name(typeName), baseId(-1) {}
+};
+
 /**
  * TYPE Reader
  * Reader for Component Pascal values like integers, reals, or sets. A reader contains a Files.Reader, to which it forwards most operations.
@@ -34,8 +43,26 @@ private:
         */
        bool d_readAlien;
 
-       INTEGER d_nextElemId;
-       INTEGER d_nextStoreId;
+       std::vector<TypeEntry*> d_typeList;
+
+       std::vector<Store*> d_elemList; // FIXME: WTH, why are these different?
+       std::vector<Store*> d_storeList;
+
+       Store *d_store;
+
+       struct ReaderState {
+               /**
+                * Position of the next store in the current level
+                */
+               std::streampos next;
+               /**
+                * Position just after the last read store
+                */
+               std::streampos end;
+       };
+       ReaderState *d_state;
+
+       INTEGER d_cause;
 
        public:
        /**
@@ -102,15 +129,20 @@ private:
         * 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).
-        * 
+        */ 
+       /**
         * 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).
@@ -148,19 +180,24 @@ private:
         * PROCEDURE (VAR rd: Reader) ReadSet (OUT x: SET)
         * NEW
         * Reads a set (32 elements).
-        * 
+        */
+       /**
         * PROCEDURE (VAR rd: Reader) ReadSString (OUT x: ARRAY OF SHORTCHAR)
         * NEW
         * Reads a 0X-terminated short string.
         * 
         * Pre
         * invalid index         LEN(x) > Length(string)
-        * 
+        */
+       void readSString(SHORTCHAR *out);
+       /** 
         * PROCEDURE (VAR rd: Reader) ReadXString (OUT x: ARRAY OF CHAR)
         * NEW
         * Same as ReadSString, but has a string-type parameter.
         * This procedure is provided to simplify migration from Release 1.2 to 1.3.
-        * 
+        */
+       //void readXString(CHAR *out);
+       /** 
         * PROCEDURE (VAR rd: Reader) ReadString (OUT x: ARRAY OF CHAR)
         * NEW
         * Reads a 0X-terminated string.
@@ -210,7 +247,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.
@@ -224,23 +263,14 @@ private:
        Store *readNilStore();
        Store *readLinkStore();
        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;
+       std::string &fixTypeName(std::string &name);
+       TypePath readPath();
+       /**
+        * Add another component to the current path. If first==true, start a new path.
         */
-       inline CHAR *newTypeName() {
-               return new CHAR[64];
-       }
-       inline CHAR **newTypePath() {
-               CHAR **out = new CHAR*[16];
-               for (int i = 0; i < 16; ++i) {
-                       out[i] = newTypeName();
-               }
-               return out;
-       }
-       void readPath(CHAR **path);
+       void addPathComponent(bool first, const std::string &typeName);
 };
 
 } // namespace odc