Rev 745 | Rev 748 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
733 | daniel-mar | 1 | unit OIDFILE; |
2 | |||
3 | (************************************************) |
||
4 | (* OIDFILE.PAS *) |
||
5 | (* Author: Daniel Marschall *) |
||
745 | daniel-mar | 6 | (* Revision: 2022-02-15 *) |
733 | daniel-mar | 7 | (* License: Apache 2.0 *) |
8 | (* This file contains: *) |
||
9 | (* - Functions to handle an OID ASCII format *) |
||
10 | (************************************************) |
||
11 | |||
12 | interface |
||
13 | |||
14 | uses |
||
15 | StrList; |
||
16 | |||
17 | type |
||
18 | POID = ^TOID; |
||
19 | TOID = record |
||
20 | FileId: string; |
||
21 | DotNotation: string; |
||
22 | ASNIds: PStringList; |
||
23 | Description: string; |
||
745 | daniel-mar | 24 | SubIds: PStringList; (* first 8 chars are FileId, followed by DotNotation *) |
25 | ParentFileId: string; |
||
26 | ParentDotNotation: string; |
||
733 | daniel-mar | 27 | end; |
28 | |||
735 | daniel-mar | 29 | procedure CreateOidDef(var oid: POid); |
733 | daniel-mar | 30 | procedure FreeOidDef(oid: POid); |
734 | daniel-mar | 31 | procedure ClearOidDef(oid: POid); |
743 | daniel-mar | 32 | function WriteOidFile(filename: string; oid: POid): boolean; |
33 | function ReadOidFile(filename: string; oid: POid): boolean; |
||
733 | daniel-mar | 34 | |
745 | daniel-mar | 35 | (* For the strings in the list "SubIds": *) |
735 | daniel-mar | 36 | function FileIdPart(s: string): string; |
37 | function DotNotationPart(s: string): string; |
||
38 | |||
733 | daniel-mar | 39 | implementation |
40 | |||
41 | uses |
||
739 | daniel-mar | 42 | VtsFuncs, OidUtils; |
733 | daniel-mar | 43 | |
44 | const |
||
45 | WANT_VERS = '2022'; |
||
46 | |||
735 | daniel-mar | 47 | procedure CreateOidDef(var oid: POid); |
734 | daniel-mar | 48 | begin |
735 | daniel-mar | 49 | GetMem(oid, SizeOf(TOID)); |
734 | daniel-mar | 50 | oid^.FileId := ''; |
51 | oid^.DotNotation := ''; |
||
52 | oid^.Description := ''; |
||
745 | daniel-mar | 53 | oid^.ParentFileId := ''; |
54 | oid^.ParentDotNotation := ''; |
||
735 | daniel-mar | 55 | CreateList(oid^.ASNIds); |
56 | CreateList(oid^.SubIds); |
||
734 | daniel-mar | 57 | end; |
58 | |||
733 | daniel-mar | 59 | procedure FreeOidDef(oid: POid); |
60 | begin |
||
61 | FreeList(oid^.ASNIds); |
||
62 | FreeList(oid^.SubIds); |
||
735 | daniel-mar | 63 | FreeMem(oid, SizeOf(TOID)); |
733 | daniel-mar | 64 | end; |
65 | |||
734 | daniel-mar | 66 | procedure ClearOidDef(oid: POid); |
67 | begin |
||
745 | daniel-mar | 68 | oid^.FileId := ''; |
69 | oid^.DotNotation := ''; |
||
70 | oid^.Description := ''; |
||
71 | oid^.ParentFileId := ''; |
||
72 | oid^.ParentDotNotation := ''; |
||
73 | ListClear(oid^.ASNIds); |
||
74 | ListClear(oid^.SubIds); |
||
734 | daniel-mar | 75 | end; |
76 | |||
740 | daniel-mar | 77 | procedure ListBubbleSortSubIds(oid: POid); |
739 | daniel-mar | 78 | var |
79 | n, i: integer; |
||
80 | a, b: string; |
||
740 | daniel-mar | 81 | swapped: boolean; |
739 | daniel-mar | 82 | begin |
83 | n := ListCount(oid^.SubIds); |
||
84 | while n>1 do |
||
85 | begin |
||
86 | i := 0; |
||
740 | daniel-mar | 87 | swapped := false; |
739 | daniel-mar | 88 | while i<n-1 do |
89 | begin |
||
90 | a := DotNotationPart(ListGetElement(oid^.SubIds, i)); |
||
91 | b := DotNotationPart(ListGetElement(oid^.SubIds, i+1)); |
||
92 | if CompareOID(a, b) > 0 then |
||
93 | begin |
||
94 | ListSwapElement(oid^.SubIds, i, i+1); |
||
740 | daniel-mar | 95 | swapped := true; |
739 | daniel-mar | 96 | end; |
97 | Inc(i); |
||
98 | end; |
||
740 | daniel-mar | 99 | if not swapped then break; |
739 | daniel-mar | 100 | Dec(n); |
101 | end; |
||
102 | end; |
||
103 | |||
743 | daniel-mar | 104 | function WriteOidFile(filename: string; oid: POid): boolean; |
733 | daniel-mar | 105 | var |
106 | f: Text; |
||
107 | i: integer; |
||
108 | lines: PStringList; |
||
109 | sTmp: string; |
||
110 | desc: string; |
||
111 | begin |
||
112 | Assign(f, filename); |
||
743 | daniel-mar | 113 | |
114 | {$I-} |
||
733 | daniel-mar | 115 | Rewrite(f); |
743 | daniel-mar | 116 | {$I+} |
117 | if IoResult <> 0 then |
||
118 | begin |
||
119 | WriteOidFile := false; |
||
120 | (* Must not call Close(f) if file was never opened *) |
||
121 | Exit; |
||
122 | end; |
||
733 | daniel-mar | 123 | |
740 | daniel-mar | 124 | WriteLn(f, 'VERS' + WANT_VERS); |
733 | daniel-mar | 125 | |
740 | daniel-mar | 126 | WriteLn(f, 'SELF' + oid^.FileId + oid^.DotNotation); |
733 | daniel-mar | 127 | |
745 | daniel-mar | 128 | WriteLn(f, 'SUPR' + oid^.ParentFileId + oid^.ParentDotNotation); |
733 | daniel-mar | 129 | |
739 | daniel-mar | 130 | (* Sort sub IDs *) |
740 | daniel-mar | 131 | ListBubbleSortSubIds(oid); |
132 | |||
733 | daniel-mar | 133 | for i := 0 to ListCount(oid^.SubIds)-1 do |
134 | begin |
||
135 | sTmp := ListGetElement(oid^.SubIds, i); |
||
136 | WriteLn(f, 'CHLD' + sTmp); |
||
137 | end; |
||
138 | |||
139 | for i := 0 to ListCount(oid^.AsnIds)-1 do |
||
140 | begin |
||
141 | sTmp := ListGetElement(oid^.AsnIds, i); |
||
142 | WriteLn(f, 'ASN1' + sTmp); |
||
143 | end; |
||
144 | |||
145 | desc := Trim(oid^.Description); |
||
146 | if desc <> '' then |
||
147 | begin |
||
735 | daniel-mar | 148 | CreateList(lines); |
733 | daniel-mar | 149 | SplitStrToList(desc, lines, #13#10); |
150 | for i := 0 to ListCount(lines)-1 do |
||
151 | begin |
||
152 | sTmp := ListGetElement(lines, i); |
||
153 | WriteLn(f, 'DESC' + sTmp); |
||
154 | end; |
||
155 | FreeList(lines); |
||
156 | end; |
||
157 | |||
158 | Close(f); |
||
743 | daniel-mar | 159 | |
160 | WriteOidFile := true; |
||
733 | daniel-mar | 161 | end; |
162 | |||
743 | daniel-mar | 163 | function ReadOidFile(filename: string; oid: POid): boolean; |
733 | daniel-mar | 164 | var |
165 | f: Text; |
||
166 | line, cmd: string; |
||
167 | version: string; |
||
168 | begin |
||
734 | daniel-mar | 169 | ClearOidDef(oid); |
733 | daniel-mar | 170 | version := ''; |
171 | |||
172 | Assign(f, filename); |
||
743 | daniel-mar | 173 | {$I-} |
733 | daniel-mar | 174 | Reset(f); |
743 | daniel-mar | 175 | {$I+} |
176 | if IoResult <> 0 then |
||
177 | begin |
||
178 | ReadOidFile := false; |
||
179 | (* Must not call Close(f) if file was never opened *) |
||
180 | Exit; |
||
181 | end; |
||
182 | |||
733 | daniel-mar | 183 | while not EOF(f) do |
184 | begin |
||
185 | ReadLn(f, line); |
||
186 | cmd := Copy(line,1,4); |
||
187 | Delete(line,1,4); |
||
188 | |||
189 | if cmd = 'VERS' then |
||
190 | begin |
||
191 | version := line; |
||
192 | end; |
||
193 | |||
194 | if cmd = 'SELF' then |
||
195 | begin |
||
196 | oid^.FileId := Copy(line,1,8); |
||
197 | Delete(line,1,8); |
||
198 | oid^.DotNotation := line; |
||
199 | end; |
||
200 | |||
201 | if cmd = 'SUPR' then |
||
202 | begin |
||
745 | daniel-mar | 203 | oid^.ParentFileId := FileIdPart(line); |
204 | oid^.ParentDotNotation := DotNotationPart(line); |
||
733 | daniel-mar | 205 | end; |
206 | |||
207 | if cmd = 'CHLD' then |
||
208 | begin |
||
209 | ListAppend(oid^.SubIds, line); |
||
210 | end; |
||
211 | |||
212 | if cmd = 'ASN1' then |
||
213 | begin |
||
214 | ListAppend(oid^.ASNIds, line); |
||
215 | end; |
||
216 | |||
217 | if cmd = 'DESC' then |
||
218 | begin |
||
219 | oid^.Description := oid^.Description + line + #13#10; |
||
220 | end; |
||
221 | end; |
||
740 | daniel-mar | 222 | |
739 | daniel-mar | 223 | (* Sort sub IDs *) |
740 | daniel-mar | 224 | ListBubbleSortSubIds(oid); |
733 | daniel-mar | 225 | |
226 | (* Remove last CRLF *) |
||
227 | oid^.Description := Copy(oid^.Description, 1, Length(oid^.Description)-Length(#13#10)); |
||
228 | |||
747 | daniel-mar | 229 | (* Check if everything is correct *) |
744 | daniel-mar | 230 | ReadOidFile := (version = WANT_VERS) and (oid^.FileId <> ''); |
733 | daniel-mar | 231 | |
232 | Close(f); |
||
233 | end; |
||
234 | |||
735 | daniel-mar | 235 | function FileIdPart(s: string): string; |
236 | begin |
||
237 | FileIdPart := Copy(s,1,8); |
||
238 | end; |
||
239 | |||
240 | function DotNotationPart(s: string): string; |
||
241 | begin |
||
242 | Delete(s,1,8); |
||
243 | DotNotationPart := s; |
||
244 | end; |
||
245 | |||
733 | daniel-mar | 246 | end. |