CPT.txt 69 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886
  1. MODULE LindevCPT;
  2. (* THIS IS TEXT COPY OF CPT.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT DevCPM := LindevCPM;
  5. CONST
  6. MaxIdLen = 256;
  7. TYPE
  8. Name* = ARRAY MaxIdLen OF SHORTCHAR;
  9. String* = POINTER TO ARRAY OF SHORTCHAR;
  10. Const* = POINTER TO ConstDesc;
  11. Object* = POINTER TO ObjDesc;
  12. Struct* = POINTER TO StrDesc;
  13. Node* = POINTER TO NodeDesc;
  14. ConstExt* = String;
  15. LinkList* = POINTER TO LinkDesc;
  16. ConstDesc* = RECORD
  17. ext*: ConstExt; (* string or code for code proc (longstring in utf8) *)
  18. intval*: INTEGER; (* constant value or adr, proc par size, text position or least case label *)
  19. intval2*: INTEGER; (* string length (#char, incl 0X), proc var size or larger case label *)
  20. setval*: SET; (* constant value, procedure body present or "ELSE" present in case *)
  21. realval*: REAL; (* real or longreal constant value *)
  22. link*: Const (* chain of constants present in obj file *)
  23. END ;
  24. LinkDesc* = RECORD
  25. offset*, linkadr*: INTEGER;
  26. next*: LinkList;
  27. END;
  28. ObjDesc* = RECORD
  29. left*, right*, link*, scope*: Object;
  30. name*: String; (* name = null OR name^ # "" *)
  31. leaf*: BOOLEAN;
  32. sysflag*: BYTE;
  33. mode*, mnolev*: BYTE; (* mnolev < 0 -> mno = -mnolev *)
  34. vis*: BYTE; (* internal, external, externalR, inPar, outPar *)
  35. history*: BYTE; (* relevant if name # "" *)
  36. used*, fpdone*: BOOLEAN;
  37. fprint*: INTEGER;
  38. typ*: Struct; (* actual type, changed in with statements *)
  39. ptyp*: Struct; (* original type if typ is changed *)
  40. conval*: Const;
  41. adr*, num*: INTEGER; (* mthno *)
  42. links*: LinkList;
  43. nlink*: Object; (* link for name list, declaration order for methods, library link for imp obj *)
  44. library*, entry*: String; (* library name, entry name *)
  45. modifiers*: POINTER TO ARRAY OF String; (* additional interface strings *)
  46. linkadr*: INTEGER; (* used in ofront *)
  47. red: BOOLEAN;
  48. END ;
  49. StrDesc* = RECORD
  50. form*, comp*, mno*, extlev*: BYTE;
  51. ref*, sysflag*: SHORTINT;
  52. n*, size*, align*, txtpos*: INTEGER; (* align is alignment for records and len offset for dynarrs *)
  53. untagged*, allocated*, pbused*, pvused*, exp*, fpdone, idfpdone: BOOLEAN;
  54. attribute*: BYTE;
  55. idfp, pbfp*, pvfp*:INTEGER;
  56. BaseTyp*: Struct;
  57. link*, strobj*: Object;
  58. ext*: ConstExt (* id string for interface records *)
  59. END ;
  60. NodeDesc* = RECORD
  61. left*, right*, link*: Node;
  62. class*, subcl*, hint*: BYTE;
  63. readonly*: BOOLEAN;
  64. typ*: Struct;
  65. obj*: Object;
  66. conval*: Const
  67. END ;
  68. CONST
  69. maxImps = 127; (* must be <= MAX(SHORTINT) *)
  70. maxStruct = DevCPM.MaxStruct; (* must be < MAX(INTEGER) DIV 2 *)
  71. FirstRef = 32;
  72. FirstRef0 = 16; (* correction for version 0 *)
  73. actVersion = 1;
  74. VAR
  75. topScope*: Object;
  76. undftyp*, bytetyp*, booltyp*, char8typ*, int8typ*, int16typ*, int32typ*,
  77. real32typ*, real64typ*, settyp*, string8typ*, niltyp*, notyp*, sysptrtyp*,
  78. anytyp*, anyptrtyp*, char16typ*, string16typ*, int64typ*,
  79. restyp*, iunktyp*, punktyp*, guidtyp*,
  80. intrealtyp*, lreal64typ*, lint64typ*, lchar16typ*: Struct;
  81. nofGmod*: BYTE; (*nof imports*)
  82. GlbMod*: ARRAY maxImps OF Object; (* .right = first object, .name = module import name (not alias) *)
  83. SelfName*: Name; (* name of module being compiled *)
  84. SYSimported*: BOOLEAN;
  85. processor*, impProc*: SHORTINT;
  86. libName*: Name; (* library alias of module being compiled *)
  87. null*: String; (* "" *)
  88. CONST
  89. (* object modes *)
  90. Var = 1; VarPar = 2; Con = 3; Fld = 4; Typ = 5; LProc = 6; XProc = 7;
  91. SProc = 8; CProc = 9; IProc = 10; Mod = 11; Head = 12; TProc = 13; Attr = 20;
  92. (* structure forms *)
  93. Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6;
  94. Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12;
  95. Pointer = 13; ProcTyp = 14; Comp = 15;
  96. AnyPtr = 14; AnyRec = 15; (* sym file only *)
  97. Char16 = 16; String16 = 17; Int64 = 18;
  98. Res = 20; IUnk = 21; PUnk = 22; Guid = 23;
  99. (* composite structure forms *)
  100. Basic = 1; Array = 2; DynArr = 3; Record = 4;
  101. (*function number*)
  102. assign = 0;
  103. haltfn = 0; newfn = 1; absfn = 2; capfn = 3; ordfn = 4;
  104. entierfn = 5; oddfn = 6; minfn = 7; maxfn = 8; chrfn = 9;
  105. shortfn = 10; longfn = 11; sizefn = 12; incfn = 13; decfn = 14;
  106. inclfn = 15; exclfn = 16; lenfn = 17; copyfn = 18; ashfn = 19; assertfn = 32;
  107. lchrfn = 33; lentierfcn = 34; typfn = 36; bitsfn = 37; bytesfn = 38;
  108. (*SYSTEM function number*)
  109. adrfn = 20; ccfn = 21; lshfn = 22; rotfn = 23;
  110. getfn = 24; putfn = 25; getrfn = 26; putrfn = 27;
  111. bitfn = 28; valfn = 29; sysnewfn = 30; movefn = 31;
  112. thisrecfn = 45; thisarrfn = 46;
  113. (* COM function number *)
  114. validfn = 40; iidfn = 41; queryfn = 42;
  115. (* attribute flags (attr.adr, struct.attribute, proc.conval.setval) *)
  116. newAttr = 16; absAttr = 17; limAttr = 18; empAttr = 19; extAttr = 20;
  117. (* procedure flags (conval.setval) *)
  118. isHidden = 29;
  119. (* module visibility of objects *)
  120. internal = 0; external = 1; externalR = 2; inPar = 3; outPar = 4;
  121. (* history of imported objects *)
  122. inserted = 0; same = 1; pbmodified = 2; pvmodified = 3; removed = 4; inconsistent = 5;
  123. (* sysflags *)
  124. inBit = 2; outBit = 4; interface = 10;
  125. (* symbol file items *)
  126. Smname = 16; Send = 18; Stype = 19; Salias = 20; Svar = 21; Srvar = 22;
  127. Svalpar = 23; Svarpar = 24; Sfld = 25; Srfld = 26; Shdptr = 27; Shdpro = 28; Stpro = 29; Shdtpro = 30;
  128. Sxpro = 31; Sipro = 32; Scpro = 33; Sstruct = 34; Ssys = 35; Sptr = 36; Sarr = 37; Sdarr = 38; Srec = 39; Spro = 40;
  129. Shdutptr = 41; Slib = 42; Sentry = 43; Sinpar = 25; Soutpar = 26;
  130. Slimrec = 25; Sabsrec = 26; Sextrec = 27; Slimpro = 31; Sabspro = 32; Semppro = 33; Sextpro = 34; Simpo = 22;
  131. TYPE
  132. ImpCtxt = RECORD
  133. nextTag, reffp: INTEGER;
  134. nofr, minr, nofm: SHORTINT;
  135. self: BOOLEAN;
  136. ref: ARRAY maxStruct OF Struct;
  137. old: ARRAY maxStruct OF Object;
  138. pvfp: ARRAY maxStruct OF INTEGER; (* set only if old # NIL *)
  139. glbmno: ARRAY maxImps OF BYTE (* index is local mno *)
  140. END ;
  141. ExpCtxt = RECORD
  142. reffp: INTEGER;
  143. ref: SHORTINT;
  144. nofm: BYTE;
  145. locmno: ARRAY maxImps OF BYTE (* index is global mno *)
  146. END ;
  147. VAR
  148. universe, syslink, comlink, infinity: Object;
  149. impCtxt: ImpCtxt;
  150. expCtxt: ExpCtxt;
  151. nofhdfld: INTEGER;
  152. sfpresent, symExtended, symNew: BOOLEAN;
  153. version: INTEGER;
  154. symChanges: INTEGER;
  155. portable: BOOLEAN;
  156. depth: INTEGER;
  157. PROCEDURE err(n: SHORTINT);
  158. BEGIN DevCPM.err(n)
  159. END err;
  160. PROCEDURE NewConst*(): Const;
  161. VAR const: Const;
  162. BEGIN NEW(const); RETURN const
  163. END NewConst;
  164. PROCEDURE NewObj*(): Object;
  165. VAR obj: Object;
  166. BEGIN NEW(obj); obj.name := null; RETURN obj
  167. END NewObj;
  168. PROCEDURE NewStr*(form, comp: BYTE): Struct;
  169. VAR typ: Struct;
  170. BEGIN NEW(typ); typ.form := form; typ.comp := comp; typ.ref := maxStruct; (* ref >= maxStruct: not exported yet *)
  171. typ.txtpos := DevCPM.errpos; typ.size := -1; typ.BaseTyp := undftyp; RETURN typ
  172. END NewStr;
  173. PROCEDURE NewNode*(class: BYTE): Node;
  174. VAR node: Node;
  175. BEGIN
  176. NEW(node); node.class := class; RETURN node
  177. END NewNode;
  178. (*
  179. PROCEDURE NewExt*(): ConstExt;
  180. VAR ext: ConstExt;
  181. BEGIN NEW(ext); RETURN ext
  182. END NewExt;
  183. *)
  184. PROCEDURE NewName* ((*IN*) name: ARRAY OF SHORTCHAR): String;
  185. VAR i: INTEGER; p: String;
  186. BEGIN
  187. i := 0; WHILE name[i] # 0X DO INC(i) END;
  188. IF i > 0 THEN NEW(p, i + 1); p^ := name$; RETURN p
  189. ELSE RETURN null
  190. END
  191. END NewName;
  192. PROCEDURE OpenScope*(level: BYTE; owner: Object);
  193. VAR head: Object;
  194. BEGIN head := NewObj();
  195. head.mode := Head; head.mnolev := level; head.link := owner;
  196. IF owner # NIL THEN owner.scope := head END ;
  197. head.left := topScope; head.right := NIL; head.scope := NIL; topScope := head
  198. END OpenScope;
  199. PROCEDURE CloseScope*;
  200. BEGIN topScope := topScope.left
  201. END CloseScope;
  202. PROCEDURE Init*(opt: SET);
  203. BEGIN
  204. topScope := universe; OpenScope(0, NIL); SYSimported := FALSE;
  205. GlbMod[0] := topScope; nofGmod := 1;
  206. sfpresent := TRUE; (* !!! *)
  207. symChanges := 0;
  208. infinity.conval.intval := DevCPM.ConstNotAlloc;
  209. depth := 0
  210. END Init;
  211. PROCEDURE Open* (name: Name);
  212. BEGIN
  213. SelfName := name$; topScope.name := NewName(name);
  214. END Open;
  215. PROCEDURE Close*;
  216. VAR i: SHORTINT;
  217. BEGIN (* garbage collection *)
  218. CloseScope;
  219. i := 0; WHILE i < maxImps DO GlbMod[i] := NIL; INC(i) END ;
  220. i := FirstRef; WHILE i < maxStruct DO impCtxt.ref[i] := NIL; impCtxt.old[i] := NIL; INC(i) END
  221. END Close;
  222. PROCEDURE SameType* (x, y: Struct): BOOLEAN;
  223. BEGIN
  224. RETURN (x = y) OR (x.form = y.form) & ~(x.form IN {Pointer, ProcTyp, Comp}) OR (x = undftyp) OR (y = undftyp)
  225. END SameType;
  226. PROCEDURE EqualType* (x, y: Struct): BOOLEAN;
  227. VAR xp, yp: Object; n: INTEGER;
  228. BEGIN
  229. n := 0;
  230. WHILE (n < 100) & (x # y)
  231. & (((x.comp = DynArr) & (y.comp = DynArr) & (x.sysflag = y.sysflag))
  232. OR ((x.form = Pointer) & (y.form = Pointer))
  233. OR ((x.form = ProcTyp) & (y.form = ProcTyp))) DO
  234. IF x.form = ProcTyp THEN
  235. IF x.sysflag # y.sysflag THEN RETURN FALSE END;
  236. xp := x.link; yp := y.link;
  237. INC(depth);
  238. WHILE (xp # NIL) & (yp # NIL) & (xp.mode = yp.mode) & (xp.sysflag = yp.sysflag)
  239. & (xp.vis = yp.vis) & (depth < 100) & EqualType(xp.typ, yp.typ) DO
  240. xp := xp.link; yp := yp.link
  241. END;
  242. DEC(depth);
  243. IF (xp # NIL) OR (yp # NIL) THEN RETURN FALSE END
  244. END;
  245. x := x.BaseTyp; y := y.BaseTyp; INC(n)
  246. END;
  247. RETURN SameType(x, y)
  248. END EqualType;
  249. PROCEDURE Extends* (x, y: Struct): BOOLEAN;
  250. BEGIN
  251. IF (x.form = Pointer) & (y.form = Pointer) THEN x := x.BaseTyp; y := y.BaseTyp END;
  252. IF (x.comp = Record) & (y.comp = Record) THEN
  253. IF (y = anytyp) & ~x.untagged THEN RETURN TRUE END;
  254. WHILE (x # NIL) & (x # undftyp) & (x # y) DO x := x.BaseTyp END
  255. END;
  256. RETURN (x # NIL) & EqualType(x, y)
  257. END Extends;
  258. PROCEDURE Includes* (xform, yform: INTEGER): BOOLEAN;
  259. BEGIN
  260. CASE xform OF
  261. | Char16: RETURN yform IN {Char8, Char16, Int8}
  262. | Int16: RETURN yform IN {Char8, Int8, Int16}
  263. | Int32: RETURN yform IN {Char8, Char16, Int8, Int16, Int32}
  264. | Int64: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64}
  265. | Real32: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64, Real32}
  266. | Real64: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64, Real32, Real64}
  267. | String16: RETURN yform IN {String8, String16}
  268. ELSE RETURN xform = yform
  269. END
  270. END Includes;
  271. PROCEDURE FindImport*(VAR name: Name; mod: Object; VAR res: Object);
  272. VAR obj: Object; (* i: INTEGER; n: Name; *)
  273. BEGIN obj := mod.scope.right;
  274. LOOP
  275. IF obj = NIL THEN EXIT END ;
  276. IF name < obj.name^ THEN obj := obj.left
  277. ELSIF name > obj.name^ THEN obj := obj.right
  278. ELSE (*found*)
  279. IF (obj.mode = Typ) & (obj.vis = internal) THEN obj := NIL
  280. ELSE obj.used := TRUE
  281. END ;
  282. EXIT
  283. END
  284. END ;
  285. res := obj;
  286. (* bh: checks usage of non Unicode WinApi functions and types
  287. IF (res # NIL) & (mod.scope.library # NIL)
  288. & ~(DevCPM.interface IN DevCPM.options)
  289. & (SelfName # "Kernel") & (SelfName # "HostPorts") THEN
  290. n := name + "W";
  291. FindImport(n, mod, obj);
  292. IF obj # NIL THEN
  293. DevCPM.err(733)
  294. ELSE
  295. i := LEN(name$);
  296. IF name[i - 1] = "A" THEN
  297. n[i - 1] := "W"; n[i] := 0X;
  298. FindImport(n, mod, obj);
  299. IF obj # NIL THEN
  300. DevCPM.err(734)
  301. END
  302. END
  303. END
  304. END;
  305. *)
  306. END FindImport;
  307. PROCEDURE Find*(VAR name: Name; VAR res: Object);
  308. VAR obj, head: Object;
  309. BEGIN head := topScope;
  310. LOOP obj := head.right;
  311. LOOP
  312. IF obj = NIL THEN EXIT END ;
  313. IF name < obj.name^ THEN obj := obj.left
  314. ELSIF name > obj.name^ THEN obj := obj.right
  315. ELSE (* found, obj.used not set for local objects *) EXIT
  316. END
  317. END ;
  318. IF obj # NIL THEN EXIT END ;
  319. head := head.left;
  320. IF head = NIL THEN EXIT END
  321. END ;
  322. res := obj
  323. END Find;
  324. PROCEDURE FindFld (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object);
  325. VAR obj: Object;
  326. BEGIN
  327. WHILE (typ # NIL) & (typ # undftyp) DO obj := typ.link;
  328. WHILE obj # NIL DO
  329. IF name < obj.name^ THEN obj := obj.left
  330. ELSIF name > obj.name^ THEN obj := obj.right
  331. ELSE (*found*) res := obj; RETURN
  332. END
  333. END ;
  334. typ := typ.BaseTyp
  335. END;
  336. res := NIL
  337. END FindFld;
  338. PROCEDURE FindField* (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object);
  339. BEGIN
  340. FindFld(name, typ, res);
  341. IF (res = NIL) & ~typ.untagged THEN FindFld(name, anytyp, res) END
  342. END FindField;
  343. PROCEDURE FindBaseField* (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object);
  344. BEGIN
  345. FindFld(name, typ.BaseTyp, res);
  346. IF (res = NIL) & ~typ.untagged THEN FindFld(name, anytyp, res) END
  347. END FindBaseField;
  348. (*
  349. PROCEDURE Rotated (y: Object; name: String): Object;
  350. VAR c, gc: Object;
  351. BEGIN
  352. IF name^ < y.name^ THEN
  353. c := y.left;
  354. IF name^ < c.name^ THEN gc := c.left; c.left := gc.right; gc.right := c
  355. ELSE gc := c.right; c.right := gc.left; gc.left := c
  356. END;
  357. y.left := gc
  358. ELSE
  359. c := y.right;
  360. IF name^ < c.name^ THEN gc := c.left; c.left := gc.right; gc.right := c
  361. ELSE gc := c.right; c.right := gc.left; gc.left := c
  362. END;
  363. y.right := gc
  364. END;
  365. RETURN gc
  366. END Rotated;
  367. PROCEDURE InsertIn (obj, scope: Object; VAR old: Object);
  368. VAR gg, g, p, x: Object; name, sname: String;
  369. BEGIN
  370. sname := scope.name; scope.name := null;
  371. gg := scope; g := gg; p := g; x := p.right; name := obj.name;
  372. WHILE x # NIL DO
  373. IF (x.left # NIL) & (x.right # NIL) & x.left.red & x.right.red THEN
  374. x.red := TRUE; x.left.red := FALSE; x.right.red := FALSE;
  375. IF p.red THEN
  376. g.red := TRUE;
  377. IF (name^ < g.name^) # (name^ < p.name^) THEN p := Rotated(g, name) END;
  378. x := Rotated(gg, name); x.red := FALSE
  379. END
  380. END;
  381. gg := g; g := p; p := x;
  382. IF name^ < x.name^ THEN x := x.left
  383. ELSIF name^ > x.name^ THEN x := x.right
  384. ELSE old := x; scope.right.red := FALSE; scope.name := sname; RETURN
  385. END
  386. END;
  387. x := obj; old := NIL;
  388. IF name^ < p.name^ THEN p.left := x ELSE p.right := x END;
  389. x.red := TRUE;
  390. IF p.red THEN
  391. g.red := TRUE;
  392. IF (name^ < g.name^) # (name^ < p.name^) THEN p := Rotated(g, name) END;
  393. x := Rotated(gg, name);
  394. x.red := FALSE
  395. END;
  396. scope.right.red := FALSE; scope.name := sname
  397. END InsertIn;
  398. *)
  399. PROCEDURE InsertIn (obj, scope: Object; VAR old: Object);
  400. VAR ob0, ob1: Object; left: BOOLEAN; name: String;
  401. BEGIN
  402. ASSERT((scope # NIL) & (scope.mode = Head), 100);
  403. ob0 := scope; ob1 := scope.right; left := FALSE; name := obj.name;
  404. WHILE ob1 # NIL DO
  405. IF name^ < ob1.name^ THEN ob0 := ob1; ob1 := ob1.left; left := TRUE
  406. ELSIF name^ > ob1.name^ THEN ob0 := ob1; ob1 := ob1.right; left := FALSE
  407. ELSE old := ob1; RETURN
  408. END
  409. END;
  410. IF left THEN ob0.left := obj ELSE ob0.right := obj END ;
  411. obj.left := NIL; obj.right := NIL; old := NIL
  412. END InsertIn;
  413. PROCEDURE Insert* (VAR name: Name; VAR obj: Object);
  414. VAR old: Object;
  415. BEGIN
  416. obj := NewObj(); obj.leaf := TRUE;
  417. obj.name := NewName(name);
  418. obj.mnolev := topScope.mnolev;
  419. InsertIn(obj, topScope, old);
  420. IF old # NIL THEN err(1) END (*double def*)
  421. END Insert;
  422. PROCEDURE InsertThisField (obj: Object; typ: Struct; VAR old: Object);
  423. VAR ob0, ob1: Object; left: BOOLEAN; name: String;
  424. BEGIN
  425. IF typ.link = NIL THEN typ.link := obj
  426. ELSE
  427. ob1 := typ.link; name := obj.name;
  428. REPEAT
  429. IF name^ < ob1.name^ THEN ob0 := ob1; ob1 := ob1.left; left := TRUE
  430. ELSIF name^ > ob1.name^ THEN ob0 := ob1; ob1 := ob1.right; left := FALSE
  431. ELSE old := ob1; RETURN
  432. END
  433. UNTIL ob1 = NIL;
  434. IF left THEN ob0.left := obj ELSE ob0.right := obj END
  435. END
  436. END InsertThisField;
  437. PROCEDURE InsertField* (VAR name: Name; typ: Struct; VAR obj: Object);
  438. VAR old: Object;
  439. BEGIN
  440. obj := NewObj(); obj.leaf := TRUE;
  441. obj.name := NewName(name);
  442. InsertThisField(obj, typ, old);
  443. IF old # NIL THEN err(1) END (*double def*)
  444. END InsertField;
  445. (*-------------------------- Fingerprinting --------------------------*)
  446. PROCEDURE FPrintName(VAR fp: INTEGER; VAR name: ARRAY OF SHORTCHAR);
  447. VAR i: SHORTINT; ch: SHORTCHAR;
  448. BEGIN i := 0;
  449. REPEAT ch := name[i]; DevCPM.FPrint(fp, ORD(ch)); INC(i) UNTIL ch = 0X
  450. END FPrintName;
  451. PROCEDURE ^IdFPrint*(typ: Struct);
  452. PROCEDURE FPrintSign*(VAR fp: INTEGER; result: Struct; par: Object);
  453. (* depends on assignment compatibility of params only *)
  454. BEGIN
  455. IdFPrint(result); DevCPM.FPrint(fp, result.idfp);
  456. WHILE par # NIL DO
  457. DevCPM.FPrint(fp, par.mode); IdFPrint(par.typ); DevCPM.FPrint(fp, par.typ.idfp);
  458. IF (par.mode = VarPar) & (par.vis # 0) THEN DevCPM.FPrint(fp, par.vis) END; (* IN / OUT *)
  459. IF par.sysflag # 0 THEN DevCPM.FPrint(fp, par.sysflag) END;
  460. (* par.name and par.adr not considered *)
  461. par := par.link
  462. END
  463. END FPrintSign;
  464. PROCEDURE IdFPrint*(typ: Struct); (* idfp codifies assignment compatibility *)
  465. VAR btyp: Struct; strobj: Object; idfp: INTEGER; f, c: SHORTINT;
  466. BEGIN
  467. IF ~typ.idfpdone THEN
  468. typ.idfpdone := TRUE; (* may be recursive, temporary idfp is 0 in that case *)
  469. idfp := 0; f := typ.form; c := typ.comp; DevCPM.FPrint(idfp, f); DevCPM.FPrint(idfp, c);
  470. btyp := typ.BaseTyp; strobj := typ.strobj;
  471. IF (strobj # NIL) & (strobj.name # null) THEN
  472. FPrintName(idfp, GlbMod[typ.mno].name^); FPrintName(idfp, strobj.name^)
  473. END ;
  474. IF (f = Pointer) OR (c = Record) & (btyp # NIL) OR (c = DynArr) THEN
  475. IdFPrint(btyp); DevCPM.FPrint(idfp, btyp.idfp)
  476. ELSIF c = Array THEN IdFPrint(btyp); DevCPM.FPrint(idfp, btyp.idfp); DevCPM.FPrint(idfp, typ.n)
  477. ELSIF f = ProcTyp THEN FPrintSign(idfp, btyp, typ.link)
  478. END ;
  479. typ.idfp := idfp
  480. END
  481. END IdFPrint;
  482. PROCEDURE FPrintStr*(typ: Struct);
  483. VAR f, c: SHORTINT; btyp: Struct; strobj, bstrobj: Object; pbfp, pvfp: INTEGER;
  484. PROCEDURE ^FPrintFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  485. PROCEDURE FPrintHdFld(typ: Struct; fld: Object; adr: INTEGER); (* modifies pvfp only *)
  486. VAR i, j, n: INTEGER; btyp: Struct;
  487. BEGIN
  488. IF typ.comp = Record THEN FPrintFlds(typ.link, adr, FALSE)
  489. ELSIF typ.comp = Array THEN btyp := typ.BaseTyp; n := typ.n;
  490. WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ;
  491. IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN
  492. j := nofhdfld; FPrintHdFld(btyp, fld, adr);
  493. IF j # nofhdfld THEN i := 1;
  494. WHILE (i < n) (* & (nofhdfld <= DevCPM.MaxHdFld) *) DO (* !!! *)
  495. INC(adr, btyp.size); FPrintHdFld(btyp, fld, adr); INC(i)
  496. END
  497. END
  498. END
  499. ELSIF DevCPM.ExpHdPtrFld &
  500. ((typ.form = Pointer) & ~typ.untagged OR (fld.name^ = DevCPM.HdPtrName)) THEN (* !!! *)
  501. DevCPM.FPrint(pvfp, Pointer); DevCPM.FPrint(pvfp, adr); INC(nofhdfld)
  502. ELSIF DevCPM.ExpHdUtPtrFld &
  503. ((typ.form = Pointer) & typ.untagged OR (fld.name^ = DevCPM.HdUtPtrName)) THEN (* !!! *)
  504. DevCPM.FPrint(pvfp, Pointer); DevCPM.FPrint(pvfp, adr); INC(nofhdfld);
  505. IF typ.form = Pointer THEN DevCPM.FPrint(pvfp, typ.sysflag) ELSE DevCPM.FPrint(pvfp, fld.sysflag) END
  506. ELSIF DevCPM.ExpHdProcFld & ((typ.form = ProcTyp) OR (fld.name^ = DevCPM.HdProcName)) THEN
  507. DevCPM.FPrint(pvfp, ProcTyp); DevCPM.FPrint(pvfp, adr); INC(nofhdfld)
  508. END
  509. END FPrintHdFld;
  510. PROCEDURE FPrintFlds(fld: Object; adr: INTEGER; visible: BOOLEAN); (* modifies pbfp and pvfp *)
  511. BEGIN
  512. WHILE (fld # NIL) & (fld.mode = Fld) DO
  513. IF (fld.vis # internal) & visible THEN
  514. DevCPM.FPrint(pbfp, fld.vis); FPrintName(pbfp, fld.name^); DevCPM.FPrint(pbfp, fld.adr);
  515. FPrintStr(fld.typ); DevCPM.FPrint(pbfp, fld.typ.pbfp); DevCPM.FPrint(pvfp, fld.typ.pvfp)
  516. ELSE FPrintHdFld(fld.typ, fld, fld.adr + adr)
  517. END ;
  518. fld := fld.link
  519. END
  520. END FPrintFlds;
  521. PROCEDURE FPrintTProcs(obj: Object); (* modifies pbfp and pvfp *)
  522. BEGIN
  523. IF obj # NIL THEN
  524. FPrintTProcs(obj.left);
  525. IF obj.mode = TProc THEN
  526. IF obj.vis # internal THEN
  527. IF obj.vis = externalR THEN DevCPM.FPrint(pbfp, externalR) END;
  528. IF limAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, limAttr)
  529. ELSIF absAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, absAttr)
  530. ELSIF empAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, empAttr)
  531. ELSIF extAttr IN obj.conval.setval THEN DevCPM.FPrint(pbfp, extAttr)
  532. END;
  533. DevCPM.FPrint(pbfp, TProc); DevCPM.FPrint(pbfp, obj.num);
  534. FPrintSign(pbfp, obj.typ, obj.link); FPrintName(pbfp, obj.name^);
  535. IF obj.entry # NIL THEN FPrintName(pbfp, obj.entry^) END
  536. ELSIF DevCPM.ExpHdTProc THEN
  537. DevCPM.FPrint(pvfp, TProc); DevCPM.FPrint(pvfp, obj.num)
  538. END
  539. END;
  540. FPrintTProcs(obj.right)
  541. END
  542. END FPrintTProcs;
  543. BEGIN
  544. IF ~typ.fpdone THEN
  545. IdFPrint(typ); pbfp := typ.idfp;
  546. IF typ.sysflag # 0 THEN DevCPM.FPrint(pbfp, typ.sysflag) END;
  547. IF typ.ext # NIL THEN FPrintName(pbfp, typ.ext^) END;
  548. IF typ.attribute # 0 THEN DevCPM.FPrint(pbfp, typ.attribute) END;
  549. pvfp := pbfp; typ.pbfp := pbfp; typ.pvfp := pvfp; (* initial fprints may be used recursively *)
  550. typ.fpdone := TRUE;
  551. f := typ.form; c := typ.comp; btyp := typ.BaseTyp;
  552. IF f = Pointer THEN
  553. strobj := typ.strobj; bstrobj := btyp.strobj;
  554. IF (strobj = NIL) OR (strobj.name = null) OR (bstrobj = NIL) OR (bstrobj.name = null) THEN
  555. FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); pvfp := pbfp
  556. (* else use idfp as pbfp and as pvfp, do not call FPrintStr(btyp) here, else cycle not broken *)
  557. END
  558. ELSIF f = ProcTyp THEN (* use idfp as pbfp and as pvfp *)
  559. ELSIF c IN {Array, DynArr} THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pvfp); pvfp := pbfp
  560. ELSE (* c = Record *)
  561. IF btyp # NIL THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); DevCPM.FPrint(pvfp, btyp.pvfp) END ;
  562. DevCPM.FPrint(pvfp, typ.size); DevCPM.FPrint(pvfp, typ.align); DevCPM.FPrint(pvfp, typ.n);
  563. nofhdfld := 0; FPrintFlds(typ.link, 0, TRUE);
  564. (*
  565. IF nofhdfld > DevCPM.MaxHdFld THEN DevCPM.Mark(225, typ.txtpos) END ;
  566. *)
  567. FPrintTProcs(typ.link); DevCPM.FPrint(pvfp, pbfp); strobj := typ.strobj;
  568. IF (strobj = NIL) OR (strobj.name = null) THEN pbfp := pvfp END
  569. END ;
  570. typ.pbfp := pbfp; typ.pvfp := pvfp
  571. END
  572. END FPrintStr;
  573. PROCEDURE FPrintObj*(obj: Object);
  574. VAR fprint: INTEGER; f, m: SHORTINT; rval: SHORTREAL; ext: ConstExt; mod: Object; r: REAL; x: INTEGER;
  575. BEGIN
  576. IF ~obj.fpdone THEN
  577. fprint := 0; obj.fpdone := TRUE;
  578. DevCPM.FPrint(fprint, obj.mode);
  579. IF obj.mode = Con THEN
  580. f := obj.typ.form; DevCPM.FPrint(fprint, f);
  581. CASE f OF
  582. | Bool, Char8, Char16, Int8, Int16, Int32:
  583. DevCPM.FPrint(fprint, obj.conval.intval)
  584. | Int64:
  585. x := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4294967296.0));
  586. r := obj.conval.realval + obj.conval.intval - x * 4294967296.0;
  587. IF r > MAX(INTEGER) THEN r := r - 4294967296.0 END;
  588. DevCPM.FPrint(fprint, SHORT(ENTIER(r)));
  589. DevCPM.FPrint(fprint, x)
  590. | Set:
  591. DevCPM.FPrintSet(fprint, obj.conval.setval)
  592. | Real32:
  593. rval := SHORT(obj.conval.realval); DevCPM.FPrintReal(fprint, rval)
  594. | Real64:
  595. DevCPM.FPrintLReal(fprint, obj.conval.realval)
  596. | String8, String16:
  597. FPrintName(fprint, obj.conval.ext^)
  598. | NilTyp:
  599. ELSE err(127)
  600. END
  601. ELSIF obj.mode = Var THEN
  602. DevCPM.FPrint(fprint, obj.vis); FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp)
  603. ELSIF obj.mode IN {XProc, IProc} THEN
  604. FPrintSign(fprint, obj.typ, obj.link)
  605. ELSIF obj.mode = CProc THEN
  606. FPrintSign(fprint, obj.typ, obj.link); ext := obj.conval.ext;
  607. m := ORD(ext^[0]); f := 1; DevCPM.FPrint(fprint, m);
  608. WHILE f <= m DO DevCPM.FPrint(fprint, ORD(ext^[f])); INC(f) END
  609. ELSIF obj.mode = Typ THEN
  610. FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp)
  611. END ;
  612. IF obj.sysflag < 0 THEN DevCPM.FPrint(fprint, obj.sysflag) END;
  613. IF obj.mode IN {LProc, XProc, CProc, Var, Typ, Con} THEN
  614. IF obj.library # NIL THEN
  615. FPrintName(fprint, obj.library^)
  616. ELSIF obj.mnolev < 0 THEN
  617. mod := GlbMod[-obj.mnolev];
  618. IF (mod.library # NIL) THEN
  619. FPrintName(fprint, mod.library^)
  620. END
  621. ELSIF obj.mnolev = 0 THEN
  622. IF libName # "" THEN FPrintName(fprint, libName) END
  623. END;
  624. IF obj.entry # NIL THEN FPrintName(fprint, obj.entry^) END
  625. END;
  626. obj.fprint := fprint
  627. END
  628. END FPrintObj;
  629. PROCEDURE FPrintErr* (obj: Object; errno: SHORTINT); (* !!! *)
  630. CONST
  631. nl = 0DX;
  632. BEGIN
  633. IF errno = 249 THEN
  634. DevCPM.errorMes := DevCPM.errorMes + nl + " ";
  635. DevCPM.errorMes := DevCPM.errorMes + GlbMod[-obj.mnolev].name^;
  636. DevCPM.errorMes := DevCPM.errorMes + "." + obj.name^;
  637. DevCPM.errorMes := DevCPM.errorMes +" is not consistently imported";
  638. err(249)
  639. ELSIF obj = NIL THEN (* changed module sys flags *)
  640. IF ~symNew & sfpresent THEN
  641. DevCPM.errorMes := DevCPM.errorMes + nl + " changed library flag"
  642. END
  643. ELSIF obj.mnolev = 0 THEN (* don't report changes in imported modules *)
  644. IF sfpresent THEN
  645. IF symChanges < 20 THEN
  646. DevCPM.errorMes := DevCPM.errorMes + nl + " " + obj.name^;
  647. IF errno = 250 THEN DevCPM.errorMes := DevCPM.errorMes + " is no longer in symbol file"
  648. ELSIF errno = 251 THEN DevCPM.errorMes := DevCPM.errorMes + " is redefined internally "
  649. ELSIF errno = 252 THEN DevCPM.errorMes := DevCPM.errorMes + " is redefined"
  650. ELSIF errno = 253 THEN DevCPM.errorMes := DevCPM.errorMes + " is new in symbol file"
  651. END
  652. ELSIF symChanges = 20 THEN
  653. DevCPM.errorMes := DevCPM.errorMes + nl + " ..."
  654. END;
  655. INC(symChanges)
  656. ELSIF (errno = 253) & ~symExtended THEN
  657. DevCPM.errorMes := DevCPM.errorMes + nl + " new symbol file"
  658. END
  659. END;
  660. IF errno = 253 THEN symExtended := TRUE ELSE symNew := TRUE END
  661. END FPrintErr;
  662. (*-------------------------- Import --------------------------*)
  663. PROCEDURE InName(VAR name: String);
  664. VAR i: SHORTINT; ch: SHORTCHAR; n: Name;
  665. BEGIN i := 0;
  666. REPEAT
  667. DevCPM.SymRCh(ch); n[i] := ch; INC(i)
  668. UNTIL ch = 0X;
  669. IF i > 1 THEN NEW(name, i); name^ := n$ ELSE name := null END
  670. END InName;
  671. PROCEDURE InMod(tag: INTEGER; VAR mno: BYTE); (* mno is global *)
  672. VAR head: Object; name: String; mn: INTEGER; i: BYTE; lib: String;
  673. BEGIN
  674. IF tag = 0 THEN mno := impCtxt.glbmno[0]
  675. ELSIF tag > 0 THEN
  676. lib := NIL;
  677. IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END;
  678. ASSERT(tag = Smname);
  679. InName(name);
  680. IF (name^ = SelfName) & ~impCtxt.self & ~(DevCPM.interface IN DevCPM.options) THEN err(154) END ;
  681. i := 0;
  682. WHILE (i < nofGmod) & (name^ # GlbMod[i].name^) DO INC(i) END ;
  683. IF i < nofGmod THEN mno := i (*module already present*)
  684. ELSE
  685. head := NewObj(); head.mode := Head; head.name := name;
  686. mno := nofGmod; head.mnolev := SHORT(SHORT(-mno));
  687. head.library := lib;
  688. IF nofGmod < maxImps THEN
  689. GlbMod[mno] := head; INC(nofGmod)
  690. ELSE err(227)
  691. END
  692. END ;
  693. impCtxt.glbmno[impCtxt.nofm] := mno; INC(impCtxt.nofm)
  694. ELSE
  695. mno := impCtxt.glbmno[-tag]
  696. END
  697. END InMod;
  698. PROCEDURE InConstant(f: INTEGER; conval: Const);
  699. VAR ch, ch1: SHORTCHAR; ext, t: ConstExt; rval: SHORTREAL; r, s: REAL; i, x, y: INTEGER; str: Name;
  700. BEGIN
  701. CASE f OF
  702. | Byte, Char8, Bool:
  703. DevCPM.SymRCh(ch); conval.intval := ORD(ch)
  704. | Char16:
  705. DevCPM.SymRCh(ch); conval.intval := ORD(ch);
  706. DevCPM.SymRCh(ch); conval.intval := conval.intval + ORD(ch) * 256
  707. | Int8, Int16, Int32:
  708. conval.intval := DevCPM.SymRInt()
  709. | Int64:
  710. DevCPM.SymRCh(ch); x := 0; y := 1; r := 0; s := 268435456 (*2^28*);
  711. WHILE (y < 268435456 (*2^28*)) & (ch >= 80X) DO
  712. x := x + (ORD(ch) - 128) * y; y := y * 128; DevCPM.SymRCh(ch)
  713. END;
  714. WHILE ch >= 80X DO r := r + (ORD(ch) - 128) * s; s := s * 128; DevCPM.SymRCh(ch) END;
  715. conval.realval := r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s;
  716. conval.intval := SHORT(ENTIER(r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s - conval.realval))
  717. | Set:
  718. DevCPM.SymRSet(conval.setval)
  719. | Real32:
  720. DevCPM.SymRReal(rval); conval.realval := rval;
  721. conval.intval := DevCPM.ConstNotAlloc
  722. | Real64:
  723. DevCPM.SymRLReal(conval.realval);
  724. conval.intval := DevCPM.ConstNotAlloc
  725. | String8, String16:
  726. i := 0;
  727. REPEAT
  728. DevCPM.SymRCh(ch);
  729. IF i < LEN(str) - 1 THEN str[i] := ch
  730. ELSIF i = LEN(str) - 1 THEN str[i] := 0X; NEW(ext, 2 * LEN(str)); ext^ := str$; ext[i] := ch
  731. ELSIF i < LEN(ext^) - 1 THEN ext[i] := ch
  732. ELSE t := ext; t[i] := 0X; NEW(ext, 2 * LEN(t^)); ext^ := t^$; ext[i] := ch
  733. END;
  734. INC(i)
  735. UNTIL ch = 0X;
  736. IF i < LEN(str) THEN NEW(ext, i); ext^ := str$ END;
  737. conval.ext := ext; conval.intval := DevCPM.ConstNotAlloc;
  738. IF f = String8 THEN conval.intval2 := i
  739. ELSE
  740. i := 0; y := 0;
  741. REPEAT DevCPM.GetUtf8(ext^, x, i); INC(y) UNTIL x = 0;
  742. conval.intval2 := y
  743. END
  744. (*
  745. ext := NewExt(); conval.ext := ext; i := 0;
  746. REPEAT
  747. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i)
  748. UNTIL ch = 0X;
  749. conval.intval2 := i;
  750. conval.intval := DevCPM.ConstNotAlloc
  751. | String16:
  752. ext := NewExt(); conval.ext := ext; i := 0;
  753. REPEAT
  754. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i);
  755. DevCPM.SymRCh(ch1); ext^[i] := ch1; INC(i)
  756. UNTIL (ch = 0X) & (ch1 = 0X);
  757. conval.intval2 := i;
  758. conval.intval := DevCPM.ConstNotAlloc
  759. *)
  760. | NilTyp:
  761. conval.intval := 0
  762. (*
  763. | Guid:
  764. ext := NewExt(); conval.ext := ext; i := 0;
  765. WHILE i < 16 DO
  766. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i)
  767. END;
  768. ext[16] := 0X;
  769. conval.intval2 := 16;
  770. conval.intval := DevCPM.ConstNotAlloc;
  771. *)
  772. END
  773. END InConstant;
  774. PROCEDURE ^InStruct(VAR typ: Struct);
  775. PROCEDURE InSign(mno: BYTE; VAR res: Struct; VAR par: Object);
  776. VAR last, new: Object; tag: INTEGER;
  777. BEGIN
  778. InStruct(res);
  779. tag := DevCPM.SymRInt(); last := NIL;
  780. WHILE tag # Send DO
  781. new := NewObj(); new.mnolev := SHORT(SHORT(-mno));
  782. IF last = NIL THEN par := new ELSE last.link := new END ;
  783. IF tag = Ssys THEN
  784. new.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt();
  785. IF ODD(new.sysflag DIV inBit) THEN new.vis := inPar
  786. ELSIF ODD(new.sysflag DIV inBit) THEN new.vis := outPar
  787. END
  788. END;
  789. IF tag = Svalpar THEN new.mode := Var
  790. ELSE new.mode := VarPar;
  791. IF tag = Sinpar THEN new.vis := inPar
  792. ELSIF tag = Soutpar THEN new.vis := outPar
  793. END
  794. END ;
  795. InStruct(new.typ); new.adr := DevCPM.SymRInt(); InName(new.name);
  796. last := new; tag := DevCPM.SymRInt()
  797. END
  798. END InSign;
  799. PROCEDURE InFld(): Object; (* first number in impCtxt.nextTag, mno set outside *)
  800. VAR tag: INTEGER; obj: Object;
  801. BEGIN
  802. tag := impCtxt.nextTag; obj := NewObj();
  803. IF tag <= Srfld THEN
  804. obj.mode := Fld;
  805. IF tag = Srfld THEN obj.vis := externalR ELSE obj.vis := external END ;
  806. InStruct(obj.typ); InName(obj.name);
  807. obj.adr := DevCPM.SymRInt()
  808. ELSE
  809. obj.mode := Fld;
  810. IF tag = Shdptr THEN obj.name := NewName(DevCPM.HdPtrName)
  811. ELSIF tag = Shdutptr THEN obj.name := NewName(DevCPM.HdUtPtrName); (* !!! *)
  812. obj.sysflag := 1
  813. ELSIF tag = Ssys THEN
  814. obj.name := NewName(DevCPM.HdUtPtrName); obj.sysflag := SHORT(SHORT(DevCPM.SymRInt()))
  815. ELSE obj.name := NewName(DevCPM.HdProcName)
  816. END;
  817. obj.typ := undftyp; obj.vis := internal;
  818. obj.adr := DevCPM.SymRInt()
  819. END;
  820. RETURN obj
  821. END InFld;
  822. PROCEDURE InTProc(mno: BYTE): Object; (* first number in impCtxt.nextTag *)
  823. VAR tag: INTEGER; obj: Object;
  824. BEGIN
  825. tag := impCtxt.nextTag;
  826. obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno));
  827. IF tag = Shdtpro THEN
  828. obj.mode := TProc; obj.name := NewName(DevCPM.HdTProcName);
  829. obj.link := NewObj(); (* dummy, easier in Browser *)
  830. obj.typ := undftyp; obj.vis := internal;
  831. obj.num := DevCPM.SymRInt()
  832. ELSE
  833. obj.vis := external;
  834. IF tag = Simpo THEN obj.vis := externalR; tag := DevCPM.SymRInt() END;
  835. obj.mode := TProc; obj.conval := NewConst(); obj.conval.intval := -1;
  836. IF tag = Sentry THEN InName(obj.entry); tag := DevCPM.SymRInt() END;
  837. InSign(mno, obj.typ, obj.link); InName(obj.name);
  838. obj.num := DevCPM.SymRInt();
  839. IF tag = Slimpro THEN INCL(obj.conval.setval, limAttr)
  840. ELSIF tag = Sabspro THEN INCL(obj.conval.setval, absAttr)
  841. ELSIF tag = Semppro THEN INCL(obj.conval.setval, empAttr)
  842. ELSIF tag = Sextpro THEN INCL(obj.conval.setval, extAttr)
  843. END
  844. END ;
  845. RETURN obj
  846. END InTProc;
  847. PROCEDURE InStruct(VAR typ: Struct);
  848. VAR mno: BYTE; ref: SHORTINT; tag: INTEGER; name: String;
  849. t: Struct; obj, last, fld, old, dummy: Object;
  850. BEGIN
  851. tag := DevCPM.SymRInt();
  852. IF tag # Sstruct THEN
  853. tag := -tag;
  854. IF (version = 0) & (tag >= FirstRef0) THEN tag := tag + FirstRef - FirstRef0 END; (* correction for new FirstRef *)
  855. typ := impCtxt.ref[tag]
  856. ELSE
  857. ref := impCtxt.nofr; INC(impCtxt.nofr);
  858. IF ref < impCtxt.minr THEN impCtxt.minr := ref END ;
  859. tag := DevCPM.SymRInt();
  860. InMod(tag, mno); InName(name); obj := NewObj();
  861. IF name = null THEN
  862. IF impCtxt.self THEN old := NIL (* do not insert type desc anchor here, but in OPL *)
  863. ELSE obj.name := NewName("@"); InsertIn(obj, GlbMod[mno], old(*=NIL*)); obj.name := null
  864. END ;
  865. typ := NewStr(Undef, Basic)
  866. ELSE obj.name := name; InsertIn(obj, GlbMod[mno], old);
  867. IF old # NIL THEN (* recalculate fprints to compare with old fprints *)
  868. FPrintObj(old); impCtxt.pvfp[ref] := old.typ.pvfp;
  869. IF impCtxt.self THEN (* do not overwrite old typ *)
  870. typ := NewStr(Undef, Basic)
  871. ELSE (* overwrite old typ for compatibility reason *)
  872. typ := old.typ; typ.link := NIL; typ.sysflag := 0; typ.ext := NIL;
  873. typ.fpdone := FALSE; typ.idfpdone := FALSE
  874. END
  875. ELSE typ := NewStr(Undef, Basic)
  876. END
  877. END ;
  878. impCtxt.ref[ref] := typ; impCtxt.old[ref] := old; typ.ref := SHORT(ref + maxStruct);
  879. (* ref >= maxStruct: not exported yet, ref used for err 155 *)
  880. typ.mno := mno; typ.allocated := TRUE;
  881. typ.strobj := obj; obj.mode := Typ; obj.typ := typ;
  882. obj.mnolev := SHORT(SHORT(-mno)); obj.vis := internal; (* name not visible here *)
  883. tag := DevCPM.SymRInt();
  884. IF tag = Ssys THEN
  885. typ.sysflag := SHORT(DevCPM.SymRInt()); tag := DevCPM.SymRInt()
  886. END;
  887. typ.untagged := typ.sysflag > 0;
  888. IF tag = Slib THEN
  889. InName(obj.library); tag := DevCPM.SymRInt()
  890. END;
  891. IF tag = Sentry THEN
  892. InName(obj.entry); tag := DevCPM.SymRInt()
  893. END;
  894. IF tag = String8 THEN
  895. InName(typ.ext); tag := DevCPM.SymRInt()
  896. END;
  897. CASE tag OF
  898. | Sptr:
  899. typ.form := Pointer; typ.size := DevCPM.PointerSize; typ.n := 0; InStruct(typ.BaseTyp)
  900. | Sarr:
  901. typ.form := Comp; typ.comp := Array; InStruct(typ.BaseTyp); typ.n := DevCPM.SymRInt();
  902. typ.size := typ.n * typ.BaseTyp.size (* !!! *)
  903. | Sdarr:
  904. typ.form := Comp; typ.comp := DynArr; InStruct(typ.BaseTyp);
  905. IF typ.BaseTyp.comp = DynArr THEN typ.n := typ.BaseTyp.n + 1
  906. ELSE typ.n := 0
  907. END ;
  908. typ.size := DevCPM.DArrSizeA + DevCPM.DArrSizeB * typ.n; (* !!! *)
  909. IF typ.untagged THEN typ.size := DevCPM.PointerSize END
  910. | Srec, Sabsrec, Slimrec, Sextrec:
  911. typ.form := Comp; typ.comp := Record; InStruct(typ.BaseTyp);
  912. (* correction by ETH 18.1.96 *)
  913. IF typ.BaseTyp = notyp THEN typ.BaseTyp := NIL END;
  914. typ.extlev := 0; t := typ.BaseTyp;
  915. WHILE (t # NIL) & (t.comp = Record) DO INC(typ.extlev); t := t.BaseTyp END;
  916. typ.size := DevCPM.SymRInt(); typ.align := DevCPM.SymRInt();
  917. typ.n := DevCPM.SymRInt();
  918. IF tag = Sabsrec THEN typ.attribute := absAttr
  919. ELSIF tag = Slimrec THEN typ.attribute := limAttr
  920. ELSIF tag = Sextrec THEN typ.attribute := extAttr
  921. END;
  922. impCtxt.nextTag := DevCPM.SymRInt(); last := NIL;
  923. WHILE (impCtxt.nextTag >= Sfld) & (impCtxt.nextTag <= Shdpro)
  924. OR (impCtxt.nextTag = Shdutptr) OR (impCtxt.nextTag = Ssys) DO
  925. fld := InFld(); fld.mnolev := SHORT(SHORT(-mno));
  926. IF last # NIL THEN last.link := fld END ;
  927. last := fld;
  928. InsertThisField(fld, typ, dummy);
  929. impCtxt.nextTag := DevCPM.SymRInt()
  930. END ;
  931. WHILE impCtxt.nextTag # Send DO fld := InTProc(mno);
  932. InsertThisField(fld, typ, dummy);
  933. impCtxt.nextTag := DevCPM.SymRInt()
  934. END
  935. | Spro:
  936. typ.form := ProcTyp; typ.size := DevCPM.ProcSize; InSign(mno, typ.BaseTyp, typ.link)
  937. | Salias:
  938. InStruct(t);
  939. typ.form := t.form; typ.comp := Basic; typ.size := t.size;
  940. typ.pbfp := t.pbfp; typ.pvfp := t.pvfp; typ.fpdone := TRUE;
  941. typ.idfp := t.idfp; typ.idfpdone := TRUE; typ.BaseTyp := t
  942. END ;
  943. IF ref = impCtxt.minr THEN
  944. WHILE ref < impCtxt.nofr DO
  945. t := impCtxt.ref[ref]; FPrintStr(t);
  946. obj := t.strobj; (* obj.typ.strobj = obj, else obj.fprint differs (alias) *)
  947. IF obj.name # null THEN FPrintObj(obj) END ;
  948. old := impCtxt.old[ref];
  949. IF old # NIL THEN t.strobj := old; (* restore strobj *)
  950. IF impCtxt.self THEN
  951. IF old.mnolev < 0 THEN
  952. IF old.history # inconsistent THEN
  953. IF old.fprint # obj.fprint THEN old.history := pbmodified
  954. ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified
  955. END
  956. (* ELSE remain inconsistent *)
  957. END
  958. ELSIF old.fprint # obj.fprint THEN old.history := pbmodified
  959. ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified
  960. ELSIF old.vis = internal THEN old.history := same (* may be changed to "removed" in InObj *)
  961. ELSE old.history := inserted (* may be changed to "same" in InObj *)
  962. END
  963. ELSE
  964. (* check private part, delay error message until really used *)
  965. IF impCtxt.pvfp[ref] # t.pvfp THEN old.history := inconsistent END ;
  966. IF old.fprint # obj.fprint THEN FPrintErr(old, 249) END
  967. END
  968. ELSIF impCtxt.self THEN obj.history := removed
  969. ELSE obj.history := same
  970. END ;
  971. INC(ref)
  972. END ;
  973. impCtxt.minr := maxStruct
  974. END
  975. END
  976. END InStruct;
  977. PROCEDURE InObj(mno: BYTE): Object; (* first number in impCtxt.nextTag *)
  978. VAR ch: SHORTCHAR; obj, old: Object; typ: Struct;
  979. tag, i, s: INTEGER; ext: ConstExt;
  980. BEGIN
  981. tag := impCtxt.nextTag;
  982. IF tag = Stype THEN
  983. InStruct(typ); obj := typ.strobj;
  984. IF ~impCtxt.self THEN obj.vis := external END (* type name visible now, obj.fprint already done *)
  985. ELSE
  986. obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno)); obj.vis := external;
  987. IF tag = Ssys THEN obj.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt() END;
  988. IF tag = Slib THEN
  989. InName(obj.library); tag := DevCPM.SymRInt()
  990. END;
  991. IF tag = Sentry THEN
  992. InName(obj.entry); tag := DevCPM.SymRInt()
  993. END;
  994. IF tag >= Sxpro THEN
  995. IF obj.conval = NIL THEN obj.conval := NewConst() END;
  996. obj.conval.intval := -1;
  997. InSign(mno, obj.typ, obj.link);
  998. CASE tag OF
  999. | Sxpro: obj.mode := XProc
  1000. | Sipro: obj.mode := IProc
  1001. | Scpro: obj.mode := CProc;
  1002. s := DevCPM.SymRInt();
  1003. NEW(ext, s + 1); obj.conval.ext := ext;
  1004. ext^[0] := SHORT(CHR(s)); i := 1;
  1005. WHILE i <= s DO DevCPM.SymRCh(ext^[i]); INC(i) END
  1006. END
  1007. ELSIF tag = Salias THEN
  1008. obj.mode := Typ; InStruct(obj.typ)
  1009. ELSIF (tag = Svar) OR (tag = Srvar) THEN
  1010. obj.mode := Var;
  1011. IF tag = Srvar THEN obj.vis := externalR END ;
  1012. InStruct(obj.typ)
  1013. ELSE (* Constant *)
  1014. obj.conval := NewConst(); InConstant(tag, obj.conval);
  1015. IF (tag = Int8) OR (tag = Int16) THEN tag := Int32 END;
  1016. obj.mode := Con; obj.typ := impCtxt.ref[tag];
  1017. END ;
  1018. InName(obj.name)
  1019. END ;
  1020. FPrintObj(obj);
  1021. IF (obj.mode = Var) & ((obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null)) THEN
  1022. (* compute a global fingerprint to avoid structural type equivalence for anonymous types *)
  1023. DevCPM.FPrint(impCtxt.reffp, obj.typ.ref - maxStruct)
  1024. END ;
  1025. IF tag # Stype THEN
  1026. InsertIn(obj, GlbMod[mno], old);
  1027. IF impCtxt.self THEN
  1028. IF old # NIL THEN
  1029. (* obj is from old symbol file, old is new declaration *)
  1030. IF old.vis = internal THEN old.history := removed
  1031. ELSE FPrintObj(old); FPrintStr(old.typ); (* FPrint(obj) already called *)
  1032. IF obj.fprint # old.fprint THEN old.history := pbmodified
  1033. ELSIF obj.typ.pvfp # old.typ.pvfp THEN old.history := pvmodified
  1034. ELSE old.history := same
  1035. END
  1036. END
  1037. ELSE obj.history := removed (* OutObj not called if mnolev < 0 *)
  1038. END
  1039. (* ELSE old = NIL, or file read twice, consistent, OutObj not called *)
  1040. END
  1041. ELSE (* obj already inserted in InStruct *)
  1042. IF impCtxt.self THEN (* obj.mnolev = 0 *)
  1043. IF obj.vis = internal THEN obj.history := removed
  1044. ELSIF obj.history = inserted THEN obj.history := same
  1045. END
  1046. (* ELSE OutObj not called for obj with mnolev < 0 *)
  1047. END
  1048. END ;
  1049. RETURN obj
  1050. END InObj;
  1051. PROCEDURE Import*(aliasName: Name; VAR name: Name; VAR done: BOOLEAN);
  1052. VAR obj, h: Object; mno: BYTE; tag, p: INTEGER; lib: String; (* done used in Browser *)
  1053. BEGIN
  1054. IF name = "SYSTEM" THEN
  1055. SYSimported := TRUE;
  1056. p := processor;
  1057. IF (p < 10) OR (p > 30) THEN p := DevCPM.sysImp END;
  1058. INCL(DevCPM.options, p); (* for sysflag handling *)
  1059. Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := syslink; obj.typ := notyp;
  1060. h := NewObj(); h.mode := Head; h.right := syslink; obj.scope := h
  1061. ELSIF name = "COM" THEN
  1062. IF DevCPM.comAware IN DevCPM.options THEN
  1063. INCL(DevCPM.options, DevCPM.com); (* for sysflag handling *)
  1064. Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := comlink; obj.typ := notyp;
  1065. h := NewObj(); h.mode := Head; h.right := comlink; obj.scope := h;
  1066. ELSE err(151)
  1067. END;
  1068. ELSIF name = "JAVA" THEN
  1069. INCL(DevCPM.options, DevCPM.java)
  1070. ELSE
  1071. impCtxt.nofr := FirstRef; impCtxt.minr := maxStruct; impCtxt.nofm := 0;
  1072. impCtxt.self := aliasName = "@self"; impCtxt.reffp := 0;
  1073. DevCPM.OldSym(name, done);
  1074. IF done THEN
  1075. lib := NIL;
  1076. impProc := SHORT(DevCPM.SymRInt());
  1077. IF (impProc # 0) & (processor # 0) & (impProc # processor) THEN err(151) END;
  1078. tag := DevCPM.SymRInt();
  1079. IF tag < Smname THEN version := tag; tag := DevCPM.SymRInt()
  1080. ELSE version := 0
  1081. END;
  1082. IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END;
  1083. InMod(tag, mno);
  1084. IF (name[0] # "@") & (GlbMod[mno].name^ # name) THEN (* symbol file name conflict *)
  1085. GlbMod[mno] := NIL; nofGmod := mno; DEC(impCtxt.nofm);
  1086. DevCPM.CloseOldSym; done := FALSE
  1087. END;
  1088. END;
  1089. IF done THEN
  1090. GlbMod[mno].library := lib;
  1091. impCtxt.nextTag := DevCPM.SymRInt();
  1092. WHILE ~DevCPM.eofSF() DO
  1093. obj := InObj(mno); impCtxt.nextTag := DevCPM.SymRInt()
  1094. END ;
  1095. Insert(aliasName, obj);
  1096. obj.mode := Mod; obj.scope := GlbMod[mno](*.right*);
  1097. GlbMod[mno].link := obj;
  1098. obj.mnolev := SHORT(SHORT(-mno)); obj.typ := notyp;
  1099. DevCPM.CloseOldSym
  1100. ELSIF impCtxt.self THEN
  1101. sfpresent := FALSE
  1102. ELSE err(152) (*sym file not found*)
  1103. END
  1104. END
  1105. END Import;
  1106. (*-------------------------- Export --------------------------*)
  1107. PROCEDURE OutName(VAR name: ARRAY OF SHORTCHAR);
  1108. VAR i: SHORTINT; ch: SHORTCHAR;
  1109. BEGIN i := 0;
  1110. REPEAT ch := name[i]; DevCPM.SymWCh(ch); INC(i) UNTIL ch = 0X
  1111. END OutName;
  1112. PROCEDURE OutMod(mno: SHORTINT);
  1113. VAR mod: Object;
  1114. BEGIN
  1115. IF expCtxt.locmno[mno] < 0 THEN (* new mod *)
  1116. mod := GlbMod[mno];
  1117. IF mod.library # NIL THEN
  1118. DevCPM.SymWInt(Slib); OutName(mod.library^)
  1119. END;
  1120. DevCPM.SymWInt(Smname);
  1121. expCtxt.locmno[mno] := expCtxt.nofm; INC(expCtxt.nofm);
  1122. OutName(mod.name^)
  1123. ELSE DevCPM.SymWInt(-expCtxt.locmno[mno])
  1124. END
  1125. END OutMod;
  1126. PROCEDURE ^OutStr(typ: Struct);
  1127. PROCEDURE ^OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  1128. PROCEDURE OutHdFld(typ: Struct; fld: Object; adr: INTEGER);
  1129. VAR i, j, n: INTEGER; btyp: Struct;
  1130. BEGIN
  1131. IF typ.comp = Record THEN OutFlds(typ.link, adr, FALSE)
  1132. ELSIF typ.comp = Array THEN btyp := typ.BaseTyp; n := typ.n;
  1133. WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ;
  1134. IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN
  1135. j := nofhdfld; OutHdFld(btyp, fld, adr);
  1136. IF j # nofhdfld THEN i := 1;
  1137. WHILE (i < n) (* & (nofhdfld <= DevCPM.MaxHdFld) *) DO (* !!! *)
  1138. INC(adr, btyp.size); OutHdFld(btyp, fld, adr); INC(i)
  1139. END
  1140. END
  1141. END
  1142. ELSIF DevCPM.ExpHdPtrFld &
  1143. ((typ.form = Pointer) & ~typ.untagged OR (fld.name^ = DevCPM.HdPtrName)) THEN (* !!! *)
  1144. DevCPM.SymWInt(Shdptr); DevCPM.SymWInt(adr); INC(nofhdfld)
  1145. ELSIF DevCPM.ExpHdUtPtrFld &
  1146. ((typ.form = Pointer) & typ.untagged OR (fld.name^ = DevCPM.HdUtPtrName)) THEN (* !!! *)
  1147. DevCPM.SymWInt(Ssys); (* DevCPM.SymWInt(Shdutptr); *)
  1148. IF typ.form = Pointer THEN n := typ.sysflag ELSE n := fld.sysflag END;
  1149. DevCPM.SymWInt(n);
  1150. DevCPM.SymWInt(adr); INC(nofhdfld);
  1151. IF n > 1 THEN portable := FALSE END (* hidden untagged pointer are portable *)
  1152. ELSIF DevCPM.ExpHdProcFld & ((typ.form = ProcTyp) OR (fld.name^ = DevCPM.HdProcName)) THEN
  1153. DevCPM.SymWInt(Shdpro); DevCPM.SymWInt(adr); INC(nofhdfld)
  1154. END
  1155. END OutHdFld;
  1156. PROCEDURE OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  1157. BEGIN
  1158. WHILE (fld # NIL) & (fld.mode = Fld) DO
  1159. IF (fld.vis # internal) & visible THEN
  1160. IF fld.vis = externalR THEN DevCPM.SymWInt(Srfld) ELSE DevCPM.SymWInt(Sfld) END ;
  1161. OutStr(fld.typ); OutName(fld.name^); DevCPM.SymWInt(fld.adr)
  1162. ELSE OutHdFld(fld.typ, fld, fld.adr + adr)
  1163. END ;
  1164. fld := fld.link
  1165. END
  1166. END OutFlds;
  1167. PROCEDURE OutSign(result: Struct; par: Object);
  1168. BEGIN
  1169. OutStr(result);
  1170. WHILE par # NIL DO
  1171. IF par.sysflag # 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(par.sysflag) END;
  1172. IF par.mode = Var THEN DevCPM.SymWInt(Svalpar)
  1173. ELSIF par.vis = inPar THEN DevCPM.SymWInt(Sinpar)
  1174. ELSIF par.vis = outPar THEN DevCPM.SymWInt(Soutpar)
  1175. ELSE DevCPM.SymWInt(Svarpar)
  1176. END ;
  1177. OutStr(par.typ);
  1178. DevCPM.SymWInt(par.adr);
  1179. OutName(par.name^); par := par.link
  1180. END ;
  1181. DevCPM.SymWInt(Send)
  1182. END OutSign;
  1183. PROCEDURE OutTProcs(typ: Struct; obj: Object);
  1184. VAR bObj: Object;
  1185. BEGIN
  1186. IF obj # NIL THEN
  1187. IF obj.mode = TProc THEN
  1188. (*
  1189. IF (typ.BaseTyp # NIL) & (obj.num < typ.BaseTyp.n) & (obj.vis = internal) & (obj.scope # NIL) THEN
  1190. FindBaseField(obj.name^, typ, bObj);
  1191. ASSERT((bObj # NIL) & (bObj.num = obj.num));
  1192. IF bObj.vis # internal THEN DevCPM.Mark(109, typ.txtpos) END
  1193. (* hidden and overriding, not detected in OPP because record exported indirectly or via aliasing *)
  1194. END;
  1195. *)
  1196. IF obj.vis # internal THEN
  1197. IF obj.vis = externalR THEN DevCPM.SymWInt(Simpo) END;
  1198. IF obj.entry # NIL THEN
  1199. DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE
  1200. END;
  1201. IF limAttr IN obj.conval.setval THEN DevCPM.SymWInt(Slimpro)
  1202. ELSIF absAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sabspro)
  1203. ELSIF empAttr IN obj.conval.setval THEN DevCPM.SymWInt(Semppro)
  1204. ELSIF extAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sextpro)
  1205. ELSE DevCPM.SymWInt(Stpro)
  1206. END;
  1207. OutSign(obj.typ, obj.link); OutName(obj.name^);
  1208. DevCPM.SymWInt(obj.num)
  1209. ELSIF DevCPM.ExpHdTProc THEN
  1210. DevCPM.SymWInt(Shdtpro);
  1211. DevCPM.SymWInt(obj.num)
  1212. END
  1213. END;
  1214. OutTProcs(typ, obj.left);
  1215. OutTProcs(typ, obj.right)
  1216. END
  1217. END OutTProcs;
  1218. PROCEDURE OutStr(typ: Struct); (* OPV.TypeAlloc already applied *)
  1219. VAR strobj: Object;
  1220. BEGIN
  1221. IF typ.ref < expCtxt.ref THEN DevCPM.SymWInt(-typ.ref)
  1222. ELSE
  1223. DevCPM.SymWInt(Sstruct);
  1224. typ.ref := expCtxt.ref; INC(expCtxt.ref);
  1225. IF expCtxt.ref >= maxStruct THEN err(228) END ;
  1226. OutMod(typ.mno); strobj := typ.strobj;
  1227. IF (strobj # NIL) & (strobj.name # null) THEN OutName(strobj.name^);
  1228. CASE strobj.history OF
  1229. | pbmodified: FPrintErr(strobj, 252)
  1230. | pvmodified: FPrintErr(strobj, 251)
  1231. | inconsistent: FPrintErr(strobj, 249)
  1232. ELSE (* checked in OutObj or correct indirect export *)
  1233. END
  1234. ELSE DevCPM.SymWCh(0X) (* anonymous => never inconsistent, pvfp influences the client fp *)
  1235. END;
  1236. IF typ.sysflag # 0 THEN (* !!! *)
  1237. DevCPM.SymWInt(Ssys); DevCPM.SymWInt(typ.sysflag);
  1238. IF typ.sysflag > 0 THEN portable := FALSE END
  1239. END;
  1240. IF strobj # NIL THEN
  1241. IF strobj.library # NIL THEN
  1242. DevCPM.SymWInt(Slib); OutName(strobj.library^); portable := FALSE
  1243. END;
  1244. IF strobj.entry # NIL THEN
  1245. DevCPM.SymWInt(Sentry); OutName(strobj.entry^); portable := FALSE
  1246. END
  1247. END;
  1248. IF typ.ext # NIL THEN
  1249. DevCPM.SymWInt(String8); OutName(typ.ext^); portable := FALSE
  1250. END;
  1251. CASE typ.form OF
  1252. | Pointer:
  1253. DevCPM.SymWInt(Sptr); OutStr(typ.BaseTyp)
  1254. | ProcTyp:
  1255. DevCPM.SymWInt(Spro); OutSign(typ.BaseTyp, typ.link)
  1256. | Comp:
  1257. CASE typ.comp OF
  1258. | Array:
  1259. DevCPM.SymWInt(Sarr); OutStr(typ.BaseTyp); DevCPM.SymWInt(typ.n)
  1260. | DynArr:
  1261. DevCPM.SymWInt(Sdarr); OutStr(typ.BaseTyp)
  1262. | Record:
  1263. IF typ.attribute = limAttr THEN DevCPM.SymWInt(Slimrec)
  1264. ELSIF typ.attribute = absAttr THEN DevCPM.SymWInt(Sabsrec)
  1265. ELSIF typ.attribute = extAttr THEN DevCPM.SymWInt(Sextrec)
  1266. ELSE DevCPM.SymWInt(Srec)
  1267. END;
  1268. IF typ.BaseTyp = NIL THEN OutStr(notyp) ELSE OutStr(typ.BaseTyp) END ;
  1269. (* BaseTyp should be Notyp, too late to change *)
  1270. DevCPM.SymWInt(typ.size); DevCPM.SymWInt(typ.align); DevCPM.SymWInt(typ.n);
  1271. nofhdfld := 0; OutFlds(typ.link, 0, TRUE);
  1272. (*
  1273. IF nofhdfld > DevCPM.MaxHdFld THEN DevCPM.Mark(223, typ.txtpos) END ; (* !!! *)
  1274. *)
  1275. OutTProcs(typ, typ.link); DevCPM.SymWInt(Send)
  1276. END
  1277. ELSE (* alias structure *)
  1278. DevCPM.SymWInt(Salias); OutStr(typ.BaseTyp)
  1279. END
  1280. END
  1281. END OutStr;
  1282. PROCEDURE OutConstant(obj: Object);
  1283. VAR f, i: SHORTINT; rval: SHORTREAL; a, b, c: INTEGER; r: REAL;
  1284. BEGIN
  1285. f := obj.typ.form;
  1286. (*
  1287. IF obj.typ = guidtyp THEN f := Guid END;
  1288. *)
  1289. IF f = Int32 THEN
  1290. IF (obj.conval.intval >= -128) & (obj.conval.intval <= -127) THEN f := Int8
  1291. ELSIF (obj.conval.intval >= -32768) & (obj.conval.intval <= -32767) THEN f := Int16
  1292. END
  1293. END;
  1294. DevCPM.SymWInt(f);
  1295. CASE f OF
  1296. | Bool, Char8:
  1297. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval)))
  1298. | Char16:
  1299. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval MOD 256)));
  1300. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval DIV 256)))
  1301. | Int8, Int16, Int32:
  1302. DevCPM.SymWInt(obj.conval.intval)
  1303. | Int64:
  1304. IF ABS(obj.conval.realval + obj.conval.intval) <= MAX(INTEGER) THEN
  1305. a := SHORT(ENTIER(obj.conval.realval + obj.conval.intval)); b := -1; c := -1
  1306. ELSIF ABS(obj.conval.realval + obj.conval.intval) <= 1125899906842624.0 (*2^50*) THEN
  1307. a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 2097152.0 (*2^21*)));
  1308. b := SHORT(ENTIER(obj.conval.realval + obj.conval.intval - a * 2097152.0 (*2^21*))); c := -1
  1309. ELSE
  1310. a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4398046511104.0 (*2^42*)));
  1311. r := obj.conval.realval + obj.conval.intval - a * 4398046511104.0 (*2^42*);
  1312. b := SHORT(ENTIER(r / 2097152.0 (*2^21*)));
  1313. c := SHORT(ENTIER(r - b * 2097152.0 (*2^21*)))
  1314. END;
  1315. IF c >= 0 THEN
  1316. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128;
  1317. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128;
  1318. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128)))
  1319. END;
  1320. IF b >= 0 THEN
  1321. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128;
  1322. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128;
  1323. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128)))
  1324. END;
  1325. DevCPM.SymWInt(a)
  1326. | Set:
  1327. DevCPM.SymWSet(obj.conval.setval)
  1328. | Real32:
  1329. rval := SHORT(obj.conval.realval); DevCPM.SymWReal(rval)
  1330. | Real64:
  1331. DevCPM.SymWLReal(obj.conval.realval)
  1332. | String8, String16:
  1333. OutName(obj.conval.ext^)
  1334. | NilTyp:
  1335. (*
  1336. | Guid:
  1337. i := 0;
  1338. WHILE i < 16 DO DevCPM.SymWCh(obj.conval.ext[i]); INC(i) END
  1339. *)
  1340. ELSE err(127)
  1341. END
  1342. END OutConstant;
  1343. PROCEDURE OutObj(obj: Object);
  1344. VAR i, j: SHORTINT; ext: ConstExt;
  1345. BEGIN
  1346. IF obj # NIL THEN
  1347. OutObj(obj.left);
  1348. IF obj.mode IN {Con, Typ, Var, LProc, XProc, CProc, IProc} THEN
  1349. IF obj.history = removed THEN FPrintErr(obj, 250)
  1350. ELSIF obj.vis # internal THEN
  1351. CASE obj.history OF
  1352. | inserted: FPrintErr(obj, 253)
  1353. | same: (* ok *)
  1354. | pbmodified:
  1355. IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 252) END
  1356. | pvmodified:
  1357. IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 251) END
  1358. END ;
  1359. IF obj.sysflag < 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(obj.sysflag); portable := FALSE END;
  1360. IF obj.mode IN {LProc, XProc, CProc, Var, Con} THEN
  1361. (* name alias for types handled in OutStr *)
  1362. IF obj.library # NIL THEN
  1363. DevCPM.SymWInt(Slib); OutName(obj.library^); portable := FALSE
  1364. END;
  1365. IF obj.entry # NIL THEN
  1366. DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE
  1367. END
  1368. END;
  1369. CASE obj.mode OF
  1370. | Con:
  1371. OutConstant(obj); OutName(obj.name^)
  1372. | Typ:
  1373. IF obj.typ.strobj = obj THEN DevCPM.SymWInt(Stype); OutStr(obj.typ)
  1374. ELSE DevCPM.SymWInt(Salias); OutStr(obj.typ); OutName(obj.name^)
  1375. END
  1376. | Var:
  1377. IF obj.vis = externalR THEN DevCPM.SymWInt(Srvar) ELSE DevCPM.SymWInt(Svar) END ;
  1378. OutStr(obj.typ); OutName(obj.name^);
  1379. IF (obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null) THEN
  1380. (* compute fingerprint to avoid structural type equivalence *)
  1381. DevCPM.FPrint(expCtxt.reffp, obj.typ.ref)
  1382. END
  1383. | XProc:
  1384. DevCPM.SymWInt(Sxpro); OutSign(obj.typ, obj.link); OutName(obj.name^)
  1385. | IProc:
  1386. DevCPM.SymWInt(Sipro); OutSign(obj.typ, obj.link); OutName(obj.name^)
  1387. | CProc:
  1388. DevCPM.SymWInt(Scpro); OutSign(obj.typ, obj.link); ext := obj.conval.ext;
  1389. j := ORD(ext^[0]); i := 1; DevCPM.SymWInt(j);
  1390. WHILE i <= j DO DevCPM.SymWCh(ext^[i]); INC(i) END ;
  1391. OutName(obj.name^); portable := FALSE
  1392. END
  1393. END
  1394. END ;
  1395. OutObj(obj.right)
  1396. END
  1397. END OutObj;
  1398. PROCEDURE Export*(VAR ext, new: BOOLEAN);
  1399. VAR i: SHORTINT; nofmod: BYTE; done: BOOLEAN; old: Object;
  1400. BEGIN
  1401. symExtended := FALSE; symNew := FALSE; nofmod := nofGmod;
  1402. Import("@self", SelfName, done); nofGmod := nofmod;
  1403. ASSERT(GlbMod[0].name^ = SelfName);
  1404. IF DevCPM.noerr THEN (* ~DevCPM.noerr => ~done *)
  1405. DevCPM.NewSym(SelfName);
  1406. IF DevCPM.noerr THEN
  1407. DevCPM.SymWInt(0); (* portable symfile *)
  1408. DevCPM.SymWInt(actVersion);
  1409. old := GlbMod[0]; portable := TRUE;
  1410. IF libName # "" THEN
  1411. DevCPM.SymWInt(Slib); OutName(libName); portable := FALSE;
  1412. IF done & ((old.library = NIL) OR (old.library^ # libName)) THEN
  1413. FPrintErr(NIL, 252)
  1414. END
  1415. ELSIF done & (old.library # NIL) THEN FPrintErr(NIL, 252)
  1416. END;
  1417. DevCPM.SymWInt(Smname); OutName(SelfName);
  1418. expCtxt.reffp := 0; expCtxt.ref := FirstRef;
  1419. expCtxt.nofm := 1; expCtxt.locmno[0] := 0;
  1420. i := 1; WHILE i < maxImps DO expCtxt.locmno[i] := -1; INC(i) END ;
  1421. OutObj(topScope.right);
  1422. ext := sfpresent & symExtended; new := ~sfpresent OR symNew;
  1423. IF DevCPM.noerr & ~portable THEN
  1424. DevCPM.SymReset;
  1425. DevCPM.SymWInt(processor) (* nonportable symfile *)
  1426. END;
  1427. IF DevCPM.noerr & sfpresent & (impCtxt.reffp # expCtxt.reffp) THEN
  1428. new := TRUE
  1429. END ;
  1430. IF ~DevCPM.noerr THEN DevCPM.DeleteNewSym END
  1431. (* DevCPM.RegisterNewSym is called in OP2 after writing the object file *)
  1432. END
  1433. END
  1434. END Export; (* no new symbol file if ~DevCPM.noerr *)
  1435. PROCEDURE InitStruct(VAR typ: Struct; form: BYTE);
  1436. BEGIN
  1437. typ := NewStr(form, Basic); typ.ref := form; typ.size := 1; typ.allocated := TRUE;
  1438. typ.strobj := NewObj(); typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE;
  1439. typ.idfp := form; typ.idfpdone := TRUE
  1440. END InitStruct;
  1441. PROCEDURE EnterBoolConst(name: Name; val: INTEGER);
  1442. VAR obj: Object;
  1443. BEGIN
  1444. Insert(name, obj); obj.conval := NewConst();
  1445. obj.mode := Con; obj.typ := booltyp; obj.conval.intval := val
  1446. END EnterBoolConst;
  1447. PROCEDURE EnterRealConst(name: Name; val: REAL; VAR obj: Object);
  1448. BEGIN
  1449. Insert(name, obj); obj.conval := NewConst();
  1450. obj.mode := Con; obj.typ := real32typ; obj.conval.realval := val
  1451. END EnterRealConst;
  1452. PROCEDURE EnterTyp(name: Name; form: BYTE; size: SHORTINT; VAR res: Struct);
  1453. VAR obj: Object; typ: Struct;
  1454. BEGIN
  1455. Insert(name, obj);
  1456. typ := NewStr(form, Basic); obj.mode := Typ; obj.typ := typ; obj.vis := external;
  1457. typ.strobj := obj; typ.size := size; typ.ref := form; typ.allocated := TRUE;
  1458. typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE;
  1459. typ.idfp := form; typ.idfpdone := TRUE; res := typ
  1460. END EnterTyp;
  1461. PROCEDURE EnterProc(name: Name; num: SHORTINT);
  1462. VAR obj: Object;
  1463. BEGIN Insert(name, obj);
  1464. obj.mode := SProc; obj.typ := notyp; obj.adr := num
  1465. END EnterProc;
  1466. PROCEDURE EnterAttr(name: Name; num: SHORTINT);
  1467. VAR obj: Object;
  1468. BEGIN Insert(name, obj);
  1469. obj.mode := Attr; obj.adr := num
  1470. END EnterAttr;
  1471. PROCEDURE EnterTProc(ptr, rec: Struct; name: Name; num, typ: SHORTINT);
  1472. VAR obj, par: Object;
  1473. BEGIN
  1474. InsertField(name, rec, obj);
  1475. obj.mnolev := -128; (* for correct implement only behaviour *)
  1476. obj.mode := TProc; obj.num := num; obj.conval := NewConst();
  1477. obj.conval.setval := obj.conval.setval + {newAttr};
  1478. IF typ = 0 THEN (* FINALIZE, RELEASE *)
  1479. obj.typ := notyp; obj.vis := externalR;
  1480. INCL(obj.conval.setval, empAttr)
  1481. ELSIF typ = 1 THEN (* QueryInterface *)
  1482. par := NewObj(); par.name := NewName("int"); par.mode := VarPar; par.vis := outPar;
  1483. par.sysflag := 8; par.adr := 16; par.typ := punktyp;
  1484. par.link := obj.link; obj.link := par;
  1485. par := NewObj(); par.name := NewName("iid"); par.mode := VarPar; par.vis := inPar;
  1486. par.sysflag := 16; par.adr := 12; par.typ := guidtyp;
  1487. par.link := obj.link; obj.link := par;
  1488. obj.typ := restyp; obj.vis := external;
  1489. INCL(obj.conval.setval, extAttr)
  1490. ELSIF typ = 2 THEN (* AddRef, Release *)
  1491. obj.typ := notyp; obj.vis := externalR;
  1492. INCL(obj.conval.setval, isHidden);
  1493. INCL(obj.conval.setval, extAttr)
  1494. END;
  1495. par := NewObj(); par.name := NewName("this"); par.mode := Var;
  1496. par.adr := 8; par.typ := ptr;
  1497. par.link := obj.link; obj.link := par;
  1498. END EnterTProc;
  1499. PROCEDURE EnterHdField(VAR root: Object; offs: SHORTINT);
  1500. VAR obj: Object;
  1501. BEGIN
  1502. obj := NewObj(); obj.mode := Fld;
  1503. obj.name := NewName(DevCPM.HdPtrName); obj.typ := undftyp; obj.adr := offs;
  1504. obj.link := root; root := obj
  1505. END EnterHdField;
  1506. BEGIN
  1507. NEW(null, 1); null^ := "";
  1508. topScope := NIL; OpenScope(0, NIL); DevCPM.errpos := 0;
  1509. InitStruct(undftyp, Undef); InitStruct(notyp, NoTyp);
  1510. InitStruct(string8typ, String8); InitStruct(niltyp, NilTyp); niltyp.size := DevCPM.PointerSize;
  1511. InitStruct(string16typ, String16);
  1512. undftyp.BaseTyp := undftyp;
  1513. (*initialization of module SYSTEM*)
  1514. (*
  1515. EnterTyp("BYTE", Byte, 1, bytetyp);
  1516. EnterProc("NEW", sysnewfn);
  1517. *)
  1518. EnterTyp("PTR", Pointer, DevCPM.PointerSize, sysptrtyp);
  1519. EnterProc("ADR", adrfn);
  1520. EnterProc("TYP", typfn);
  1521. EnterProc("CC", ccfn);
  1522. EnterProc("LSH", lshfn);
  1523. EnterProc("ROT", rotfn);
  1524. EnterProc("GET", getfn);
  1525. EnterProc("PUT", putfn);
  1526. EnterProc("GETREG", getrfn);
  1527. EnterProc("PUTREG", putrfn);
  1528. EnterProc("BIT", bitfn);
  1529. EnterProc("VAL", valfn);
  1530. EnterProc("MOVE", movefn);
  1531. EnterProc("THISRECORD", thisrecfn);
  1532. EnterProc("THISARRAY", thisarrfn);
  1533. syslink := topScope.right; topScope.right := NIL;
  1534. (* initialization of module COM *)
  1535. EnterProc("ID", iidfn);
  1536. EnterProc("QUERY", queryfn);
  1537. EnterTyp("RESULT", Int32, 4, restyp);
  1538. restyp.ref := Res;
  1539. EnterTyp("GUID", Guid, 16, guidtyp);
  1540. guidtyp.form := Comp; guidtyp.comp := Array; guidtyp.n := 16;
  1541. EnterTyp("IUnknown^", IUnk, 12, iunktyp);
  1542. iunktyp.form := Comp; iunktyp.comp := Record; iunktyp.n := 3;
  1543. iunktyp.attribute := absAttr;
  1544. (*
  1545. EnterHdField(iunktyp.link, 12);
  1546. *)
  1547. iunktyp.BaseTyp := NIL; iunktyp.align := 4;
  1548. iunktyp.sysflag := interface; iunktyp.untagged := TRUE;
  1549. NEW(iunktyp.ext, 40); iunktyp.ext^ := "{00000000-0000-0000-C000-000000000046}";
  1550. EnterTyp("IUnknown", PUnk, DevCPM.PointerSize, punktyp);
  1551. punktyp.form := Pointer; punktyp.BaseTyp := iunktyp;
  1552. punktyp.sysflag := interface; punktyp.untagged := TRUE;
  1553. EnterTProc(punktyp, iunktyp, "QueryInterface", 0, 1);
  1554. EnterTProc(punktyp, iunktyp, "AddRef", 1, 2);
  1555. EnterTProc(punktyp, iunktyp, "Release", 2, 2);
  1556. comlink := topScope.right; topScope.right := NIL;
  1557. universe := topScope;
  1558. EnterProc("LCHR", lchrfn);
  1559. EnterProc("LENTIER", lentierfcn);
  1560. EnterTyp("ANYREC", AnyRec, 0, anytyp);
  1561. anytyp.form := Comp; anytyp.comp := Record; anytyp.n := 1;
  1562. anytyp.BaseTyp := NIL; anytyp.extlev := -1; (* !!! *)
  1563. anytyp.attribute := absAttr;
  1564. EnterTyp("ANYPTR", AnyPtr, DevCPM.PointerSize, anyptrtyp);
  1565. anyptrtyp.form := Pointer; anyptrtyp.BaseTyp := anytyp;
  1566. EnterTProc(anyptrtyp, anytyp, "FINALIZE", 0, 0);
  1567. EnterTProc(anyptrtyp, iunktyp, "RELEASE", 1, 0);
  1568. EnterProc("VALID", validfn);
  1569. EnterTyp("SHORTCHAR", Char8, 1, char8typ);
  1570. string8typ.BaseTyp := char8typ;
  1571. EnterTyp("CHAR", Char16, 2, char16typ);
  1572. EnterTyp("LONGCHAR", Char16, 2, lchar16typ);
  1573. string16typ.BaseTyp := char16typ;
  1574. EnterTyp("SET", Set, 4, settyp);
  1575. EnterTyp("BYTE", Int8, 1, int8typ);
  1576. guidtyp.BaseTyp := int8typ;
  1577. EnterTyp("SHORTINT", Int16, 2, int16typ);
  1578. EnterTyp("INTEGER", Int32, 4, int32typ);
  1579. EnterTyp("LONGINT", Int64, 8, int64typ);
  1580. EnterTyp("LARGEINT", Int64, 8, lint64typ);
  1581. EnterTyp("SHORTREAL", Real32, 4, real32typ);
  1582. EnterTyp("REAL", Real64, 8, real64typ);
  1583. EnterTyp("LONGREAL", Real64, 8, lreal64typ);
  1584. EnterTyp("BOOLEAN", Bool, 1, booltyp);
  1585. EnterBoolConst("FALSE", 0); (* 0 and 1 are compiler internal representation only *)
  1586. EnterBoolConst("TRUE", 1);
  1587. EnterRealConst("INF", DevCPM.InfReal, infinity);
  1588. EnterProc("HALT", haltfn);
  1589. EnterProc("NEW", newfn);
  1590. EnterProc("ABS", absfn);
  1591. EnterProc("CAP", capfn);
  1592. EnterProc("ORD", ordfn);
  1593. EnterProc("ENTIER", entierfn);
  1594. EnterProc("ODD", oddfn);
  1595. EnterProc("MIN", minfn);
  1596. EnterProc("MAX", maxfn);
  1597. EnterProc("CHR", chrfn);
  1598. EnterProc("SHORT", shortfn);
  1599. EnterProc("LONG", longfn);
  1600. EnterProc("SIZE", sizefn);
  1601. EnterProc("INC", incfn);
  1602. EnterProc("DEC", decfn);
  1603. EnterProc("INCL", inclfn);
  1604. EnterProc("EXCL", exclfn);
  1605. EnterProc("LEN", lenfn);
  1606. EnterProc("COPY", copyfn);
  1607. EnterProc("ASH", ashfn);
  1608. EnterProc("ASSERT", assertfn);
  1609. (*
  1610. EnterProc("ADR", adrfn);
  1611. EnterProc("TYP", typfn);
  1612. *)
  1613. EnterProc("BITS", bitsfn);
  1614. EnterAttr("ABSTRACT", absAttr);
  1615. EnterAttr("LIMITED", limAttr);
  1616. EnterAttr("EMPTY", empAttr);
  1617. EnterAttr("EXTENSIBLE", extAttr);
  1618. NEW(intrealtyp); intrealtyp^ := real64typ^;
  1619. impCtxt.ref[Undef] := undftyp; impCtxt.ref[Byte] := bytetyp;
  1620. impCtxt.ref[Bool] := booltyp; impCtxt.ref[Char8] := char8typ;
  1621. impCtxt.ref[Int8] := int8typ; impCtxt.ref[Int16] := int16typ;
  1622. impCtxt.ref[Int32] := int32typ; impCtxt.ref[Real32] := real32typ;
  1623. impCtxt.ref[Real64] := real64typ; impCtxt.ref[Set] := settyp;
  1624. impCtxt.ref[String8] := string8typ; impCtxt.ref[NilTyp] := niltyp;
  1625. impCtxt.ref[NoTyp] := notyp; impCtxt.ref[Pointer] := sysptrtyp;
  1626. impCtxt.ref[AnyPtr] := anyptrtyp; impCtxt.ref[AnyRec] := anytyp;
  1627. impCtxt.ref[Char16] := char16typ; impCtxt.ref[String16] := string16typ;
  1628. impCtxt.ref[Int64] := int64typ;
  1629. impCtxt.ref[IUnk] := iunktyp; impCtxt.ref[PUnk] := punktyp;
  1630. impCtxt.ref[Guid] := guidtyp; impCtxt.ref[Res] := restyp;
  1631. END LindevCPT.
  1632. Objects:
  1633. mode | adr conval link scope leaf
  1634. ------------------------------------------------
  1635. Undef | Not used
  1636. Var | vadr next regopt Glob or loc var or proc value parameter
  1637. VarPar| vadr next regopt Var parameter (vis = 0 | inPar | outPar)
  1638. Con | val Constant
  1639. Fld | off next Record field
  1640. Typ | Named type
  1641. LProc | entry sizes firstpar scope leaf Local procedure, entry adr set in back-end
  1642. XProc | entry sizes firstpar scope leaf External procedure, entry adr set in back-end
  1643. SProc | fno sizes Standard procedure
  1644. CProc | code firstpar scope Code procedure
  1645. IProc | entry sizes scope leaf Interrupt procedure, entry adr set in back-end
  1646. Mod | scope Module
  1647. Head | txtpos owner firstvar Scope anchor
  1648. TProc | entry sizes firstpar scope leaf Bound procedure, mthno = obj.num
  1649. Structures:
  1650. form comp | n BaseTyp link mno txtpos sysflag
  1651. ----------------------------------------------------------------------------------
  1652. Undef Basic |
  1653. Byte Basic |
  1654. Bool Basic |
  1655. Char8 Basic |
  1656. Int8 Basic |
  1657. Int16 Basic |
  1658. Int32 Basic |
  1659. Real32 Basic |
  1660. Real64 Basic |
  1661. Set Basic |
  1662. String8 Basic |
  1663. NilTyp Basic |
  1664. NoTyp Basic |
  1665. Pointer Basic | PBaseTyp mno txtpos sysflag
  1666. ProcTyp Basic | ResTyp params mno txtpos sysflag
  1667. Comp Array | nofel ElemTyp mno txtpos sysflag
  1668. Comp DynArr| dim ElemTyp mno txtpos sysflag
  1669. Comp Record| nofmth RBaseTyp fields mno txtpos sysflag
  1670. Char16 Basic |
  1671. String16Basic |
  1672. Int64 Basic |
  1673. Nodes:
  1674. design = Nvar|Nvarpar|Nfield|Nderef|Nindex|Nguard|Neguard|Ntype|Nproc.
  1675. expr = design|Nconst|Nupto|Nmop|Ndop|Ncall.
  1676. nextexpr = NIL|expr.
  1677. ifstat = NIL|Nif.
  1678. casestat = Ncaselse.
  1679. sglcase = NIL|Ncasedo.
  1680. stat = NIL|Ninittd|Nenter|Nassign|Ncall|Nifelse|Ncase|Nwhile|Nrepeat|
  1681. Nloop|Nexit|Nreturn|Nwith|Ntrap.
  1682. class subcl obj left right link
  1683. ---------------------------------------------------------
  1684. design Nvar var nextexpr
  1685. Nvarpar varpar nextexpr
  1686. Nfield field design nextexpr
  1687. Nderef ptr/str design nextexpr
  1688. Nindex design expr nextexpr
  1689. Nguard design nextexpr (typ = guard type)
  1690. Neguard design nextexpr (typ = guard type)
  1691. Ntype type nextexpr
  1692. Nproc normal proc nextexpr
  1693. super proc nextexpr
  1694. expr design
  1695. Nconst const (val = node.conval)
  1696. Nupto expr expr nextexpr
  1697. Nmop not expr nextexpr
  1698. minus expr nextexpr
  1699. is tsttype expr nextexpr
  1700. conv expr nextexpr
  1701. abs expr nextexpr
  1702. cap expr nextexpr
  1703. odd expr nextexpr
  1704. bit expr nextexpr {x}
  1705. adr expr nextexpr SYSTEM.ADR
  1706. typ expr nextexpr SYSTEM.TYP
  1707. cc Nconst nextexpr SYSTEM.CC
  1708. val expr nextexpr SYSTEM.VAL
  1709. Ndop times expr expr nextexpr
  1710. slash expr expr nextexpr
  1711. div expr expr nextexpr
  1712. mod expr expr nextexpr
  1713. and expr expr nextexpr
  1714. plus expr expr nextexpr
  1715. minus expr expr nextexpr
  1716. or expr expr nextexpr
  1717. eql expr expr nextexpr
  1718. neq expr expr nextexpr
  1719. lss expr expr nextexpr
  1720. leq expr expr nextexpr
  1721. grt expr expr nextexpr
  1722. geq expr expr nextexpr
  1723. in expr expr nextexpr
  1724. ash expr expr nextexpr
  1725. msk expr Nconst nextexpr
  1726. len design Nconst nextexpr
  1727. min expr expr nextexpr MIN
  1728. max expr expr nextexpr MAX
  1729. bit expr expr nextexpr SYSTEM.BIT
  1730. lsh expr expr nextexpr SYSTEM.LSH
  1731. rot expr expr nextexpr SYSTEM.ROT
  1732. Ncall fpar design nextexpr nextexpr
  1733. Ncomp stat expr nextexpr
  1734. nextexpr NIL
  1735. expr
  1736. ifstat NIL
  1737. Nif expr stat ifstat
  1738. casestat Ncaselse sglcase stat (minmax = node.conval)
  1739. sglcase NIL
  1740. Ncasedo Nconst stat sglcase
  1741. stat NIL
  1742. Ninittd stat (of node.typ)
  1743. Nenter proc stat stat stat (proc=NIL for mod)
  1744. Nassign assign design expr stat
  1745. newfn design nextexp stat
  1746. incfn design expr stat
  1747. decfn design expr stat
  1748. inclfn design expr stat
  1749. exclfn design expr stat
  1750. copyfn design expr stat
  1751. getfn design expr stat SYSTEM.GET
  1752. putfn expr expr stat SYSTEM.PUT
  1753. getrfn design Nconst stat SYSTEM.GETREG
  1754. putrfn Nconst expr stat SYSTEM.PUTREG
  1755. sysnewfn design expr stat SYSTEM.NEW
  1756. movefn expr expr stat SYSTEM.MOVE
  1757. (right.link = 3rd par)
  1758. Ncall fpar design nextexpr stat
  1759. Nifelse ifstat stat stat
  1760. Ncase expr casestat stat
  1761. Nwhile expr stat stat
  1762. Nrepeat stat expr stat
  1763. Nloop stat stat
  1764. Nexit stat
  1765. Nreturn proc nextexpr stat (proc = NIL for mod)
  1766. Nwith ifstat stat stat
  1767. Ntrap expr stat
  1768. Ncomp stat stat stat