DEADSOFTWARE

first cpc release
[cpc.git] / src / generic / Dsw / Mod / Documents.cp
1 MODULE DswDocuments;
3 IMPORT Files;
5 (* !!! make better store type and version checking *)
7 TYPE
8 Name = ARRAY 256 OF SHORTCHAR;
10 Store = RECORD
11 (* type: Name; *)
12 next, down, len: INTEGER;
13 pos, end: INTEGER;
14 isElem: BOOLEAN;
15 END;
17 Text* = POINTER TO RECORD
18 t*: POINTER TO ARRAY OF CHAR;
19 END;
21 PROCEDURE Import* (loc: Files.Locator; IN name: Files.Name; OUT text: Text; OUT res: INTEGER);
22 CONST
23 docTag = 6F4F4443H; docVersion = 0;
24 Step = 256;
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;
29 BEGIN
30 IF text = NIL THEN
31 NEW(text); NEW(text.t, Step); chid := 0
32 END;
33 len := LEN(text.t);
34 IF chid + 1 >= len THEN
35 NEW(t, len + Step);
36 FOR i := 0 TO len - 1 DO
37 t[i] := text.t[i]
38 END;
39 text.t := t
40 END;
41 text.t[chid] := ch; INC(chid);
42 text.t[chid] := 0X;
43 END AddChar;
45 PROCEDURE ReadSChar (OUT x: SHORTCHAR);
46 VAR i: BYTE;
47 BEGIN
48 r.ReadByte(i);
49 x := SHORT(CHR(i MOD 256))
50 END ReadSChar;
52 PROCEDURE ReadInt (OUT x: INTEGER);
53 VAR i: ARRAY 4 OF BYTE;
54 BEGIN
55 r.ReadBytes(i, 0, 4);
56 x := i[0] MOD 256 + i[1] MOD 256 * 256 + i[2] MOD 256 * 65536 + i[3] MOD 256 * 16777216
57 END ReadInt;
59 PROCEDURE ReadBool (OUT x: BOOLEAN);
60 VAR i: SHORTCHAR;
61 BEGIN
62 ReadSChar(i);
63 x := i # 0X
64 END ReadBool;
66 PROCEDURE ReadStore (OUT s: Store);
67 CONST
68 storeVersion = 0X;
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 *)
72 VAR
73 tag, version, ch: SHORTCHAR; i, x: INTEGER;
74 BEGIN
75 ReadSChar(tag); s.isElem := tag = elem;
76 ASSERT((tag = store) OR (tag = elem), 100);
77 ReadSChar(tag);
78 WHILE tag = newExt DO
79 REPEAT ReadSChar(ch) UNTIL ch = 0X;
80 ReadSChar(tag)
81 END;
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 *)
86 ELSE
87 HALT(102)
88 END;
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);
95 IF s.isElem THEN
96 ReadSChar(version);
97 ASSERT(version = storeVersion, 104)
98 END
99 END ReadStore;
101 PROCEDURE ReadStdTextModel;
102 CONST
103 dictSize = 32;
104 noLCharStdModelVersion = 0; stdModelVersion = 1;
105 VAR
106 s: Store;
107 version, ano: BYTE;
108 org, len, dictlen, i, w, h: INTEGER;
109 R: Files.Reader;
110 x: ARRAY 2 OF BYTE;
111 ch: CHAR;
112 BEGIN
113 r.ReadByte(version);
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;
117 WHILE ano # -1 DO
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
121 ELSE
122 (* attr := dictattr[ano] *)
123 END;
124 ReadInt(len);
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)
128 END
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)
133 END
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 *)
137 END;
138 r.ReadByte(ano)
139 END;
140 res := 0 (* ok *)
141 ELSE
142 res := 4 (* unsupported text model version *)
143 END
144 END ReadStdTextModel;
146 PROCEDURE ReadTextModel;
147 CONST
148 modelVersion = 0;
149 conteinerVersion = 0;
150 textModelVersion = 0;
151 VAR
152 s: Store;
153 version: BYTE;
154 BEGIN
155 ReadStore(s);
156 IF TRUE (*s.type = "TextModels.StdModelDesc"*) THEN
157 r.ReadByte(version);
158 IF version = modelVersion THEN (* Models.Model *)
159 r.ReadByte(version);
160 IF version = conteinerVersion THEN (* Containers.Container *)
161 r.ReadByte(version);
162 IF version = textModelVersion THEN (* TextModels.Model *)
163 ReadStdTextModel
164 ELSE
165 res := 4 (* unsupported text model version *)
166 END
167 ELSE
168 res := 4 (* unsupported text model version *)
169 END
170 ELSE
171 res := 4 (* unsupported text model version *)
172 END
173 ELSE
174 res := 3 (* unsupported version *)
175 END
176 END ReadTextModel;
178 PROCEDURE ReadDocument;
179 VAR s: Store;
180 BEGIN
181 ReadStore(s);
182 IF TRUE (*s.type = "Documents.StdDocumentDesc"*) THEN
183 r.SetPos(s.down); (* !!! *)
184 ReadStore(s);
185 IF TRUE (*s.type = "Documents.ModelDesc"*) THEN
186 r.SetPos(s.down); (* !!! *)
187 ReadStore(s);
188 IF TRUE (*s.type = "TextViews.StdViewDesc"*) THEN
189 r.SetPos(s.down); (* !!! *)
190 ReadTextModel
191 ELSE
192 res := 3 (* unsupported version *)
193 END
194 ELSE
195 res := 3 (* unsupported version *)
196 END
197 ELSE
198 res := 3 (* unsupported version *)
199 END
200 END ReadDocument;
202 BEGIN
203 ASSERT(loc # NIL, 20);
204 ASSERT(name # "", 21);
205 text := NIL;
206 f := Files.dir.Old(loc, name, Files.shared);
207 IF f # NIL THEN
208 IF f.Length() > 8 THEN (* !!! calculate minimal document size *)
209 r := f.NewReader(NIL);
210 ReadInt(tag);
211 IF tag = docTag THEN
212 ReadInt(version);
213 IF version = docVersion THEN
214 ReadDocument;
215 f.Close
216 ELSE
217 f.Close;
218 res := 3 (* unsupported version *)
219 END
220 ELSE
221 f.Close;
222 res := 2 (* not document *)
223 END
224 ELSE
225 f.Close;
226 res := 2 (* not document *)
227 END
228 ELSE
229 res := 1 (* unable to open *)
230 END
231 END Import;
233 END DswDocuments.