Rev 735 | 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 OIDUTILS; |
2 | |||
3 | (************************************************) |
||
4 | (* OIDUTILS.PAS *) |
||
5 | (* Author: Daniel Marschall *) |
||
735 | daniel-mar | 6 | (* Revision: 2022-02-14 *) |
733 | daniel-mar | 7 | (* License: Apache 2.0 *) |
8 | (* This file contains: *) |
||
9 | (* - Various OID functions *) |
||
10 | (************************************************) |
||
11 | |||
12 | interface |
||
13 | |||
14 | uses |
||
15 | StrList; |
||
16 | |||
17 | function CompareOIDArcList(a, b: PStringList): integer; |
||
18 | function CompareOID(a, b: string): integer; |
||
19 | procedure ListBubbleSortOID(list: PStringList); |
||
20 | function ASN1IDValid(asn1id: string): boolean; |
||
21 | |||
22 | implementation |
||
23 | |||
24 | uses |
||
25 | VtsFuncs; |
||
26 | |||
27 | function CompareOIDArcList(a, b: PStringList): integer; |
||
28 | var |
||
29 | x, y: PStringList; |
||
30 | tmp: integer; |
||
31 | begin |
||
32 | x := a; |
||
33 | y := b; |
||
34 | |||
35 | repeat |
||
36 | if (x = nil) and (y <> nil) then |
||
37 | begin |
||
38 | CompareOIDArcList := -1; |
||
39 | exit; |
||
40 | end; |
||
41 | |||
42 | if (x <> nil) and (y = nil) then |
||
43 | begin |
||
44 | CompareOIDArcList := 1; |
||
45 | exit; |
||
46 | end; |
||
47 | |||
48 | if (x = nil) and (y = nil) then |
||
49 | begin |
||
50 | CompareOIDArcList := 0; |
||
51 | exit; |
||
52 | end; |
||
53 | |||
54 | tmp := CompareNumericString(x^.element, y^.element); |
||
55 | |||
56 | if tmp <> 0 then |
||
57 | begin |
||
58 | CompareOIDArcList := tmp; |
||
59 | exit; |
||
60 | end; |
||
61 | |||
62 | x := x^.next; |
||
63 | y := y^.next; |
||
64 | until false; |
||
65 | end; |
||
66 | |||
67 | function CompareOID(a, b: string): integer; |
||
68 | var |
||
69 | la, lb: PStringList; |
||
70 | begin |
||
735 | daniel-mar | 71 | CreateList(la); |
72 | CreateList(lb); |
||
733 | daniel-mar | 73 | OIDtoArcList(a, la); |
74 | OIDtoArcList(b, lb); |
||
75 | CompareOID := CompareOIDArcList(la, lb); |
||
76 | end; |
||
77 | |||
78 | procedure ListBubbleSortOID(list: PStringList); |
||
79 | var |
||
80 | n, i: integer; |
||
81 | a, b: string; |
||
740 | daniel-mar | 82 | swapped: boolean; |
733 | daniel-mar | 83 | begin |
84 | n := ListCount(list); |
||
85 | while n>1 do |
||
86 | begin |
||
87 | i := 0; |
||
740 | daniel-mar | 88 | swapped := false; |
733 | daniel-mar | 89 | while i<n-1 do |
90 | begin |
||
91 | a := ListGetElement(list, i); |
||
92 | b := ListGetElement(list, i+1); |
||
93 | if CompareOID(a, b) > 0 then |
||
94 | begin |
||
95 | ListSwapElement(list, i, i+1); |
||
740 | daniel-mar | 96 | swapped := true; |
733 | daniel-mar | 97 | end; |
98 | Inc(i); |
||
99 | end; |
||
740 | daniel-mar | 100 | if not swapped then break; |
733 | daniel-mar | 101 | Dec(n); |
102 | end; |
||
103 | end; |
||
104 | |||
105 | function ASN1IDValid(asn1id: string): boolean; |
||
106 | var |
||
107 | i: integer; |
||
108 | lastChar: char; |
||
109 | begin |
||
110 | (* see Rec. ITU-T X.660 | ISO/IEC 9834-1, clause 7.7 *) |
||
111 | (* and Rec. ITU-T X.680 | ISO/IEC 8824-1, clause 12.3 *) |
||
112 | |||
113 | ASN1IDValid := false; |
||
114 | |||
115 | if Length(asn1id) = 0 then exit; (* may not be empty *) |
||
116 | if not (asn1id[1] in ['a'..'z']) then exit; (* first char must be lowercase *) |
||
117 | |||
118 | lastChar := #0; |
||
119 | for i := 1 to Length(asn1id) do |
||
120 | begin |
||
121 | if (lastChar = '-') and (asn1id[i] = '-') then exit; (* may not contain '--' *) |
||
122 | if not (asn1id[i] in ['a'..'z', 'A'..'Z', '0'..'9', '-']) then exit; |
||
123 | lastChar := asn1id[i]; |
||
124 | end; |
||
125 | if lastChar = '-' then exit; (* may not end with '-' *) |
||
126 | ASN1IDValid := true; |
||
127 | end; |
||
128 | |||
129 | end. |