12cb6b5338dcbc474be472a3727879b31fac122d
5 (* !!! make better store type and version checking *)
8 Name
= ARRAY 256 OF SHORTCHAR
;
12 next
, down
, len
: INTEGER;
17 Text
* = POINTER TO RECORD
18 t
*: POINTER TO ARRAY OF CHAR;
21 PROCEDURE Import
* (loc
: Files
.Locator
; IN name
: Files
.Name
; OUT text
: Text
; OUT res
: INTEGER);
23 docTag
= 6F4F4443H
; docVersion
= 0;
25 VAR f
: Files
.File
; r
: Files
.Reader
; tag
, version
, chid
: INTEGER; s
: Store
;
27 PROCEDURE AddChar (ch
: CHAR);
28 VAR i
, len
: INTEGER; t
: POINTER TO ARRAY OF CHAR;
31 NEW(text
); NEW(text
.t
, Step
); chid
:= 0
34 IF chid
+ 1 >= len
THEN
36 FOR i
:= 0 TO len
- 1 DO
41 text
.t
[chid
] := ch
; INC(chid
);
45 PROCEDURE ReadSChar (OUT x
: SHORTCHAR
);
49 x
:= SHORT(CHR(i
MOD 256))
52 PROCEDURE ReadInt (OUT x
: INTEGER);
53 VAR i
: ARRAY 4 OF BYTE;
56 x
:= i
[0] MOD 256 + i
[1] MOD 256 * 256 + i
[2] MOD 256 * 65536 + i
[3] MOD 256 * 16777216
59 PROCEDURE ReadBool (OUT x
: BOOLEAN);
66 PROCEDURE ReadStore (OUT s
: Store
);
69 newBase
= 0F0X
; newExt
= 0F1X
; oldType
= 0F2X
;
70 nil
= 80X
; link
= 81X
; store
= 82X
; elem
= 83X
; newlink
= 84X
;
71 elemTName
= "Stores.ElemDesc"; modelTName
= "Models.ModelDesc"; (* from pre-1.3 *)
73 tag
, version
, ch
: SHORTCHAR
; i
, x
: INTEGER;
75 ReadSChar(tag
); s
.isElem
:= tag
= elem
;
76 ASSERT((tag
= store
) OR (tag
= elem
), 100);
79 REPEAT ReadSChar(ch
) UNTIL ch
= 0X
;
82 IF tag
= newBase
THEN (* !!! get base types *)
83 REPEAT ReadSChar(ch
) UNTIL ch
= 0X
;
84 ELSIF tag
= oldType
THEN
85 ReadInt(x
) (* !!! get from dictionary *)
89 ReadInt(x
); (* extension hook = 00000000 *)
90 ReadInt(s
.next
); s
.next
:= s
.next
+ r
.Pos();
91 ReadInt(s
.down
); s
.down
:= s
.down
+ r
.Pos();
92 ReadInt(s
.len
); s
.pos
:= r
.Pos(); s
.end
:= s
.pos
+ s
.len
;
93 ReadSChar(version
); (* version *)
94 ASSERT(version
= storeVersion
, 103);
97 ASSERT(version
= storeVersion
, 104)
101 PROCEDURE ReadStdTextModel
;
104 noLCharStdModelVersion
= 0; stdModelVersion
= 1;
108 org
, len
, dictlen
, i
, w
, h
: INTEGER;
114 IF version
IN {noLCharStdModelVersion
, stdModelVersion
} THEN
115 ReadInt(org
); org
:= org
+ r
.Pos(); R
:= f
.NewReader(NIL); R
.SetPos(org
);
116 r
.ReadByte(ano
); dictlen
:= 0;
118 IF ano
= dictlen
THEN
119 ReadStore(s
); r
.SetPos(s
.end
); (* attr IS TextModels.AttributesDesc *)
120 IF dictlen
< dictSize
THEN (* dictattr[dictlen] := attr *) INC(dictlen
) END
122 (* attr := dictattr[ano] *)
125 IF len
> 0 THEN (* pice *)
126 FOR i
:= 0 TO len
- 1 DO
127 R
.ReadByte(x
[0]); ch
:= CHR(x
[0] MOD 256); AddChar(ch
)
129 ELSIF len
< 0 THEN (* longchar pice *)
130 ASSERT(len
MOD 2 = 0);
131 FOR i
:= 0 TO (-len
) DIV 2 - 1 DO
132 R
.ReadBytes(x
, 0, 2); ch
:= CHR(x
[0] MOD 256 + x
[1] MOD 256 * 256); AddChar(ch
)
134 ELSE (* len = 0 => embedded view *)
135 ReadInt(w
); ReadInt(h
); R
.ReadByte(x
[0]); (* viewcode!!! *) AddChar(02X
);
136 ReadStore(s
); r
.SetPos(s
.end
) (* random view type *)
142 res
:= 4 (* unsupported text model version *)
144 END ReadStdTextModel
;
146 PROCEDURE ReadTextModel
;
149 conteinerVersion
= 0;
150 textModelVersion
= 0;
156 IF TRUE (*s.type = "TextModels.StdModelDesc"*) THEN
158 IF version
= modelVersion
THEN (* Models.Model *)
160 IF version
= conteinerVersion
THEN (* Containers.Container *)
162 IF version
= textModelVersion
THEN (* TextModels.Model *)
165 res
:= 4 (* unsupported text model version *)
168 res
:= 4 (* unsupported text model version *)
171 res
:= 4 (* unsupported text model version *)
174 res
:= 3 (* unsupported version *)
178 PROCEDURE ReadDocument
;
182 IF TRUE (*s.type = "Documents.StdDocumentDesc"*) THEN
183 r
.SetPos(s
.down
); (* !!! *)
185 IF TRUE (*s.type = "Documents.ModelDesc"*) THEN
186 r
.SetPos(s
.down
); (* !!! *)
188 IF TRUE (*s.type = "TextViews.StdViewDesc"*) THEN
189 r
.SetPos(s
.down
); (* !!! *)
192 res
:= 3 (* unsupported version *)
195 res
:= 3 (* unsupported version *)
198 res
:= 3 (* unsupported version *)
203 ASSERT(loc
# NIL, 20);
204 ASSERT(name
# "", 21);
206 f
:= Files
.dir
.Old(loc
, name
, Files
.shared
);
208 IF f
.Length() > 8 THEN (* !!! calculate minimal document size *)
209 r
:= f
.NewReader(NIL);
213 IF version
= docVersion
THEN
218 res
:= 3 (* unsupported version *)
222 res
:= 2 (* not document *)
226 res
:= 2 (* not document *)
229 res
:= 1 (* unable to open *)