CPT.txt 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891
  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(pvfp, fld.vis); FPrintName(pvfp, fld.name^); DevCPM.FPrint(pvfp, fld.adr);
  515. DevCPM.FPrint(pbfp, fld.vis); FPrintName(pbfp, fld.name^); DevCPM.FPrint(pbfp, fld.adr);
  516. FPrintStr(fld.typ); DevCPM.FPrint(pbfp, fld.typ.pbfp); DevCPM.FPrint(pvfp, fld.typ.pvfp)
  517. ELSE FPrintHdFld(fld.typ, fld, fld.adr + adr)
  518. END ;
  519. fld := fld.link
  520. END
  521. END FPrintFlds;
  522. PROCEDURE FPrintTProcs(obj: Object); (* modifies pbfp and pvfp *)
  523. VAR fp: INTEGER;
  524. BEGIN
  525. IF obj # NIL THEN
  526. FPrintTProcs(obj.left);
  527. IF obj.mode = TProc THEN
  528. IF obj.vis # internal THEN
  529. fp := 0;
  530. IF obj.vis = externalR THEN DevCPM.FPrint(fp, externalR) END;
  531. IF limAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, limAttr)
  532. ELSIF absAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, absAttr)
  533. ELSIF empAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, empAttr)
  534. ELSIF extAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, extAttr)
  535. END;
  536. DevCPM.FPrint(fp, TProc); DevCPM.FPrint(fp, obj.num);
  537. FPrintSign(fp, obj.typ, obj.link); FPrintName(fp, obj.name^);
  538. IF obj.entry # NIL THEN FPrintName(fp, obj.entry^) END;
  539. DevCPM.FPrint(pvfp, fp); DevCPM.FPrint(pbfp, fp)
  540. ELSIF DevCPM.ExpHdTProc THEN
  541. DevCPM.FPrint(pvfp, TProc); DevCPM.FPrint(pvfp, obj.num)
  542. END
  543. END;
  544. FPrintTProcs(obj.right)
  545. END
  546. END FPrintTProcs;
  547. BEGIN
  548. IF ~typ.fpdone THEN
  549. IdFPrint(typ); pbfp := typ.idfp;
  550. IF typ.sysflag # 0 THEN DevCPM.FPrint(pbfp, typ.sysflag) END;
  551. IF typ.ext # NIL THEN FPrintName(pbfp, typ.ext^) END;
  552. IF typ.attribute # 0 THEN DevCPM.FPrint(pbfp, typ.attribute) END;
  553. pvfp := pbfp; typ.pbfp := pbfp; typ.pvfp := pvfp; (* initial fprints may be used recursively *)
  554. typ.fpdone := TRUE;
  555. f := typ.form; c := typ.comp; btyp := typ.BaseTyp;
  556. IF f = Pointer THEN
  557. strobj := typ.strobj; bstrobj := btyp.strobj;
  558. IF (strobj = NIL) OR (strobj.name = null) OR (bstrobj = NIL) OR (bstrobj.name = null) THEN
  559. FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); pvfp := pbfp
  560. (* else use idfp as pbfp and as pvfp, do not call FPrintStr(btyp) here, else cycle not broken *)
  561. END
  562. ELSIF f = ProcTyp THEN (* use idfp as pbfp and as pvfp *)
  563. ELSIF c IN {Array, DynArr} THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pvfp); pvfp := pbfp
  564. ELSE (* c = Record *)
  565. IF btyp # NIL THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); DevCPM.FPrint(pvfp, btyp.pvfp) END ;
  566. DevCPM.FPrint(pvfp, typ.size); DevCPM.FPrint(pvfp, typ.align); DevCPM.FPrint(pvfp, typ.n);
  567. nofhdfld := 0; FPrintFlds(typ.link, 0, TRUE);
  568. FPrintTProcs(typ.link); (* DevCPM.FPrint(pvfp, pbfp); *) strobj := typ.strobj;
  569. IF (strobj = NIL) OR (strobj.name = null) THEN pbfp := pvfp END
  570. END ;
  571. typ.pbfp := pbfp; typ.pvfp := pvfp
  572. END
  573. END FPrintStr;
  574. PROCEDURE FPrintObj*(obj: Object);
  575. VAR fprint: INTEGER; f, m: SHORTINT; rval: SHORTREAL; ext: ConstExt; mod: Object; r: REAL; x: INTEGER;
  576. BEGIN
  577. IF ~obj.fpdone THEN
  578. fprint := 0; obj.fpdone := TRUE;
  579. DevCPM.FPrint(fprint, obj.mode);
  580. IF obj.mode = Con THEN
  581. f := obj.typ.form; DevCPM.FPrint(fprint, f);
  582. CASE f OF
  583. | Bool, Char8, Char16, Int8, Int16, Int32:
  584. DevCPM.FPrint(fprint, obj.conval.intval)
  585. | Int64:
  586. x := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4294967296.0));
  587. r := obj.conval.realval + obj.conval.intval - x * 4294967296.0;
  588. IF r > MAX(INTEGER) THEN r := r - 4294967296.0 END;
  589. DevCPM.FPrint(fprint, SHORT(ENTIER(r)));
  590. DevCPM.FPrint(fprint, x)
  591. | Set:
  592. DevCPM.FPrintSet(fprint, obj.conval.setval)
  593. | Real32:
  594. rval := SHORT(obj.conval.realval); DevCPM.FPrintReal(fprint, rval)
  595. | Real64:
  596. DevCPM.FPrintLReal(fprint, obj.conval.realval)
  597. | String8, String16:
  598. FPrintName(fprint, obj.conval.ext^)
  599. | NilTyp:
  600. ELSE err(127)
  601. END
  602. ELSIF obj.mode = Var THEN
  603. DevCPM.FPrint(fprint, obj.vis); FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp)
  604. ELSIF obj.mode IN {XProc, IProc} THEN
  605. FPrintSign(fprint, obj.typ, obj.link)
  606. ELSIF obj.mode = CProc THEN
  607. FPrintSign(fprint, obj.typ, obj.link); ext := obj.conval.ext;
  608. m := ORD(ext^[0]); f := 1; DevCPM.FPrint(fprint, m);
  609. WHILE f <= m DO DevCPM.FPrint(fprint, ORD(ext^[f])); INC(f) END
  610. ELSIF obj.mode = Typ THEN
  611. FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp)
  612. END ;
  613. IF obj.sysflag < 0 THEN DevCPM.FPrint(fprint, obj.sysflag) END;
  614. IF obj.mode IN {LProc, XProc, CProc, Var, Typ, Con} THEN
  615. IF obj.library # NIL THEN
  616. FPrintName(fprint, obj.library^)
  617. ELSIF obj.mnolev < 0 THEN
  618. mod := GlbMod[-obj.mnolev];
  619. IF (mod.library # NIL) THEN
  620. FPrintName(fprint, mod.library^)
  621. END
  622. ELSIF obj.mnolev = 0 THEN
  623. IF libName # "" THEN FPrintName(fprint, libName) END
  624. END;
  625. IF obj.entry # NIL THEN FPrintName(fprint, obj.entry^) END
  626. END;
  627. obj.fprint := fprint
  628. END
  629. END FPrintObj;
  630. PROCEDURE FPrintErr* (obj: Object; errno: SHORTINT); (* !!! *)
  631. CONST
  632. nl = 0DX;
  633. BEGIN
  634. IF errno = 249 THEN
  635. DevCPM.errorMes := DevCPM.errorMes + nl + " ";
  636. DevCPM.errorMes := DevCPM.errorMes + GlbMod[-obj.mnolev].name^;
  637. DevCPM.errorMes := DevCPM.errorMes + "." + obj.name^;
  638. DevCPM.errorMes := DevCPM.errorMes +" is not consistently imported";
  639. err(249)
  640. ELSIF obj = NIL THEN (* changed module sys flags *)
  641. IF ~symNew & sfpresent THEN
  642. DevCPM.errorMes := DevCPM.errorMes + nl + " changed library flag"
  643. END
  644. ELSIF obj.mnolev = 0 THEN (* don't report changes in imported modules *)
  645. IF sfpresent THEN
  646. IF symChanges < 20 THEN
  647. DevCPM.errorMes := DevCPM.errorMes + nl + " " + obj.name^;
  648. IF errno = 250 THEN DevCPM.errorMes := DevCPM.errorMes + " is no longer in symbol file"
  649. ELSIF errno = 251 THEN DevCPM.errorMes := DevCPM.errorMes + " is redefined internally "
  650. ELSIF errno = 252 THEN DevCPM.errorMes := DevCPM.errorMes + " is redefined"
  651. ELSIF errno = 253 THEN DevCPM.errorMes := DevCPM.errorMes + " is new in symbol file"
  652. END
  653. ELSIF symChanges = 20 THEN
  654. DevCPM.errorMes := DevCPM.errorMes + nl + " ..."
  655. END;
  656. INC(symChanges)
  657. ELSIF (errno = 253) & ~symExtended THEN
  658. DevCPM.errorMes := DevCPM.errorMes + nl + " new symbol file"
  659. END
  660. END;
  661. IF errno = 253 THEN symExtended := TRUE ELSE symNew := TRUE END
  662. END FPrintErr;
  663. (*-------------------------- Import --------------------------*)
  664. PROCEDURE InName(VAR name: String);
  665. VAR i: SHORTINT; ch: SHORTCHAR; n: Name;
  666. BEGIN i := 0;
  667. REPEAT
  668. DevCPM.SymRCh(ch); n[i] := ch; INC(i)
  669. UNTIL ch = 0X;
  670. IF i > 1 THEN NEW(name, i); name^ := n$ ELSE name := null END
  671. END InName;
  672. PROCEDURE InMod(tag: INTEGER; VAR mno: BYTE); (* mno is global *)
  673. VAR head: Object; name: String; mn: INTEGER; i: BYTE; lib: String;
  674. BEGIN
  675. IF tag = 0 THEN mno := impCtxt.glbmno[0]
  676. ELSIF tag > 0 THEN
  677. lib := NIL;
  678. IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END;
  679. ASSERT(tag = Smname);
  680. InName(name);
  681. IF (name^ = SelfName) & ~impCtxt.self & ~(DevCPM.interface IN DevCPM.options) THEN err(154) END ;
  682. i := 0;
  683. WHILE (i < nofGmod) & (name^ # GlbMod[i].name^) DO INC(i) END ;
  684. IF i < nofGmod THEN mno := i (*module already present*)
  685. ELSE
  686. head := NewObj(); head.mode := Head; head.name := name;
  687. mno := nofGmod; head.mnolev := SHORT(SHORT(-mno));
  688. head.library := lib;
  689. IF nofGmod < maxImps THEN
  690. GlbMod[mno] := head; INC(nofGmod)
  691. ELSE err(227)
  692. END
  693. END ;
  694. impCtxt.glbmno[impCtxt.nofm] := mno; INC(impCtxt.nofm)
  695. ELSE
  696. mno := impCtxt.glbmno[-tag]
  697. END
  698. END InMod;
  699. PROCEDURE InConstant(f: INTEGER; conval: Const);
  700. VAR ch, ch1: SHORTCHAR; ext, t: ConstExt; rval: SHORTREAL; r, s: REAL; i, x, y: INTEGER; str: Name;
  701. BEGIN
  702. CASE f OF
  703. | Byte, Char8, Bool:
  704. DevCPM.SymRCh(ch); conval.intval := ORD(ch)
  705. | Char16:
  706. DevCPM.SymRCh(ch); conval.intval := ORD(ch);
  707. DevCPM.SymRCh(ch); conval.intval := conval.intval + ORD(ch) * 256
  708. | Int8, Int16, Int32:
  709. conval.intval := DevCPM.SymRInt()
  710. | Int64:
  711. DevCPM.SymRCh(ch); x := 0; y := 1; r := 0; s := 268435456 (*2^28*);
  712. WHILE (y < 268435456 (*2^28*)) & (ch >= 80X) DO
  713. x := x + (ORD(ch) - 128) * y; y := y * 128; DevCPM.SymRCh(ch)
  714. END;
  715. WHILE ch >= 80X DO r := r + (ORD(ch) - 128) * s; s := s * 128; DevCPM.SymRCh(ch) END;
  716. conval.realval := r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s;
  717. conval.intval := SHORT(ENTIER(r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s - conval.realval))
  718. | Set:
  719. DevCPM.SymRSet(conval.setval)
  720. | Real32:
  721. DevCPM.SymRReal(rval); conval.realval := rval;
  722. conval.intval := DevCPM.ConstNotAlloc
  723. | Real64:
  724. DevCPM.SymRLReal(conval.realval);
  725. conval.intval := DevCPM.ConstNotAlloc
  726. | String8, String16:
  727. i := 0;
  728. REPEAT
  729. DevCPM.SymRCh(ch);
  730. IF i < LEN(str) - 1 THEN str[i] := ch
  731. ELSIF i = LEN(str) - 1 THEN str[i] := 0X; NEW(ext, 2 * LEN(str)); ext^ := str$; ext[i] := ch
  732. ELSIF i < LEN(ext^) - 1 THEN ext[i] := ch
  733. ELSE t := ext; t[i] := 0X; NEW(ext, 2 * LEN(t^)); ext^ := t^$; ext[i] := ch
  734. END;
  735. INC(i)
  736. UNTIL ch = 0X;
  737. IF i < LEN(str) THEN NEW(ext, i); ext^ := str$ END;
  738. conval.ext := ext; conval.intval := DevCPM.ConstNotAlloc;
  739. IF f = String8 THEN conval.intval2 := i
  740. ELSE
  741. i := 0; y := 0;
  742. REPEAT DevCPM.GetUtf8(ext^, x, i); INC(y) UNTIL x = 0;
  743. conval.intval2 := y
  744. END
  745. (*
  746. ext := NewExt(); conval.ext := ext; i := 0;
  747. REPEAT
  748. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i)
  749. UNTIL ch = 0X;
  750. conval.intval2 := i;
  751. conval.intval := DevCPM.ConstNotAlloc
  752. | String16:
  753. ext := NewExt(); conval.ext := ext; i := 0;
  754. REPEAT
  755. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i);
  756. DevCPM.SymRCh(ch1); ext^[i] := ch1; INC(i)
  757. UNTIL (ch = 0X) & (ch1 = 0X);
  758. conval.intval2 := i;
  759. conval.intval := DevCPM.ConstNotAlloc
  760. *)
  761. | NilTyp:
  762. conval.intval := 0
  763. (*
  764. | Guid:
  765. ext := NewExt(); conval.ext := ext; i := 0;
  766. WHILE i < 16 DO
  767. DevCPM.SymRCh(ch); ext^[i] := ch; INC(i)
  768. END;
  769. ext[16] := 0X;
  770. conval.intval2 := 16;
  771. conval.intval := DevCPM.ConstNotAlloc;
  772. *)
  773. END
  774. END InConstant;
  775. PROCEDURE ^InStruct(VAR typ: Struct);
  776. PROCEDURE InSign(mno: BYTE; VAR res: Struct; VAR par: Object);
  777. VAR last, new: Object; tag: INTEGER;
  778. BEGIN
  779. InStruct(res);
  780. tag := DevCPM.SymRInt(); last := NIL;
  781. WHILE tag # Send DO
  782. new := NewObj(); new.mnolev := SHORT(SHORT(-mno));
  783. IF last = NIL THEN par := new ELSE last.link := new END ;
  784. IF tag = Ssys THEN
  785. new.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt();
  786. IF ODD(new.sysflag DIV inBit) THEN new.vis := inPar
  787. ELSIF ODD(new.sysflag DIV inBit) THEN new.vis := outPar
  788. END
  789. END;
  790. IF tag = Svalpar THEN new.mode := Var
  791. ELSE new.mode := VarPar;
  792. IF tag = Sinpar THEN new.vis := inPar
  793. ELSIF tag = Soutpar THEN new.vis := outPar
  794. END
  795. END ;
  796. InStruct(new.typ); new.adr := DevCPM.SymRInt(); InName(new.name);
  797. last := new; tag := DevCPM.SymRInt()
  798. END
  799. END InSign;
  800. PROCEDURE InFld(): Object; (* first number in impCtxt.nextTag, mno set outside *)
  801. VAR tag: INTEGER; obj: Object;
  802. BEGIN
  803. tag := impCtxt.nextTag; obj := NewObj();
  804. IF tag <= Srfld THEN
  805. obj.mode := Fld;
  806. IF tag = Srfld THEN obj.vis := externalR ELSE obj.vis := external END ;
  807. InStruct(obj.typ); InName(obj.name);
  808. obj.adr := DevCPM.SymRInt()
  809. ELSE
  810. obj.mode := Fld;
  811. IF tag = Shdptr THEN obj.name := NewName(DevCPM.HdPtrName)
  812. ELSIF tag = Shdutptr THEN obj.name := NewName(DevCPM.HdUtPtrName); (* !!! *)
  813. obj.sysflag := 1
  814. ELSIF tag = Ssys THEN
  815. obj.name := NewName(DevCPM.HdUtPtrName); obj.sysflag := SHORT(SHORT(DevCPM.SymRInt()))
  816. ELSE obj.name := NewName(DevCPM.HdProcName)
  817. END;
  818. obj.typ := undftyp; obj.vis := internal;
  819. obj.adr := DevCPM.SymRInt()
  820. END;
  821. RETURN obj
  822. END InFld;
  823. PROCEDURE InTProc(mno: BYTE): Object; (* first number in impCtxt.nextTag *)
  824. VAR tag: INTEGER; obj: Object;
  825. BEGIN
  826. tag := impCtxt.nextTag;
  827. obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno));
  828. IF tag = Shdtpro THEN
  829. obj.mode := TProc; obj.name := NewName(DevCPM.HdTProcName);
  830. obj.link := NewObj(); (* dummy, easier in Browser *)
  831. obj.typ := undftyp; obj.vis := internal;
  832. obj.num := DevCPM.SymRInt()
  833. ELSE
  834. obj.vis := external;
  835. IF tag = Simpo THEN obj.vis := externalR; tag := DevCPM.SymRInt() END;
  836. obj.mode := TProc; obj.conval := NewConst(); obj.conval.intval := -1;
  837. IF tag = Sentry THEN InName(obj.entry); tag := DevCPM.SymRInt() END;
  838. InSign(mno, obj.typ, obj.link); InName(obj.name);
  839. obj.num := DevCPM.SymRInt();
  840. IF tag = Slimpro THEN INCL(obj.conval.setval, limAttr)
  841. ELSIF tag = Sabspro THEN INCL(obj.conval.setval, absAttr)
  842. ELSIF tag = Semppro THEN INCL(obj.conval.setval, empAttr)
  843. ELSIF tag = Sextpro THEN INCL(obj.conval.setval, extAttr)
  844. END
  845. END ;
  846. RETURN obj
  847. END InTProc;
  848. PROCEDURE InStruct(VAR typ: Struct);
  849. VAR mno: BYTE; ref: SHORTINT; tag: INTEGER; name: String;
  850. t: Struct; obj, last, fld, old, dummy: Object;
  851. BEGIN
  852. tag := DevCPM.SymRInt();
  853. IF tag # Sstruct THEN
  854. tag := -tag;
  855. IF (version = 0) & (tag >= FirstRef0) THEN tag := tag + FirstRef - FirstRef0 END; (* correction for new FirstRef *)
  856. typ := impCtxt.ref[tag]
  857. ELSE
  858. ref := impCtxt.nofr; INC(impCtxt.nofr);
  859. IF ref < impCtxt.minr THEN impCtxt.minr := ref END ;
  860. tag := DevCPM.SymRInt();
  861. InMod(tag, mno); InName(name); obj := NewObj();
  862. IF name = null THEN
  863. IF impCtxt.self THEN old := NIL (* do not insert type desc anchor here, but in OPL *)
  864. ELSE obj.name := NewName("@"); InsertIn(obj, GlbMod[mno], old(*=NIL*)); obj.name := null
  865. END ;
  866. typ := NewStr(Undef, Basic)
  867. ELSE obj.name := name; InsertIn(obj, GlbMod[mno], old);
  868. IF old # NIL THEN (* recalculate fprints to compare with old fprints *)
  869. FPrintObj(old); impCtxt.pvfp[ref] := old.typ.pvfp;
  870. IF impCtxt.self THEN (* do not overwrite old typ *)
  871. typ := NewStr(Undef, Basic)
  872. ELSE (* overwrite old typ for compatibility reason *)
  873. typ := old.typ; typ.link := NIL; typ.sysflag := 0; typ.ext := NIL;
  874. typ.fpdone := FALSE; typ.idfpdone := FALSE
  875. END
  876. ELSE typ := NewStr(Undef, Basic)
  877. END
  878. END ;
  879. impCtxt.ref[ref] := typ; impCtxt.old[ref] := old; typ.ref := SHORT(ref + maxStruct);
  880. (* ref >= maxStruct: not exported yet, ref used for err 155 *)
  881. typ.mno := mno; typ.allocated := TRUE;
  882. typ.strobj := obj; obj.mode := Typ; obj.typ := typ;
  883. obj.mnolev := SHORT(SHORT(-mno)); obj.vis := internal; (* name not visible here *)
  884. tag := DevCPM.SymRInt();
  885. IF tag = Ssys THEN
  886. typ.sysflag := SHORT(DevCPM.SymRInt()); tag := DevCPM.SymRInt()
  887. END;
  888. typ.untagged := typ.sysflag > 0;
  889. IF tag = Slib THEN
  890. InName(obj.library); tag := DevCPM.SymRInt()
  891. END;
  892. IF tag = Sentry THEN
  893. InName(obj.entry); tag := DevCPM.SymRInt()
  894. END;
  895. IF tag = String8 THEN
  896. InName(typ.ext); tag := DevCPM.SymRInt()
  897. END;
  898. CASE tag OF
  899. | Sptr:
  900. typ.form := Pointer; typ.size := DevCPM.PointerSize; typ.n := 0; InStruct(typ.BaseTyp)
  901. | Sarr:
  902. typ.form := Comp; typ.comp := Array; InStruct(typ.BaseTyp); typ.n := DevCPM.SymRInt();
  903. typ.size := typ.n * typ.BaseTyp.size (* !!! *)
  904. | Sdarr:
  905. typ.form := Comp; typ.comp := DynArr; InStruct(typ.BaseTyp);
  906. IF typ.BaseTyp.comp = DynArr THEN typ.n := typ.BaseTyp.n + 1
  907. ELSE typ.n := 0
  908. END ;
  909. typ.size := DevCPM.DArrSizeA + DevCPM.DArrSizeB * typ.n; (* !!! *)
  910. IF typ.untagged THEN typ.size := DevCPM.PointerSize END
  911. | Srec, Sabsrec, Slimrec, Sextrec:
  912. typ.form := Comp; typ.comp := Record; InStruct(typ.BaseTyp);
  913. (* correction by ETH 18.1.96 *)
  914. IF typ.BaseTyp = notyp THEN typ.BaseTyp := NIL END;
  915. typ.extlev := 0; t := typ.BaseTyp;
  916. WHILE (t # NIL) & (t.comp = Record) DO INC(typ.extlev); t := t.BaseTyp END;
  917. typ.size := DevCPM.SymRInt(); typ.align := DevCPM.SymRInt();
  918. typ.n := DevCPM.SymRInt();
  919. IF tag = Sabsrec THEN typ.attribute := absAttr
  920. ELSIF tag = Slimrec THEN typ.attribute := limAttr
  921. ELSIF tag = Sextrec THEN typ.attribute := extAttr
  922. END;
  923. impCtxt.nextTag := DevCPM.SymRInt(); last := NIL;
  924. WHILE (impCtxt.nextTag >= Sfld) & (impCtxt.nextTag <= Shdpro)
  925. OR (impCtxt.nextTag = Shdutptr) OR (impCtxt.nextTag = Ssys) DO
  926. fld := InFld(); fld.mnolev := SHORT(SHORT(-mno));
  927. IF last # NIL THEN last.link := fld END ;
  928. last := fld;
  929. InsertThisField(fld, typ, dummy);
  930. impCtxt.nextTag := DevCPM.SymRInt()
  931. END ;
  932. WHILE impCtxt.nextTag # Send DO fld := InTProc(mno);
  933. InsertThisField(fld, typ, dummy);
  934. impCtxt.nextTag := DevCPM.SymRInt()
  935. END
  936. | Spro:
  937. typ.form := ProcTyp; typ.size := DevCPM.ProcSize; InSign(mno, typ.BaseTyp, typ.link)
  938. | Salias:
  939. InStruct(t);
  940. typ.form := t.form; typ.comp := Basic; typ.size := t.size;
  941. typ.pbfp := t.pbfp; typ.pvfp := t.pvfp; typ.fpdone := TRUE;
  942. typ.idfp := t.idfp; typ.idfpdone := TRUE; typ.BaseTyp := t
  943. END ;
  944. IF ref = impCtxt.minr THEN
  945. WHILE ref < impCtxt.nofr DO
  946. t := impCtxt.ref[ref]; FPrintStr(t);
  947. obj := t.strobj; (* obj.typ.strobj = obj, else obj.fprint differs (alias) *)
  948. IF obj.name # null THEN FPrintObj(obj) END ;
  949. old := impCtxt.old[ref];
  950. IF old # NIL THEN t.strobj := old; (* restore strobj *)
  951. IF impCtxt.self THEN
  952. IF old.mnolev < 0 THEN
  953. IF old.history # inconsistent THEN
  954. IF old.fprint # obj.fprint THEN old.history := pbmodified
  955. ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified
  956. END
  957. (* ELSE remain inconsistent *)
  958. END
  959. ELSIF old.fprint # obj.fprint THEN old.history := pbmodified
  960. ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified
  961. ELSIF old.vis = internal THEN old.history := same (* may be changed to "removed" in InObj *)
  962. ELSE old.history := inserted (* may be changed to "same" in InObj *)
  963. END
  964. ELSE
  965. (* check private part, delay error message until really used *)
  966. IF impCtxt.pvfp[ref] # t.pvfp THEN old.history := inconsistent END ;
  967. IF old.fprint # obj.fprint THEN FPrintErr(old, 249) END
  968. END
  969. ELSIF impCtxt.self THEN obj.history := removed
  970. ELSE obj.history := same
  971. END ;
  972. INC(ref)
  973. END ;
  974. impCtxt.minr := maxStruct
  975. END
  976. END
  977. END InStruct;
  978. PROCEDURE InObj(mno: BYTE): Object; (* first number in impCtxt.nextTag *)
  979. VAR ch: SHORTCHAR; obj, old: Object; typ: Struct;
  980. tag, i, s: INTEGER; ext: ConstExt;
  981. BEGIN
  982. tag := impCtxt.nextTag;
  983. IF tag = Stype THEN
  984. InStruct(typ); obj := typ.strobj;
  985. IF ~impCtxt.self THEN obj.vis := external END (* type name visible now, obj.fprint already done *)
  986. ELSE
  987. obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno)); obj.vis := external;
  988. IF tag = Ssys THEN obj.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt() END;
  989. IF tag = Slib THEN
  990. InName(obj.library); tag := DevCPM.SymRInt()
  991. END;
  992. IF tag = Sentry THEN
  993. InName(obj.entry); tag := DevCPM.SymRInt()
  994. END;
  995. IF tag >= Sxpro THEN
  996. IF obj.conval = NIL THEN obj.conval := NewConst() END;
  997. obj.conval.intval := -1;
  998. InSign(mno, obj.typ, obj.link);
  999. CASE tag OF
  1000. | Sxpro: obj.mode := XProc
  1001. | Sipro: obj.mode := IProc
  1002. | Scpro: obj.mode := CProc;
  1003. s := DevCPM.SymRInt();
  1004. NEW(ext, s + 1); obj.conval.ext := ext;
  1005. ext^[0] := SHORT(CHR(s)); i := 1;
  1006. WHILE i <= s DO DevCPM.SymRCh(ext^[i]); INC(i) END
  1007. END
  1008. ELSIF tag = Salias THEN
  1009. obj.mode := Typ; InStruct(obj.typ)
  1010. ELSIF (tag = Svar) OR (tag = Srvar) THEN
  1011. obj.mode := Var;
  1012. IF tag = Srvar THEN obj.vis := externalR END ;
  1013. InStruct(obj.typ)
  1014. ELSE (* Constant *)
  1015. obj.conval := NewConst(); InConstant(tag, obj.conval);
  1016. IF (tag = Int8) OR (tag = Int16) THEN tag := Int32 END;
  1017. obj.mode := Con; obj.typ := impCtxt.ref[tag];
  1018. END ;
  1019. InName(obj.name)
  1020. END ;
  1021. FPrintObj(obj);
  1022. IF (obj.mode = Var) & ((obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null)) THEN
  1023. (* compute a global fingerprint to avoid structural type equivalence for anonymous types *)
  1024. DevCPM.FPrint(impCtxt.reffp, obj.typ.ref - maxStruct)
  1025. END ;
  1026. IF tag # Stype THEN
  1027. InsertIn(obj, GlbMod[mno], old);
  1028. IF impCtxt.self THEN
  1029. IF old # NIL THEN
  1030. (* obj is from old symbol file, old is new declaration *)
  1031. IF old.vis = internal THEN old.history := removed
  1032. ELSE FPrintObj(old); FPrintStr(old.typ); (* FPrint(obj) already called *)
  1033. IF obj.fprint # old.fprint THEN old.history := pbmodified
  1034. ELSIF obj.typ.pvfp # old.typ.pvfp THEN old.history := pvmodified
  1035. ELSE old.history := same
  1036. END
  1037. END
  1038. ELSE obj.history := removed (* OutObj not called if mnolev < 0 *)
  1039. END
  1040. (* ELSE old = NIL, or file read twice, consistent, OutObj not called *)
  1041. END
  1042. ELSE (* obj already inserted in InStruct *)
  1043. IF impCtxt.self THEN (* obj.mnolev = 0 *)
  1044. IF obj.vis = internal THEN obj.history := removed
  1045. ELSIF obj.history = inserted THEN obj.history := same
  1046. END
  1047. (* ELSE OutObj not called for obj with mnolev < 0 *)
  1048. END
  1049. END ;
  1050. RETURN obj
  1051. END InObj;
  1052. PROCEDURE Import*(aliasName: Name; VAR name: Name; VAR done: BOOLEAN);
  1053. VAR obj, h: Object; mno: BYTE; tag, p: INTEGER; lib: String; (* done used in Browser *)
  1054. BEGIN
  1055. IF name = "SYSTEM" THEN
  1056. SYSimported := TRUE;
  1057. p := processor;
  1058. IF (p < 10) OR (p > 30) THEN p := DevCPM.sysImp END;
  1059. INCL(DevCPM.options, p); (* for sysflag handling *)
  1060. Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := syslink; obj.typ := notyp;
  1061. h := NewObj(); h.mode := Head; h.right := syslink; obj.scope := h
  1062. ELSIF name = "COM" THEN
  1063. IF DevCPM.comAware IN DevCPM.options THEN
  1064. INCL(DevCPM.options, DevCPM.com); (* for sysflag handling *)
  1065. Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := comlink; obj.typ := notyp;
  1066. h := NewObj(); h.mode := Head; h.right := comlink; obj.scope := h;
  1067. ELSE err(151)
  1068. END;
  1069. ELSIF name = "JAVA" THEN
  1070. INCL(DevCPM.options, DevCPM.java)
  1071. ELSE
  1072. impCtxt.nofr := FirstRef; impCtxt.minr := maxStruct; impCtxt.nofm := 0;
  1073. impCtxt.self := aliasName = "@self"; impCtxt.reffp := 0;
  1074. DevCPM.OldSym(name, done);
  1075. IF done THEN
  1076. lib := NIL;
  1077. impProc := SHORT(DevCPM.SymRInt());
  1078. IF (impProc # 0) & (processor # 0) & (impProc # processor) THEN err(151) END;
  1079. DevCPM.checksum := 0; (* start checksum here to avoid problems with proc id fixup *)
  1080. tag := DevCPM.SymRInt();
  1081. IF tag < Smname THEN version := tag; tag := DevCPM.SymRInt()
  1082. ELSE version := 0
  1083. END;
  1084. IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END;
  1085. InMod(tag, mno);
  1086. IF (name[0] # "@") & (GlbMod[mno].name^ # name) THEN (* symbol file name conflict *)
  1087. GlbMod[mno] := NIL; nofGmod := mno; DEC(impCtxt.nofm);
  1088. DevCPM.CloseOldSym; done := FALSE
  1089. END;
  1090. END;
  1091. IF done THEN
  1092. GlbMod[mno].library := lib;
  1093. impCtxt.nextTag := DevCPM.SymRInt();
  1094. WHILE ~DevCPM.eofSF() DO
  1095. obj := InObj(mno); impCtxt.nextTag := DevCPM.SymRInt()
  1096. END ;
  1097. Insert(aliasName, obj);
  1098. obj.mode := Mod; obj.scope := GlbMod[mno](*.right*);
  1099. GlbMod[mno].link := obj;
  1100. obj.mnolev := SHORT(SHORT(-mno)); obj.typ := notyp;
  1101. DevCPM.CloseOldSym
  1102. ELSIF impCtxt.self THEN
  1103. sfpresent := FALSE
  1104. ELSE err(152) (*sym file not found*)
  1105. END
  1106. END
  1107. END Import;
  1108. (*-------------------------- Export --------------------------*)
  1109. PROCEDURE OutName(VAR name: ARRAY OF SHORTCHAR);
  1110. VAR i: SHORTINT; ch: SHORTCHAR;
  1111. BEGIN i := 0;
  1112. REPEAT ch := name[i]; DevCPM.SymWCh(ch); INC(i) UNTIL ch = 0X
  1113. END OutName;
  1114. PROCEDURE OutMod(mno: SHORTINT);
  1115. VAR mod: Object;
  1116. BEGIN
  1117. IF expCtxt.locmno[mno] < 0 THEN (* new mod *)
  1118. mod := GlbMod[mno];
  1119. IF mod.library # NIL THEN
  1120. DevCPM.SymWInt(Slib); OutName(mod.library^)
  1121. END;
  1122. DevCPM.SymWInt(Smname);
  1123. expCtxt.locmno[mno] := expCtxt.nofm; INC(expCtxt.nofm);
  1124. OutName(mod.name^)
  1125. ELSE DevCPM.SymWInt(-expCtxt.locmno[mno])
  1126. END
  1127. END OutMod;
  1128. PROCEDURE ^OutStr(typ: Struct);
  1129. PROCEDURE ^OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  1130. PROCEDURE OutHdFld(typ: Struct; fld: Object; adr: INTEGER);
  1131. VAR i, j, n: INTEGER; btyp: Struct;
  1132. BEGIN
  1133. IF typ.comp = Record THEN OutFlds(typ.link, adr, FALSE)
  1134. ELSIF typ.comp = Array THEN btyp := typ.BaseTyp; n := typ.n;
  1135. WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ;
  1136. IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN
  1137. j := nofhdfld; OutHdFld(btyp, fld, adr);
  1138. IF j # nofhdfld THEN i := 1;
  1139. WHILE (i < n) (* & (nofhdfld <= DevCPM.MaxHdFld) *) DO (* !!! *)
  1140. INC(adr, btyp.size); OutHdFld(btyp, fld, adr); INC(i)
  1141. END
  1142. END
  1143. END
  1144. ELSIF DevCPM.ExpHdPtrFld &
  1145. ((typ.form = Pointer) & ~typ.untagged OR (fld.name^ = DevCPM.HdPtrName)) THEN (* !!! *)
  1146. DevCPM.SymWInt(Shdptr); DevCPM.SymWInt(adr); INC(nofhdfld)
  1147. ELSIF DevCPM.ExpHdUtPtrFld &
  1148. ((typ.form = Pointer) & typ.untagged OR (fld.name^ = DevCPM.HdUtPtrName)) THEN (* !!! *)
  1149. DevCPM.SymWInt(Ssys); (* DevCPM.SymWInt(Shdutptr); *)
  1150. IF typ.form = Pointer THEN n := typ.sysflag ELSE n := fld.sysflag END;
  1151. DevCPM.SymWInt(n);
  1152. DevCPM.SymWInt(adr); INC(nofhdfld);
  1153. IF n > 1 THEN portable := FALSE END (* hidden untagged pointer are portable *)
  1154. ELSIF DevCPM.ExpHdProcFld & ((typ.form = ProcTyp) OR (fld.name^ = DevCPM.HdProcName)) THEN
  1155. DevCPM.SymWInt(Shdpro); DevCPM.SymWInt(adr); INC(nofhdfld)
  1156. END
  1157. END OutHdFld;
  1158. PROCEDURE OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN);
  1159. BEGIN
  1160. WHILE (fld # NIL) & (fld.mode = Fld) DO
  1161. IF (fld.vis # internal) & visible THEN
  1162. IF fld.vis = externalR THEN DevCPM.SymWInt(Srfld) ELSE DevCPM.SymWInt(Sfld) END ;
  1163. OutStr(fld.typ); OutName(fld.name^); DevCPM.SymWInt(fld.adr)
  1164. ELSE OutHdFld(fld.typ, fld, fld.adr + adr)
  1165. END ;
  1166. fld := fld.link
  1167. END
  1168. END OutFlds;
  1169. PROCEDURE OutSign(result: Struct; par: Object);
  1170. BEGIN
  1171. OutStr(result);
  1172. WHILE par # NIL DO
  1173. IF par.sysflag # 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(par.sysflag) END;
  1174. IF par.mode = Var THEN DevCPM.SymWInt(Svalpar)
  1175. ELSIF par.vis = inPar THEN DevCPM.SymWInt(Sinpar)
  1176. ELSIF par.vis = outPar THEN DevCPM.SymWInt(Soutpar)
  1177. ELSE DevCPM.SymWInt(Svarpar)
  1178. END ;
  1179. OutStr(par.typ);
  1180. DevCPM.SymWInt(par.adr);
  1181. OutName(par.name^); par := par.link
  1182. END ;
  1183. DevCPM.SymWInt(Send)
  1184. END OutSign;
  1185. PROCEDURE OutTProcs(typ: Struct; obj: Object);
  1186. VAR bObj: Object;
  1187. BEGIN
  1188. IF obj # NIL THEN
  1189. IF obj.mode = TProc THEN
  1190. (*
  1191. IF (typ.BaseTyp # NIL) & (obj.num < typ.BaseTyp.n) & (obj.vis = internal) & (obj.scope # NIL) THEN
  1192. FindBaseField(obj.name^, typ, bObj);
  1193. ASSERT((bObj # NIL) & (bObj.num = obj.num));
  1194. IF bObj.vis # internal THEN DevCPM.Mark(109, typ.txtpos) END
  1195. (* hidden and overriding, not detected in OPP because record exported indirectly or via aliasing *)
  1196. END;
  1197. *)
  1198. IF obj.vis # internal THEN
  1199. IF obj.vis = externalR THEN DevCPM.SymWInt(Simpo) END;
  1200. IF obj.entry # NIL THEN
  1201. DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE
  1202. END;
  1203. IF limAttr IN obj.conval.setval THEN DevCPM.SymWInt(Slimpro)
  1204. ELSIF absAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sabspro)
  1205. ELSIF empAttr IN obj.conval.setval THEN DevCPM.SymWInt(Semppro)
  1206. ELSIF extAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sextpro)
  1207. ELSE DevCPM.SymWInt(Stpro)
  1208. END;
  1209. OutSign(obj.typ, obj.link); OutName(obj.name^);
  1210. DevCPM.SymWInt(obj.num)
  1211. ELSIF DevCPM.ExpHdTProc THEN
  1212. DevCPM.SymWInt(Shdtpro);
  1213. DevCPM.SymWInt(obj.num)
  1214. END
  1215. END;
  1216. OutTProcs(typ, obj.left);
  1217. OutTProcs(typ, obj.right)
  1218. END
  1219. END OutTProcs;
  1220. PROCEDURE OutStr(typ: Struct); (* OPV.TypeAlloc already applied *)
  1221. VAR strobj: Object;
  1222. BEGIN
  1223. IF typ.ref < expCtxt.ref THEN DevCPM.SymWInt(-typ.ref)
  1224. ELSE
  1225. DevCPM.SymWInt(Sstruct);
  1226. typ.ref := expCtxt.ref; INC(expCtxt.ref);
  1227. IF expCtxt.ref >= maxStruct THEN err(228) END ;
  1228. OutMod(typ.mno); strobj := typ.strobj;
  1229. IF (strobj # NIL) & (strobj.name # null) THEN OutName(strobj.name^);
  1230. CASE strobj.history OF
  1231. | pbmodified: FPrintErr(strobj, 252)
  1232. | pvmodified: FPrintErr(strobj, 251)
  1233. | inconsistent: FPrintErr(strobj, 249)
  1234. ELSE (* checked in OutObj or correct indirect export *)
  1235. END
  1236. ELSE DevCPM.SymWCh(0X) (* anonymous => never inconsistent, pvfp influences the client fp *)
  1237. END;
  1238. IF typ.sysflag # 0 THEN (* !!! *)
  1239. DevCPM.SymWInt(Ssys); DevCPM.SymWInt(typ.sysflag);
  1240. IF typ.sysflag > 0 THEN portable := FALSE END
  1241. END;
  1242. IF strobj # NIL THEN
  1243. IF strobj.library # NIL THEN
  1244. DevCPM.SymWInt(Slib); OutName(strobj.library^); portable := FALSE
  1245. END;
  1246. IF strobj.entry # NIL THEN
  1247. DevCPM.SymWInt(Sentry); OutName(strobj.entry^); portable := FALSE
  1248. END
  1249. END;
  1250. IF typ.ext # NIL THEN
  1251. DevCPM.SymWInt(String8); OutName(typ.ext^); portable := FALSE
  1252. END;
  1253. CASE typ.form OF
  1254. | Pointer:
  1255. DevCPM.SymWInt(Sptr); OutStr(typ.BaseTyp)
  1256. | ProcTyp:
  1257. DevCPM.SymWInt(Spro); OutSign(typ.BaseTyp, typ.link)
  1258. | Comp:
  1259. CASE typ.comp OF
  1260. | Array:
  1261. DevCPM.SymWInt(Sarr); OutStr(typ.BaseTyp); DevCPM.SymWInt(typ.n)
  1262. | DynArr:
  1263. DevCPM.SymWInt(Sdarr); OutStr(typ.BaseTyp)
  1264. | Record:
  1265. IF typ.attribute = limAttr THEN DevCPM.SymWInt(Slimrec)
  1266. ELSIF typ.attribute = absAttr THEN DevCPM.SymWInt(Sabsrec)
  1267. ELSIF typ.attribute = extAttr THEN DevCPM.SymWInt(Sextrec)
  1268. ELSE DevCPM.SymWInt(Srec)
  1269. END;
  1270. IF typ.BaseTyp = NIL THEN OutStr(notyp) ELSE OutStr(typ.BaseTyp) END ;
  1271. (* BaseTyp should be Notyp, too late to change *)
  1272. DevCPM.SymWInt(typ.size); DevCPM.SymWInt(typ.align); DevCPM.SymWInt(typ.n);
  1273. nofhdfld := 0; OutFlds(typ.link, 0, TRUE);
  1274. (*
  1275. IF nofhdfld > DevCPM.MaxHdFld THEN DevCPM.Mark(223, typ.txtpos) END ; (* !!! *)
  1276. *)
  1277. OutTProcs(typ, typ.link); DevCPM.SymWInt(Send)
  1278. END
  1279. ELSE (* alias structure *)
  1280. DevCPM.SymWInt(Salias); OutStr(typ.BaseTyp)
  1281. END
  1282. END
  1283. END OutStr;
  1284. PROCEDURE OutConstant(obj: Object);
  1285. VAR f, i: SHORTINT; rval: SHORTREAL; a, b, c: INTEGER; r: REAL;
  1286. BEGIN
  1287. f := obj.typ.form;
  1288. (*
  1289. IF obj.typ = guidtyp THEN f := Guid END;
  1290. *)
  1291. IF f = Int32 THEN
  1292. IF (obj.conval.intval >= -128) & (obj.conval.intval <= -127) THEN f := Int8
  1293. ELSIF (obj.conval.intval >= -32768) & (obj.conval.intval <= -32767) THEN f := Int16
  1294. END
  1295. END;
  1296. DevCPM.SymWInt(f);
  1297. CASE f OF
  1298. | Bool, Char8:
  1299. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval)))
  1300. | Char16:
  1301. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval MOD 256)));
  1302. DevCPM.SymWCh(SHORT(CHR(obj.conval.intval DIV 256)))
  1303. | Int8, Int16, Int32:
  1304. DevCPM.SymWInt(obj.conval.intval)
  1305. | Int64:
  1306. IF ABS(obj.conval.realval + obj.conval.intval) <= MAX(INTEGER) THEN
  1307. a := SHORT(ENTIER(obj.conval.realval + obj.conval.intval)); b := -1; c := -1
  1308. ELSIF ABS(obj.conval.realval + obj.conval.intval) <= 1125899906842624.0 (*2^50*) THEN
  1309. a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 2097152.0 (*2^21*)));
  1310. b := SHORT(ENTIER(obj.conval.realval + obj.conval.intval - a * 2097152.0 (*2^21*))); c := -1
  1311. ELSE
  1312. a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4398046511104.0 (*2^42*)));
  1313. r := obj.conval.realval + obj.conval.intval - a * 4398046511104.0 (*2^42*);
  1314. b := SHORT(ENTIER(r / 2097152.0 (*2^21*)));
  1315. c := SHORT(ENTIER(r - b * 2097152.0 (*2^21*)))
  1316. END;
  1317. IF c >= 0 THEN
  1318. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128;
  1319. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128;
  1320. DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128)))
  1321. END;
  1322. IF b >= 0 THEN
  1323. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128;
  1324. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128;
  1325. DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128)))
  1326. END;
  1327. DevCPM.SymWInt(a)
  1328. | Set:
  1329. DevCPM.SymWSet(obj.conval.setval)
  1330. | Real32:
  1331. rval := SHORT(obj.conval.realval); DevCPM.SymWReal(rval)
  1332. | Real64:
  1333. DevCPM.SymWLReal(obj.conval.realval)
  1334. | String8, String16:
  1335. OutName(obj.conval.ext^)
  1336. | NilTyp:
  1337. (*
  1338. | Guid:
  1339. i := 0;
  1340. WHILE i < 16 DO DevCPM.SymWCh(obj.conval.ext[i]); INC(i) END
  1341. *)
  1342. ELSE err(127)
  1343. END
  1344. END OutConstant;
  1345. PROCEDURE OutObj(obj: Object);
  1346. VAR i, j: SHORTINT; ext: ConstExt;
  1347. BEGIN
  1348. IF obj # NIL THEN
  1349. OutObj(obj.left);
  1350. IF obj.mode IN {Con, Typ, Var, LProc, XProc, CProc, IProc} THEN
  1351. IF obj.history = removed THEN FPrintErr(obj, 250)
  1352. ELSIF obj.vis # internal THEN
  1353. CASE obj.history OF
  1354. | inserted: FPrintErr(obj, 253)
  1355. | same: (* ok *)
  1356. | pbmodified:
  1357. IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 252) END
  1358. | pvmodified:
  1359. IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 251) END
  1360. END ;
  1361. IF obj.sysflag < 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(obj.sysflag); portable := FALSE END;
  1362. IF obj.mode IN {LProc, XProc, CProc, Var, Con} THEN
  1363. (* name alias for types handled in OutStr *)
  1364. IF obj.library # NIL THEN
  1365. DevCPM.SymWInt(Slib); OutName(obj.library^); portable := FALSE
  1366. END;
  1367. IF obj.entry # NIL THEN
  1368. DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE
  1369. END
  1370. END;
  1371. CASE obj.mode OF
  1372. | Con:
  1373. OutConstant(obj); OutName(obj.name^)
  1374. | Typ:
  1375. IF obj.typ.strobj = obj THEN DevCPM.SymWInt(Stype); OutStr(obj.typ)
  1376. ELSE DevCPM.SymWInt(Salias); OutStr(obj.typ); OutName(obj.name^)
  1377. END
  1378. | Var:
  1379. IF obj.vis = externalR THEN DevCPM.SymWInt(Srvar) ELSE DevCPM.SymWInt(Svar) END ;
  1380. OutStr(obj.typ); OutName(obj.name^);
  1381. IF (obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null) THEN
  1382. (* compute fingerprint to avoid structural type equivalence *)
  1383. DevCPM.FPrint(expCtxt.reffp, obj.typ.ref)
  1384. END
  1385. | XProc:
  1386. DevCPM.SymWInt(Sxpro); OutSign(obj.typ, obj.link); OutName(obj.name^)
  1387. | IProc:
  1388. DevCPM.SymWInt(Sipro); OutSign(obj.typ, obj.link); OutName(obj.name^)
  1389. | CProc:
  1390. DevCPM.SymWInt(Scpro); OutSign(obj.typ, obj.link); ext := obj.conval.ext;
  1391. j := ORD(ext^[0]); i := 1; DevCPM.SymWInt(j);
  1392. WHILE i <= j DO DevCPM.SymWCh(ext^[i]); INC(i) END ;
  1393. OutName(obj.name^); portable := FALSE
  1394. END
  1395. END
  1396. END ;
  1397. OutObj(obj.right)
  1398. END
  1399. END OutObj;
  1400. PROCEDURE Export*(VAR ext, new: BOOLEAN);
  1401. VAR i: SHORTINT; nofmod: BYTE; done: BOOLEAN; old: Object; oldCSum: INTEGER;
  1402. BEGIN
  1403. symExtended := FALSE; symNew := FALSE; nofmod := nofGmod;
  1404. Import("@self", SelfName, done); nofGmod := nofmod;
  1405. oldCSum := DevCPM.checksum;
  1406. ASSERT(GlbMod[0].name^ = SelfName);
  1407. IF DevCPM.noerr THEN (* ~DevCPM.noerr => ~done *)
  1408. DevCPM.NewSym(SelfName);
  1409. IF DevCPM.noerr THEN
  1410. DevCPM.SymWInt(0); (* portable symfile *)
  1411. DevCPM.checksum := 0; (* start checksum here to avoid problems with proc id fixup *)
  1412. DevCPM.SymWInt(actVersion);
  1413. old := GlbMod[0]; portable := TRUE;
  1414. IF libName # "" THEN
  1415. DevCPM.SymWInt(Slib); OutName(libName); portable := FALSE;
  1416. IF done & ((old.library = NIL) OR (old.library^ # libName)) THEN
  1417. FPrintErr(NIL, 252)
  1418. END
  1419. ELSIF done & (old.library # NIL) THEN FPrintErr(NIL, 252)
  1420. END;
  1421. DevCPM.SymWInt(Smname); OutName(SelfName);
  1422. expCtxt.reffp := 0; expCtxt.ref := FirstRef;
  1423. expCtxt.nofm := 1; expCtxt.locmno[0] := 0;
  1424. i := 1; WHILE i < maxImps DO expCtxt.locmno[i] := -1; INC(i) END ;
  1425. OutObj(topScope.right);
  1426. ext := sfpresent & symExtended;
  1427. new := ~sfpresent OR symNew OR (DevCPM.checksum # oldCSum);
  1428. IF DevCPM.noerr & ~portable THEN
  1429. DevCPM.SymReset;
  1430. DevCPM.SymWInt(processor) (* nonportable symfile *)
  1431. END;
  1432. IF DevCPM.noerr & sfpresent & (impCtxt.reffp # expCtxt.reffp) THEN
  1433. new := TRUE
  1434. END ;
  1435. IF ~DevCPM.noerr THEN DevCPM.DeleteNewSym END
  1436. (* DevCPM.RegisterNewSym is called in OP2 after writing the object file *)
  1437. END
  1438. END
  1439. END Export; (* no new symbol file if ~DevCPM.noerr *)
  1440. PROCEDURE InitStruct(VAR typ: Struct; form: BYTE);
  1441. BEGIN
  1442. typ := NewStr(form, Basic); typ.ref := form; typ.size := 1; typ.allocated := TRUE;
  1443. typ.strobj := NewObj(); typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE;
  1444. typ.idfp := form; typ.idfpdone := TRUE
  1445. END InitStruct;
  1446. PROCEDURE EnterBoolConst(name: Name; val: INTEGER);
  1447. VAR obj: Object;
  1448. BEGIN
  1449. Insert(name, obj); obj.conval := NewConst();
  1450. obj.mode := Con; obj.typ := booltyp; obj.conval.intval := val
  1451. END EnterBoolConst;
  1452. PROCEDURE EnterRealConst(name: Name; val: REAL; VAR obj: Object);
  1453. BEGIN
  1454. Insert(name, obj); obj.conval := NewConst();
  1455. obj.mode := Con; obj.typ := real32typ; obj.conval.realval := val
  1456. END EnterRealConst;
  1457. PROCEDURE EnterTyp(name: Name; form: BYTE; size: SHORTINT; VAR res: Struct);
  1458. VAR obj: Object; typ: Struct;
  1459. BEGIN
  1460. Insert(name, obj);
  1461. typ := NewStr(form, Basic); obj.mode := Typ; obj.typ := typ; obj.vis := external;
  1462. typ.strobj := obj; typ.size := size; typ.ref := form; typ.allocated := TRUE;
  1463. typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE;
  1464. typ.idfp := form; typ.idfpdone := TRUE; res := typ
  1465. END EnterTyp;
  1466. PROCEDURE EnterProc(name: Name; num: SHORTINT);
  1467. VAR obj: Object;
  1468. BEGIN Insert(name, obj);
  1469. obj.mode := SProc; obj.typ := notyp; obj.adr := num
  1470. END EnterProc;
  1471. PROCEDURE EnterAttr(name: Name; num: SHORTINT);
  1472. VAR obj: Object;
  1473. BEGIN Insert(name, obj);
  1474. obj.mode := Attr; obj.adr := num
  1475. END EnterAttr;
  1476. PROCEDURE EnterTProc(ptr, rec: Struct; name: Name; num, typ: SHORTINT);
  1477. VAR obj, par: Object;
  1478. BEGIN
  1479. InsertField(name, rec, obj);
  1480. obj.mnolev := -128; (* for correct implement only behaviour *)
  1481. obj.mode := TProc; obj.num := num; obj.conval := NewConst();
  1482. obj.conval.setval := obj.conval.setval + {newAttr};
  1483. IF typ = 0 THEN (* FINALIZE, RELEASE *)
  1484. obj.typ := notyp; obj.vis := externalR;
  1485. INCL(obj.conval.setval, empAttr)
  1486. ELSIF typ = 1 THEN (* QueryInterface *)
  1487. par := NewObj(); par.name := NewName("int"); par.mode := VarPar; par.vis := outPar;
  1488. par.sysflag := 8; par.adr := 16; par.typ := punktyp;
  1489. par.link := obj.link; obj.link := par;
  1490. par := NewObj(); par.name := NewName("iid"); par.mode := VarPar; par.vis := inPar;
  1491. par.sysflag := 16; par.adr := 12; par.typ := guidtyp;
  1492. par.link := obj.link; obj.link := par;
  1493. obj.typ := restyp; obj.vis := external;
  1494. INCL(obj.conval.setval, extAttr)
  1495. ELSIF typ = 2 THEN (* AddRef, Release *)
  1496. obj.typ := notyp; obj.vis := externalR;
  1497. INCL(obj.conval.setval, isHidden);
  1498. INCL(obj.conval.setval, extAttr)
  1499. END;
  1500. par := NewObj(); par.name := NewName("this"); par.mode := Var;
  1501. par.adr := 8; par.typ := ptr;
  1502. par.link := obj.link; obj.link := par;
  1503. END EnterTProc;
  1504. PROCEDURE EnterHdField(VAR root: Object; offs: SHORTINT);
  1505. VAR obj: Object;
  1506. BEGIN
  1507. obj := NewObj(); obj.mode := Fld;
  1508. obj.name := NewName(DevCPM.HdPtrName); obj.typ := undftyp; obj.adr := offs;
  1509. obj.link := root; root := obj
  1510. END EnterHdField;
  1511. BEGIN
  1512. NEW(null, 1); null^ := "";
  1513. topScope := NIL; OpenScope(0, NIL); DevCPM.errpos := 0;
  1514. InitStruct(undftyp, Undef); InitStruct(notyp, NoTyp);
  1515. InitStruct(string8typ, String8); InitStruct(niltyp, NilTyp); niltyp.size := DevCPM.PointerSize;
  1516. InitStruct(string16typ, String16);
  1517. undftyp.BaseTyp := undftyp;
  1518. (*initialization of module SYSTEM*)
  1519. (*
  1520. EnterTyp("BYTE", Byte, 1, bytetyp);
  1521. EnterProc("NEW", sysnewfn);
  1522. *)
  1523. EnterTyp("PTR", Pointer, DevCPM.PointerSize, sysptrtyp);
  1524. EnterProc("ADR", adrfn);
  1525. EnterProc("TYP", typfn);
  1526. EnterProc("CC", ccfn);
  1527. EnterProc("LSH", lshfn);
  1528. EnterProc("ROT", rotfn);
  1529. EnterProc("GET", getfn);
  1530. EnterProc("PUT", putfn);
  1531. EnterProc("GETREG", getrfn);
  1532. EnterProc("PUTREG", putrfn);
  1533. EnterProc("BIT", bitfn);
  1534. EnterProc("VAL", valfn);
  1535. EnterProc("MOVE", movefn);
  1536. EnterProc("THISRECORD", thisrecfn);
  1537. EnterProc("THISARRAY", thisarrfn);
  1538. syslink := topScope.right; topScope.right := NIL;
  1539. (* initialization of module COM *)
  1540. EnterProc("ID", iidfn);
  1541. EnterProc("QUERY", queryfn);
  1542. EnterTyp("RESULT", Int32, 4, restyp);
  1543. restyp.ref := Res;
  1544. EnterTyp("GUID", Guid, 16, guidtyp);
  1545. guidtyp.form := Comp; guidtyp.comp := Array; guidtyp.n := 16;
  1546. EnterTyp("IUnknown^", IUnk, 12, iunktyp);
  1547. iunktyp.form := Comp; iunktyp.comp := Record; iunktyp.n := 3;
  1548. iunktyp.attribute := absAttr;
  1549. (*
  1550. EnterHdField(iunktyp.link, 12);
  1551. *)
  1552. iunktyp.BaseTyp := NIL; iunktyp.align := 4;
  1553. iunktyp.sysflag := interface; iunktyp.untagged := TRUE;
  1554. NEW(iunktyp.ext, 40); iunktyp.ext^ := "{00000000-0000-0000-C000-000000000046}";
  1555. EnterTyp("IUnknown", PUnk, DevCPM.PointerSize, punktyp);
  1556. punktyp.form := Pointer; punktyp.BaseTyp := iunktyp;
  1557. punktyp.sysflag := interface; punktyp.untagged := TRUE;
  1558. EnterTProc(punktyp, iunktyp, "QueryInterface", 0, 1);
  1559. EnterTProc(punktyp, iunktyp, "AddRef", 1, 2);
  1560. EnterTProc(punktyp, iunktyp, "Release", 2, 2);
  1561. comlink := topScope.right; topScope.right := NIL;
  1562. universe := topScope;
  1563. EnterProc("LCHR", lchrfn);
  1564. EnterProc("LENTIER", lentierfcn);
  1565. EnterTyp("ANYREC", AnyRec, 0, anytyp);
  1566. anytyp.form := Comp; anytyp.comp := Record; anytyp.n := 1;
  1567. anytyp.BaseTyp := NIL; anytyp.extlev := -1; (* !!! *)
  1568. anytyp.attribute := absAttr;
  1569. EnterTyp("ANYPTR", AnyPtr, DevCPM.PointerSize, anyptrtyp);
  1570. anyptrtyp.form := Pointer; anyptrtyp.BaseTyp := anytyp;
  1571. EnterTProc(anyptrtyp, anytyp, "FINALIZE", 0, 0);
  1572. EnterTProc(anyptrtyp, iunktyp, "RELEASE", 1, 0);
  1573. EnterProc("VALID", validfn);
  1574. EnterTyp("SHORTCHAR", Char8, 1, char8typ);
  1575. string8typ.BaseTyp := char8typ;
  1576. EnterTyp("CHAR", Char16, 2, char16typ);
  1577. EnterTyp("LONGCHAR", Char16, 2, lchar16typ);
  1578. string16typ.BaseTyp := char16typ;
  1579. EnterTyp("SET", Set, 4, settyp);
  1580. EnterTyp("BYTE", Int8, 1, int8typ);
  1581. guidtyp.BaseTyp := int8typ;
  1582. EnterTyp("SHORTINT", Int16, 2, int16typ);
  1583. EnterTyp("INTEGER", Int32, 4, int32typ);
  1584. EnterTyp("LONGINT", Int64, 8, int64typ);
  1585. EnterTyp("LARGEINT", Int64, 8, lint64typ);
  1586. EnterTyp("SHORTREAL", Real32, 4, real32typ);
  1587. EnterTyp("REAL", Real64, 8, real64typ);
  1588. EnterTyp("LONGREAL", Real64, 8, lreal64typ);
  1589. EnterTyp("BOOLEAN", Bool, 1, booltyp);
  1590. EnterBoolConst("FALSE", 0); (* 0 and 1 are compiler internal representation only *)
  1591. EnterBoolConst("TRUE", 1);
  1592. EnterRealConst("INF", DevCPM.InfReal, infinity);
  1593. EnterProc("HALT", haltfn);
  1594. EnterProc("NEW", newfn);
  1595. EnterProc("ABS", absfn);
  1596. EnterProc("CAP", capfn);
  1597. EnterProc("ORD", ordfn);
  1598. EnterProc("ENTIER", entierfn);
  1599. EnterProc("ODD", oddfn);
  1600. EnterProc("MIN", minfn);
  1601. EnterProc("MAX", maxfn);
  1602. EnterProc("CHR", chrfn);
  1603. EnterProc("SHORT", shortfn);
  1604. EnterProc("LONG", longfn);
  1605. EnterProc("SIZE", sizefn);
  1606. EnterProc("INC", incfn);
  1607. EnterProc("DEC", decfn);
  1608. EnterProc("INCL", inclfn);
  1609. EnterProc("EXCL", exclfn);
  1610. EnterProc("LEN", lenfn);
  1611. EnterProc("COPY", copyfn);
  1612. EnterProc("ASH", ashfn);
  1613. EnterProc("ASSERT", assertfn);
  1614. (*
  1615. EnterProc("ADR", adrfn);
  1616. EnterProc("TYP", typfn);
  1617. *)
  1618. EnterProc("BITS", bitsfn);
  1619. EnterAttr("ABSTRACT", absAttr);
  1620. EnterAttr("LIMITED", limAttr);
  1621. EnterAttr("EMPTY", empAttr);
  1622. EnterAttr("EXTENSIBLE", extAttr);
  1623. NEW(intrealtyp); intrealtyp^ := real64typ^;
  1624. impCtxt.ref[Undef] := undftyp; impCtxt.ref[Byte] := bytetyp;
  1625. impCtxt.ref[Bool] := booltyp; impCtxt.ref[Char8] := char8typ;
  1626. impCtxt.ref[Int8] := int8typ; impCtxt.ref[Int16] := int16typ;
  1627. impCtxt.ref[Int32] := int32typ; impCtxt.ref[Real32] := real32typ;
  1628. impCtxt.ref[Real64] := real64typ; impCtxt.ref[Set] := settyp;
  1629. impCtxt.ref[String8] := string8typ; impCtxt.ref[NilTyp] := niltyp;
  1630. impCtxt.ref[NoTyp] := notyp; impCtxt.ref[Pointer] := sysptrtyp;
  1631. impCtxt.ref[AnyPtr] := anyptrtyp; impCtxt.ref[AnyRec] := anytyp;
  1632. impCtxt.ref[Char16] := char16typ; impCtxt.ref[String16] := string16typ;
  1633. impCtxt.ref[Int64] := int64typ;
  1634. impCtxt.ref[IUnk] := iunktyp; impCtxt.ref[PUnk] := punktyp;
  1635. impCtxt.ref[Guid] := guidtyp; impCtxt.ref[Res] := restyp;
  1636. END LindevCPT.
  1637. Objects:
  1638. mode | adr conval link scope leaf
  1639. ------------------------------------------------
  1640. Undef | Not used
  1641. Var | vadr next regopt Glob or loc var or proc value parameter
  1642. VarPar| vadr next regopt Var parameter (vis = 0 | inPar | outPar)
  1643. Con | val Constant
  1644. Fld | off next Record field
  1645. Typ | Named type
  1646. LProc | entry sizes firstpar scope leaf Local procedure, entry adr set in back-end
  1647. XProc | entry sizes firstpar scope leaf External procedure, entry adr set in back-end
  1648. SProc | fno sizes Standard procedure
  1649. CProc | code firstpar scope Code procedure
  1650. IProc | entry sizes scope leaf Interrupt procedure, entry adr set in back-end
  1651. Mod | scope Module
  1652. Head | txtpos owner firstvar Scope anchor
  1653. TProc | entry sizes firstpar scope leaf Bound procedure, mthno = obj.num
  1654. Structures:
  1655. form comp | n BaseTyp link mno txtpos sysflag
  1656. ----------------------------------------------------------------------------------
  1657. Undef Basic |
  1658. Byte Basic |
  1659. Bool Basic |
  1660. Char8 Basic |
  1661. Int8 Basic |
  1662. Int16 Basic |
  1663. Int32 Basic |
  1664. Real32 Basic |
  1665. Real64 Basic |
  1666. Set Basic |
  1667. String8 Basic |
  1668. NilTyp Basic |
  1669. NoTyp Basic |
  1670. Pointer Basic | PBaseTyp mno txtpos sysflag
  1671. ProcTyp Basic | ResTyp params mno txtpos sysflag
  1672. Comp Array | nofel ElemTyp mno txtpos sysflag
  1673. Comp DynArr| dim ElemTyp mno txtpos sysflag
  1674. Comp Record| nofmth RBaseTyp fields mno txtpos sysflag
  1675. Char16 Basic |
  1676. String16Basic |
  1677. Int64 Basic |
  1678. Nodes:
  1679. design = Nvar|Nvarpar|Nfield|Nderef|Nindex|Nguard|Neguard|Ntype|Nproc.
  1680. expr = design|Nconst|Nupto|Nmop|Ndop|Ncall.
  1681. nextexpr = NIL|expr.
  1682. ifstat = NIL|Nif.
  1683. casestat = Ncaselse.
  1684. sglcase = NIL|Ncasedo.
  1685. stat = NIL|Ninittd|Nenter|Nassign|Ncall|Nifelse|Ncase|Nwhile|Nrepeat|
  1686. Nloop|Nexit|Nreturn|Nwith|Ntrap.
  1687. class subcl obj left right link
  1688. ---------------------------------------------------------
  1689. design Nvar var nextexpr
  1690. Nvarpar varpar nextexpr
  1691. Nfield field design nextexpr
  1692. Nderef ptr/str design nextexpr
  1693. Nindex design expr nextexpr
  1694. Nguard design nextexpr (typ = guard type)
  1695. Neguard design nextexpr (typ = guard type)
  1696. Ntype type nextexpr
  1697. Nproc normal proc nextexpr
  1698. super proc nextexpr
  1699. expr design
  1700. Nconst const (val = node.conval)
  1701. Nupto expr expr nextexpr
  1702. Nmop not expr nextexpr
  1703. minus expr nextexpr
  1704. is tsttype expr nextexpr
  1705. conv expr nextexpr
  1706. abs expr nextexpr
  1707. cap expr nextexpr
  1708. odd expr nextexpr
  1709. bit expr nextexpr {x}
  1710. adr expr nextexpr SYSTEM.ADR
  1711. typ expr nextexpr SYSTEM.TYP
  1712. cc Nconst nextexpr SYSTEM.CC
  1713. val expr nextexpr SYSTEM.VAL
  1714. Ndop times expr expr nextexpr
  1715. slash expr expr nextexpr
  1716. div expr expr nextexpr
  1717. mod expr expr nextexpr
  1718. and expr expr nextexpr
  1719. plus expr expr nextexpr
  1720. minus expr expr nextexpr
  1721. or expr expr nextexpr
  1722. eql expr expr nextexpr
  1723. neq expr expr nextexpr
  1724. lss expr expr nextexpr
  1725. leq expr expr nextexpr
  1726. grt expr expr nextexpr
  1727. geq expr expr nextexpr
  1728. in expr expr nextexpr
  1729. ash expr expr nextexpr
  1730. msk expr Nconst nextexpr
  1731. len design Nconst nextexpr
  1732. min expr expr nextexpr MIN
  1733. max expr expr nextexpr MAX
  1734. bit expr expr nextexpr SYSTEM.BIT
  1735. lsh expr expr nextexpr SYSTEM.LSH
  1736. rot expr expr nextexpr SYSTEM.ROT
  1737. Ncall fpar design nextexpr nextexpr
  1738. Ncomp stat expr nextexpr
  1739. nextexpr NIL
  1740. expr
  1741. ifstat NIL
  1742. Nif expr stat ifstat
  1743. casestat Ncaselse sglcase stat (minmax = node.conval)
  1744. sglcase NIL
  1745. Ncasedo Nconst stat sglcase
  1746. stat NIL
  1747. Ninittd stat (of node.typ)
  1748. Nenter proc stat stat stat (proc=NIL for mod)
  1749. Nassign assign design expr stat
  1750. newfn design nextexp stat
  1751. incfn design expr stat
  1752. decfn design expr stat
  1753. inclfn design expr stat
  1754. exclfn design expr stat
  1755. copyfn design expr stat
  1756. getfn design expr stat SYSTEM.GET
  1757. putfn expr expr stat SYSTEM.PUT
  1758. getrfn design Nconst stat SYSTEM.GETREG
  1759. putrfn Nconst expr stat SYSTEM.PUTREG
  1760. sysnewfn design expr stat SYSTEM.NEW
  1761. movefn expr expr stat SYSTEM.MOVE
  1762. (right.link = 3rd par)
  1763. Ncall fpar design nextexpr stat
  1764. Nifelse ifstat stat stat
  1765. Ncase expr casestat stat
  1766. Nwhile expr stat stat
  1767. Nrepeat stat expr stat
  1768. Nloop stat stat
  1769. Nexit stat
  1770. Nreturn proc nextexpr stat (proc = NIL for mod)
  1771. Nwith ifstat stat stat
  1772. Ntrap expr stat
  1773. Ncomp stat stat stat