1 (* ================================================================ *)
3 (* Module of the V1.4+ gpcp tool to create symbol files from *)
4 (* the metadata of .NET assemblies, using the PERWAPI interface. *)
5 (* Also used in GPCP itself. *)
7 (* Copyright K John Gough, QUT 2004 - 2007. *)
9 (* This code released under the terms of the GPCP licence. *)
11 (* ================================================================ *)
16 (* ---------------------------------------------------------- *)
18 TYPE CharOpen
* = POINTER TO ARRAY OF CHAR;
20 (* ---------------------------------------------------------- *)
22 PROCEDURE QuotedName
*(asmN
, nmsN
: CharOpen
) : CharOpen
;
24 IF nmsN
= NIL THEN RETURN BOX("[" + asmN^
+ "]");
25 ELSE RETURN BOX("[" + asmN^
+ "]" + nmsN^
);
29 PROCEDURE MangledName
*(asmN
, nmsN
: CharOpen
) : CharOpen
;
30 CONST prefix
= 2; equal
= 1; unequal
= 0;
31 VAR sNm
, aNm
: CharOpen
;
32 (* ------------------------------------------------ *)
33 PROCEDURE canonEq(l
,r
: CharOpen
) : INTEGER;
34 VAR cl
, cr
: CHAR; ix
: INTEGER;
39 IF CAP(cl
) # CAP(cr
) THEN RETURN unequal
END;
43 IF cr
= 0X
THEN RETURN equal
;
44 ELSIF cr
= "_" THEN RETURN prefix
;
45 ELSE (* -------- *) RETURN unequal
;
48 (* ------------------------------------------------ *)
49 PROCEDURE canonicalizeId(str
: CharOpen
) : CharOpen
;
50 VAR ix
: INTEGER; co
: CharOpen
; ch
: CHAR;
53 FOR ix
:= 0 TO LEN(str
)-1 DO
55 IF (ch
>= 'a'
) & (ch
<= 'z'
) OR
56 (ch
>= 'A'
) & (ch
<= 'Z'
) OR
57 (ch
>= '
0'
) & (ch
<= '
9'
) OR
58 (ch
>= 0C0X
) & (ch
<= 0D6X
) OR
59 (ch
>= 0D8X
) & (ch
<= 0F6X
) OR
60 (ch
>= 0F8X
) & (ch
<= 0FFX
) OR
61 (ch
= 0X
) THEN (* skip *) ELSE ch
:= '_'
END;
66 (* ------------------------------------------------ *)
67 PROCEDURE merge(str
: CharOpen
; pos
: INTEGER) : CharOpen
;
74 FOR idx
:= 0 TO pos
-1 DO res
[idx
] := str
[idx
] END;
76 FOR idx
:= pos
TO len
-1 DO res
[idx
+1] := str
[idx
] END;
79 (* ------------------------------------------------ *)
81 aNm
:= canonicalizeId(asmN
);
82 IF (nmsN
= NIL) OR (nmsN
[0] = 0X
) THEN
84 * There is no namespace name, so the CP
85 * name is "aNm" and the scopeNm is "[asmN]"
89 sNm
:= canonicalizeId(nmsN
);
90 CASE canonEq(aNm
, sNm
) OF
93 * The CP name is "aNm_sNm"
94 * and scopeNm is "[asmN]nmsN"
96 RETURN BOX(aNm^
+ "_" + sNm^
);
99 * The CP name is "sNm_"
100 * and scopeNm is "[asmN]nmsN"
102 RETURN BOX(sNm^
+ "_");
105 * The CP name is prefix(sNm) + "_" + suffix(sNm)
106 * and scopeNm is "[asmN]nmsN"
108 RETURN merge(sNm
, LEN(aNm$
));
113 (* ---------------------------------------------------------- *)
115 PROCEDURE ParseModuleString
*(str
: CharOpen
; OUT nam
: CharOpen
);
126 max
:= LEN(str^
) - 1;
127 FOR idx
:= 0 TO max
DO
129 IF chr
= '
['
THEN lBr
:= idx
;
130 ELSIF chr
= '
]'
THEN rBr
:= idx
;
133 IF (lBr
= 0) & (rBr
> 1) & (rBr
< max
) THEN
135 NEW(cNm
, max
- rBr
+ 1);
136 FOR idx
:= 0 TO rBr
- lBr
- 2 DO fNm
[idx
] := str
[idx
+ lBr
+ 1] END;
137 FOR idx
:= 0 TO max
- rBr
- 1 DO cNm
[idx
] := str
[idx
+ rBr
+ 1] END;
138 nam
:= MangledName(fNm
, cNm
);
142 END ParseModuleString
;
144 (* ---------------------------------------------------------- *)