CPT.txt 70 KB

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