From 7c7fa4aee82b89fc5e889e23ebb90f449ac71837 Mon Sep 17 00:00:00 2001 From: Alexander Shiryaev Date: Fri, 16 Nov 2012 23:47:16 +0400 Subject: [PATCH] Dev0 removed --- new/Cons/Mod/Interp.odc | Bin 0 -> 3592 bytes new/Cons/Mod/Interp.txt | 128 - new/Cons/Mod/Log.odc | Bin 0 -> 5356 bytes new/Cons/Mod/Log.txt | 193 - new/Dev/Mod/CPB.odc | Bin 0 -> 85811 bytes new/Dev/Mod/CPB.txt | 2238 ------------ new/Dev/Mod/CPC486.odc | Bin 0 -> 85114 bytes new/Dev/Mod/CPC486.txt | 2333 ------------ new/Dev/Mod/CPE.odc | Bin 0 -> 39821 bytes new/Dev/Mod/CPE.txt | 1105 ------ new/Dev/Mod/CPH.odc | Bin 0 -> 12821 bytes new/Dev/Mod/CPH.txt | 291 -- new/Dev/Mod/CPL486.odc | Bin 0 -> 36903 bytes new/Dev/Mod/CPL486.txt | 1057 ------ new/Dev/Mod/CPM.odc | Bin 0 -> 29690 bytes new/Dev/Mod/CPM.txt | 853 ----- new/Dev/Mod/CPP.odc | Bin 0 -> 62531 bytes new/Dev/Mod/CPP.txt | 1650 --------- new/Dev/Mod/CPS.odc | Bin 0 -> 15389 bytes new/Dev/Mod/CPS.txt | 367 -- new/Dev/Mod/CPT.odc | Bin 0 -> 75676 bytes new/Dev/Mod/CPT.txt | 1890 ---------- new/Dev/Mod/CPV486.odc | Bin 0 -> 67677 bytes new/Dev/Mod/CPV486.txt | 1774 --------- new/Dev/Mod/Commanders.odc | Bin 0 -> 13298 bytes new/Dev/Mod/Commanders.txt | 361 -- new/Dev/Mod/Compiler.odc | Bin 0 -> 13301 bytes new/Dev/Mod/Compiler.txt | 348 -- new/Dev/Mod/Markers.odc | Bin 0 -> 14881 bytes new/Dev/Mod/Markers.txt | 442 --- new/Dev/Mod/Selectors.odc | Bin 0 -> 15614 bytes new/Dev/Mod/Selectors.txt | 411 --- new/Dev0/Mod/CPB.odc | Bin 85923 -> 0 bytes new/Dev0/Mod/CPB.txt | 2251 ------------ new/Dev0/Mod/CPC486.odc | Bin 85407 -> 0 bytes new/Dev0/Mod/CPC486.txt | 2347 ------------ new/Dev0/Mod/CPE.odc | Bin 40043 -> 0 bytes new/Dev0/Mod/CPE.txt | 1120 ------ new/Dev0/Mod/CPH.odc | Bin 12920 -> 0 bytes new/Dev0/Mod/CPH.txt | 304 -- new/Dev0/Mod/CPL486.odc | Bin 37044 -> 0 bytes new/Dev0/Mod/CPL486.txt | 1070 ------ new/Dev0/Mod/CPM.odc | Bin 28285 -> 0 bytes new/Dev0/Mod/CPM.txt | 809 ----- new/Dev0/Mod/CPP.odc | Bin 62670 -> 0 bytes new/Dev0/Mod/CPP.txt | 1662 --------- new/Dev0/Mod/CPS.odc | Bin 15509 -> 0 bytes new/Dev0/Mod/CPS.txt | 379 -- new/Dev0/Mod/CPT.odc | Bin 75987 -> 0 bytes new/Dev0/Mod/CPT.txt | 1904 ---------- new/Dev0/Mod/CPV486.odc | Bin 67890 -> 0 bytes new/Dev0/Mod/CPV486.txt | 1788 ---------- new/Dev0/Mod/Compiler.odc | Bin 5749 -> 0 bytes new/Dev0/Mod/Compiler.txt | 140 - new/Dev0/Mod/ElfLinker16.odc | Bin 63440 -> 0 bytes new/Dev0/Mod/ElfLinker16.txt | 1892 ---------- new/Dev0/Mod/Interp.txt | 56 - new/Dev0/Mod/Linker.odc | Bin 61632 -> 0 bytes new/Dev0/Mod/Linker.txt | 1779 --------- new/Dev0/Views.txt | 14 - new/Std/Mod/Api.odc | Bin 0 -> 10286 bytes new/Std/Mod/CFrames.odc | Bin 0 -> 12901 bytes new/Std/Mod/Clocks.odc | Bin 0 -> 7345 bytes new/Std/Mod/Cmds.odc | Bin 0 -> 32783 bytes new/Std/Mod/Coder.odc | Bin 0 -> 24960 bytes new/Std/Mod/Debug.odc | Bin 0 -> 24543 bytes new/Std/Mod/Dialog.odc | Bin 0 -> 12495 bytes new/Std/Mod/ETHConv.odc | Bin 0 -> 9559 bytes new/Std/Mod/Folds.odc | Bin 0 -> 26866 bytes new/Std/Mod/Headers.odc | Bin 0 -> 15977 bytes new/Std/Mod/Interpreter.odc | Bin 0 -> 9639 bytes new/Std/Mod/Links.odc | Bin 0 -> 29947 bytes new/Std/Mod/Loader.odc | Bin 0 -> 13413 bytes new/Std/Mod/Log.odc | Bin 0 -> 11451 bytes new/Std/Mod/Logos.odc | Bin 0 -> 6898 bytes new/Std/Mod/Scrollers.odc | Bin 0 -> 28195 bytes new/Std/Mod/Stamps.odc | Bin 0 -> 16439 bytes new/Std/Mod/ViewSizer.odc | Bin 0 -> 7030 bytes new/{__GUI => }/System/Docu/In.odc | Bin new/{__GUI => }/System/Docu/Out.odc | Bin new/System/Mod/Console.txt | 58 - new/System/Mod/Containers.odc | Bin 0 -> 50589 bytes new/System/Mod/Containers.txt | 1381 ------- new/System/Mod/Controllers.odc | Bin 0 -> 15396 bytes new/System/Mod/Controllers.txt | 426 --- new/System/Mod/Controls.odc | Bin 0 -> 98296 bytes new/System/Mod/Controls.txt | 3163 ----------------- new/System/Mod/Converters.odc | Bin 0 -> 5771 bytes new/System/Mod/Converters.txt | 105 - new/System/Mod/Dates.odc | Bin 0 -> 7849 bytes new/System/Mod/Dates.txt | 191 - new/System/Mod/Dialog.odc | Bin 0 -> 40001 bytes new/System/Mod/Dialog.txt | 1202 ------- new/System/Mod/Documents.odc | Bin 0 -> 43070 bytes new/System/Mod/Documents.txt | 1286 ------- new/System/Mod/Files.odc | Bin 0 -> 6624 bytes new/System/Mod/Files.txt | 110 - new/System/Mod/Fonts.odc | Bin 0 -> 4399 bytes new/System/Mod/Fonts.txt | 59 - new/{__GUI => }/System/Mod/In.odc | Bin new/System/Mod/In.txt | 87 - new/System/Mod/Integers.odc | Bin 0 -> 29326 bytes new/System/Mod/Integers.txt | 848 ----- new/System/Mod/Log.odc | Bin 0 -> 6537 bytes new/System/Mod/Log.txt | 144 - new/System/Mod/Math.odc | Bin 0 -> 18006 bytes new/System/Mod/Math.txt | 532 --- new/System/Mod/Mechanisms.odc | Bin 0 -> 7386 bytes new/System/Mod/Mechanisms.txt | 129 - new/System/Mod/Meta.odc | Bin 0 -> 46081 bytes new/System/Mod/Meta.txt | 1214 ------- new/System/Mod/Models.odc | Bin 0 -> 9377 bytes new/System/Mod/Models.txt | 258 -- new/{__GUI => }/System/Mod/Out.odc | Bin new/System/Mod/Ports.odc | Bin 0 -> 13412 bytes new/System/Mod/Ports.txt | 318 -- new/System/Mod/Printers.odc | Bin 0 -> 4456 bytes new/System/Mod/Printers.txt | 63 - new/System/Mod/Printing.odc | Bin 0 -> 9886 bytes new/System/Mod/Printing.txt | 226 -- new/System/Mod/Properties.odc | Bin 0 -> 16167 bytes new/System/Mod/Properties.txt | 425 --- new/System/Mod/SMath.odc | Bin 0 -> 15070 bytes new/System/Mod/SMath.txt | 392 -- new/System/Mod/Sequencers.odc | Bin 0 -> 5449 bytes new/System/Mod/Sequencers.txt | 86 - new/System/Mod/Services.odc | Bin 0 -> 10479 bytes new/System/Mod/Services.txt | 256 -- new/System/Mod/Stores.odc | Bin 0 -> 43647 bytes new/System/Mod/Stores.txt | 1313 ------- new/System/Mod/Strings.odc | Bin 0 -> 22037 bytes new/System/Mod/Strings.txt | 565 --- new/System/Mod/Views.odc | Bin 0 -> 44177 bytes new/System/Mod/Views.txt | 1347 ------- new/System/Mod/Windows.odc | Bin 0 -> 27620 bytes new/System/Mod/Windows.txt | 855 ----- new/Text/Mod/Cmds.txt | 860 ----- new/Text/Mod/Controllers.txt | 1633 --------- new/Text/Mod/Mappers.txt | 596 ---- new/Text/Mod/Models.txt | 2085 ----------- new/Text/Mod/Rulers.txt | 1676 --------- new/Text/Mod/Setters.txt | 1313 ------- new/Text/Mod/Views.txt | 1579 -------- new/_LinuxOpenBSD_/Host/Mod/Lang.txt | 121 - new/_LinuxOpenBSD_/Host/Mod/TextConv.txt | 1155 ------ new/_LinuxOpenBSD_/System/Mod/Config.txt | 27 - .../System/Mod/Kernel_so_init.txt | 27 - new/_Linux_/Host/Mod/Console.odc | Bin 5060 -> 5064 bytes new/_Linux_/Host/Mod/Console.txt | 156 - new/_Linux_/Host/Mod/Dates.txt | 92 - new/_Linux_/Host/Mod/Files.txt | 1501 -------- new/_Linux_/libBB.so | Bin 88220 -> 88220 bytes new/_Linux_/libBB0.so | Bin 832592 -> 1452536 bytes new/_OpenBSD_/Host/Mod/Console.odc | Bin 5199 -> 5203 bytes new/_OpenBSD_/Host/Mod/Console.txt | 156 - new/_OpenBSD_/Host/Mod/Dates.txt | 92 - new/_OpenBSD_/Host/Mod/Files.txt | 1501 -------- new/_OpenBSD_/Lin/Mod/Dl.txt | 10 +- new/_OpenBSD_/System/Mod/Kernel.txt | 2155 ----------- new/_OpenBSD_/libBB.so | Bin 89892 -> 89876 bytes new/_OpenBSD_/libBB0.so | Bin 834280 -> 1454168 bytes new/_Windows_/Host/Mod/Console.txt | 120 - new/__Interp/Host/Mod/Dialog.odc | Bin 0 -> 2225 bytes new/__Interp/Host/Mod/Dialog.txt | 52 - new/__Interp/Host/Mod/Fonts.odc | Bin 0 -> 2620 bytes new/__Interp/Host/Mod/Fonts.txt | 75 - new/__Interp/Host/Mod/Windows.odc | Bin 0 -> 4327 bytes new/__Interp/Host/Mod/Windows.txt | 143 - new/__Interp/System/Mod/Init.odc | Bin 0 -> 1773 bytes new/__Interp/System/Mod/Init.txt | 28 - new/build | 147 +- new/build-dev0 | 43 - new/build-gui | 2 - new/pack-dev0 | 10 + 174 files changed, 54 insertions(+), 67296 deletions(-) create mode 100644 new/Cons/Mod/Interp.odc delete mode 100644 new/Cons/Mod/Interp.txt create mode 100644 new/Cons/Mod/Log.odc delete mode 100644 new/Cons/Mod/Log.txt create mode 100644 new/Dev/Mod/CPB.odc delete mode 100644 new/Dev/Mod/CPB.txt create mode 100644 new/Dev/Mod/CPC486.odc delete mode 100644 new/Dev/Mod/CPC486.txt create mode 100644 new/Dev/Mod/CPE.odc delete mode 100644 new/Dev/Mod/CPE.txt create mode 100644 new/Dev/Mod/CPH.odc delete mode 100644 new/Dev/Mod/CPH.txt create mode 100644 new/Dev/Mod/CPL486.odc delete mode 100644 new/Dev/Mod/CPL486.txt create mode 100644 new/Dev/Mod/CPM.odc delete mode 100644 new/Dev/Mod/CPM.txt create mode 100644 new/Dev/Mod/CPP.odc delete mode 100644 new/Dev/Mod/CPP.txt create mode 100644 new/Dev/Mod/CPS.odc delete mode 100644 new/Dev/Mod/CPS.txt create mode 100644 new/Dev/Mod/CPT.odc delete mode 100644 new/Dev/Mod/CPT.txt create mode 100644 new/Dev/Mod/CPV486.odc delete mode 100644 new/Dev/Mod/CPV486.txt create mode 100644 new/Dev/Mod/Commanders.odc delete mode 100644 new/Dev/Mod/Commanders.txt create mode 100644 new/Dev/Mod/Compiler.odc delete mode 100644 new/Dev/Mod/Compiler.txt create mode 100644 new/Dev/Mod/Markers.odc delete mode 100644 new/Dev/Mod/Markers.txt create mode 100644 new/Dev/Mod/Selectors.odc delete mode 100644 new/Dev/Mod/Selectors.txt delete mode 100644 new/Dev0/Mod/CPB.odc delete mode 100644 new/Dev0/Mod/CPB.txt delete mode 100644 new/Dev0/Mod/CPC486.odc delete mode 100644 new/Dev0/Mod/CPC486.txt delete mode 100644 new/Dev0/Mod/CPE.odc delete mode 100644 new/Dev0/Mod/CPE.txt delete mode 100644 new/Dev0/Mod/CPH.odc delete mode 100644 new/Dev0/Mod/CPH.txt delete mode 100644 new/Dev0/Mod/CPL486.odc delete mode 100644 new/Dev0/Mod/CPL486.txt delete mode 100644 new/Dev0/Mod/CPM.odc delete mode 100644 new/Dev0/Mod/CPM.txt delete mode 100644 new/Dev0/Mod/CPP.odc delete mode 100644 new/Dev0/Mod/CPP.txt delete mode 100644 new/Dev0/Mod/CPS.odc delete mode 100644 new/Dev0/Mod/CPS.txt delete mode 100644 new/Dev0/Mod/CPT.odc delete mode 100644 new/Dev0/Mod/CPT.txt delete mode 100644 new/Dev0/Mod/CPV486.odc delete mode 100644 new/Dev0/Mod/CPV486.txt delete mode 100644 new/Dev0/Mod/Compiler.odc delete mode 100644 new/Dev0/Mod/Compiler.txt delete mode 100644 new/Dev0/Mod/ElfLinker16.odc delete mode 100644 new/Dev0/Mod/ElfLinker16.txt delete mode 100644 new/Dev0/Mod/Interp.txt delete mode 100644 new/Dev0/Mod/Linker.odc delete mode 100644 new/Dev0/Mod/Linker.txt delete mode 100644 new/Dev0/Views.txt create mode 100644 new/Std/Mod/Api.odc create mode 100644 new/Std/Mod/CFrames.odc create mode 100644 new/Std/Mod/Clocks.odc create mode 100644 new/Std/Mod/Cmds.odc create mode 100644 new/Std/Mod/Coder.odc create mode 100644 new/Std/Mod/Debug.odc create mode 100644 new/Std/Mod/Dialog.odc create mode 100644 new/Std/Mod/ETHConv.odc create mode 100644 new/Std/Mod/Folds.odc create mode 100644 new/Std/Mod/Headers.odc create mode 100644 new/Std/Mod/Interpreter.odc create mode 100644 new/Std/Mod/Links.odc create mode 100644 new/Std/Mod/Loader.odc create mode 100644 new/Std/Mod/Log.odc create mode 100644 new/Std/Mod/Logos.odc create mode 100644 new/Std/Mod/Scrollers.odc create mode 100644 new/Std/Mod/Stamps.odc create mode 100644 new/Std/Mod/ViewSizer.odc rename new/{__GUI => }/System/Docu/In.odc (100%) rename new/{__GUI => }/System/Docu/Out.odc (100%) delete mode 100644 new/System/Mod/Console.txt create mode 100644 new/System/Mod/Containers.odc delete mode 100644 new/System/Mod/Containers.txt create mode 100644 new/System/Mod/Controllers.odc delete mode 100644 new/System/Mod/Controllers.txt create mode 100644 new/System/Mod/Controls.odc delete mode 100644 new/System/Mod/Controls.txt create mode 100644 new/System/Mod/Converters.odc delete mode 100644 new/System/Mod/Converters.txt create mode 100644 new/System/Mod/Dates.odc delete mode 100644 new/System/Mod/Dates.txt create mode 100644 new/System/Mod/Dialog.odc delete mode 100644 new/System/Mod/Dialog.txt create mode 100644 new/System/Mod/Documents.odc delete mode 100644 new/System/Mod/Documents.txt create mode 100644 new/System/Mod/Files.odc delete mode 100644 new/System/Mod/Files.txt create mode 100644 new/System/Mod/Fonts.odc delete mode 100644 new/System/Mod/Fonts.txt rename new/{__GUI => }/System/Mod/In.odc (100%) delete mode 100644 new/System/Mod/In.txt create mode 100644 new/System/Mod/Integers.odc delete mode 100644 new/System/Mod/Integers.txt create mode 100644 new/System/Mod/Log.odc delete mode 100644 new/System/Mod/Log.txt create mode 100644 new/System/Mod/Math.odc delete mode 100644 new/System/Mod/Math.txt create mode 100644 new/System/Mod/Mechanisms.odc delete mode 100644 new/System/Mod/Mechanisms.txt create mode 100644 new/System/Mod/Meta.odc delete mode 100644 new/System/Mod/Meta.txt create mode 100644 new/System/Mod/Models.odc delete mode 100644 new/System/Mod/Models.txt rename new/{__GUI => }/System/Mod/Out.odc (100%) create mode 100644 new/System/Mod/Ports.odc delete mode 100644 new/System/Mod/Ports.txt create mode 100644 new/System/Mod/Printers.odc delete mode 100644 new/System/Mod/Printers.txt create mode 100644 new/System/Mod/Printing.odc delete mode 100644 new/System/Mod/Printing.txt create mode 100644 new/System/Mod/Properties.odc delete mode 100644 new/System/Mod/Properties.txt create mode 100644 new/System/Mod/SMath.odc delete mode 100644 new/System/Mod/SMath.txt create mode 100644 new/System/Mod/Sequencers.odc delete mode 100644 new/System/Mod/Sequencers.txt create mode 100644 new/System/Mod/Services.odc delete mode 100644 new/System/Mod/Services.txt create mode 100644 new/System/Mod/Stores.odc delete mode 100644 new/System/Mod/Stores.txt create mode 100644 new/System/Mod/Strings.odc delete mode 100644 new/System/Mod/Strings.txt create mode 100644 new/System/Mod/Views.odc delete mode 100644 new/System/Mod/Views.txt create mode 100644 new/System/Mod/Windows.odc delete mode 100644 new/System/Mod/Windows.txt delete mode 100644 new/Text/Mod/Cmds.txt delete mode 100644 new/Text/Mod/Controllers.txt delete mode 100644 new/Text/Mod/Mappers.txt delete mode 100644 new/Text/Mod/Models.txt delete mode 100644 new/Text/Mod/Rulers.txt delete mode 100644 new/Text/Mod/Setters.txt delete mode 100644 new/Text/Mod/Views.txt delete mode 100644 new/_LinuxOpenBSD_/Host/Mod/Lang.txt delete mode 100644 new/_LinuxOpenBSD_/Host/Mod/TextConv.txt delete mode 100644 new/_LinuxOpenBSD_/System/Mod/Config.txt delete mode 100644 new/_LinuxOpenBSD_/System/Mod/Kernel_so_init.txt delete mode 100644 new/_Linux_/Host/Mod/Console.txt delete mode 100644 new/_Linux_/Host/Mod/Dates.txt delete mode 100644 new/_Linux_/Host/Mod/Files.txt delete mode 100644 new/_OpenBSD_/Host/Mod/Console.txt delete mode 100644 new/_OpenBSD_/Host/Mod/Dates.txt delete mode 100644 new/_OpenBSD_/Host/Mod/Files.txt delete mode 100644 new/_OpenBSD_/System/Mod/Kernel.txt delete mode 100644 new/_Windows_/Host/Mod/Console.txt create mode 100644 new/__Interp/Host/Mod/Dialog.odc delete mode 100644 new/__Interp/Host/Mod/Dialog.txt create mode 100644 new/__Interp/Host/Mod/Fonts.odc delete mode 100644 new/__Interp/Host/Mod/Fonts.txt create mode 100644 new/__Interp/Host/Mod/Windows.odc delete mode 100644 new/__Interp/Host/Mod/Windows.txt create mode 100644 new/__Interp/System/Mod/Init.odc delete mode 100644 new/__Interp/System/Mod/Init.txt delete mode 100755 new/build-dev0 create mode 100755 new/pack-dev0 diff --git a/new/Cons/Mod/Interp.odc b/new/Cons/Mod/Interp.odc new file mode 100644 index 0000000000000000000000000000000000000000..0b5e294d8328d3cbccce244a61f4020cc4618996 GIT binary patch literal 3592 zcmb_f&2Jk;6rZ#R*is9GI8>aTQiRtbtTq(~aN4S_ciUQW?P%>Zfv8AsJWV#(yOwud z(@UvZ_0A1}IKc^V;?99PNB#o-gEprgkji^+X7(_Udkse)=1N7cyE@< zq#Q|AOT4e&VudDa;=*&Dh;RAz9@18x9IK=Xv96g<5+Z&jv`Sph-W1}@f0HEk-#IsD zY5FccXLCs+(NH!yKwK?4$_4rXH(uTDdfROuu+&K_O67F2S*cj|TE(&&4%~5|cNk6| z4&;M%xa4kJa@@}<)>;i&TDP~lK_A&jG9Jlwoc1tx(Lu5fUN{)V2SoDZgJwJ)527KW zbRF^nDgI$QJ|Kg48UZq=SiYcMU~&REKtbZz3c5|-+YWs6D4t{4S<)g&*snwLRwLM~ zSl9iVtqyxa`wl5|8k32PhPD!M?#=GkNS`w1^kljfC$@_;Ln52a!@< z`{u|v1+R;&R_g}r!xeD7UFhHP$!3-cXJ;CwvK}qqXtV)#s{=_L8bQ$b9J)7D>L9E`tJC*y z`a!J@*Sp=e-{_EIl;5Llk6p#fD**m%m7m45NVjNBTs0KQFSg0eo z3Sm~JG0FDxn_?JFosOK_Ty1MkyJI3KzwAz{t#*{95H6!Wg#l}>O3md=_QJc0(IN*z za?@1M>i9c0W~sIb_{*?lGirHH9?;5FE5xdD!4wrfh7HbTIm4)k`0#~>bgb&!IaFsG zPunW2t^-z!-8xYkgCo_YBNh1l?Vv+)gl~l?Mo#${63GRd@Ue)dWd!Bu;z$@l1&~=` zgm*^~cgt8vAWW#hct?%HXpqVw;H?4?o=7>Kqz@G^LY2u37&euKkx_#W!K|uKEiG+a z>SJw6m!pR@U?%c|PN~7vb5bbJTx&e(2sO=&1~R-ciR!y+VlNBBN3cO)p{oKA`$mOb zRUv6Ou`uU}#BVf^n@I|mCNg)I0()dXQk*8_D;RLKW`d;4OIum3uCk+e&aeWcSxf5p z@uD*sF(AvN`MhP9pW^k)>NSy)PUF#t8g~?Krc>Q;(^sjuna`IR z@{_iV&V{|K9jEq`2DRjcv7)>RX2v0&DU0Nh-pHxP+<2mfU-6;N{AZ<2b>_LAUixsP z{&R54o^2TFG0B>N4Y2q^FG>!b){+~+4``ygaGbcmDJ6%0uZRoy*NQgG=4oBBVOi{w zk!r9>{Ij;0>vxQhep6UHIO*5+5+T0-Nj(1N96x`2c_<$L_?-~{ E0#kx{2LJ#7 literal 0 HcmV?d00001 diff --git a/new/Cons/Mod/Interp.txt b/new/Cons/Mod/Interp.txt deleted file mode 100644 index 9dac7e9..0000000 --- a/new/Cons/Mod/Interp.txt +++ /dev/null @@ -1,128 +0,0 @@ -MODULE ConsInterp; - - (* - A. V. Shiryaev, 2012.09 - *) - - IMPORT - Console, - Strings, Dialog, - DevCommanders, TextModels, - StdLog; - - VAR - textR: TextModels.Reader; - - PROCEDURE ShowStdLog; - VAR c: CHAR; - BEGIN - StdLog.text.Append(StdLog.buf); - - textR.SetPos(0); - textR.ReadChar(c); - WHILE ~textR.eot DO - IF c = 0DX THEN - Console.WriteLn - ELSE - Console.WriteChar(c) - END; - textR.ReadChar(c) - END; - StdLog.text.Delete(0, StdLog.text.Length()) - END ShowStdLog; - - PROCEDURE Call1 (IN s: ARRAY OF CHAR; i: INTEGER): BOOLEAN; - VAR j: INTEGER; - res: INTEGER; - par: DevCommanders.Par; - m: TextModels.Model; w: TextModels.Writer; - BEGIN - (* ASSERT 0X in s[ i:LEN(s) ) *) - j := i; - WHILE s[j] # 0X DO INC(j) END; - IF j > i THEN - m := TextModels.dir.New(); - w := m.NewWriter(NIL); - WHILE i < j DO - w.WriteChar(s[i]); - INC(i) - END; - NEW(par); par.text := m; par.beg := 0; par.end := m.Length() - 1; - DevCommanders.par := par - END; - Dialog.Call(s, " ", res); - DevCommanders.par := NIL; - ShowStdLog; - RETURN res = 0 - END Call1; - - PROCEDURE Call0 (VAR s: ARRAY OF CHAR): BOOLEAN; - VAR i: INTEGER; - res: BOOLEAN; - inStr: BOOLEAN; - BEGIN - (* ASSERT s is 0X terminated and not empty *) - i := 0; - WHILE (s[i] # 0X) & (s[i] # ' ') & (s[i] # '(') DO - INC(i) - END; - IF s[i] = 0X THEN - res := Call1(s, i) - ELSIF s[i] = ' ' THEN - s[i] := 0X; - res := Call1(s, i + 1) - ELSE (* s[i] = '(' *) - INC(i); - inStr := FALSE; - WHILE (s[i] # 0X) & ~(~inStr & (s[i] = ')')) DO - IF s[i] = "'" THEN inStr := ~inStr END; - INC(i) - END; - IF s[i] # 0X THEN - INC(i); - IF s[i] = 0X THEN - res := Call1(s, i) - ELSE - s[i] := 0X; - res := Call1(s, i + 1) - END - ELSE - res := FALSE - END - END; - RETURN res - END Call0; - - PROCEDURE Call (VAR s: ARRAY OF CHAR): BOOLEAN; - VAR i: INTEGER; - res: BOOLEAN; - BEGIN - i := 0; - WHILE (i < LEN(s)) & (s[i] # 0AX) & (s[i] # 0DX) & (s[i] # 0X) DO - INC(i) - END; - IF (i < LEN(s)) & (s[i] # 0X) THEN - IF (i > 0) & (s[0] # '#') THEN - s[i] := 0X; - res := Call0(s) - ELSE (* skip empty strings and comments *) - res := TRUE - END - ELSE (* end of input *) - res := FALSE - END; - RETURN res - END Call; - - PROCEDURE Run*; - VAR s: ARRAY 1024 OF CHAR; - BEGIN - Console.ReadLn(s); - WHILE Call(s) DO - Console.ReadLn(s) - END - END Run; - -BEGIN - textR := StdLog.text.NewReader(NIL) -END ConsInterp. diff --git a/new/Cons/Mod/Log.odc b/new/Cons/Mod/Log.odc new file mode 100644 index 0000000000000000000000000000000000000000..722604d493f240e9966f9bcffa952b27f26e0fb2 GIT binary patch literal 5356 zcmb^#O^@4D@NM}F5CMWi#p$U<;6#y?t^|jqTQ!?_yAj!V<)ph^7Lc6m+l@tH2iw_h zFQ{sd9N>Zw5+^tz4izUZNc7IH;2*Sm>H!I6-iQ614~vzEWO*{*GjHB|<7u|+fWYs; z(^fE?O_(1?W-mTce_AXW5{;C_Hv>O*J)eblB^f&M!$Je4(=kLd!$0LwW&9G)GX&f_vvLNt^;A>-6?!j~EWrQ}e5MPArh~v;F2!Rzs!UXpPLOeZwf{PL2d>n^~Cx0N0+jx{vKSGGR z@fAYc#@7k-9YS2<&jk7wwEnYWw{CYV3Z)fwf|Gi&STM@PLZM;OJ(KoEUU<)Crxm(h zy|!*%s{*+IZ02?ld``W|6e50rr$u_GGz6siEYiiL6s1ll{hw$m4a70PR^ zLR+3Y4o)h7O>3k=IqXiSu!E3b0XvN`3*)FpH*LFPHM(`cMzeuEi)*?`b1MiZZXB}^g$sk(u_WUTlp731 zW2kB;LvomVB&3Wo?ac->noXxc7*n2rUB_-(t=o=OrnhEpctnk$MjPFO-M&-OecH5c zwY#9-vHG{2E)D2a+HH4=1&BrnqFb7>=9szR=Ij`Kf>6Qe0RCkhP8=s+kx5~xnd(QqUx9?MkQak$TT`H2D>!A4W5 zmw|$KuKuoVdHGU zCZcnV_TakrPrz)uOQSf1bJB4d2h`r;N69KDgp>gS3l;?_*XCvr$Ux=&u*wWyzs2;T z{E}D^oog4)I+5R=)xV%g5M5#su(<|d#qo+0MrA40Dc;%@I`RB{?Sz0m9Ds!qURA_{2Me15uEh(ED1=dg+2G(YsPD3{IBIrUyAQj5a zru!>GS>?CVi;geVr~F^=T1n=*-FFAc5d+7tynp$*0HpaN0a5yGKYwC%{8h?2eyR(v zu=K)6ZF?luh%>LCr@6T!n-z>|;-Dc#J^2y;&6V6!;s5!5BV-`9P}~ zhjOTd`O%3fyfAcHMp8QGXvxS)479}92__Hfw 0 THEN - textR.SetPos(0); - textR.ReadChar(c); - WHILE ~textR.eot DO - IF c = 0DX THEN - Console.WriteLn - ELSE - Console.WriteChar(c) - END; - textR.ReadChar(c) - END; - buf.Delete(0, buf.Length()) - END - END FlushBuf; - - PROCEDURE* SubFlush; - BEGIN - IF Log.synch THEN - FlushBuf; - (* IF Log.force THEN Views.RestoreDomain(text.Domain()) END *) - END; - END SubFlush; - - PROCEDURE (log: LogHook) Guard* (o: ANYPTR): BOOLEAN; - BEGIN RETURN Guard(o) - END Guard; - - PROCEDURE (log: LogHook) ClearBuf*; - BEGIN ClearBuf - END ClearBuf; - - PROCEDURE (log: LogHook) FlushBuf*; - BEGIN FlushBuf - END FlushBuf; - - PROCEDURE (log: LogHook) Beep*; - BEGIN Dialog.Beep - END Beep; - - PROCEDURE (log: LogHook) Char* (ch: CHAR); - BEGIN - subOut.WriteChar(ch); SubFlush - END Char; - - PROCEDURE (log: LogHook) Int* (n: INTEGER); - BEGIN - subOut.WriteChar(" "); subOut.WriteInt(n); SubFlush - END Int; - - PROCEDURE (log: LogHook) Real* (x: REAL); - BEGIN - subOut.WriteChar(" "); subOut.WriteReal(x); SubFlush - END Real; - - PROCEDURE (log: LogHook) String* (IN str: ARRAY OF CHAR); - BEGIN - subOut.WriteString(str); SubFlush - END String; - - PROCEDURE (log: LogHook) Bool* (x: BOOLEAN); - BEGIN - subOut.WriteChar(" "); subOut.WriteBool(x); SubFlush - END Bool; - - PROCEDURE (log: LogHook) Set* (x: SET); - BEGIN - subOut.WriteChar(" "); subOut.WriteSet(x); SubFlush - END Set; - - PROCEDURE (log: LogHook) IntForm* (x: INTEGER; base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN); - BEGIN - subOut.WriteIntForm(x, base, minWidth, fillCh, showBase); SubFlush - END IntForm; - - PROCEDURE (log: LogHook) RealForm* (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR); - BEGIN - subOut.WriteRealForm(x, precision, minW, expW, fillCh); SubFlush - END RealForm; - - PROCEDURE (log: LogHook) Tab*; - BEGIN - subOut.WriteTab; SubFlush - END Tab; - - PROCEDURE (log: LogHook) Ln*; - BEGIN - subOut.WriteLn; SubFlush; - (* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *) - END Ln; - - PROCEDURE (log: LogHook) Para*; - BEGIN - subOut.WritePara; SubFlush; - (* IF Log.synch THEN Views.RestoreDomain(text.Domain()) END *) - END Para; - - PROCEDURE (log: LogHook) View* (v: ANYPTR); - BEGIN - IF (v # NIL) & (v IS Views.View) THEN - subOut.WriteView(v(Views.View)); SubFlush - END - END View; - - PROCEDURE (log: LogHook) ViewForm* (v: ANYPTR; w, h: INTEGER); - BEGIN - ASSERT(v # NIL, 20); - IF (v # NIL) & (v IS Views.View) THEN - subOut.WriteViewForm(v(Views.View), w, h); SubFlush - END - END ViewForm; - - PROCEDURE (log: LogHook) ParamMsg* (IN s, p0, p1, p2: ARRAY OF CHAR); - VAR msg: ARRAY 256 OF CHAR; i: INTEGER; ch: CHAR; - BEGIN - IF logAlerts THEN - (* IF Log.synch THEN Open END; *) - Dialog.MapParamString(s, p0, p1, p2, msg); - i := 0; ch := msg[0]; - WHILE ch # 0X DO - IF ch = TextModels.line THEN subOut.WriteLn - ELSIF ch = TextModels.para THEN subOut.WritePara - ELSIF ch = TextModels.tab THEN subOut.WriteTab - ELSIF ch >= " " THEN subOut.WriteChar(ch) - END; - INC(i); ch := msg[i]; - END; - subOut.WriteLn; SubFlush - (* ELSE - HostDialog.ShowParamMsg(s, p0, p1, p2) *) - END - END ParamMsg; - - - PROCEDURE AttachSubLog; - VAR h: LogHook; - BEGIN - subOut.ConnectTo(TextModels.dir.New()); - buf := subOut.rider.Base(); - textR := buf.NewReader(NIL); - NEW(h); - Log.SetHook(h); - END AttachSubLog; - - PROCEDURE DetachSubLog; - BEGIN - Log.SetHook(NIL) - END DetachSubLog; - -BEGIN - AttachSubLog -CLOSE - DetachSubLog; -END ConsLog. diff --git a/new/Dev/Mod/CPB.odc b/new/Dev/Mod/CPB.odc new file mode 100644 index 0000000000000000000000000000000000000000..9b48385e01be8c365610ebaec9086484240a1953 GIT binary patch literal 85811 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 A;{X5v literal 0 HcmV?d00001 diff --git a/new/Dev/Mod/CPB.txt b/new/Dev/Mod/CPB.txt deleted file mode 100644 index 56a840a..0000000 --- a/new/Dev/Mod/CPB.txt +++ /dev/null @@ -1,2238 +0,0 @@ -MODULE DevCPB; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/CPB.odc *) - (* DO NOT EDIT *) - - IMPORT DevCPT, DevCPM; - - CONST - (* symbol values or ops *) - times = 1; slash = 2; div = 3; mod = 4; - and = 5; plus = 6; minus = 7; or = 8; eql = 9; - neq = 10; lss = 11; leq = 12; gtr = 13; geq = 14; - in = 15; is = 16; ash = 17; msk = 18; len = 19; - conv = 20; abs = 21; cap = 22; odd = 23; not = 33; - (*SYSTEM*) - adr = 24; cc = 25; bit = 26; lsh = 27; rot = 28; val = 29; - min = 34; max = 35; typfn = 36; size = 37; - - (* object modes *) - Var = 1; VarPar = 2; Con = 3; Fld = 4; Typ = 5; LProc = 6; XProc = 7; - SProc = 8; CProc = 9; IProc = 10; Mod = 11; Head = 12; TProc = 13; - - (* Structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - Char16 = 16; String16 = 17; Int64 = 18; - intSet = {Int8..Int32, Int64}; realSet = {Real32, Real64}; charSet = {Char8, Char16}; - - (* composite structure forms *) - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - (* nodes classes *) - Nvar = 0; Nvarpar = 1; Nfield = 2; Nderef = 3; Nindex = 4; Nguard = 5; Neguard = 6; - Nconst = 7; Ntype = 8; Nproc = 9; Nupto = 10; Nmop = 11; Ndop = 12; Ncall = 13; - Ninittd = 14; Nif = 15; Ncaselse = 16; Ncasedo = 17; Nenter = 18; Nassign = 19; - Nifelse = 20; Ncase = 21; Nwhile = 22; Nrepeat = 23; Nloop = 24; Nexit = 25; - Nreturn = 26; Nwith = 27; Ntrap = 28; - - (*function number*) - assign = 0; - haltfn = 0; newfn = 1; absfn = 2; capfn = 3; ordfn = 4; - entierfn = 5; oddfn = 6; minfn = 7; maxfn = 8; chrfn = 9; - shortfn = 10; longfn = 11; sizefn = 12; incfn = 13; decfn = 14; - inclfn = 15; exclfn = 16; lenfn = 17; copyfn = 18; ashfn = 19; assertfn = 32; - lchrfn = 33; lentierfcn = 34; bitsfn = 37; bytesfn = 38; - - (*SYSTEM function number*) - adrfn = 20; ccfn = 21; lshfn = 22; rotfn = 23; - getfn = 24; putfn = 25; getrfn = 26; putrfn = 27; - bitfn = 28; valfn = 29; sysnewfn = 30; movefn = 31; - thisrecfn = 45; thisarrfn = 46; - - (* COM function number *) - validfn = 40; iidfn = 41; queryfn = 42; - - (* module visibility of objects *) - internal = 0; external = 1; externalR = 2; inPar = 3; outPar = 4; - - (* procedure flags (conval.setval) *) - hasBody = 1; isRedef = 2; slNeeded = 3; imVar = 4; - - (* attribute flags (attr.adr, struct.attribute, proc.conval.setval)*) - newAttr = 16; absAttr = 17; limAttr = 18; empAttr = 19; extAttr = 20; - - (* case statement flags (conval.setval) *) - useTable = 1; useTree = 2; - - (* sysflags *) - nilBit = 1; inBit = 2; outBit = 4; newBit = 8; iidBit = 16; interface = 10; jint = -11; jstr = -13; - - AssertTrap = 0; (* default trap number *) - - covarOut = FALSE; - - - VAR - typSize*: PROCEDURE(typ: DevCPT.Struct); - zero, one, two, dummy, quot: DevCPT.Const; - - PROCEDURE err(n: SHORTINT); - BEGIN DevCPM.err(n) - END err; - - PROCEDURE NewLeaf*(obj: DevCPT.Object): DevCPT.Node; - VAR node: DevCPT.Node; typ: DevCPT.Struct; - BEGIN - typ := obj.typ; - CASE obj.mode OF - Var: - node := DevCPT.NewNode(Nvar); node.readonly := (obj.vis = externalR) & (obj.mnolev < 0) - | VarPar: - node := DevCPT.NewNode(Nvarpar); node.readonly := obj.vis = inPar; - | Con: - node := DevCPT.NewNode(Nconst); node.conval := DevCPT.NewConst(); - node.conval^ := obj.conval^ (* string is not copied, only its ref *) - | Typ: - node := DevCPT.NewNode(Ntype) - | LProc..IProc, TProc: - node := DevCPT.NewNode(Nproc) - ELSE err(127); node := DevCPT.NewNode(Nvar); typ := DevCPT.notyp - END ; - node.obj := obj; node.typ := typ; - RETURN node - END NewLeaf; - - PROCEDURE Construct*(class: BYTE; VAR x: DevCPT.Node; y: DevCPT.Node); - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(class); node.typ := DevCPT.notyp; - node.left := x; node.right := y; x := node - END Construct; - - PROCEDURE Link*(VAR x, last: DevCPT.Node; y: DevCPT.Node); - BEGIN - IF x = NIL THEN x := y ELSE last.link := y END ; - WHILE y.link # NIL DO y := y.link END ; - last := y - END Link; - - PROCEDURE BoolToInt(b: BOOLEAN): INTEGER; - BEGIN - IF b THEN RETURN 1 ELSE RETURN 0 END - END BoolToInt; - - PROCEDURE IntToBool(i: INTEGER): BOOLEAN; - BEGIN - IF i = 0 THEN RETURN FALSE ELSE RETURN TRUE END - END IntToBool; - - PROCEDURE NewBoolConst*(boolval: BOOLEAN): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.typ := DevCPT.booltyp; - x.conval := DevCPT.NewConst(); x.conval.intval := BoolToInt(boolval); RETURN x - END NewBoolConst; - - PROCEDURE OptIf*(VAR x: DevCPT.Node); (* x.link = NIL *) - VAR if, pred: DevCPT.Node; - BEGIN - if := x.left; - WHILE if.left.class = Nconst DO - IF IntToBool(if.left.conval.intval) THEN x := if.right; RETURN - ELSIF if.link = NIL THEN x := x.right; RETURN - ELSE if := if.link; x.left := if - END - END ; - pred := if; if := if.link; - WHILE if # NIL DO - IF if.left.class = Nconst THEN - IF IntToBool(if.left.conval.intval) THEN - pred.link := NIL; x.right := if.right; RETURN - ELSE if := if.link; pred.link := if - END - ELSE pred := if; if := if.link - END - END - END OptIf; - - PROCEDURE Nil*(): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.typ := DevCPT.niltyp; - x.conval := DevCPT.NewConst(); x.conval.intval := 0; RETURN x - END Nil; - - PROCEDURE EmptySet*(): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.typ := DevCPT.settyp; - x.conval := DevCPT.NewConst(); x.conval.setval := {}; RETURN x - END EmptySet; - - PROCEDURE MarkAsUsed (node: DevCPT.Node); - VAR c: BYTE; - BEGIN - c := node.class; - WHILE (c = Nfield) OR (c = Nindex) OR (c = Nguard) OR (c = Neguard) DO node := node.left; c := node.class END; - IF (c = Nvar) & (node.obj.mnolev > 0) THEN node.obj.used := TRUE END - END MarkAsUsed; - - - PROCEDURE GetTempVar* (name: ARRAY OF SHORTCHAR; typ: DevCPT.Struct; VAR obj: DevCPT.Object); - VAR n: DevCPT.Name; o: DevCPT.Object; - BEGIN - n := "@@ "; DevCPT.Insert(n, obj); obj.name^ := name$; (* avoid err 1 *) - obj.mode := Var; obj.typ := typ; - o := DevCPT.topScope.scope; - IF o = NIL THEN DevCPT.topScope.scope := obj - ELSE - WHILE o.link # NIL DO o := o.link END; - o.link := obj - END - END GetTempVar; - - - (* ---------- constant operations ---------- *) - - PROCEDURE Log (x: DevCPT.Node): INTEGER; - VAR val, exp: INTEGER; - BEGIN - exp := 0; - IF x.typ.form = Int64 THEN - RETURN -1 - ELSE - val := x.conval.intval; - IF val > 0 THEN - WHILE ~ODD(val) DO val := val DIV 2; INC(exp) END - END; - IF val # 1 THEN exp := -1 END - END; - RETURN exp - END Log; - - PROCEDURE Floor (x: REAL): REAL; - VAR y: REAL; - BEGIN - IF ABS(x) > 9007199254740992.0 (* 2^53 *) THEN RETURN x - ELSIF (x >= MAX(INTEGER) + 1.0) OR (x < MIN(INTEGER)) THEN - y := Floor(x / (MAX(INTEGER) + 1.0)) * (MAX(INTEGER) + 1.0); - RETURN SHORT(ENTIER(x - y)) + y - ELSE RETURN SHORT(ENTIER(x)) - END - END Floor; - - PROCEDURE SetToInt (s: SET): INTEGER; - VAR x, i: INTEGER; - BEGIN - i := 31; x := 0; - IF 31 IN s THEN x := -1 END; - WHILE i > 0 DO - x := x * 2; DEC(i); - IF i IN s THEN INC(x) END - END; - RETURN x - END SetToInt; - - PROCEDURE IntToSet (x: INTEGER): SET; - VAR i: INTEGER; s: SET; - BEGIN - i := 0; s := {}; - WHILE i < 32 DO - IF ODD(x) THEN INCL(s, i) END; - x := x DIV 2; INC(i) - END; - RETURN s - END IntToSet; - - PROCEDURE GetConstType (x: DevCPT.Const; form: INTEGER; errno: SHORTINT; VAR typ: DevCPT.Struct); - CONST MAXL = 9223372036854775808.0; (* 2^63 *) - BEGIN - IF (form IN intSet + charSet) & (x.realval + x.intval >= MIN(INTEGER)) - & (x.realval + x.intval <= MAX(INTEGER)) THEN - x.intval := SHORT(ENTIER(x.realval + x.intval)); x.realval := 0 - END; - IF form IN intSet THEN - IF x.realval = 0 THEN typ := DevCPT.int32typ - ELSIF (x.intval >= -MAXL - x.realval) & (x.intval < MAXL - x.realval) THEN typ := DevCPT.int64typ - ELSE err(errno); x.intval := 1; x.realval := 0; typ := DevCPT.int32typ - END - ELSIF form IN realSet THEN (* SR *) - typ := DevCPT.real64typ - ELSIF form IN charSet THEN - IF x.intval <= 255 THEN typ := DevCPT.char8typ - ELSE typ := DevCPT.char16typ - END - ELSE typ := DevCPT.undftyp - END - END GetConstType; - - PROCEDURE CheckConstType (x: DevCPT.Const; form: INTEGER; errno: SHORTINT); - VAR type: DevCPT.Struct; - BEGIN - GetConstType(x, form, errno, type); - IF ~DevCPT.Includes(form, type.form) - & ((form # Int8) OR (x.realval # 0) OR (x.intval < -128) OR (x.intval > 127)) - & ((form # Int16) OR (x.realval # 0) OR (x.intval < -32768) OR (x.intval > 32767)) - & ((form # Real32) OR (ABS(x.realval) > DevCPM.MaxReal32) & (ABS(x.realval) # DevCPM.InfReal)) THEN - err(errno); x.intval := 1; x.realval := 0 - END -(* - IF (form IN intSet + charSet) & (x.realval + x.intval >= MIN(INTEGER)) - & (x.realval + x.intval <= MAX(INTEGER)) THEN - x.intval := SHORT(ENTIER(x.realval + x.intval)); x.realval := 0 - END; - IF (form = Int64) & ((x.intval < -MAXL - x.realval) OR (x.intval >= MAXL - x.realval)) - OR (form = Int32) & (x.realval # 0) - OR (form = Int16) & ((x.realval # 0) OR (x.intval < -32768) OR (x.intval > 32767)) - OR (form = Int8) & ((x.realval # 0) OR (x.intval < -128) OR (x.intval > 127)) - OR (form = Char16) & ((x.realval # 0) OR (x.intval < 0) OR (x.intval > 65535)) - OR (form = Char8) & ((x.realval # 0) OR (x.intval < 0) OR (x.intval > 255)) - OR (form = Real32) & (ABS(x.realval) > DevCPM.MaxReal32) & (ABS(x.realval) # DevCPM.InfReal) THEN - err(errno); x.intval := 1; x.realval := 0 - END -*) - END CheckConstType; - - PROCEDURE ConvConst (x: DevCPT.Const; from, to: INTEGER); - VAR sr: SHORTREAL; - BEGIN - IF from = Set THEN - x.intval := SetToInt(x.setval); x.realval := 0; x.setval := {}; - ELSIF from IN intSet + charSet THEN - IF to = Set THEN CheckConstType(x, Int32, 203); x.setval := IntToSet(x.intval) - ELSIF to IN intSet THEN CheckConstType(x, to, 203) - ELSIF to IN realSet THEN x.realval := x.realval + x.intval; x.intval := DevCPM.ConstNotAlloc - ELSE (*to IN charSet*) CheckConstType(x, to, 220) - END - ELSIF from IN realSet THEN - IF to IN realSet THEN CheckConstType(x, to, 203); - IF to = Real32 THEN sr := SHORT(x.realval); x.realval := sr END (* reduce precision *) - ELSE x.realval := Floor(x.realval); x.intval := 0; CheckConstType(x, to, 203) - END - END - END ConvConst; - - PROCEDURE Prepare (x: DevCPT.Const); - VAR r: REAL; - BEGIN - x.realval := x.realval + x.intval DIV 32768 * 32768; - x.intval := x.intval MOD 32768; - r := Floor(x.realval / 4096) * 4096; - x.intval := x.intval + SHORT(ENTIER(x.realval - r)); - x.realval := r - (* ABS(x.intval) < 2^15 & ABS(x.realval) MOD 2^12 = 0 *) - END Prepare; - - PROCEDURE AddConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x + y *) - BEGIN - IF type.form IN intSet THEN - Prepare(x); Prepare(y); - z.intval := x.intval + y.intval; z.realval := x.realval + y.realval - ELSIF type.form IN realSet THEN - IF (ABS(x.realval) = DevCPM.InfReal) & (x.realval = - y.realval) THEN err(212) - ELSE z.realval := x.realval + y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 206, type) - END AddConst; - - PROCEDURE NegateConst (y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := - y *) - BEGIN - IF type.form IN intSet THEN Prepare(y); z.intval := -y.intval; z.realval := -y.realval - ELSIF type.form IN realSet THEN z.realval := -y.realval - ELSE HALT(100) - END; - GetConstType(z, type.form, 207, type) - END NegateConst; - - PROCEDURE SubConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x - y *) - BEGIN - IF type.form IN intSet THEN - Prepare(x); Prepare(y); - z.intval := x.intval - y.intval; z.realval := x.realval - y.realval - ELSIF type.form IN realSet THEN - IF (ABS(x.realval) = DevCPM.InfReal) & (x.realval = y.realval) THEN err(212) - ELSE z.realval := x.realval - y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 207, type) - END SubConst; - - PROCEDURE MulConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x * y *) - BEGIN - IF type.form IN intSet THEN - Prepare(x); Prepare(y); - z.realval := x.realval * y.realval + x.intval * y.realval + x.realval * y.intval; - z.intval := x.intval * y.intval - ELSIF type.form IN realSet THEN - IF (ABS(x.realval) = DevCPM.InfReal) & ( y.realval = 0.0) THEN err(212) - ELSIF (ABS(y.realval) = DevCPM.InfReal) & (x.realval = 0.0) THEN err(212) - ELSE z.realval := x.realval * y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 204, type) - END MulConst; - - PROCEDURE DivConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x / y *) - BEGIN - IF type.form IN realSet THEN - IF (x.realval = 0.0) & (y.realval = 0.0) THEN err(212) - ELSIF (ABS(x.realval) = DevCPM.InfReal) & (ABS(y.realval) = DevCPM.InfReal) THEN err(212) - ELSE z.realval := x.realval / y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 204, type) - END DivConst; - - PROCEDURE DivModConst (x, y: DevCPT.Const; div: BOOLEAN; VAR type: DevCPT.Struct); - (* x := x DIV y | x MOD y *) - BEGIN - IF type.form IN intSet THEN - IF y.realval + y.intval # 0 THEN - Prepare(x); Prepare(y); - quot.realval := Floor((x.realval + x.intval) / (y.realval + y.intval)); - quot.intval := 0; Prepare(quot); - x.realval := x.realval - quot.realval * y.realval - quot.realval * y.intval - quot.intval * y.realval; - x.intval := x.intval - quot.intval * y.intval; - IF y.realval + y.intval > 0 THEN - WHILE x.realval + x.intval > 0 DO SubConst(x, y, x, type); INC(quot.intval) END; - WHILE x.realval + x.intval < 0 DO AddConst(x, y, x, type); DEC(quot.intval) END - ELSE - WHILE x.realval + x.intval < 0 DO SubConst(x, y, x, type); INC(quot.intval) END; - WHILE x.realval + x.intval > 0 DO AddConst(x, y, x, type); DEC(quot.intval) END - END; - IF div THEN x.realval := quot.realval; x.intval := quot.intval END; - GetConstType(x, type.form, 204, type) - ELSE err(205) - END - ELSE HALT(100) - END - END DivModConst; - - PROCEDURE EqualConst (x, y: DevCPT.Const; form: INTEGER): BOOLEAN; (* x = y *) - VAR res: BOOLEAN; - BEGIN - CASE form OF - | Undef: res := TRUE - | Bool, Byte, Char8..Int32, Char16: res := x.intval = y.intval - | Int64: Prepare(x); Prepare(y); res := (x.realval - y.realval) + (x.intval - y.intval) = 0 - | Real32, Real64: res := x.realval = y.realval - | Set: res := x.setval = y.setval - | String8, String16, Comp (* guid *): res := x.ext^ = y.ext^ - | NilTyp, Pointer, ProcTyp: res := x.intval = y.intval - END; - RETURN res - END EqualConst; - - PROCEDURE LessConst (x, y: DevCPT.Const; form: INTEGER): BOOLEAN; (* x < y *) - VAR res: BOOLEAN; - BEGIN - CASE form OF - | Undef: res := TRUE - | Byte, Char8..Int32, Char16: res := x.intval < y.intval - | Int64: Prepare(x); Prepare(y); res := (x.realval - y.realval) + (x.intval - y.intval) < 0 - | Real32, Real64: res := x.realval < y.realval - | String8, String16: res := x.ext^ < y.ext^ - | Bool, Set, NilTyp, Pointer, ProcTyp, Comp: err(108) - END; - RETURN res - END LessConst; - - PROCEDURE IsNegConst (x: DevCPT.Const; form: INTEGER): BOOLEAN; (* x < 0 OR x = (-0.0) *) - VAR res: BOOLEAN; - BEGIN - CASE form OF - | Int8..Int32: res := x.intval < 0 - | Int64: Prepare(x); res := x.realval + x.intval < 0 - | Real32, Real64: res := (x.realval <= 0.) & (1. / x.realval <= 0.) - END; - RETURN res - END IsNegConst; - - - PROCEDURE NewIntConst*(intval: INTEGER): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - x.conval.intval := intval; x.conval.realval := 0; x.typ := DevCPT.int32typ; RETURN x - END NewIntConst; - - PROCEDURE NewLargeIntConst* (intval: INTEGER; realval: REAL): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - x.conval.intval := intval; x.conval.realval := realval; x.typ := DevCPT.int64typ; RETURN x - END NewLargeIntConst; - - PROCEDURE NewRealConst*(realval: REAL; typ: DevCPT.Struct): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - x.conval.realval := realval; x.conval.intval := DevCPM.ConstNotAlloc; - IF typ = NIL THEN typ := DevCPT.real64typ END; - x.typ := typ; - RETURN x - END NewRealConst; - - PROCEDURE NewString*(str: DevCPT.String; lstr: POINTER TO ARRAY OF CHAR; len: INTEGER): DevCPT.Node; - VAR i, j, c: INTEGER; x: DevCPT.Node; ext: DevCPT.ConstExt; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - IF lstr # NIL THEN - x.typ := DevCPT.string16typ; - NEW(ext, 3 * len); i := 0; j := 0; - REPEAT c := ORD(lstr[i]); INC(i); DevCPM.PutUtf8(ext^, c, j) UNTIL c = 0; - x.conval.ext := ext - ELSE - x.typ := DevCPT.string8typ; x.conval.ext := str - END; - x.conval.intval := DevCPM.ConstNotAlloc; x.conval.intval2 := len; - RETURN x - END NewString; - - PROCEDURE CharToString8(n: DevCPT.Node); - VAR ch: SHORTCHAR; - BEGIN - n.typ := DevCPT.string8typ; ch := SHORT(CHR(n.conval.intval)); NEW(n.conval.ext, 2); - IF ch = 0X THEN n.conval.intval2 := 1 ELSE n.conval.intval2 := 2; n.conval.ext[1] := 0X END ; - n.conval.ext[0] := ch; n.conval.intval := DevCPM.ConstNotAlloc; n.obj := NIL - END CharToString8; - - PROCEDURE CharToString16 (n: DevCPT.Node); - VAR ch, ch1: SHORTCHAR; i: INTEGER; - BEGIN - n.typ := DevCPT.string16typ; NEW(n.conval.ext, 4); - IF n.conval.intval = 0 THEN - n.conval.ext[0] := 0X; n.conval.intval2 := 1 - ELSE - i := 0; DevCPM.PutUtf8(n.conval.ext^, n.conval.intval, i); - n.conval.ext[i] := 0X; n.conval.intval2 := 2 - END; - n.conval.intval := DevCPM.ConstNotAlloc; n.obj := NIL - END CharToString16; - - PROCEDURE String8ToString16 (n: DevCPT.Node); - VAR i, j, x: INTEGER; ext, new: DevCPT.ConstExt; - BEGIN - n.typ := DevCPT.string16typ; ext := n.conval.ext; - NEW(new, 2 * n.conval.intval2); i := 0; j := 0; - REPEAT x := ORD(ext[i]); INC(i); DevCPM.PutUtf8(new^, x, j) UNTIL x = 0; - n.conval.ext := new; n.obj := NIL - END String8ToString16; - - PROCEDURE String16ToString8 (n: DevCPT.Node); - VAR i, j, x: INTEGER; ext, new: DevCPT.ConstExt; - BEGIN - n.typ := DevCPT.string8typ; ext := n.conval.ext; - NEW(new, n.conval.intval2); i := 0; j := 0; - REPEAT DevCPM.GetUtf8(ext^, x, i); new[j] := SHORT(CHR(x MOD 256)); INC(j) UNTIL x = 0; - n.conval.ext := new; n.obj := NIL - END String16ToString8; - - PROCEDURE StringToGuid (VAR n: DevCPT.Node); - BEGIN - ASSERT((n.class = Nconst) & (n.typ.form = String8)); - IF ~DevCPM.ValidGuid(n.conval.ext^) THEN err(165) END; - n.typ := DevCPT.guidtyp - END StringToGuid; - - PROCEDURE CheckString (n: DevCPT.Node; typ: DevCPT.Struct; e: SHORTINT); - VAR ntyp: DevCPT.Struct; - BEGIN - ntyp := n.typ; - IF (typ = DevCPT.guidtyp) & (n.class = Nconst) & (ntyp.form = String8) THEN StringToGuid(n) - ELSIF (typ.comp IN {Array, DynArr}) & (typ.BaseTyp.form = Char8) OR (typ.form = String8) THEN - IF (n.class = Nconst) & (ntyp.form = Char8) THEN CharToString8(n) - ELSIF (ntyp.comp IN {Array, DynArr}) & (ntyp.BaseTyp.form = Char8) OR (ntyp.form = String8) THEN (* ok *) - ELSE err(e) - END - ELSIF (typ.comp IN {Array, DynArr}) & (typ.BaseTyp.form = Char16) OR (typ.form = String16) THEN - IF (n.class = Nconst) & (ntyp.form IN charSet) THEN CharToString16(n) - ELSIF (n.class = Nconst) & (ntyp.form = String8) THEN String8ToString16(n) - ELSIF (ntyp.comp IN {Array, DynArr}) & (ntyp.BaseTyp.form = Char16) OR (ntyp.form = String16) THEN - (* ok *) - ELSE err(e) - END - ELSE err(e) - END - END CheckString; - - - PROCEDURE BindNodes(class: BYTE; typ: DevCPT.Struct; VAR x: DevCPT.Node; y: DevCPT.Node); - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(class); node.typ := typ; - node.left := x; node.right := y; x := node - END BindNodes; - - PROCEDURE NotVar(x: DevCPT.Node): BOOLEAN; - BEGIN - RETURN (x.class >= Nconst) & ((x.class # Nmop) OR (x.subcl # val) OR (x.left.class >= Nconst)) - OR (x.typ.form IN {String8, String16}) - END NotVar; - - - PROCEDURE Convert(VAR x: DevCPT.Node; typ: DevCPT.Struct); - VAR node: DevCPT.Node; f, g: SHORTINT; k: INTEGER; r: REAL; - BEGIN f := x.typ.form; g := typ.form; - IF x.class = Nconst THEN - IF g = String8 THEN - IF f = String16 THEN String16ToString8(x) - ELSIF f IN charSet THEN CharToString8(x) - ELSE typ := DevCPT.undftyp - END - ELSIF g = String16 THEN - IF f = String8 THEN String8ToString16(x) - ELSIF f IN charSet THEN CharToString16(x) - ELSE typ := DevCPT.undftyp - END - ELSE ConvConst(x.conval, f, g) - END; - x.obj := NIL - ELSIF (x.class = Nmop) & (x.subcl = conv) & (DevCPT.Includes(f, x.left.typ.form) OR DevCPT.Includes(f, g)) - THEN - (* don't create new node *) - IF x.left.typ.form = typ.form THEN (* and suppress existing node *) x := x.left END - ELSE - IF (x.class = Ndop) & (x.typ.form IN {String8, String16}) THEN (* propagate to leaf nodes *) - Convert(x.left, typ); Convert(x.right, typ) - ELSE - node := DevCPT.NewNode(Nmop); node.subcl := conv; node.left := x; x := node; - END - END; - x.typ := typ - END Convert; - - PROCEDURE Promote (VAR left, right: DevCPT.Node; op: INTEGER); (* check expression compatibility *) - VAR f, g: INTEGER; new: DevCPT.Struct; - BEGIN - f := left.typ.form; g := right.typ.form; new := left.typ; - IF f IN intSet + realSet THEN - IF g IN intSet + realSet THEN - IF (f = Real32) & (right.class = Nconst) & (g IN realSet) & (left.class # Nconst) - (* & ((ABS(right.conval.realval) <= DevCPM.MaxReal32) - OR (ABS(right.conval.realval) = DevCPM.InfReal)) *) - OR (g = Real32) & (left.class = Nconst) & (f IN realSet) & (right.class # Nconst) - (* & ((ABS(left.conval.realval) <= DevCPM.MaxReal32) - OR (ABS(left.conval.realval) = DevCPM.InfReal)) *) THEN - new := DevCPT.real32typ (* SR *) - ELSIF (f = Real64) OR (g = Real64) THEN new := DevCPT.real64typ - ELSIF (f = Real32) OR (g = Real32) THEN new := DevCPT.real32typ (* SR *) - ELSIF op = slash THEN new := DevCPT.real64typ - ELSIF (f = Int64) OR (g = Int64) THEN new := DevCPT.int64typ - ELSE new := DevCPT.int32typ - END - ELSE err(100) - END - ELSIF (left.typ = DevCPT.guidtyp) OR (right.typ = DevCPT.guidtyp) THEN - IF f = String8 THEN StringToGuid(left) END; - IF g = String8 THEN StringToGuid(right) END; - IF left.typ # right.typ THEN err(100) END; - f := Comp - ELSIF f IN charSet + {String8, String16} THEN - IF g IN charSet + {String8, String16} THEN - IF (f = String16) OR (g = String16) OR (f = Char16) & (g = String8) OR (f = String8) & (g = Char16) THEN - new := DevCPT.string16typ - ELSIF (f = Char16) OR (g = Char16) THEN new := DevCPT.char16typ - ELSIF (f = String8) OR (g = String8) THEN new := DevCPT.string8typ - ELSIF op = plus THEN - IF (f = Char16) OR (g = Char16) THEN new := DevCPT.string16typ - ELSE new := DevCPT.string8typ - END - END; - IF (new.form IN {String8, String16}) - & ((f IN charSet) & (left.class # Nconst) OR (g IN charSet) & (right.class # Nconst)) - THEN - err(100) - END - ELSE err(100) - END - ELSIF (f IN {NilTyp, Pointer, ProcTyp}) & (g IN {NilTyp, Pointer, ProcTyp}) THEN - IF ~DevCPT.SameType(left.typ, right.typ) & (f # NilTyp) & (g # NilTyp) - & ~((f = Pointer) & (g = Pointer) - & (DevCPT.Extends(left.typ, right.typ) OR DevCPT.Extends(right.typ, left.typ))) THEN err(100) END - ELSIF f # g THEN err(100) - END; - IF ~(f IN {NilTyp, Pointer, ProcTyp, Comp}) THEN - IF g # new.form THEN Convert(right, new) END; - IF f # new.form THEN Convert(left, new) END - END - END Promote; - - PROCEDURE CheckParameters* (fp, ap: DevCPT.Object; checkNames: BOOLEAN); (* checks par list match *) - VAR ft, at: DevCPT.Struct; - BEGIN - WHILE fp # NIL DO - IF ap # NIL THEN - ft := fp.typ; at := ap.typ; - IF fp.ptyp # NIL THEN ft := fp.ptyp END; (* get original formal type *) - IF ap.ptyp # NIL THEN at := ap.ptyp END; (* get original formal type *) - IF ~DevCPT.EqualType(ft, at) - OR (fp.mode # ap.mode) OR (fp.sysflag # ap.sysflag) OR (fp.vis # ap.vis) - OR checkNames & (fp.name^ # ap.name^) THEN err(115) END ; - ap := ap.link - ELSE err(116) - END; - fp := fp.link - END; - IF ap # NIL THEN err(116) END - END CheckParameters; - - PROCEDURE CheckNewParamPair* (newPar, iidPar: DevCPT.Node); - VAR ityp, ntyp: DevCPT.Struct; - BEGIN - ntyp := newPar.typ.BaseTyp; - IF (newPar.class = Nvarpar) & ODD(newPar.obj.sysflag DIV newBit) THEN - IF (iidPar.class = Nvarpar) & ODD(iidPar.obj.sysflag DIV iidBit) & (iidPar.obj.mnolev = newPar.obj.mnolev) - THEN (* ok *) - ELSE err(168) - END - ELSIF ntyp.extlev = 0 THEN (* ok *) - ELSIF (iidPar.class = Nconst) & (iidPar.obj # NIL) & (iidPar.obj.mode = Typ) THEN - IF ~DevCPT.Extends(iidPar.obj.typ, ntyp) THEN err(168) END - ELSE err(168) - END - END CheckNewParamPair; - - - PROCEDURE DeRef*(VAR x: DevCPT.Node); - VAR strobj, bstrobj: DevCPT.Object; typ, btyp: DevCPT.Struct; - BEGIN - typ := x.typ; - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(78) - ELSIF typ.form = Pointer THEN - btyp := typ.BaseTyp; strobj := typ.strobj; bstrobj := btyp.strobj; - IF (strobj # NIL) & (strobj.name # DevCPT.null) & (bstrobj # NIL) & (bstrobj.name # DevCPT.null) THEN - btyp.pbused := TRUE - END ; - BindNodes(Nderef, btyp, x, NIL); x.subcl := 0 - ELSE err(84) - END - END DeRef; - - PROCEDURE StrDeref*(VAR x: DevCPT.Node); - VAR typ, btyp: DevCPT.Struct; - BEGIN - typ := x.typ; - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(78) - ELSIF ((typ.comp IN {Array, DynArr}) & (typ.BaseTyp.form IN charSet)) OR (typ.sysflag = jstr) THEN - IF (typ.BaseTyp # NIL) & (typ.BaseTyp.form = Char8) THEN btyp := DevCPT.string8typ - ELSE btyp := DevCPT.string16typ - END; - BindNodes(Nderef, btyp, x, NIL); x.subcl := 1 - ELSE err(90) - END - END StrDeref; - - PROCEDURE Index*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR f: SHORTINT; typ: DevCPT.Struct; - BEGIN - f := y.typ.form; - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(79) - ELSIF ~(f IN intSet) OR (y.class IN {Nproc, Ntype}) THEN err(80); y.typ := DevCPT.int32typ END ; - IF f = Int64 THEN Convert(y, DevCPT.int32typ) END; - IF x.typ.comp = Array THEN typ := x.typ.BaseTyp; - IF (y.class = Nconst) & ((y.conval.intval < 0) OR (y.conval.intval >= x.typ.n)) THEN err(81) END - ELSIF x.typ.comp = DynArr THEN typ := x.typ.BaseTyp; - IF (y.class = Nconst) & (y.conval.intval < 0) THEN err(81) END - ELSE err(82); typ := DevCPT.undftyp - END ; - BindNodes(Nindex, typ, x, y); x.readonly := x.left.readonly - END Index; - - PROCEDURE Field*(VAR x: DevCPT.Node; y: DevCPT.Object); - BEGIN (*x.typ.comp = Record*) - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(77) END ; - IF (y # NIL) & (y.mode IN {Fld, TProc}) THEN - BindNodes(Nfield, y.typ, x, NIL); x.obj := y; - x.readonly := x.left.readonly OR ((y.vis = externalR) & (y.mnolev < 0)) - ELSE err(83); x.typ := DevCPT.undftyp - END - END Field; - - PROCEDURE TypTest*(VAR x: DevCPT.Node; obj: DevCPT.Object; guard: BOOLEAN); - - PROCEDURE GTT(t0, t1: DevCPT.Struct); - VAR node: DevCPT.Node; - BEGIN - IF (t0 # NIL) & DevCPT.SameType(t0, t1) & (guard OR (x.class # Nguard)) THEN - IF ~guard THEN x := NewBoolConst(TRUE) END - ELSIF (t0 = NIL) OR DevCPT.Extends(t1, t0) OR (t0.sysflag = jint) OR (t1.sysflag = jint) - OR (t1.comp = DynArr) & (DevCPM.java IN DevCPM.options) THEN - IF guard THEN BindNodes(Nguard, NIL, x, NIL); x.readonly := x.left.readonly - ELSE node := DevCPT.NewNode(Nmop); node.subcl := is; node.left := x; node.obj := obj; x := node - END - ELSE err(85) - END - END GTT; - - BEGIN - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(112) - ELSIF x.typ.form = Pointer THEN - IF x.typ = DevCPT.sysptrtyp THEN - IF obj.typ.form = Pointer THEN GTT(NIL, obj.typ.BaseTyp) - ELSE err(86) - END - ELSIF x.typ.BaseTyp.comp # Record THEN err(85) - ELSIF obj.typ.form = Pointer THEN GTT(x.typ.BaseTyp, obj.typ.BaseTyp) - ELSE err(86) - END - ELSIF (x.typ.comp = Record) & (x.class = Nvarpar) & (x.obj.vis # outPar) & (obj.typ.comp = Record) THEN - GTT(x.typ, obj.typ) - ELSE err(87) - END ; - IF guard THEN x.typ := obj.typ ELSE x.typ := DevCPT.booltyp END - END TypTest; - - PROCEDURE In*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR f: SHORTINT; k: INTEGER; - BEGIN f := x.typ.form; - IF (x.class = Ntype) OR (x.class = Nproc) OR (y.class = Ntype) OR (y.class = Nproc) THEN err(126) - ELSIF (f IN intSet) & (y.typ.form = Set) THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF x.class = Nconst THEN - k := x.conval.intval; - IF (k < 0) OR (k > DevCPM.MaxSet) THEN err(202) - ELSIF y.class = Nconst THEN x.conval.intval := BoolToInt(k IN y.conval.setval); x.obj := NIL - ELSE BindNodes(Ndop, DevCPT.booltyp, x, y); x.subcl := in - END - ELSE BindNodes(Ndop, DevCPT.booltyp, x, y); x.subcl := in - END - ELSE err(92) - END ; - x.typ := DevCPT.booltyp - END In; - - PROCEDURE MOp*(op: BYTE; VAR x: DevCPT.Node); - VAR f: SHORTINT; typ: DevCPT.Struct; z: DevCPT.Node; - - PROCEDURE NewOp(op: BYTE; typ: DevCPT.Struct; z: DevCPT.Node): DevCPT.Node; - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(Nmop); node.subcl := op; node.typ := typ; - node.left := z; RETURN node - END NewOp; - - BEGIN z := x; - IF ((z.class = Ntype) OR (z.class = Nproc)) & (op # adr) & (op # typfn) & (op # size) THEN err(126) (* !!! *) - ELSE - typ := z.typ; f := typ.form; - CASE op OF - | not: - IF f = Bool THEN - IF z.class = Nconst THEN - z.conval.intval := BoolToInt(~IntToBool(z.conval.intval)); z.obj := NIL - ELSE z := NewOp(op, typ, z) - END - ELSE err(98) - END - | plus: - IF ~(f IN intSet + realSet) THEN err(96) END - | minus: - IF f IN intSet + realSet + {Set} THEN - IF z.class = Nconst THEN - IF f = Set THEN z.conval.setval := -z.conval.setval - ELSE NegateConst(z.conval, z.conval, z.typ) - END; - z.obj := NIL - ELSE - IF f < Int32 THEN Convert(z, DevCPT.int32typ) END; - z := NewOp(op, z.typ, z) - END - ELSE err(97) - END - | abs: - IF f IN intSet + realSet THEN - IF z.class = Nconst THEN - IF IsNegConst(z.conval, f) THEN NegateConst(z.conval, z.conval, z.typ) END; - z.obj := NIL - ELSE - IF f < Int32 THEN Convert(z, DevCPT.int32typ) END; - z := NewOp(op, z.typ, z) - END - ELSE err(111) - END - | cap: - IF f IN charSet THEN - IF z.class = Nconst THEN - IF ODD(z.conval.intval DIV 32) THEN DEC(z.conval.intval, 32) END; - z.obj := NIL - ELSE z := NewOp(op, typ, z) - END - ELSE err(111); z.typ := DevCPT.char8typ - END - | odd: - IF f IN intSet THEN - IF z.class = Nconst THEN - DivModConst(z.conval, two, FALSE, z.typ); (* z MOD 2 *) - z.obj := NIL - ELSE z := NewOp(op, typ, z) - END - ELSE err(111) - END ; - z.typ := DevCPT.booltyp - | adr: (*ADR*) - IF z.class = Nproc THEN - IF z.obj.mnolev > 0 THEN err(73) - ELSIF z.obj.mode = LProc THEN z.obj.mode := XProc - END; - z := NewOp(op, typ, z) - ELSIF z.class = Ntype THEN - IF z.obj.typ.untagged THEN err(111) END; - z := NewOp(op, typ, z) - ELSIF (z.class < Nconst) OR (z.class = Nconst) & (f IN {String8, String16}) THEN - z := NewOp(op, typ, z) - ELSE err(127) - END ; - z.typ := DevCPT.int32typ - | typfn, size: (*TYP, SIZE*) - z := NewOp(op, typ, z); - z.typ := DevCPT.int32typ - | cc: (*SYSTEM.CC*) - IF (f IN intSet) & (z.class = Nconst) THEN - IF (0 <= z.conval.intval) & (z.conval.intval <= DevCPM.MaxCC) & (z.conval.realval = 0) THEN - z := NewOp(op, typ, z) - ELSE err(219) - END - ELSE err(69) - END; - z.typ := DevCPT.booltyp - END - END; - x := z - END MOp; - - PROCEDURE ConstOp(op: SHORTINT; x, y: DevCPT.Node); - VAR f: SHORTINT; i, j: INTEGER; xval, yval: DevCPT.Const; ext: DevCPT.ConstExt; t: DevCPT.Struct; - BEGIN - f := x.typ.form; - IF f = y.typ.form THEN - xval := x.conval; yval := y.conval; - CASE op OF - | times: - IF f IN intSet + realSet THEN MulConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval * yval.setval - ELSIF f # Undef THEN err(101) - END - | slash: - IF f IN realSet THEN DivConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval / yval.setval - ELSIF f # Undef THEN err(102) - END - | div: - IF f IN intSet THEN DivModConst(xval, yval, TRUE, x.typ) - ELSIF f # Undef THEN err(103) - END - | mod: - IF f IN intSet THEN DivModConst(xval, yval, FALSE, x.typ) - ELSIF f # Undef THEN err(104) - END - | and: - IF f = Bool THEN xval.intval := BoolToInt(IntToBool(xval.intval) & IntToBool(yval.intval)) - ELSE err(94) - END - | plus: - IF f IN intSet + realSet THEN AddConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval + yval.setval - ELSIF (f IN {String8, String16}) & (xval.ext # NIL) & (yval.ext # NIL) THEN - NEW(ext, LEN(xval.ext^) + LEN(yval.ext^)); - i := 0; WHILE xval.ext[i] # 0X DO ext[i] := xval.ext[i]; INC(i) END; - j := 0; WHILE yval.ext[j] # 0X DO ext[i] := yval.ext[j]; INC(i); INC(j) END; - ext[i] := 0X; xval.ext := ext; INC(xval.intval2, yval.intval2 - 1) - ELSIF f # Undef THEN err(105) - END - | minus: - IF f IN intSet + realSet THEN SubConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval - yval.setval - ELSIF f # Undef THEN err(106) - END - | min: - IF f IN intSet + realSet THEN - IF LessConst(yval, xval, f) THEN xval^ := yval^ END - ELSIF f # Undef THEN err(111) - END - | max: - IF f IN intSet + realSet THEN - IF LessConst(xval, yval, f) THEN xval^ := yval^ END - ELSIF f # Undef THEN err(111) - END - | or: - IF f = Bool THEN xval.intval := BoolToInt(IntToBool(xval.intval) OR IntToBool(yval.intval)) - ELSE err(95) - END - | eql: xval.intval := BoolToInt(EqualConst(xval, yval, f)); x.typ := DevCPT.booltyp - | neq: xval.intval := BoolToInt(~EqualConst(xval, yval, f)); x.typ := DevCPT.booltyp - | lss: xval.intval := BoolToInt(LessConst(xval, yval, f)); x.typ := DevCPT.booltyp - | leq: xval.intval := BoolToInt(~LessConst(yval, xval, f)); x.typ := DevCPT.booltyp - | gtr: xval.intval := BoolToInt(LessConst(yval, xval, f)); x.typ := DevCPT.booltyp - | geq: xval.intval := BoolToInt(~LessConst(xval, yval, f)); x.typ := DevCPT.booltyp - END - ELSE err(100) - END; - x.obj := NIL - END ConstOp; - - PROCEDURE Op*(op: BYTE; VAR x: DevCPT.Node; y: DevCPT.Node); - VAR f, g: SHORTINT; t, z: DevCPT.Node; typ: DevCPT.Struct; do: BOOLEAN; val: INTEGER; - - PROCEDURE NewOp(op: BYTE; typ: DevCPT.Struct; VAR x: DevCPT.Node; y: DevCPT.Node); - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(Ndop); node.subcl := op; node.typ := typ; - node.left := x; node.right := y; x := node - END NewOp; - - BEGIN z := x; - IF (z.class = Ntype) OR (z.class = Nproc) OR (y.class = Ntype) OR (y.class = Nproc) THEN err(126) - ELSE - Promote(z, y, op); - IF (z.class = Nconst) & (y.class = Nconst) THEN ConstOp(op, z, y) - ELSE - typ := z.typ; f := typ.form; g := y.typ.form; - CASE op OF - | times: - do := TRUE; - IF f IN intSet THEN - IF z.class = Nconst THEN - IF EqualConst(z.conval, one, f) THEN do := FALSE; z := y - ELSIF EqualConst(z.conval, zero, f) THEN do := FALSE - ELSE val := Log(z); - IF val >= 0 THEN - t := y; y := z; z := t; - op := ash; y.typ := DevCPT.int32typ; y.conval.intval := val; y.obj := NIL - END - END - ELSIF y.class = Nconst THEN - IF EqualConst(y.conval, one, f) THEN do := FALSE - ELSIF EqualConst(y.conval, zero, f) THEN do := FALSE; z := y - ELSE val := Log(y); - IF val >= 0 THEN - op := ash; y.typ := DevCPT.int32typ; y.conval.intval := val; y.obj := NIL - END - END - END - ELSIF ~(f IN {Undef, Real32..Set}) THEN err(105); typ := DevCPT.undftyp - END ; - IF do THEN NewOp(op, typ, z, y) END; - | slash: - IF f IN realSet THEN (* OK *) - ELSIF (f # Set) & (f # Undef) THEN err(102); typ := DevCPT.undftyp - END ; - NewOp(op, typ, z, y) - | div: - do := TRUE; - IF f IN intSet THEN - IF y.class = Nconst THEN - IF EqualConst(y.conval, zero, f) THEN err(205) - ELSIF EqualConst(y.conval, one, f) THEN do := FALSE - ELSE val := Log(y); - IF val >= 0 THEN - op := ash; y.typ := DevCPT.int32typ; y.conval.intval := -val; y.obj := NIL - END - END - END - ELSIF f # Undef THEN err(103); typ := DevCPT.undftyp - END ; - IF do THEN NewOp(op, typ, z, y) END; - | mod: - IF f IN intSet THEN - IF y.class = Nconst THEN - IF EqualConst(y.conval, zero, f) THEN err(205) - ELSE val := Log(y); - IF val >= 0 THEN - op := msk; y.conval.intval := ASH(-1, val); y.obj := NIL - END - END - END - ELSIF f # Undef THEN err(104); typ := DevCPT.undftyp - END ; - NewOp(op, typ, z, y); - | and: - IF f = Bool THEN - IF z.class = Nconst THEN - IF IntToBool(z.conval.intval) THEN z := y END - ELSIF (y.class = Nconst) & IntToBool(y.conval.intval) THEN (* optimize z & TRUE -> z *) - ELSE NewOp(op, typ, z, y) - END - ELSIF f # Undef THEN err(94); z.typ := DevCPT.undftyp - END - | plus: - IF ~(f IN {Undef, Int8..Set, Int64, String8, String16}) THEN err(105); typ := DevCPT.undftyp END; - do := TRUE; - IF f IN intSet THEN - IF (z.class = Nconst) & EqualConst(z.conval, zero, f) THEN do := FALSE; z := y END ; - IF (y.class = Nconst) & EqualConst(y.conval, zero, f) THEN do := FALSE END - ELSIF f IN {String8, String16} THEN - IF (z.class = Nconst) & (z.conval.intval2 = 1) THEN do := FALSE; z := y END ; - IF (y.class = Nconst) & (y.conval.intval2 = 1) THEN do := FALSE END; - IF do THEN - IF z.class = Ndop THEN - t := z; WHILE t.right.class = Ndop DO t := t.right END; - IF (t.right.class = Nconst) & (y.class = Nconst) THEN - ConstOp(op, t.right, y); do := FALSE - ELSIF (t.right.class = Nconst) & (y.class = Ndop) & (y.left.class = Nconst) THEN - ConstOp(op, t.right, y.left); y.left := t.right; t.right := y; do := FALSE - ELSE - NewOp(op, typ, t.right, y); do := FALSE - END - ELSE - IF (z.class = Nconst) & (y.class = Ndop) & (y.left.class = Nconst) THEN - ConstOp(op, z, y.left); y.left := z; z := y; do := FALSE - END - END - END - END ; - IF do THEN NewOp(op, typ, z, y) END; - | minus: - IF ~(f IN {Undef, Int8..Set, Int64}) THEN err(106); typ := DevCPT.undftyp END; - IF ~(f IN intSet) OR (y.class # Nconst) OR ~EqualConst(y.conval, zero, f) THEN NewOp(op, typ, z, y) - END; - | min, max: - IF ~(f IN {Undef} + intSet + realSet + charSet) THEN err(111); typ := DevCPT.undftyp END; - NewOp(op, typ, z, y); - | or: - IF f = Bool THEN - IF z.class = Nconst THEN - IF ~IntToBool(z.conval.intval) THEN z := y END - ELSIF (y.class = Nconst) & ~IntToBool(y.conval.intval) THEN (* optimize z OR FALSE -> z *) - ELSE NewOp(op, typ, z, y) - END - ELSIF f # Undef THEN err(95); z.typ := DevCPT.undftyp - END - | eql, neq, lss, leq, gtr, geq: - IF f IN {String8, String16} THEN - IF (f = String16) & (z.class = Nmop) & (z.subcl = conv) & (y.class = Nmop) & (y.subcl = conv) THEN - z := z.left; y := y.left (* remove LONG on both sides *) - ELSIF (z.class = Nconst) & (z.conval.intval2 = 1) & (y.class = Nderef) THEN (* y$ = "" -> y[0] = 0X *) - y := y.left; Index(y, NewIntConst(0)); z.typ := y.typ; z.conval.intval := 0 - ELSIF (y.class = Nconst) & (y.conval.intval2 = 1) & (z.class = Nderef) THEN (* z$ = "" -> z[0] = 0X *) - z := z.left; Index(z, NewIntConst(0)); y.typ := z.typ; y.conval.intval := 0 - END; - typ := DevCPT.booltyp - ELSIF (f IN {Undef, Char8..Real64, Char16, Int64}) - OR (op <= neq) & ((f IN {Bool, Set, NilTyp, Pointer, ProcTyp}) OR (typ = DevCPT.guidtyp)) THEN - typ := DevCPT.booltyp - ELSE err(107); typ := DevCPT.undftyp - END; - NewOp(op, typ, z, y) - END - END - END; - x := z - END Op; - - PROCEDURE SetRange*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR k, l: INTEGER; - BEGIN - IF (x.class = Ntype) OR (x.class = Nproc) OR (y.class = Ntype) OR (y.class = Nproc) THEN err(126) - ELSIF (x.typ.form IN intSet) & (y.typ.form IN intSet) THEN - IF x.typ.form = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF y.typ.form = Int64 THEN Convert(y, DevCPT.int32typ) END; - IF x.class = Nconst THEN - k := x.conval.intval; - IF (0 > k) OR (k > DevCPM.MaxSet) OR (x.conval.realval # 0) THEN err(202) END - END ; - IF y.class = Nconst THEN - l := y.conval.intval; - IF (0 > l) OR (l > DevCPM.MaxSet) OR (y.conval.realval # 0) THEN err(202) END - END ; - IF (x.class = Nconst) & (y.class = Nconst) THEN - IF k <= l THEN - x.conval.setval := {k..l} - ELSE err(201); x.conval.setval := {l..k} - END ; - x.obj := NIL - ELSE BindNodes(Nupto, DevCPT.settyp, x, y) - END - ELSE err(93) - END ; - x.typ := DevCPT.settyp - END SetRange; - - PROCEDURE SetElem*(VAR x: DevCPT.Node); - VAR k: INTEGER; - BEGIN - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) END; - IF x.typ.form IN intSet THEN - IF x.typ.form = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF x.class = Nconst THEN - k := x.conval.intval; - IF (0 <= k) & (k <= DevCPM.MaxSet) & (x.conval.realval = 0) THEN x.conval.setval := {k} - ELSE err(202) - END ; - x.obj := NIL - ELSE BindNodes(Nmop, DevCPT.settyp, x, NIL); x.subcl := bit - END ; - ELSE err(93) - END; - x.typ := DevCPT.settyp - END SetElem; - - PROCEDURE CheckAssign* (x: DevCPT.Struct; VAR ynode: DevCPT.Node); - (* x := y, checks assignment compatibility *) - VAR f, g: SHORTINT; y, b: DevCPT.Struct; - BEGIN - y := ynode.typ; f := x.form; g := y.form; - IF (ynode.class = Ntype) OR (ynode.class = Nproc) & (f # ProcTyp) THEN err(126) END ; - CASE f OF - | Undef, String8, String16, Byte: - | Bool, Set: - IF g # f THEN err(113) END - | Int8, Int16, Int32, Int64, Real32, Real64: (* SR *) - IF (g IN intSet) OR (g IN realSet) & (f IN realSet) THEN - IF ynode.class = Nconst THEN Convert(ynode, x) - ELSIF ~DevCPT.Includes(f, g) THEN err(113) - END - ELSE err(113) - END -(* - IF ~(g IN intSet + realSet) OR ~DevCPT.Includes(f, g) & (~(g IN intSet) OR (ynode.class # Nconst)) THEN - err(113) - ELSIF ynode.class = Nconst THEN Convert(ynode, x) - END -*) - | Char8, Char16: - IF ~(g IN charSet) OR ~DevCPT.Includes(f, g) THEN err(113) - ELSIF ynode.class = Nconst THEN Convert(ynode, x) - END - | Pointer: - b := x.BaseTyp; - IF DevCPT.Extends(y, x) - OR (g = NilTyp) - OR (g = Pointer) - & ((x = DevCPT.sysptrtyp) OR (DevCPM.java IN DevCPM.options) & (x = DevCPT.anyptrtyp)) - THEN (* ok *) - ELSIF (b.comp = DynArr) & b.untagged THEN (* pointer to untagged open array *) - IF ynode.class = Nconst THEN CheckString(ynode, b, 113) - ELSIF ~(y.comp IN {Array, DynArr}) OR ~DevCPT.EqualType(b.BaseTyp, y.BaseTyp) THEN err(113) - END - ELSIF b.untagged & (ynode.class = Nmop) & (ynode.subcl = adr) THEN (* p := ADR(r) *) - IF (b.comp = DynArr) & (ynode.left.class = Nconst) THEN CheckString(ynode.left, b, 113) - ELSIF ~DevCPT.Extends(ynode.left.typ, b) THEN err(113) - END - ELSIF (b.sysflag = jstr) & ((g = String16) OR (ynode.class = Nconst) & (g IN {Char8, Char16, String8})) - THEN - IF g # String16 THEN Convert(ynode, DevCPT.string16typ) END - ELSE err(113) - END - | ProcTyp: - IF DevCPT.EqualType(x, y) OR (g = NilTyp) THEN (* ok *) - ELSIF (ynode.class = Nproc) & (ynode.obj.mode IN {XProc, IProc, LProc}) THEN - IF ynode.obj.mode = LProc THEN - IF ynode.obj.mnolev = 0 THEN ynode.obj.mode := XProc ELSE err(73) END - END; - IF (x.sysflag = 0) & (ynode.obj.sysflag >= 0) OR (x.sysflag = ynode.obj.sysflag) THEN - IF DevCPT.EqualType(x.BaseTyp, ynode.obj.typ) THEN CheckParameters(x.link, ynode.obj.link, FALSE) - ELSE err(117) - END - ELSE err(113) - END - ELSE err(113) - END - | NoTyp, NilTyp: err(113) - | Comp: - x.pvused := TRUE; (* idfp of y guarantees assignment compatibility with x *) - IF x.comp = Record THEN - IF ~DevCPT.EqualType(x, y) OR (x.attribute # 0) THEN err(113) END - ELSIF g IN {Char8, Char16, String8, String16} THEN - IF (x.BaseTyp.form = Char16) & (g = String8) THEN Convert(ynode, DevCPT.string16typ) - ELSE CheckString(ynode, x, 113); - END; - IF (x # DevCPT.guidtyp) & (x.comp = Array) & (ynode.class = Nconst) & (ynode.conval.intval2 > x.n) THEN - err(114) - END - ELSIF (x.comp = Array) & DevCPT.EqualType(x, y) THEN (* ok *) - ELSE err(113) - END - END - END CheckAssign; - - PROCEDURE AssignString (VAR x: DevCPT.Node; str: DevCPT.Node); (* x := str or x[0] := 0X *) - BEGIN - ASSERT((str.class = Nconst) & (str.typ.form IN {String8, String16})); - IF (x.typ.comp IN {Array, DynArr}) & (str.conval.intval2 = 1) THEN (* x := "" -> x[0] := 0X *) - Index(x, NewIntConst(0)); - str.typ := x.typ; str.conval.intval := 0; - END; - BindNodes(Nassign, DevCPT.notyp, x, str); x.subcl := assign - END AssignString; - - PROCEDURE CheckLeaf(x: DevCPT.Node; dynArrToo: BOOLEAN); - BEGIN - IF (x.class = Nmop) & (x.subcl = val) THEN x := x.left END ; - IF x.class = Nguard THEN x := x.left END ; (* skip last (and unique) guard *) - IF (x.class = Nvar) & (dynArrToo OR (x.typ.comp # DynArr)) THEN x.obj.leaf := FALSE END - END CheckLeaf; - - PROCEDURE CheckOldType (x: DevCPT.Node); - BEGIN - IF ~(DevCPM.oberon IN DevCPM.options) - & ((x.typ = DevCPT.lreal64typ) OR (x.typ = DevCPT.lint64typ) OR (x.typ = DevCPT.lchar16typ)) THEN - err(198) - END - END CheckOldType; - - PROCEDURE StPar0*(VAR par0: DevCPT.Node; fctno: SHORTINT); (* par0: first param of standard proc *) - VAR f: SHORTINT; typ: DevCPT.Struct; x, t: DevCPT.Node; - BEGIN x := par0; f := x.typ.form; - CASE fctno OF - haltfn: (*HALT*) - IF (f IN intSet - {Int64}) & (x.class = Nconst) THEN - IF (DevCPM.MinHaltNr <= x.conval.intval) & (x.conval.intval <= DevCPM.MaxHaltNr) THEN - BindNodes(Ntrap, DevCPT.notyp, x, x) - ELSE err(218) - END - ELSIF (DevCPM.java IN DevCPM.options) - & ((x.class = Ntype) OR (x.class = Nvar)) - & (x.typ.form = Pointer) - THEN - BindNodes(Ntrap, DevCPT.notyp, x, x) - ELSE err(69) - END ; - x.typ := DevCPT.notyp - | newfn: (*NEW*) - typ := DevCPT.notyp; - IF NotVar(x) THEN err(112) - ELSIF f = Pointer THEN - IF DevCPM.NEWusingAdr THEN CheckLeaf(x, TRUE) END ; - IF x.readonly THEN err(76) - ELSIF (x.typ.BaseTyp.attribute = absAttr) - OR (x.typ.BaseTyp.attribute = limAttr) & (x.typ.BaseTyp.mno # 0) THEN err(193) - ELSIF (x.obj # NIL) & ODD(x.obj.sysflag DIV newBit) THEN err(167) - END ; - MarkAsUsed(x); - f := x.typ.BaseTyp.comp; - IF f IN {Record, DynArr, Array} THEN - IF f = DynArr THEN typ := x.typ.BaseTyp END ; - BindNodes(Nassign, DevCPT.notyp, x, NIL); x.subcl := newfn - ELSE err(111) - END - ELSE err(111) - END ; - x.typ := typ - | absfn: (*ABS*) - MOp(abs, x) - | capfn: (*CAP*) - MOp(cap, x) - | ordfn: (*ORD*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f = Char8 THEN Convert(x, DevCPT.int16typ) - ELSIF f = Char16 THEN Convert(x, DevCPT.int32typ) - ELSIF f = Set THEN Convert(x, DevCPT.int32typ) - ELSE err(111) - END - | bitsfn: (*BITS*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Int8, Int16, Int32} THEN Convert(x, DevCPT.settyp) - ELSE err(111) - END - | entierfn: (*ENTIER*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN realSet THEN Convert(x, DevCPT.int64typ) - ELSE err(111) - END ; - x.typ := DevCPT.int64typ - | lentierfcn: (* LENTIER *) - IF ~(DevCPM.oberon IN DevCPM.options) THEN err(199) END; - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN realSet THEN Convert(x, DevCPT.int64typ) - ELSE err(111) - END ; - x.typ := DevCPT.int64typ - | oddfn: (*ODD*) - MOp(odd, x) - | minfn: (*MIN*) - IF x.class = Ntype THEN - CheckOldType(x); - CASE f OF - Bool: x := NewBoolConst(FALSE) - | Char8: x := NewIntConst(0); x.typ := DevCPT.char8typ - | Char16: x := NewIntConst(0); x.typ := DevCPT.char8typ - | Int8: x := NewIntConst(-128) - | Int16: x := NewIntConst(-32768) - | Int32: x := NewIntConst(-2147483648) - | Int64: x := NewLargeIntConst(0, -9223372036854775808.0E0) (* -2^63 *) - | Set: x := NewIntConst(0) (*; x.typ := DevCPT.int16typ *) - | Real32: x := NewRealConst(DevCPM.MinReal32, DevCPT.real64typ) - | Real64: x := NewRealConst(DevCPM.MinReal64, DevCPT.real64typ) - ELSE err(111) - END; - x.hint := 1 - ELSIF ~(f IN intSet + realSet + charSet) THEN err(111) - END - | maxfn: (*MAX*) - IF x.class = Ntype THEN - CheckOldType(x); - CASE f OF - Bool: x := NewBoolConst(TRUE) - | Char8: x := NewIntConst(0FFH); x.typ := DevCPT.char8typ - | Char16: x := NewIntConst(0FFFFH); x.typ := DevCPT.char16typ - | Int8: x := NewIntConst(127) - | Int16: x := NewIntConst(32767) - | Int32: x := NewIntConst(2147483647) - | Int64: x := NewLargeIntConst(-1, 9223372036854775808.0E0) (* 2^63 - 1 *) - | Set: x := NewIntConst(31) (*; x.typ := DevCPT.int16typ *) - | Real32: x := NewRealConst(DevCPM.MaxReal32, DevCPT.real64typ) - | Real64: x := NewRealConst(DevCPM.MaxReal64, DevCPT.real64typ) - ELSE err(111) - END; - x.hint := 1 - ELSIF ~(f IN intSet + realSet + charSet) THEN err(111) - END - | chrfn: (*CHR*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Undef, Int8..Int32, Int64} THEN Convert(x, DevCPT.char16typ) - ELSE err(111); x.typ := DevCPT.char16typ - END - | lchrfn: (* LCHR *) - IF ~(DevCPM.oberon IN DevCPM.options) THEN err(199) END; - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Undef, Int8..Int32, Int64} THEN Convert(x, DevCPT.char16typ) - ELSE err(111); x.typ := DevCPT.char16typ - END - | shortfn: (*SHORT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSE - IF (x.typ.comp IN {Array, DynArr}) & (x.typ.BaseTyp.form IN charSet) THEN StrDeref(x); f := x.typ.form - END; - IF f = Int16 THEN Convert(x, DevCPT.int8typ) - ELSIF f = Int32 THEN Convert(x, DevCPT.int16typ) - ELSIF f = Int64 THEN Convert(x, DevCPT.int32typ) - ELSIF f = Real64 THEN Convert(x, DevCPT.real32typ) - ELSIF f = Char16 THEN Convert(x, DevCPT.char8typ) - ELSIF f = String16 THEN Convert(x, DevCPT.string8typ) - ELSE err(111) - END - END - | longfn: (*LONG*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSE - IF (x.typ.comp IN {Array, DynArr}) & (x.typ.BaseTyp.form IN charSet) THEN StrDeref(x); f := x.typ.form - END; - IF f = Int8 THEN Convert(x, DevCPT.int16typ) - ELSIF f = Int16 THEN Convert(x, DevCPT.int32typ) - ELSIF f = Int32 THEN Convert(x, DevCPT.int64typ) - ELSIF f = Real32 THEN Convert(x, DevCPT.real64typ) - ELSIF f = Char8 THEN Convert(x, DevCPT.char16typ) - ELSIF f = String8 THEN Convert(x, DevCPT.string16typ) - ELSE err(111) - END - END - | incfn, decfn: (*INC, DEC*) - IF NotVar(x) THEN err(112) - ELSIF ~(f IN intSet) THEN err(111) - ELSIF x.readonly THEN err(76) - END; - MarkAsUsed(x) - | inclfn, exclfn: (*INCL, EXCL*) - IF NotVar(x) THEN err(112) - ELSIF f # Set THEN err(111); x.typ := DevCPT.settyp - ELSIF x.readonly THEN err(76) - END; - MarkAsUsed(x) - | lenfn: (*LEN*) - IF (* (x.class = Ntype) OR *) (x.class = Nproc) THEN err(126) (* !!! *) - (* ELSIF x.typ.sysflag = jstr THEN StrDeref(x) *) - ELSE - IF x.typ.form = Pointer THEN DeRef(x) END; - IF x.class = Nconst THEN - IF x.typ.form = Char8 THEN CharToString8(x) - ELSIF x.typ.form = Char16 THEN CharToString16(x) - END - END; - IF ~(x.typ.comp IN {DynArr, Array}) & ~(x.typ.form IN {String8, String16}) THEN err(131) END - END - | copyfn: (*COPY*) - IF ~(DevCPM.oberon IN DevCPM.options) THEN err(199) END; - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) END - | ashfn: (*ASH*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - IF f < Int32 THEN Convert(x, DevCPT.int32typ) END - ELSE err(111); x.typ := DevCPT.int32typ - END - | adrfn: (*ADR*) - IF x.class = Ntype THEN CheckOldType(x) END; - CheckLeaf(x, FALSE); MOp(adr, x) - | typfn: (*TYP*) - CheckLeaf(x, FALSE); - IF x.class = Ntype THEN - CheckOldType(x); - IF x.typ.form = Pointer THEN x := NewLeaf(x.typ.BaseTyp.strobj) END; - IF x.typ.comp # Record THEN err(111) END; - MOp(adr, x) - ELSE - IF x.typ.form = Pointer THEN DeRef(x) END; - IF x.typ.comp # Record THEN err(111) END; - MOp(typfn, x) - END - | sizefn: (*SIZE*) - IF x.class # Ntype THEN err(110); x := NewIntConst(1) - ELSIF (f IN {Byte..Set, Pointer, ProcTyp, Char16, Int64}) OR (x.typ.comp IN {Array, Record}) THEN - CheckOldType(x); x.typ.pvused := TRUE; - IF typSize # NIL THEN - typSize(x.typ); x := NewIntConst(x.typ.size) - ELSE - MOp(size, x) - END - ELSE err(111); x := NewIntConst(1) - END - | thisrecfn, (*THISRECORD*) - thisarrfn: (*THISARRAY*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Int8, Int16} THEN Convert(x, DevCPT.int32typ) - ELSIF f # Int32 THEN err(111) - END - | ccfn: (*SYSTEM.CC*) - MOp(cc, x) - | lshfn, rotfn: (*SYSTEM.LSH, SYSTEM.ROT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF ~(f IN intSet + charSet + {Byte, Set}) THEN err(111) - END - | getfn, putfn, bitfn, movefn: (*SYSTEM.GET, SYSTEM.PUT, SYSTEM.BIT, SYSTEM.MOVE*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF (x.class = Nconst) & (f IN {Int8, Int16}) THEN Convert(x, DevCPT.int32typ) - ELSIF ~(f IN {Int32, Pointer}) THEN err(111); x.typ := DevCPT.int32typ - END - | getrfn, putrfn: (*SYSTEM.GETREG, SYSTEM.PUTREG*) - IF (f IN intSet) & (x.class = Nconst) THEN - IF (x.conval.intval < DevCPM.MinRegNr) OR (x.conval.intval > DevCPM.MaxRegNr) THEN err(220) - END - ELSE err(69) - END - | valfn: (*SYSTEM.VAL*) - IF x.class # Ntype THEN err(110) - ELSIF (f IN {Undef, String8, String16, NoTyp, NilTyp}) (* OR (x.typ.comp = DynArr) *) THEN err(111) - ELSE CheckOldType(x) - END - | assertfn: (*ASSERT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126); x := NewBoolConst(FALSE) - ELSIF f # Bool THEN err(120); x := NewBoolConst(FALSE) - ELSE MOp(not, x) - END - | validfn: (* VALID *) - IF (x.class = Nvarpar) & ODD(x.obj.sysflag DIV nilBit) THEN - MOp(adr, x); x.typ := DevCPT.sysptrtyp; Op(neq, x, Nil()) - ELSE err(111) - END; - x.typ := DevCPT.booltyp - | iidfn: (* COM.IID *) - IF (x.class = Nconst) & (f = String8) THEN StringToGuid(x) - ELSE - typ := x.typ; - IF typ.form = Pointer THEN typ := typ.BaseTyp END; - IF (typ.sysflag = interface) & (typ.ext # NIL) & (typ.strobj # NIL) THEN - IF x.obj # typ.strobj THEN x := NewLeaf(typ.strobj) END - ELSE err(111) - END; - x.class := Nconst; x.typ := DevCPT.guidtyp - END - | queryfn: (* COM.QUERY *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f # Pointer THEN err(111) - END - END ; - par0 := x - END StPar0; - - PROCEDURE StPar1*(VAR par0: DevCPT.Node; x: DevCPT.Node; fctno: BYTE); - (* x: second parameter of standard proc *) - VAR f, n, L, i: INTEGER; typ, tp1: DevCPT.Struct; p, t: DevCPT.Node; - - PROCEDURE NewOp(class, subcl: BYTE; left, right: DevCPT.Node): DevCPT.Node; - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(class); node.subcl := subcl; - node.left := left; node.right := right; RETURN node - END NewOp; - - BEGIN p := par0; f := x.typ.form; - CASE fctno OF - incfn, decfn: (*INC DEC*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126); p.typ := DevCPT.notyp - ELSE - IF f # p.typ.form THEN - IF f IN intSet THEN Convert(x, p.typ) - ELSE err(111) - END - END ; - p := NewOp(Nassign, fctno, p, x); - p.typ := DevCPT.notyp - END - | inclfn, exclfn: (*INCL, EXCL*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF (x.class = Nconst) & ((0 > x.conval.intval) OR (x.conval.intval > DevCPM.MaxSet)) THEN err(202) - END ; - p := NewOp(Nassign, fctno, p, x) - ELSE err(111) - END ; - p.typ := DevCPT.notyp - | lenfn: (*LEN*) - IF ~(f IN intSet) OR (x.class # Nconst) THEN err(69) - ELSE - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - L := SHORT(x.conval.intval); typ := p.typ; - WHILE (L > 0) & (typ.comp IN {DynArr, Array}) DO typ := typ.BaseTyp; DEC(L) END ; - IF (L # 0) OR ~(typ.comp IN {DynArr, Array}) THEN err(132) - ELSE x.obj := NIL; - IF typ.comp = DynArr THEN - WHILE p.class = Nindex DO - p := p.left; INC(x.conval.intval) (* possible side effect ignored *) - END; - p := NewOp(Ndop, len, p, x); p.typ := DevCPT.int32typ - ELSE p := x; p.conval.intval := typ.n; p.typ := DevCPT.int32typ - END - END - END - | copyfn: (*COPY*) - IF NotVar(x) THEN err(112) - ELSIF x.readonly THEN err(76) - ELSE - CheckString(p, x.typ, 111); t := x; x := p; p := t; - IF (x.class = Nconst) & (x.typ.form IN {String8, String16}) THEN AssignString(p, x) - ELSE p := NewOp(Nassign, copyfn, p, x) - END - END ; - p.typ := DevCPT.notyp; MarkAsUsed(x) - | ashfn: (*ASH*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - IF (x.class = Nconst) & ((x.conval.intval > 64) OR (x.conval.intval < -64)) THEN err(208) - ELSIF (p.class = Nconst) & (x.class = Nconst) THEN - n := x.conval.intval; - IF n > 0 THEN - WHILE n > 0 DO MulConst(p.conval, two, p.conval, p.typ); DEC(n) END - ELSE - WHILE n < 0 DO DivModConst(p.conval, two, TRUE, p.typ); INC(n) END - END; - p.obj := NIL - ELSE - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - typ := p.typ; p := NewOp(Ndop, ash, p, x); p.typ := typ - END - ELSE err(111) - END - | minfn: (*MIN*) - IF p.class # Ntype THEN Op(min, p, x) ELSE err(64) END - | maxfn: (*MAX*) - IF p.class # Ntype THEN Op(max, p, x) ELSE err(64) END - | newfn: (*NEW(p, x...)*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF p.typ.comp = DynArr THEN - IF f IN intSet THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF (x.class = Nconst) & (x.conval.intval <= 0) - & (~(DevCPM.java IN DevCPM.options) OR (x.conval.intval < 0))THEN err(63) END - ELSE err(111) - END ; - p.right := x; p.typ := p.typ.BaseTyp - ELSIF (p.left # NIL) & (p.left.typ.form = Pointer) THEN - typ := p.left.typ; - WHILE (typ # DevCPT.undftyp) & (typ.BaseTyp # NIL) DO typ := typ.BaseTyp END; - IF typ.sysflag = interface THEN - typ := x.typ; - WHILE (typ # DevCPT.undftyp) & (typ.BaseTyp # NIL) DO typ := typ.BaseTyp END; - IF (f = Pointer) & (typ.sysflag = interface) THEN - p.right := x - ELSE err(169) - END - ELSE err(64) - END - ELSE err(111) - END - | thisrecfn, (*THISRECORD*) - thisarrfn: (*THISARRAY*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Int8, Int16, Int32} THEN - IF f < Int32 THEN Convert(x, DevCPT.int32typ) END; - p := NewOp(Ndop, fctno, p, x); p.typ := DevCPT.undftyp - ELSE err(111) - END - | lshfn, rotfn: (*SYSTEM.LSH, SYSTEM.ROT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF ~(f IN intSet) THEN err(111) - ELSE - IF fctno = lshfn THEN p := NewOp(Ndop, lsh, p, x) ELSE p := NewOp(Ndop, rot, p, x) END ; - p.typ := p.left.typ - END - | getfn, putfn, getrfn, putrfn: (*SYSTEM.GET, SYSTEM.PUT, SYSTEM.GETREG, SYSTEM.PUTREG*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Undef..Set, NilTyp, Pointer, ProcTyp, Char16, Int64} THEN - IF (fctno = getfn) OR (fctno = getrfn) THEN - IF NotVar(x) THEN err(112) END ; - t := x; x := p; p := t - END ; - p := NewOp(Nassign, fctno, p, x) - ELSE err(111) - END ; - p.typ := DevCPT.notyp - | bitfn: (*SYSTEM.BIT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - p := NewOp(Ndop, bit, p, x) - ELSE err(111) - END ; - p.typ := DevCPT.booltyp - | valfn: (*SYSTEM.VAL*) (* type is changed without considering the byte ordering on the target machine *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF x.typ.comp = DynArr THEN - IF x.typ.untagged & ((p.typ.comp # DynArr) OR p.typ.untagged) THEN (* ok *) - ELSIF (p.typ.comp = DynArr) & (x.typ.n = p.typ.n) THEN - typ := x.typ; - WHILE typ.comp = DynArr DO typ := typ.BaseTyp END; - tp1 := p.typ; - WHILE tp1.comp = DynArr DO tp1 := tp1.BaseTyp END; - IF typ.size # tp1.size THEN err(115) END - ELSE err(115) - END - ELSIF p.typ.comp = DynArr THEN err(115) - ELSIF (x.class = Nconst) & (f = String8) & (p.typ.form = Int32) & (x.conval.intval2 <= 5) THEN - i := 0; n := 0; - WHILE i < x.conval.intval2 - 1 DO n := 256 * n + ORD(x.conval.ext[i]); INC(i) END; - x := NewIntConst(n) - ELSIF (f IN {Undef, NoTyp, NilTyp}) OR (f IN {String8, String16}) & ~(DevCPM.java IN DevCPM.options) THEN err(111) - END ; - IF (x.class = Nconst) & (x.typ = p.typ) THEN (* ok *) - ELSIF (x.class >= Nconst) OR ((f IN realSet) # (p.typ.form IN realSet)) - OR (DevCPM.options * {DevCPM.java, DevCPM.allSysVal} # {}) THEN - t := DevCPT.NewNode(Nmop); t.subcl := val; t.left := x; x := t - ELSE x.readonly := FALSE - END ; - x.typ := p.typ; p := x - | movefn: (*SYSTEM.MOVE*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF (x.class = Nconst) & (f IN {Int8, Int16}) THEN Convert(x, DevCPT.int32typ) - ELSIF ~(f IN {Int32, Pointer}) THEN err(111); x.typ := DevCPT.int32typ - END ; - p.link := x - | assertfn: (*ASSERT*) - IF (f IN intSet - {Int64}) & (x.class = Nconst) THEN - IF (DevCPM.MinHaltNr <= x.conval.intval) & (x.conval.intval <= DevCPM.MaxHaltNr) THEN - BindNodes(Ntrap, DevCPT.notyp, x, x); - Construct(Nif, p, x); Construct(Nifelse, p, NIL); OptIf(p); - ELSE err(218) - END - ELSIF - (DevCPM.java IN DevCPM.options) & ((x.class = Ntype) OR (x.class = Nvar)) & (x.typ.form = Pointer) - THEN - BindNodes(Ntrap, DevCPT.notyp, x, x); - Construct(Nif, p, x); Construct(Nifelse, p, NIL); OptIf(p); - ELSE err(69) - END; - IF p = NIL THEN (* ASSERT(TRUE) *) - ELSIF p.class = Ntrap THEN err(99) - ELSE p.subcl := assertfn - END - | queryfn: (* COM.QUERY *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF x.typ # DevCPT.guidtyp THEN err(111); x.typ := DevCPT.guidtyp - END; - p.link := x - ELSE err(64) - END ; - par0 := p - END StPar1; - - PROCEDURE StParN*(VAR par0: DevCPT.Node; x: DevCPT.Node; fctno, n: SHORTINT); - (* x: n+1-th param of standard proc *) - VAR node: DevCPT.Node; f: SHORTINT; p: DevCPT.Node; typ: DevCPT.Struct; - BEGIN p := par0; f := x.typ.form; - IF fctno = newfn THEN (*NEW(p, ..., x...*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF p.typ.comp # DynArr THEN err(64) - ELSIF f IN intSet THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF (x.class = Nconst) & (x.conval.intval <= 0) THEN err(63) END; - node := p.right; WHILE node.link # NIL DO node := node.link END; - node.link := x; p.typ := p.typ.BaseTyp - ELSE err(111) - END - ELSIF (fctno = movefn) & (n = 2) THEN (*SYSTEM.MOVE*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - node := DevCPT.NewNode(Nassign); node.subcl := movefn; node.right := p; - node.left := p.link; p.link := x; p := node - ELSE err(111) - END ; - p.typ := DevCPT.notyp - ELSIF (fctno = queryfn) & (n = 2) THEN (* COM.QUERY *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF (x.class < Nconst) & (f = Pointer) & (x.typ.sysflag = interface) THEN - IF ~DevCPT.Extends(p.typ, x.typ) THEN err(164) END; - IF x.readonly THEN err(76) END; - CheckNewParamPair(x, p.link); - MarkAsUsed(x); - node := DevCPT.NewNode(Ndop); node.subcl := queryfn; - node.left := p; node.right := p.link; p.link := NIL; node.right.link := x; p := node - ELSE err(111) - END; - p.typ := DevCPT.booltyp - ELSE err(64) - END ; - par0 := p - END StParN; - - PROCEDURE StFct*(VAR par0: DevCPT.Node; fctno: BYTE; parno: SHORTINT); - VAR dim: SHORTINT; x, p: DevCPT.Node; - BEGIN p := par0; - IF fctno <= ashfn THEN - IF (fctno = newfn) & (p.typ # DevCPT.notyp) THEN - IF p.typ.comp = DynArr THEN err(65) END ; - p.typ := DevCPT.notyp - ELSIF (fctno = minfn) OR (fctno = maxfn) THEN - IF (parno < 1) OR (parno = 1) & (p.hint # 1) THEN err(65) END; - p.hint := 0 - ELSIF fctno <= sizefn THEN (* 1 param *) - IF parno < 1 THEN err(65) END - ELSE (* more than 1 param *) - IF ((fctno = incfn) OR (fctno = decfn)) & (parno = 1) THEN (*INC, DEC*) - BindNodes(Nassign, DevCPT.notyp, p, NewIntConst(1)); p.subcl := fctno; p.right.typ := p.left.typ - ELSIF (fctno = lenfn) & (parno = 1) THEN (*LEN*) - IF p.typ.form IN {String8, String16} THEN - IF p.class = Nconst THEN p := NewIntConst(p.conval.intval2 - 1) - ELSIF (p.class = Ndop) & (p.subcl = plus) THEN (* propagate to leaf nodes *) - StFct(p.left, lenfn, 1); StFct(p.right, lenfn, 1); p.typ := DevCPT.int32typ - ELSE - WHILE (p.class = Nmop) & (p.subcl = conv) DO p := p.left END; - IF DevCPM.errors = 0 THEN ASSERT(p.class = Nderef) END; - BindNodes(Ndop, DevCPT.int32typ, p, NewIntConst(0)); p.subcl := len - END - ELSIF p.typ.comp = DynArr THEN dim := 0; - WHILE p.class = Nindex DO p := p.left; INC(dim) END ; (* possible side effect ignored *) - BindNodes(Ndop, DevCPT.int32typ, p, NewIntConst(dim)); p.subcl := len - ELSE - p := NewIntConst(p.typ.n) - END - ELSIF parno < 2 THEN err(65) - END - END - ELSIF fctno = assertfn THEN - IF parno = 1 THEN x := NIL; - BindNodes(Ntrap, DevCPT.notyp, x, NewIntConst(AssertTrap)); - Construct(Nif, p, x); Construct(Nifelse, p, NIL); OptIf(p); - IF p = NIL THEN (* ASSERT(TRUE) *) - ELSIF p.class = Ntrap THEN err(99) - ELSE p.subcl := assertfn - END - ELSIF parno < 1 THEN err(65) - END - ELSIF (fctno >= lchrfn) & (fctno <= bytesfn) THEN - IF parno < 1 THEN err(65) END - ELSIF fctno < validfn THEN (*SYSTEM*) - IF (parno < 1) OR - (fctno > ccfn) & (parno < 2) OR - (fctno = movefn) & (parno < 3) THEN err(65) - END - ELSIF (fctno = thisrecfn) OR (fctno = thisarrfn) THEN - IF parno < 2 THEN err(65) END - ELSE (* COM *) - IF fctno = queryfn THEN - IF parno < 3 THEN err(65) END - ELSE - IF parno < 1 THEN err(65) END - END - END ; - par0 := p - END StFct; - - PROCEDURE DynArrParCheck (ftyp: DevCPT.Struct; VAR ap: DevCPT.Node; fvarpar: BOOLEAN); - (* check array compatibility *) - VAR atyp: DevCPT.Struct; - BEGIN (* ftyp.comp = DynArr *) - atyp := ap.typ; - IF atyp.form IN {Char8, Char16, String8, String16} THEN - IF ~fvarpar & (ftyp.BaseTyp.form = Char16) & (atyp.form = String8) THEN Convert(ap, DevCPT.string16typ) - ELSE CheckString(ap, ftyp, 67) - END - ELSE - WHILE (ftyp.comp = DynArr) & ((atyp.comp IN {Array, DynArr}) OR (atyp.form IN {String8, String16})) DO - ftyp := ftyp.BaseTyp; atyp := atyp.BaseTyp - END; - IF ftyp.comp = DynArr THEN err(67) - ELSIF ~fvarpar & (ftyp.form = Pointer) & DevCPT.Extends(atyp, ftyp) THEN (* ok *) - ELSIF ~DevCPT.EqualType(ftyp, atyp) THEN err(66) - END - END - END DynArrParCheck; - - PROCEDURE PrepCall*(VAR x: DevCPT.Node; VAR fpar: DevCPT.Object); - BEGIN - IF (x.obj # NIL) & (x.obj.mode IN {LProc, XProc, TProc, CProc}) THEN - fpar := x.obj.link; - IF x.obj.mode = TProc THEN - IF fpar.typ.form = Pointer THEN - IF x.left.class = Nderef THEN x.left := x.left.left (*undo DeRef*) ELSE err(71) END - END; - fpar := fpar.link - END - ELSIF (x.class # Ntype) & (x.typ # NIL) & (x.typ.form = ProcTyp) THEN - fpar := x.typ.link - ELSE err(121); fpar := NIL; x.typ := DevCPT.undftyp - END - END PrepCall; - - PROCEDURE Param* (VAR ap: DevCPT.Node; fp: DevCPT.Object); (* checks parameter compatibilty *) - VAR at, ft: DevCPT.Struct; - BEGIN - at := ap.typ; ft := fp.typ; - IF fp.ptyp # NIL THEN ft := fp.ptyp END; (* get original formal type *) - IF ft.form # Undef THEN - IF (ap.class = Ntype) OR (ap.class = Nproc) & (ft.form # ProcTyp) THEN err(126) END; - IF fp.mode = VarPar THEN - IF ODD(fp.sysflag DIV nilBit) & (at = DevCPT.niltyp) THEN (* ok *) - ELSIF (ft.comp = Record) & ~ft.untagged & (ap.class = Ndop) & (ap.subcl = thisrecfn) THEN (* ok *) - ELSIF (ft.comp = DynArr) & ~ft.untagged & (ft.n = 0) & (ap.class = Ndop) & (ap.subcl = thisarrfn) THEN - (* ok *) - ELSE - IF fp.vis = inPar THEN - IF (ft = DevCPT.guidtyp) & (ap.class = Nconst) & (at.form = String8) THEN - StringToGuid(ap); at := ap.typ -(* - ELSIF ((at.form IN charSet + {String8, String16}) OR (at = DevCPT.guidtyp)) - & ((ap.class = Nderef) OR (ap.class = Nconst)) THEN (* ok *) - ELSIF NotVar(ap) THEN err(122) -*) - END; - IF ~NotVar(ap) THEN CheckLeaf(ap, FALSE) END - ELSE - IF NotVar(ap) THEN err(122) - ELSIF ap.readonly THEN err(76) - ELSIF (ap.obj # NIL) & ODD(ap.obj.sysflag DIV newBit) & ~ODD(fp.sysflag DIV newBit) THEN - err(167) - ELSE MarkAsUsed(ap); CheckLeaf(ap, FALSE) - END - END; - IF ft.comp = DynArr THEN DynArrParCheck(ft, ap, fp.vis # inPar) - ELSIF ODD(fp.sysflag DIV newBit) THEN - IF ~DevCPT.Extends(at, ft) THEN err(123) END - ELSIF (ft = DevCPT.sysptrtyp) & (at.form = Pointer) THEN (* ok *) - ELSIF (fp.vis # outPar) & (ft.comp = Record) & DevCPT.Extends(at, ft) THEN (* ok *) - ELSIF covarOut & (fp.vis = outPar) & (ft.form = Pointer) & DevCPT.Extends(ft, at) THEN (* ok *) - ELSIF fp.vis = inPar THEN CheckAssign(ft, ap) - ELSIF ~DevCPT.EqualType(ft, at) THEN err(123) - END - END - ELSIF ft.comp = DynArr THEN DynArrParCheck(ft, ap, FALSE) - ELSE CheckAssign(ft, ap) - END - END - END Param; - - PROCEDURE StaticLink*(dlev: BYTE; var: BOOLEAN); - VAR scope: DevCPT.Object; - BEGIN - scope := DevCPT.topScope; - WHILE dlev > 0 DO DEC(dlev); - INCL(scope.link.conval.setval, slNeeded); - scope := scope.left - END; - IF var THEN INCL(scope.link.conval.setval, imVar) END (* !!! *) - END StaticLink; - - PROCEDURE Call*(VAR x: DevCPT.Node; apar: DevCPT.Node; fp: DevCPT.Object); - VAR typ: DevCPT.Struct; p: DevCPT.Node; lev: BYTE; - BEGIN - IF x.class = Nproc THEN typ := x.typ; - lev := x.obj.mnolev; - IF lev > 0 THEN StaticLink(SHORT(SHORT(DevCPT.topScope.mnolev-lev)), FALSE) END ; (* !!! *) - IF x.obj.mode = IProc THEN err(121) END - ELSIF (x.class = Nfield) & (x.obj.mode = TProc) THEN typ := x.typ; - x.class := Nproc; p := x.left; x.left := NIL; p.link := apar; apar := p; fp := x.obj.link - ELSE typ := x.typ.BaseTyp - END ; - BindNodes(Ncall, typ, x, apar); x.obj := fp - END Call; - - PROCEDURE Enter*(VAR procdec: DevCPT.Node; stat: DevCPT.Node; proc: DevCPT.Object); - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nenter); x.typ := DevCPT.notyp; x.obj := proc; - x.left := procdec; x.right := stat; procdec := x - END Enter; - - PROCEDURE Return*(VAR x: DevCPT.Node; proc: DevCPT.Object); - VAR node: DevCPT.Node; - BEGIN - IF proc = NIL THEN (* return from module *) - IF x # NIL THEN err(124) END - ELSE - IF x # NIL THEN CheckAssign(proc.typ, x) - ELSIF proc.typ # DevCPT.notyp THEN err(124) - END - END ; - node := DevCPT.NewNode(Nreturn); node.typ := DevCPT.notyp; node.obj := proc; node.left := x; x := node - END Return; - - PROCEDURE Assign*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR z: DevCPT.Node; - BEGIN - IF (x.class >= Nconst) OR (x.typ.form IN {String8, String16}) THEN err(56) END ; - CheckAssign(x.typ, y); - IF x.readonly THEN err(76) - ELSIF (x.obj # NIL) & ODD(x.obj.sysflag DIV newBit) THEN err(167) - END ; - MarkAsUsed(x); - IF (y.class = Nconst) & (y.typ.form IN {String8, String16}) & (x.typ.form # Pointer) THEN AssignString(x, y) - ELSE BindNodes(Nassign, DevCPT.notyp, x, y); x.subcl := assign - END - END Assign; - - PROCEDURE Inittd*(VAR inittd, last: DevCPT.Node; typ: DevCPT.Struct); - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(Ninittd); node.typ := typ; - node.conval := DevCPT.NewConst(); node.conval.intval := typ.txtpos; - IF inittd = NIL THEN inittd := node ELSE last.link := node END ; - last := node - END Inittd; - - (* handling of temporary variables for string operations *) - - PROCEDURE Overlap (left, right: DevCPT.Node): BOOLEAN; - BEGIN - IF right.class = Nconst THEN - RETURN FALSE - ELSIF (right.class = Ndop) & (right.subcl = plus) THEN - RETURN Overlap(left, right.left) OR Overlap(left, right.right) - ELSE - WHILE right.class = Nmop DO right := right.left END; - IF right.class = Nderef THEN right := right.left END; - IF left.typ.BaseTyp # right.typ.BaseTyp THEN RETURN FALSE END; - LOOP - IF left.class = Nvarpar THEN - WHILE (right.class = Nindex) OR (right.class = Nfield) OR (right.class = Nguard) DO - right := right.left - END; - RETURN (right.class # Nvar) OR (right.obj.mnolev < left.obj.mnolev) - ELSIF right.class = Nvarpar THEN - WHILE (left.class = Nindex) OR (left.class = Nfield) OR (left.class = Nguard) DO left := left.left END; - RETURN (left.class # Nvar) OR (left.obj.mnolev < right.obj.mnolev) - ELSIF (left.class = Nvar) & (right.class = Nvar) THEN - RETURN left.obj = right.obj - ELSIF (left.class = Nderef) & (right.class = Nderef) THEN - RETURN TRUE - ELSIF (left.class = Nindex) & (right.class = Nindex) THEN - IF (left.right.class = Nconst) & (right.right.class = Nconst) - & (left.right.conval.intval # right.right.conval.intval) THEN RETURN FALSE END; - left := left.left; right := right.left - ELSIF (left.class = Nfield) & (right.class = Nfield) THEN - IF left.obj # right.obj THEN RETURN FALSE END; - left := left.left; right := right.left; - WHILE left.class = Nguard DO left := left.left END; - WHILE right.class = Nguard DO right := right.left END - ELSE - RETURN FALSE - END - END - END - END Overlap; - - PROCEDURE GetStaticLength (n: DevCPT.Node; OUT length: INTEGER); - VAR x: INTEGER; - BEGIN - IF n.class = Nconst THEN - length := n.conval.intval2 - 1 - ELSIF (n.class = Ndop) & (n.subcl = plus) THEN - GetStaticLength(n.left, length); GetStaticLength(n.right, x); - IF (length >= 0) & (x >= 0) THEN length := length + x ELSE length := -1 END - ELSE - WHILE (n.class = Nmop) & (n.subcl = conv) DO n := n.left END; - IF (n.class = Nderef) & (n.subcl = 1) THEN n := n.left END; - IF n.typ.comp = Array THEN - length := n.typ.n - 1 - ELSIF n.typ.comp = DynArr THEN - length := -1 - ELSE (* error case *) - length := 4 - END - END - END GetStaticLength; - - PROCEDURE GetMaxLength (n: DevCPT.Node; VAR stat, last: DevCPT.Node; OUT length: DevCPT.Node); - VAR x: DevCPT.Node; d: INTEGER; obj: DevCPT.Object; - BEGIN - IF n.class = Nconst THEN - length := NewIntConst(n.conval.intval2 - 1) - ELSIF (n.class = Ndop) & (n.subcl = plus) THEN - GetMaxLength(n.left, stat, last, length); GetMaxLength(n.right, stat, last, x); - IF (length.class = Nconst) & (x.class = Nconst) THEN ConstOp(plus, length, x) - ELSE BindNodes(Ndop, length.typ, length, x); length.subcl := plus - END - ELSE - WHILE (n.class = Nmop) & (n.subcl = conv) DO n := n.left END; - IF (n.class = Nderef) & (n.subcl = 1) THEN n := n.left END; - IF n.typ.comp = Array THEN - length := NewIntConst(n.typ.n - 1) - ELSIF n.typ.comp = DynArr THEN - d := 0; - WHILE n.class = Nindex DO n := n.left; INC(d) END; - ASSERT((n.class = Nderef) OR (n.class = Nvar) OR (n.class = Nvarpar)); - IF (n.class = Nderef) & (n.left.class # Nvar) & (n.left.class # Nvarpar) THEN - GetTempVar("@tmp", n.left.typ, obj); - x := NewLeaf(obj); Assign(x, n.left); Link(stat, last, x); - n.left := NewLeaf(obj); (* tree is manipulated here *) - n := NewLeaf(obj); DeRef(n) - END; - IF n.typ.untagged & (n.typ.comp = DynArr) & (n.typ.BaseTyp.form IN {Char8, Char16}) THEN - StrDeref(n); - BindNodes(Ndop, DevCPT.int32typ, n, NewIntConst(d)); n.subcl := len; - BindNodes(Ndop, DevCPT.int32typ, n, NewIntConst(1)); n.subcl := plus - ELSE - BindNodes(Ndop, DevCPT.int32typ, n, NewIntConst(d)); n.subcl := len; - END; - length := n - ELSE (* error case *) - length := NewIntConst(4) - END - END - END GetMaxLength; - - PROCEDURE CheckBuffering* ( - VAR n: DevCPT.Node; left: DevCPT.Node; par: DevCPT.Object; VAR stat, last: DevCPT.Node - ); - VAR length, x: DevCPT.Node; obj: DevCPT.Object; typ: DevCPT.Struct; len, xlen: INTEGER; - BEGIN - IF (n.typ.form IN {String8, String16}) & ~(DevCPM.java IN DevCPM.options) - & ((n.class = Ndop) & (n.subcl = plus) & ((left = NIL) OR Overlap(left, n.right)) - OR (n.class = Nmop) & (n.subcl = conv) & (left = NIL) - OR (par # NIL) & (par.vis = inPar) & (par.typ.comp = Array)) THEN - IF (par # NIL) & (par.typ.comp = Array) THEN - len := par.typ.n - 1 - ELSE - IF left # NIL THEN GetStaticLength(left, len) ELSE len := -1 END; - GetStaticLength(n, xlen); - IF (len = -1) OR (xlen # -1) & (xlen < len) THEN len := xlen END - END; - IF len # -1 THEN - typ := DevCPT.NewStr(Comp, Array); typ.n := len + 1; typ.BaseTyp := n.typ.BaseTyp; - GetTempVar("@str", typ, obj); - x := NewLeaf(obj); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj) - ELSE - IF left # NIL THEN GetMaxLength(left, stat, last, length) - ELSE GetMaxLength(n, stat, last, length) - END; - typ := DevCPT.NewStr(Pointer, Basic); - typ.BaseTyp := DevCPT.NewStr(Comp, DynArr); typ.BaseTyp.BaseTyp := n.typ.BaseTyp; - GetTempVar("@ptr", typ, obj); - x := NewLeaf(obj); Construct(Nassign, x, length); x.subcl := newfn; Link(stat, last, x); - x := NewLeaf(obj); DeRef(x); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj); DeRef(n) - END; - StrDeref(n) - ELSIF (n.typ.form = Pointer) & (n.typ.sysflag = interface) & (left = NIL) - & ((par # NIL) OR (n.class = Ncall)) - & ((n.class # Nvar) OR (n.obj.mnolev <= 0)) THEN - GetTempVar("@cip", DevCPT.punktyp, obj); - x := NewLeaf(obj); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj) - END - END CheckBuffering; - - PROCEDURE CheckVarParBuffering* (VAR n: DevCPT.Node; VAR stat, last: DevCPT.Node); - VAR x: DevCPT.Node; obj: DevCPT.Object; - BEGIN - IF (n.class # Nvar) OR (n.obj.mnolev <= 0) THEN - GetTempVar("@ptr", n.typ, obj); - x := NewLeaf(obj); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj) - END - END CheckVarParBuffering; - - - (* case optimization *) - - PROCEDURE Evaluate (n: DevCPT.Node; VAR min, max, num, dist: INTEGER; VAR head: DevCPT.Node); - VAR a: INTEGER; - BEGIN - IF n.left # NIL THEN - a := MIN(INTEGER); Evaluate(n.left, min, a, num, dist, head); - IF n.conval.intval - a > dist THEN dist := n.conval.intval - a; head := n END - ELSIF n.conval.intval < min THEN - min := n.conval.intval - END; - IF n.right # NIL THEN - a := MAX(INTEGER); Evaluate(n.right, a, max, num, dist, head); - IF a - n.conval.intval2 > dist THEN dist := a - n.conval.intval2; head := n END - ELSIF n.conval.intval2 > max THEN - max := n.conval.intval2 - END; - INC(num); - IF n.conval.intval < n.conval.intval2 THEN - INC(num); - IF n.conval.intval2 - n.conval.intval > dist THEN dist := n.conval.intval2 - n.conval.intval; head := n END - END - END Evaluate; - - PROCEDURE Rebuild (VAR root: DevCPT.Node; head: DevCPT.Node); - VAR n: DevCPT.Node; - BEGIN - IF root # head THEN - IF head.conval.intval2 < root.conval.intval THEN - Rebuild(root.left, head); - root.left := head.right; head.right := root; root := head - ELSE - Rebuild(root.right, head); - root.right := head.left; head.left := root; root := head - END - END - END Rebuild; - - PROCEDURE OptimizeCase* (VAR n: DevCPT.Node); - VAR min, max, num, dist, limit: INTEGER; head: DevCPT.Node; - BEGIN - IF n # NIL THEN - min := MAX(INTEGER); max := MIN(INTEGER); num := 0; dist := 0; head := n; - Evaluate(n, min, max, num, dist, head); - limit := 6 * num; - IF limit < 100 THEN limit := 100 END; - IF (num > 4) & ((min > MAX(INTEGER) - limit) OR (max < min + limit)) THEN - INCL(n.conval.setval, useTable) - ELSE - IF num > 4 THEN Rebuild(n, head) END; - INCL(n.conval.setval, useTree); - OptimizeCase(n.left); - OptimizeCase(n.right) - END - END - END OptimizeCase; -(* - PROCEDURE ShowTree (n: DevCPT.Node; opts: SET); - BEGIN - IF n # NIL THEN - IF opts = {} THEN opts := n.conval.setval END; - IF useTable IN opts THEN - IF n.left # NIL THEN ShowTree(n.left, opts); DevCPM.LogW(",") END; - DevCPM.LogWNum(n.conval.intval, 1); - IF n.conval.intval2 > n.conval.intval THEN DevCPM.LogW("-"); DevCPM.LogWNum(n.conval.intval2, 1) - END; - IF n.right # NIL THEN DevCPM.LogW(","); ShowTree(n.right, opts) END - ELSIF useTree IN opts THEN - DevCPM.LogW("("); ShowTree(n.left, {}); DevCPM.LogW("|"); DevCPM.LogWNum(n.conval.intval, 1); - IF n.conval.intval2 > n.conval.intval THEN DevCPM.LogW("-"); DevCPM.LogWNum(n.conval.intval2, 1) - END; - DevCPM.LogW("|"); ShowTree(n.right, {}); DevCPM.LogW(")") - ELSE - ShowTree(n.left, opts); DevCPM.LogW(" "); DevCPM.LogWNum(n.conval.intval, 1); - IF n.conval.intval2 > n.conval.intval THEN DevCPM.LogW("-"); DevCPM.LogWNum(n.conval.intval2, 1) - END; - DevCPM.LogW(" "); ShowTree(n.right, opts) - END - END - END ShowTree; -*) -BEGIN - zero := DevCPT.NewConst(); zero.intval := 0; zero.realval := 0; - one := DevCPT.NewConst(); one.intval := 1; one.realval := 0; - two := DevCPT.NewConst(); two.intval := 2; two.realval := 0; - dummy := DevCPT.NewConst(); - quot := DevCPT.NewConst() -END DevCPB. diff --git a/new/Dev/Mod/CPC486.odc b/new/Dev/Mod/CPC486.odc new file mode 100644 index 0000000000000000000000000000000000000000..39ba9a51661728d82fb95f8600ecc84d0586834f GIT binary patch literal 85114 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 ZFaCJp*ZUy`(mMZ`L`Dq{$HPxHQ@jN literal 0 HcmV?d00001 diff --git a/new/Dev/Mod/CPC486.txt b/new/Dev/Mod/CPC486.txt deleted file mode 100644 index 1a952d9..0000000 --- a/new/Dev/Mod/CPC486.txt +++ /dev/null @@ -1,2333 +0,0 @@ -MODULE DevCPC486; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/CPC486.odc *) - (* DO NOT EDIT *) - - IMPORT SYSTEM, DevCPM, DevCPT, DevCPE, DevCPL486; - - CONST - initializeAll = FALSE; (* initialize all local variable to zero *) - initializeOut = FALSE; (* initialize all OUT parameters to zero *) - initializeDyn = FALSE; (* initialize all open array OUT parameters to zero *) - initializeStr = FALSE; (* initialize rest of string value parameters to zero *) - - FpuControlRegister = 33EH; (* value for fpu control register initialization *) - - (* structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - Char16 = 16; String16 = 17; Int64 = 18; Guid = 23; - VString16to8 = 29; VString8 = 30; VString16 = 31; - intSet = {Int8..Int32, Int64}; realSet = {Real32, Real64}; - - (* composite structure forms *) - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - (* item base modes (=object modes) *) - Var = 1; VarPar = 2; Con = 3; Fld = 4; Typ = 5; LProc = 6; XProc = 7; CProc = 9; IProc = 10; TProc = 13; - - (* item modes for i386 *) - Ind = 14; Abs = 15; Stk = 16; Cond = 17; Reg = 18; DInd = 19; - - (* symbol values and ops *) - times = 1; slash = 2; div = 3; mod = 4; - and = 5; plus = 6; minus = 7; or = 8; eql = 9; - neq = 10; lss = 11; leq = 12; gtr = 13; geq = 14; - in = 15; is = 16; ash = 17; msk = 18; len = 19; - conv = 20; abs = 21; cap = 22; odd = 23; not = 33; - adr = 24; cc = 25; bit = 26; lsh = 27; rot = 28; val = 29; - getrfn = 26; putrfn = 27; - min = 34; max = 35; typ = 36; - - (* procedure flags (conval.setval) *) - hasBody = 1; isRedef = 2; slNeeded = 3; imVar = 4; isGuarded = 30; isCallback = 31; - - (* attribute flags (attr.adr, struct.attribute, proc.conval.setval) *) - newAttr = 16; absAttr = 17; limAttr = 18; empAttr = 19; extAttr = 20; - - false = 0; true = 1; nil = 0; - - (* registers *) - AX = 0; CX = 1; DX = 2; BX = 3; SP = 4; BP = 5; SI = 6; DI = 7; AH = 4; CH = 5; DH = 6; BH = 7; - stk = 31; mem = 30; con = 29; float = 28; high = 27; short = 26; deref = 25; wreg = {AX, BX, CX, DX, SI, DI}; - - (* GenShiftOp *) - ROL = 0; ROR = 8H; SHL = 20H; SHR = 28H; SAR = 38H; - - (* GenBitOp *) - BT = 20H; BTS = 28H; BTR = 30H; - - (* GenFDOp *) - FADD = 0; FMUL = 8H; FCOM = 10H; FCOMP = 18H; FSUB = 20H; FSUBR = 28H; FDIV = 30H; FDIVR = 38H; - - (* GenFMOp *) - FABS = 1E1H; FCHS = 1E0H; FTST = 1E4H; FSTSW = 7E0H; FUCOM = 2E9H; - - (* GenCode *) - SAHF = 9EH; WAIT = 9BH; - - (* condition codes *) - ccB = 2; ccAE = 3; ccBE = 6; ccA = 7; (* unsigned *) - ccL = 12; ccGE = 13; ccLE = 14; ccG = 15; (* signed *) - ccE = 4; ccNE = 5; ccS = 8; ccNS = 9; ccO = 0; ccNO = 1; - ccAlways = -1; ccNever = -2; ccCall = -3; - - (* sysflag *) - untagged = 1; callback = 2; noAlign = 3; union = 7; - interface = 10; ccall = -10; guarded = 10; noframe = 16; - nilBit = 1; enumBits = 8; new = 1; iid = 2; - stackArray = 120; - - (* system trap numbers *) - withTrap = -1; caseTrap = -2; funcTrap = -3; typTrap = -4; - recTrap = -5; ranTrap = -6; inxTrap = -7; copyTrap = -8; - - (* module visibility of objects *) - internal = 0; external = 1; externalR = 2; inPar = 3; outPar = 4; - - (* pointer init limits *) - MaxPtrs = 10; MaxPush = 4; - - Tag0Offset = 12; - Mth0Offset = -4; - ArrDOffs = 8; - numPreIntProc = 2; - - stackAllocLimit = 2048; - - - VAR - imLevel*: ARRAY 64 OF BYTE; - intHandler*: DevCPT.Object; - inxchk, ovflchk, ranchk, typchk, ptrinit, hints: BOOLEAN; - WReg, BReg, AllReg: SET; FReg: INTEGER; - ptrTab: ARRAY MaxPtrs OF INTEGER; - stkAllocLbl: DevCPL486.Label; - procedureUsesFpu: BOOLEAN; - - - PROCEDURE Init* (opt: SET); - CONST chk = 0; achk = 1; hint = 29; - BEGIN - inxchk := chk IN opt; ovflchk := achk IN opt; ranchk := achk IN opt; typchk := chk IN opt; ptrinit := chk IN opt; - hints := hint IN opt; - stkAllocLbl := DevCPL486.NewLbl - END Init; - - PROCEDURE Reversed (cond: BYTE): BYTE; (* reversed condition *) - BEGIN - IF cond = lss THEN RETURN gtr - ELSIF cond = gtr THEN RETURN lss - ELSIF cond = leq THEN RETURN geq - ELSIF cond = geq THEN RETURN leq - ELSE RETURN cond - END - END Reversed; - - PROCEDURE Inverted (cc: INTEGER): INTEGER; (* inverted sense of condition code *) - BEGIN - IF ODD(cc) THEN RETURN cc-1 ELSE RETURN cc+1 END - END Inverted; - - PROCEDURE setCC* (VAR x: DevCPL486.Item; rel: BYTE; reversed, signed: BOOLEAN); - BEGIN - IF reversed THEN rel := Reversed(rel) END; - CASE rel OF - false: x.offset := ccNever - | true: x.offset := ccAlways - | eql: x.offset := ccE - | neq: x.offset := ccNE - | lss: IF signed THEN x.offset := ccL ELSE x.offset := ccB END - | leq: IF signed THEN x.offset := ccLE ELSE x.offset := ccBE END - | gtr: IF signed THEN x.offset := ccG ELSE x.offset := ccA END - | geq: IF signed THEN x.offset := ccGE ELSE x.offset := ccAE END - END; - x.mode := Cond; x.form := Bool; x.reg := 0; - IF reversed THEN x.reg := 1 END; - IF signed THEN INC(x.reg, 2) END - END setCC; - - PROCEDURE StackAlloc*; (* pre: len = CX bytes; post: len = CX words *) - BEGIN - DevCPL486.GenJump(ccCall, stkAllocLbl, FALSE) - END StackAlloc; - - PROCEDURE^ CheckAv* (reg: INTEGER); - - PROCEDURE AdjustStack (val: INTEGER); - VAR c, sp: DevCPL486.Item; - BEGIN - IF val < -stackAllocLimit THEN - CheckAv(CX); - DevCPL486.MakeConst(c, -val, Int32); DevCPL486.MakeReg(sp, CX, Int32); DevCPL486.GenMove(c, sp); - StackAlloc - ELSIF val # 0 THEN - DevCPL486.MakeConst(c, val, Int32); DevCPL486.MakeReg(sp, SP, Int32); DevCPL486.GenAdd(c, sp, FALSE) - END - END AdjustStack; - - PROCEDURE DecStack (form: INTEGER); - BEGIN - IF form IN {Real64, Int64} THEN AdjustStack(-8) ELSE AdjustStack(-4) END - END DecStack; - - PROCEDURE IncStack (form: INTEGER); - BEGIN - IF form IN {Real64, Int64} THEN AdjustStack(8) ELSE AdjustStack(4) END - END IncStack; - - (*-----------------register handling------------------*) - - PROCEDURE SetReg* (reg: SET); - BEGIN - AllReg := reg; WReg := reg; BReg := reg * {0..3} + SYSTEM.LSH(reg * {0..3}, 4); FReg := 8 - END SetReg; - - PROCEDURE CheckReg*; - VAR reg: SET; - BEGIN - reg := AllReg - WReg; - IF reg # {} THEN - DevCPM.err(-777); (* register not released *) - IF AX IN reg THEN DevCPM.LogWStr(" AX") END; - IF BX IN reg THEN DevCPM.LogWStr(" BX") END; - IF CX IN reg THEN DevCPM.LogWStr(" CX") END; - IF DX IN reg THEN DevCPM.LogWStr(" DX") END; - IF SI IN reg THEN DevCPM.LogWStr(" SI") END; - IF DI IN reg THEN DevCPM.LogWStr(" DI") END; - WReg := AllReg; BReg := AllReg * {0..3} + SYSTEM.LSH(AllReg * {0..3}, 4) - END; - IF FReg < 8 THEN DevCPM.err(-778); FReg := 8 (* float register not released *) - ELSIF FReg > 8 THEN DevCPM.err(-779); FReg := 8 - END - END CheckReg; - - PROCEDURE CheckAv* (reg: INTEGER); - BEGIN - ASSERT(reg IN WReg) - END CheckAv; - - PROCEDURE GetReg (VAR x: DevCPL486.Item; f: BYTE; hint, stop: SET); - VAR n: INTEGER; s, s1: SET; - BEGIN - CASE f OF - | Byte, Bool, Char8, Int8: - s := BReg * {0..3} - stop; - IF (high IN stop) OR (high IN hint) & (s - hint # {}) THEN n := 0; - IF s = {} THEN DevCPM.err(215); WReg := wreg; BReg := {0..7}; s := {0..7} END; - IF s - hint # {} THEN s := s - hint END; - WHILE ~(n IN s) DO INC(n) END - ELSE - s := BReg - (stop * {0..3}) - SYSTEM.LSH(stop * {0..3}, 4); n := 0; - IF s = {} THEN DevCPM.err(215); WReg := wreg; BReg := {0..7}; s := {0..7} END; - s1 := s - (hint * {0..3}) - SYSTEM.LSH(hint * {0..3}, 4); - IF s1 # {} THEN s := s1 END; - WHILE ~(n IN s) & ~(n + 4 IN s) DO INC(n) END; - IF ~(n IN s) THEN n := n + 4 END - END; - EXCL(BReg, n); EXCL(WReg, n MOD 4) - | Int16, Int32, Set, String8, NilTyp, Pointer, ProcTyp, Comp, Char16, String16: - s := WReg - stop; - IF high IN stop THEN s := s * {0..3} END; - IF s = {} THEN DevCPM.err(215); WReg := wreg; BReg := {0..7}; s := wreg END; - s1 := s - hint; - IF high IN hint THEN s1 := s1 * {0..3} END; - IF s1 # {} THEN s := s1 END; - IF 0 IN s THEN n := 0 - ELSIF 2 IN s THEN n := 2 - ELSIF 6 IN s THEN n := 6 - ELSIF 7 IN s THEN n := 7 - ELSIF 1 IN s THEN n := 1 - ELSE n := 3 - END; - EXCL(WReg, n); - IF n < 4 THEN EXCL(BReg, n); EXCL(BReg, n + 4) END - | Real32, Real64: - IF (FReg = 0) OR (float IN stop) THEN DevCPM.err(216); FReg := 99 END; - DEC(FReg); n := 0 - END; - DevCPL486.MakeReg(x, n, f); - END GetReg; - - PROCEDURE FreeReg (n, f: INTEGER); - BEGIN - IF f <= Int8 THEN - INCL(BReg, n); - IF (n + 4) MOD 8 IN BReg THEN INCL(WReg, n MOD 4) END - ELSIF f IN realSet THEN - INC(FReg) - ELSIF n IN AllReg THEN - INCL(WReg, n); - IF n < 4 THEN INCL(BReg, n); INCL(BReg, n + 4) END - END - END FreeReg; - - PROCEDURE FreeWReg (n: INTEGER); - BEGIN - IF n IN AllReg THEN - INCL(WReg, n); - IF n < 4 THEN INCL(BReg, n); INCL(BReg, n + 4) END - END - END FreeWReg; - - PROCEDURE Free* (VAR x: DevCPL486.Item); - BEGIN - CASE x.mode OF - | Var, VarPar, Abs: IF x.scale # 0 THEN FreeWReg(x.index) END - | Ind: FreeWReg(x.reg); - IF x.scale # 0 THEN FreeWReg(x.index) END - | Reg: FreeReg(x.reg, x.form); - IF x.form = Int64 THEN FreeWReg(x.index) END - ELSE - END - END Free; - - PROCEDURE FreeHi (VAR x: DevCPL486.Item); (* free hi byte of word reg *) - BEGIN - IF x.mode = Reg THEN - IF x.form = Int64 THEN FreeWReg(x.index) - ELSIF x.reg < 4 THEN INCL(BReg, x.reg + 4) - END - END - END FreeHi; - - PROCEDURE Fits* (VAR x: DevCPL486.Item; stop: SET): BOOLEAN; (* x.mode = Reg *) - BEGIN - IF (short IN stop) & (x.form <= Int8) THEN RETURN FALSE END; - IF x.form <= Int8 THEN RETURN ~(x.reg MOD 4 IN stop) & ((x.reg < 4) OR ~(high IN stop)) - ELSIF x.form IN realSet THEN RETURN ~(float IN stop) - ELSIF x.form = Int64 THEN RETURN ~(x.reg IN stop) & ~(x.index IN stop) - ELSE RETURN ~(x.reg IN stop) & ((x.reg < 4) OR ~(high IN stop)) - END - END Fits; - - PROCEDURE Pop* (VAR r: DevCPL486.Item; f: BYTE; hint, stop: SET); - VAR rh: DevCPL486.Item; - BEGIN - IF f = Int64 THEN - GetReg(r, Int32, hint, stop); DevCPL486.GenPop(r); - GetReg(rh, Int32, hint, stop); DevCPL486.GenPop(rh); - r.form := Int64; r.index := rh.reg - ELSE - IF f < Int16 THEN INCL(stop, high) END; - GetReg(r, f, hint, stop); DevCPL486.GenPop(r) - END - END Pop; - - PROCEDURE^ LoadLong (VAR x: DevCPL486.Item; hint, stop: SET); - - PROCEDURE Load* (VAR x: DevCPL486.Item; hint, stop: SET); (* = Assert(x, hint, stop + {mem, stk}) *) - VAR r: DevCPL486.Item; f: BYTE; - BEGIN - f := x.typ.form; - IF x.mode = Con THEN - IF (short IN stop) & (x.form IN {Int8, Int16, Bool, Char8, Char16}) THEN f := Int32; x.form := Int32 END; - IF con IN stop THEN - IF f = Int64 THEN LoadLong(x, hint, stop) - ELSE - GetReg(r, f, hint, stop); DevCPL486.GenMove(x, r); - x.mode := Reg; x.reg := r.reg; x.form := f - END - END - ELSIF x.mode = Stk THEN - IF f IN realSet THEN - GetReg(r, f, hint, stop); DevCPL486.GenFLoad(x); IncStack(x.form) - ELSE - Pop(r, f, hint, stop) - END; - x.mode := Reg; x.reg := r.reg; x.index := r.index; x.form := f - ELSIF (short IN stop) & (x.form IN {Int8, Int16, Bool, Char8, Char16}) THEN - Free(x); GetReg(r, Int32, hint, stop); DevCPL486.GenExtMove(x, r); - x.mode := Reg; x.reg := r.reg; x.form := Int32 - ELSIF (x.mode # Reg) OR ~Fits(x, stop) THEN - IF f = Int64 THEN LoadLong(x, hint, stop) - ELSE - Free(x); GetReg(r, f, hint, stop); - IF f IN realSet THEN DevCPL486.GenFLoad(x) ELSE DevCPL486.GenMove(x, r) END; - x.mode := Reg; x.reg := r.reg; x.form := f - END - END - END Load; - - PROCEDURE Push* (VAR x: DevCPL486.Item); - VAR y: DevCPL486.Item; - BEGIN - IF x.form IN realSet THEN - Load(x, {}, {}); DecStack(x.form); - Free(x); x.mode := Stk; - IF x.typ = DevCPT.intrealtyp THEN x.form := Int64 END; - DevCPL486.GenFStore(x, TRUE) - ELSIF x.form = Int64 THEN - Free(x); x.form := Int32; y := x; - IF x.mode = Reg THEN y.reg := x.index ELSE INC(y.offset, 4) END; - DevCPL486.GenPush(y); DevCPL486.GenPush(x); - x.mode := Stk; x.form := Int64 - ELSE - IF x.form < Int16 THEN Load(x, {}, {high}) - ELSIF x.form = Int16 THEN Load(x, {}, {}) - END; - Free(x); DevCPL486.GenPush(x); x.mode := Stk - END - END Push; - - PROCEDURE Assert* (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF (short IN stop) & (x.form IN {Int8, Int16, Bool, Char8, Char16}) & (x.mode # Con) THEN - IF (wreg - stop = {}) & ~(stk IN stop) THEN Load(x, {}, {short}); Push(x) - ELSE Load(x, hint, stop); - END - ELSE - CASE x.mode OF - | Var, VarPar: IF ~(mem IN stop) THEN RETURN END - | Con: IF ~(con IN stop) THEN RETURN END - | Ind: IF ~(mem IN stop) & ~(x.reg IN stop) & ((x.scale = 0) OR ~(x.index IN stop)) THEN RETURN END - | Abs: IF ~(mem IN stop) & ((x.scale = 0) OR ~(x.index IN stop)) THEN RETURN END - | Stk: IF ~(stk IN stop) THEN RETURN END - | Reg: IF Fits(x, stop) THEN RETURN END - ELSE RETURN - END; - IF ((float IN stop) OR ~(x.typ.form IN realSet) & (wreg - stop = {})) & ~(stk IN stop) THEN Push(x) - ELSE Load(x, hint, stop) - END - END - END Assert; - - (*------------------------------------------------*) - - PROCEDURE LoadR (VAR x: DevCPL486.Item); - BEGIN - IF x.mode # Reg THEN - Free(x); DevCPL486.GenFLoad(x); - IF x.mode = Stk THEN IncStack(x.form) END; - GetReg(x, Real32, {}, {}) - END - END LoadR; - - PROCEDURE PushR (VAR x: DevCPL486.Item); - BEGIN - IF x.mode # Reg THEN LoadR(x) END; - DecStack(x.form); - Free(x); x.mode := Stk; DevCPL486.GenFStore(x, TRUE) - END PushR; - - PROCEDURE LoadW (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF x.mode = Stk THEN - Pop(x, x.form, hint, stop) - ELSE - Free(x); GetReg(r, x.form, hint, stop); - DevCPL486.GenMove(x, r); - x.mode := Reg; x.reg := r.reg - END - END LoadW; - - PROCEDURE LoadL (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF x.mode = Stk THEN - Pop(x, x.form, hint, stop); - IF (x.form < Int32) OR (x.form = Char16) THEN - r := x; x.form := Int32; DevCPL486.GenExtMove(r, x) - END - ELSE - Free(x); - IF (x.form < Int32) OR (x.form = Char16) THEN GetReg(r, Int32, hint, stop) ELSE GetReg(r, x.form, hint, stop) END; - IF x.mode = Con THEN x.form := r.form END; - IF x.form # r.form THEN DevCPL486.GenExtMove(x, r) ELSE DevCPL486.GenMove(x, r) END; - x.mode := Reg; x.reg := r.reg; x.form := r.form - END - END LoadL; - - PROCEDURE LoadLong (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r, rh, c: DevCPL486.Item; offs: INTEGER; - BEGIN - IF x.form = Int64 THEN - IF x.mode = Stk THEN - Pop(x, x.form, hint, stop) - ELSIF x.mode = Reg THEN - FreeReg(x.reg, Int32); GetReg(r, Int32, hint, stop); - FreeReg(x.index, Int32); GetReg(rh, Int32, hint, stop); - x.form := Int32; DevCPL486.GenMove(x, r); - x.reg := x.index; DevCPL486.GenMove(x, rh); - x.reg := r.reg; x.index := rh.reg - ELSE - GetReg(rh, Int32, hint, stop + {AX}); - Free(x); - GetReg(r, Int32, hint, stop); - x.form := Int32; offs := x.offset; - IF x.mode = Con THEN x.offset := x.scale ELSE INC(x.offset, 4) END; - DevCPL486.GenMove(x, rh); - x.offset := offs; - DevCPL486.GenMove(x, r); - x.mode := Reg; x.reg := r.reg; x.index := rh.reg - END - ELSE - LoadL(x, hint, stop); GetReg(rh, Int32, hint, stop); DevCPL486.GenSignExt(x, rh); - x.index := rh.reg - END; - x.form := Int64 - END LoadLong; - - (*------------------------------------------------*) - - PROCEDURE CopyReg* (VAR x, y: DevCPL486.Item; hint, stop: SET); - BEGIN - ASSERT(x.mode = Reg); - GetReg(y, x.form, hint, stop); - DevCPL486.GenMove(x, y) - END CopyReg; - - PROCEDURE GetAdr* (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF x.mode = DInd THEN - x.mode := Ind - ELSIF (x.mode = Ind) & (x.offset = 0) & (x.scale = 0) & (x.reg IN wreg) THEN - x.mode := Reg - ELSE - Free(x); GetReg(r, Pointer, hint, stop); - IF x.mode = Con THEN DevCPL486.GenMove(x, r) ELSE DevCPL486.GenLoadAdr(x, r) END; - x.mode := Reg; x.reg := r.reg; x.form := Pointer - END; - x.form := Pointer; x.typ := DevCPT.anyptrtyp; - Assert(x, hint, stop) - END GetAdr; - - PROCEDURE PushAdr (VAR x: DevCPL486.Item; niltest: BOOLEAN); - VAR r, v: DevCPL486.Item; - BEGIN - IF (x.mode = Abs) & (x.scale = 0) THEN x.mode := Con; x.form := Pointer - ELSIF niltest THEN - GetAdr(x, {}, {mem, stk}); - DevCPL486.MakeReg(r, AX, Int32); - v.mode := Ind; v.form := Int32; v.offset := 0; v.scale := 0; v.reg := x.reg; - DevCPL486.GenTest(r, v) - ELSIF x.mode = DInd THEN x.mode := Ind; x.form := Pointer - ELSE GetAdr(x, {}, {}) - END; - Free(x); DevCPL486.GenPush(x) - END PushAdr; - - PROCEDURE LevelBase (VAR a: DevCPL486.Item; lev: INTEGER; hint, stop: SET); - VAR n: BYTE; - BEGIN - a.mode := Ind; a.scale := 0; a.form := Int32; a.typ := DevCPT.int32typ; - IF lev = DevCPL486.level THEN a.reg := BP - ELSE - a.reg := BX; n := SHORT(SHORT(imLevel[DevCPL486.level] - imLevel[lev])); - WHILE n > 0 DO - a.offset := -4; LoadL(a, hint, stop); a.mode := Ind; DEC(n) - END - END - END LevelBase; - - PROCEDURE LenDesc (VAR x, len: DevCPL486.Item; typ: DevCPT.Struct); (* set len to LEN(x, -typ.n) *) - BEGIN - IF x.tmode = VarPar THEN - LevelBase(len, x.obj.mnolev, {}, {}); len.offset := x.obj.adr; - ELSE ASSERT((x.tmode = Ind) & (x.mode = Ind)); - len := x; len.offset := ArrDOffs; len.scale := 0; len.form := Int32 - END; - INC(len.offset, typ.n * 4 + 4); - IF typ.sysflag = stackArray THEN len.offset := -4 END - END LenDesc; - - PROCEDURE Tag* (VAR x, tag: DevCPL486.Item); - VAR typ: DevCPT.Struct; - BEGIN - typ := x.typ; - IF typ.form = Pointer THEN typ := typ.BaseTyp END; - IF (x.typ # DevCPT.sysptrtyp) & (typ.attribute = 0) & ~(DevCPM.oberon IN DevCPM.options) THEN (* final type *) - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(typ) - ELSIF x.typ.form = Pointer THEN - ASSERT(x.mode = Reg); - tag.mode := Ind; tag.reg := x.reg; tag.offset := -4; - IF x.typ.sysflag = interface THEN tag.offset := 0 END - ELSIF x.tmode = VarPar THEN - LevelBase(tag, x.obj.mnolev, {}, {}); tag.offset := x.obj.adr + 4; - Free(tag) (* ??? *) - ELSIF x.tmode = Ind THEN - ASSERT(x.mode = Ind); - tag := x; tag.offset := -4 - ELSE - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(x.typ) - END; - tag.scale := 0; tag.form := Pointer; tag.typ := DevCPT.sysptrtyp - END Tag; - - PROCEDURE NumOfIntProc (typ: DevCPT.Struct): INTEGER; - BEGIN - WHILE (typ # NIL) & (typ.sysflag # interface) DO typ := typ.BaseTyp END; - IF typ # NIL THEN RETURN typ.n - ELSE RETURN 0 - END - END NumOfIntProc; - - PROCEDURE ContainsIPtrs* (typ: DevCPT.Struct): BOOLEAN; - VAR fld: DevCPT.Object; - BEGIN - WHILE typ.comp IN {DynArr, Array} DO typ := typ.BaseTyp END; - IF (typ.form = Pointer) & (typ.sysflag = interface) THEN RETURN TRUE - ELSIF (typ.comp = Record) & (typ.sysflag # union) THEN - REPEAT - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF (fld.sysflag = interface) & (fld.name^ = DevCPM.HdUtPtrName) - OR ContainsIPtrs(fld.typ) THEN RETURN TRUE END; - fld := fld.link - END; - typ := typ.BaseTyp - UNTIL typ = NIL - END; - RETURN FALSE - END ContainsIPtrs; - - PROCEDURE GuidFromString* (str: DevCPT.ConstExt; VAR x: DevCPL486.Item); - VAR cv: DevCPT.Const; - BEGIN - IF ~DevCPM.ValidGuid(str^) THEN DevCPM.err(165) END; - cv := DevCPT.NewConst(); - cv.intval := DevCPM.ConstNotAlloc; cv.intval2 := 16; cv.ext := str; - DevCPL486.AllocConst(x, cv, Guid); x.typ := DevCPT.guidtyp - END GuidFromString; - - PROCEDURE IPAddRef* (VAR x: DevCPL486.Item; offset: INTEGER; nilTest: BOOLEAN); - VAR r, p, c: DevCPL486.Item; lbl: DevCPL486.Label; - BEGIN - ASSERT(x.mode IN {Reg, Ind, Abs}); - ASSERT({AX, CX, DX} - WReg = {}); - IF hints THEN - IF nilTest THEN DevCPM.err(-701) ELSE DevCPM.err(-700) END - END; - IF x.mode # Reg THEN - GetReg(r, Pointer, {}, {}); - p := x; INC(p.offset, offset); p.form := Pointer; DevCPL486.GenMove(p, r); - ELSE r := x - END; - IF nilTest THEN - DevCPL486.MakeConst(c, 0, Pointer); DevCPL486.GenComp(c, r); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE) - END; - DevCPL486.GenPush(r); p := r; - IF x.mode # Reg THEN Free(r) END; - GetReg(r, Pointer, {}, {}); - p.mode := Ind; p.offset := 0; p.scale := 0; p.form := Pointer; DevCPL486.GenMove(p, r); - p.offset := 4; p.reg := r.reg; Free(r); DevCPL486.GenCall(p); - IF nilTest THEN DevCPL486.SetLabel(lbl) END; - END IPAddRef; - - PROCEDURE IPRelease* (VAR x: DevCPL486.Item; offset: INTEGER; nilTest, nilSet: BOOLEAN); - VAR r, p, c: DevCPL486.Item; lbl: DevCPL486.Label; - BEGIN - ASSERT(x.mode IN {Ind, Abs}); - ASSERT({AX, CX, DX} - WReg = {}); - IF hints THEN - IF nilTest THEN DevCPM.err(-703) ELSE DevCPM.err(-702) END - END; - GetReg(r, Pointer, {}, {}); - p := x; INC(p.offset, offset); p.form := Pointer; DevCPL486.GenMove(p, r); - DevCPL486.MakeConst(c, 0, Pointer); - IF nilTest THEN - DevCPL486.GenComp(c, r); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE) - END; - IF nilSet THEN DevCPL486.GenMove(c, p) END; - DevCPL486.GenPush(r); - p.mode := Ind; p.reg := r.reg; p.offset := 0; p.scale := 0; DevCPL486.GenMove(p, r); - p.offset := 8; Free(r); DevCPL486.GenCall(p); - IF nilTest THEN DevCPL486.SetLabel(lbl) END; - END IPRelease; - - PROCEDURE Prepare* (VAR x: DevCPL486.Item; hint, stop: SET); - VAR n, i, lev: INTEGER; len, y: DevCPL486.Item; typ: DevCPT.Struct; - BEGIN - IF (x.mode IN {Var, VarPar, Ind, Abs}) & (x.scale # 0) THEN - DevCPL486.MakeReg(y, x.index, Int32); typ := x.typ; - WHILE typ.comp = DynArr DO (* complete dynamic array iterations *) - LenDesc(x, len, typ); DevCPL486.GenMul(len, y, FALSE); typ := typ.BaseTyp; - IF x.tmode = VarPar THEN Free(len) END; (* ??? *) - END; - n := x.scale; i := 0; - WHILE (n MOD 2 = 0) & (i < 3) DO n := n DIV 2; INC(i) END; - IF n > 1 THEN (* assure scale factor in {1, 2, 4, 8} *) - DevCPL486.MakeConst(len, n, Int32); DevCPL486.GenMul(len, y, FALSE); x.scale := x.scale DIV n - END - END; - CASE x.mode OF - Var, VarPar: - lev := x.obj.mnolev; - IF lev <= 0 THEN - x.mode := Abs - ELSE - LevelBase(y, lev, hint, stop); - IF x.mode # VarPar THEN - x.mode := Ind - ELSIF (deref IN hint) & (x.offset = 0) & (x.scale = 0) THEN - x.mode := DInd; x.offset := x.obj.adr - ELSE - y.offset := x.obj.adr; Load(y, hint, stop); x.mode := Ind - END; - x.reg := y.reg - END; - x.form := x.typ.form - | LProc, XProc, IProc: - x.mode := Con; x.offset := 0; x.form := ProcTyp - | TProc, CProc: - x.form := ProcTyp - | Ind, Abs, Stk, Reg: - IF ~(x.typ.form IN {String8, String16}) THEN x.form := x.typ.form END - END - END Prepare; - - PROCEDURE Field* (VAR x: DevCPL486.Item; field: DevCPT.Object); - BEGIN - INC(x.offset, field.adr); x.tmode := Con - END Field; - - PROCEDURE DeRef* (VAR x: DevCPL486.Item); - VAR btyp: DevCPT.Struct; - BEGIN - x.mode := Ind; x.tmode := Ind; x.scale := 0; - btyp := x.typ.BaseTyp; - IF btyp.untagged OR (btyp.sysflag = stackArray) THEN x.offset := 0 - ELSIF btyp.comp = DynArr THEN x.offset := ArrDOffs + btyp.size - ELSIF btyp.comp = Array THEN x.offset := ArrDOffs + 4 - ELSE x.offset := 0 - END - END DeRef; - - PROCEDURE Index* (VAR x, y: DevCPL486.Item; hint, stop: SET); (* x[y] *) - VAR idx, len: DevCPL486.Item; btyp: DevCPT.Struct; elsize: INTEGER; - BEGIN - btyp := x.typ.BaseTyp; elsize := btyp.size; - IF elsize = 0 THEN Free(y) - ELSIF x.typ.comp = Array THEN - len.mode := Con; len.obj := NIL; - IF y.mode = Con THEN - INC(x.offset, y.offset * elsize) - ELSE - Load(y, hint, stop + {mem, stk, short}); - IF inxchk THEN - DevCPL486.MakeConst(len, x.typ.n, Int32); - DevCPL486.GenComp(len, y); DevCPL486.GenAssert(ccB, inxTrap) - END; - IF x.scale = 0 THEN x.index := y.reg - ELSE - IF x.scale MOD elsize # 0 THEN - IF (x.scale MOD 4 = 0) & (elsize MOD 4 = 0) THEN elsize := 4 - ELSIF (x.scale MOD 2 = 0) & (elsize MOD 2 = 0) THEN elsize := 2 - ELSE elsize := 1 - END; - DevCPL486.MakeConst(len, btyp.size DIV elsize, Int32); - DevCPL486.GenMul(len, y, FALSE) - END; - DevCPL486.MakeConst(len, x.scale DIV elsize, Int32); - DevCPL486.MakeReg(idx, x.index, Int32); - DevCPL486.GenMul(len, idx, FALSE); DevCPL486.GenAdd(y, idx, FALSE); Free(y) - END; - x.scale := elsize - END; - x.tmode := Con - ELSE (* x.typ.comp = DynArr *) - IF (btyp.comp = DynArr) & x.typ.untagged THEN DevCPM.err(137) END; - LenDesc(x, len, x.typ); - IF x.scale # 0 THEN - DevCPL486.MakeReg(idx, x.index, Int32); - DevCPL486.GenMul(len, idx, FALSE) - END; - IF (y.mode # Con) OR (y.offset # 0) THEN - IF (y.mode # Con) OR (btyp.comp = DynArr) & (x.scale = 0) THEN - Load(y, hint, stop + {mem, stk, con, short}) - ELSE y.form := Int32 - END; - IF inxchk & ~x.typ.untagged THEN - DevCPL486.GenComp(y, len); DevCPL486.GenAssert(ccA, inxTrap) - END; - IF (y.mode = Con) & (btyp.comp # DynArr) THEN - INC(x.offset, y.offset * elsize) - ELSIF x.scale = 0 THEN - WHILE btyp.comp = DynArr DO btyp := btyp.BaseTyp END; - x.index := y.reg; x.scale := btyp.size - ELSE - DevCPL486.GenAdd(y, idx, FALSE); Free(y) - END - END; - IF x.tmode = VarPar THEN Free(len) END; (* ??? *) - IF x.typ.BaseTyp.comp # DynArr THEN x.tmode := Con END - END - END Index; - - PROCEDURE TypTest* (VAR x: DevCPL486.Item; testtyp: DevCPT.Struct; guard, equal: BOOLEAN); - VAR tag, tdes, r: DevCPL486.Item; typ: DevCPT.Struct; - BEGIN - typ := x.typ; - IF typ.form = Pointer THEN testtyp := testtyp.BaseTyp; typ := typ.BaseTyp END; - IF ~guard & typ.untagged THEN DevCPM.err(139) - ELSIF ~guard OR typchk & ~typ.untagged THEN - IF testtyp.untagged THEN DevCPM.err(139) - ELSE - IF (x.typ.form = Pointer) & (x.mode # Reg) THEN - GetReg(r, Pointer, {}, {}); DevCPL486.GenMove(x, r); Free(r); r.typ := x.typ; Tag(r, tag) - ELSE Tag(x, tag) - END; - IF ~guard THEN Free(x) END; - IF ~equal THEN - GetReg(r, Pointer, {}, {}); DevCPL486.GenMove(tag, r); Free(r); - tag.mode := Ind; tag.reg := r.reg; tag.scale := 0; tag.offset := Tag0Offset + 4 * testtyp.extlev - END; - DevCPL486.MakeConst(tdes, 0, Pointer); tdes.obj := DevCPE.TypeObj(testtyp); - DevCPL486.GenComp(tdes, tag); - IF guard THEN - IF equal THEN DevCPL486.GenAssert(ccE, recTrap) ELSE DevCPL486.GenAssert(ccE, typTrap) END - ELSE setCC(x, eql, FALSE, FALSE) - END - END - END - END TypTest; - - PROCEDURE ShortTypTest* (VAR x: DevCPL486.Item; testtyp: DevCPT.Struct); - VAR tag, tdes: DevCPL486.Item; - BEGIN - (* tag must be in AX ! *) - IF testtyp.form = Pointer THEN testtyp := testtyp.BaseTyp END; - IF testtyp.untagged THEN DevCPM.err(139) - ELSE - tag.mode := Ind; tag.reg := AX; tag.scale := 0; tag.offset := Tag0Offset + 4 * testtyp.extlev; tag.form := Pointer; - DevCPL486.MakeConst(tdes, 0, Pointer); tdes.obj := DevCPE.TypeObj(testtyp); - DevCPL486.GenComp(tdes, tag); - setCC(x, eql, FALSE, FALSE) - END - END ShortTypTest; - - PROCEDURE Check (VAR x: DevCPL486.Item; min, max: INTEGER); - VAR c: DevCPL486.Item; - BEGIN - ASSERT((x.mode # Reg) OR (max > 255) OR (max = 31) OR (x.reg < 4)); - IF ranchk & (x.mode # Con) THEN - DevCPL486.MakeConst(c, max, x.form); DevCPL486.GenComp(c, x); - IF min # 0 THEN - DevCPL486.GenAssert(ccLE, ranTrap); - c.offset := min; DevCPL486.GenComp(c, x); - DevCPL486.GenAssert(ccGE, ranTrap) - ELSIF max # 0 THEN - DevCPL486.GenAssert(ccBE, ranTrap) - ELSE - DevCPL486.GenAssert(ccNS, ranTrap) - END - END - END Check; - - PROCEDURE Floor (VAR x: DevCPL486.Item; useSt1: BOOLEAN); - VAR c: DevCPL486.Item; local: DevCPL486.Label; - BEGIN - IF useSt1 THEN DevCPL486.GenFMOp(5D1H); (* FST ST1 *) - ELSE DevCPL486.GenFMOp(1C0H); (* FLD ST0 *) - END; - DevCPL486.GenFMOp(1FCH); (* FRNDINT *) - DevCPL486.GenFMOp(0D1H); (* FCOM *) - CheckAv(AX); - DevCPL486.GenFMOp(FSTSW); - DevCPL486.GenFMOp(5D9H); (* FSTP ST1 *) - (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; DevCPL486.GenJump(ccBE, local, TRUE); - DevCPL486.AllocConst(c, DevCPL486.one, Real32); - DevCPL486.GenFDOp(FSUB, c); - DevCPL486.SetLabel(local); - END Floor; - - PROCEDURE Entier(VAR x: DevCPL486.Item; typ: DevCPT.Struct; hint, stop: SET); - BEGIN - IF typ # DevCPT.intrealtyp THEN Floor(x, FALSE) END; - DevCPL486.GenFStore(x, TRUE); - IF (x.mode = Stk) & (stk IN stop) THEN Pop(x, x.form, hint, stop) END - END Entier; - - PROCEDURE ConvMove (VAR x, y: DevCPL486.Item; sysval: BOOLEAN; hint, stop: SET); (* x := y *) - (* scalar values only, y.mode # Con, all kinds of conversions, x.mode = Undef => convert y only *) - VAR f, m: BYTE; s: INTEGER; z: DevCPL486.Item; - BEGIN - f := x.form; m := x.mode; ASSERT(m IN {Undef, Reg, Abs, Ind, Stk}); - IF y.form IN {Real32, Real64} THEN - IF f IN {Real32, Real64} THEN - IF m = Undef THEN - IF (y.form = Real64) & (f = Real32) THEN - IF y.mode # Reg THEN LoadR(y) END; - Free(y); DecStack(Real32); y.mode := Stk; y.form := Real32; DevCPL486.GenFStore(y, TRUE) - END - ELSE - IF y.mode # Reg THEN LoadR(y) END; - IF m = Stk THEN DecStack(f) END; - IF m # Reg THEN Free(y); DevCPL486.GenFStore(x, TRUE) END; - END - ELSE (* x not real *) - IF sysval THEN - IF y.mode = Reg THEN Free(y); - IF (m # Stk) & (m # Undef) & (m # Reg) & (f >= Int32) THEN - x.form := y.form; DevCPL486.GenFStore(x, TRUE); x.form := f - ELSE - ASSERT(y.form # Real64); - DecStack(y.form); y.mode := Stk; DevCPL486.GenFStore(y, TRUE); y.form := Int32; - IF m # Stk THEN - Pop(y, y.form, hint, stop); - IF f < Int16 THEN ASSERT(y.reg < 4) END; - y.form := f; - IF m # Undef THEN Free(y); DevCPL486.GenMove(y, x) END - END - END - ELSE (* y.mode # Reg *) - y.form := f; - IF m # Undef THEN LoadW(y, hint, stop); Free(y); - IF m = Stk THEN DevCPL486.GenPush(y) ELSE DevCPL486.GenMove(y, x) END - END - END - ELSE (* not sysval *) - IF y.mode # Reg THEN LoadR(y) END; - Free(y); - IF (m # Stk) & (m # Undef) & (m # Reg) & (f >= Int16) & (f # Char16) THEN - Entier(x, y.typ, hint, stop); - ELSE - DecStack(f); y.mode := Stk; - IF (f < Int16) OR (f = Char16) THEN y.form := Int32 ELSE y.form := f END; - IF m = Stk THEN Entier(y, y.typ, {}, {}) - ELSIF m = Undef THEN Entier(y, y.typ, hint, stop) - ELSE Entier(y, y.typ, hint, stop + {stk}) - END; - IF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Char16 THEN Check(y, 0, 65536); FreeHi(y) - END; - y.form := f; - IF (m # Undef) & (m # Stk) THEN - IF f = Int64 THEN - Free(y); y.form := Int32; z := x; z.form := Int32; DevCPL486.GenMove(y, z); - IF z.mode = Reg THEN z.reg := z.index ELSE INC(z.offset, 4) END; - y.reg := y.index; DevCPL486.GenMove(y, z); - ELSE - Free(y); DevCPL486.GenMove(y, x); - END - END - END - END - END - ELSE (* y not real *) - IF sysval THEN - IF (y.form < Int16) & (f >= Int16) OR (y.form IN {Int16, Char16}) & (f >= Int32) & (f < Char16) THEN LoadL(y, hint, stop) END; - IF (y.form >= Int16) & (f < Int16) THEN FreeHi(y) END - ELSE - CASE y.form OF - | Byte, Bool: - IF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int16 THEN LoadL(y, hint, stop) - END - | Char8: - IF f = Int8 THEN Check(y, 0, 0) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int16 THEN LoadL(y, hint, stop) - END - | Char16: - IF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Int16 THEN Check(y, 0, 0) - ELSIF f = Char16 THEN (* ok *) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int32 THEN LoadL(y, hint, stop) - END - | Int8: - IF f = Char8 THEN Check(y, 0, 0) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int16 THEN LoadL(y, hint, stop) - END - | Int16: - IF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Char16 THEN Check(y, 0, 0) - ELSIF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF (f = Int32) OR (f = Set) THEN LoadL(y, hint, stop) - END - | Int32, Set, Pointer, ProcTyp: - IF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Char16 THEN Check(y, 0, 65536) - ELSIF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Int16 THEN Check(y, -32768, 32767) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - END - | Int64: - IF f IN {Bool..Int32, Char16} THEN - (* make range checks !!! *) - FreeHi(y) - END - END - END; - IF f IN {Real32, Real64} THEN - IF sysval THEN - IF (m # Undef) & (m # Reg) THEN - IF y.mode # Reg THEN LoadW(y, hint, stop) END; - Free(y); - IF m = Stk THEN DevCPL486.GenPush(y) - ELSE x.form := Int32; DevCPL486.GenMove(y, x); x.form := f - END - ELSE - IF y.mode = Reg THEN Push(y) END; - y.form := f; - IF m = Reg THEN LoadR(y) END - END - ELSE (* not sysval *) (* int -> float *) - IF y.mode = Reg THEN Push(y) END; - IF m = Stk THEN - Free(y); DevCPL486.GenFLoad(y); s := -4; - IF f = Real64 THEN DEC(s, 4) END; - IF y.mode = Stk THEN - IF y.form = Int64 THEN INC(s, 8) ELSE INC(s, 4) END - END; - IF s # 0 THEN AdjustStack(s) END; - GetReg(y, Real32, {}, {}); - Free(y); DevCPL486.GenFStore(x, TRUE) - ELSIF m = Reg THEN - LoadR(y) - ELSIF m # Undef THEN - LoadR(y); Free(y); DevCPL486.GenFStore(x, TRUE) - END - END - ELSE - y.form := f; - IF m = Stk THEN - IF ((f < Int32) OR (f = Char16)) & (y.mode # Reg) THEN LoadW(y, hint, stop) END; - Push(y) - ELSIF m # Undef THEN - IF f = Int64 THEN - IF y.mode # Reg THEN LoadLong(y, hint, stop) END; - Free(y); y.form := Int32; z := x; z.form := Int32; DevCPL486.GenMove(y, z); - IF z.mode = Reg THEN ASSERT(z.reg # y.index); z.reg := z.index ELSE INC(z.offset, 4) END; - y.reg := y.index; DevCPL486.GenMove(y, z); - ELSE - IF y.mode # Reg THEN LoadW(y, hint, stop) END; - Free(y); DevCPL486.GenMove(y, x) - END - END - END - END - END ConvMove; - - PROCEDURE Convert* (VAR x: DevCPL486.Item; f: BYTE; size: INTEGER; hint, stop: SET); (* size >= 0: sysval *) - VAR y: DevCPL486.Item; - BEGIN - ASSERT(x.mode # Con); - IF (size >= 0) - & ((size # x.typ.size) & ((size > 4) OR (x.typ.size > 4)) - OR (f IN {Comp, Real64, Int64}) & (x.mode IN {Reg, Stk})) THEN DevCPM.err(220) END; -(* - IF sysval & ((x.form = Real64) & ~(f IN {Comp, Int64}) OR (f = Real64) & ~(x.form IN {Comp, Int64})) THEN DevCPM.err(220) END; -*) - y.mode := Undef; y.form := f; ConvMove(y, x, size >= 0, hint, stop) - END Convert; - - PROCEDURE LoadCond* (VAR x, y: DevCPL486.Item; F, T: DevCPL486.Label; hint, stop: SET); - VAR end, T1: DevCPL486.Label; c, r: DevCPL486.Item; - BEGIN - IF mem IN stop THEN GetReg(x, Bool, hint, stop) END; - IF (F = DevCPL486.NewLbl) & (T = DevCPL486.NewLbl) THEN (* no label used *) - DevCPL486.GenSetCC(y.offset, x) - ELSE - end := DevCPL486.NewLbl; T1 := DevCPL486.NewLbl; - DevCPL486.GenJump(y.offset, T1, TRUE); (* T1 to enable short jump *) - DevCPL486.SetLabel(F); - DevCPL486.MakeConst(c, 0, Bool); DevCPL486.GenMove(c, x); - DevCPL486.GenJump(ccAlways, end, TRUE); - DevCPL486.SetLabel(T); DevCPL486.SetLabel(T1); - DevCPL486.MakeConst(c, 1, Bool); DevCPL486.GenMove(c, x); - DevCPL486.SetLabel(end) - END; - IF x.mode # Reg THEN Free(x) END - END LoadCond; - - PROCEDURE IntDOp* (VAR x, y: DevCPL486.Item; subcl: BYTE; rev: BOOLEAN); - VAR local: DevCPL486.Label; - BEGIN - ASSERT((x.mode = Reg) OR (y.mode = Reg) OR (y.mode = Con)); - CASE subcl OF - | eql..geq: - DevCPL486.GenComp(y, x); Free(x); - setCC(x, subcl, rev, x.typ.form IN {Int8..Int32}) - | times: - IF x.form = Set THEN DevCPL486.GenAnd(y, x) ELSE DevCPL486.GenMul(y, x, ovflchk) END - | slash: - DevCPL486.GenXor(y, x) - | plus: - IF x.form = Set THEN DevCPL486.GenOr(y, x) ELSE DevCPL486.GenAdd(y, x, ovflchk) END - | minus, msk: - IF (x.form = Set) OR (subcl = msk) THEN (* and not *) - IF rev THEN DevCPL486.GenNot(x); DevCPL486.GenAnd(y, x) (* y and not x *) - ELSIF y.mode = Con THEN y.offset := -1 - y.offset; DevCPL486.GenAnd(y, x) (* x and y' *) - ELSIF y.mode = Reg THEN DevCPL486.GenNot(y); DevCPL486.GenAnd(y, x) (* x and not y *) - ELSE DevCPL486.GenNot(x); DevCPL486.GenOr(y, x); DevCPL486.GenNot(x) (* not (not x or y) *) - END - ELSE (* minus *) - IF rev THEN (* y - x *) - IF (y.mode = Con) & (y.offset = -1) THEN DevCPL486.GenNot(x) - ELSE DevCPL486.GenNeg(x, ovflchk); DevCPL486.GenAdd(y, x, ovflchk) (* ??? *) - END - ELSE (* x - y *) - DevCPL486.GenSub(y, x, ovflchk) - END - END - | min, max: - local := DevCPL486.NewLbl; - DevCPL486.GenComp(y, x); - IF subcl = min THEN - IF x.typ.form IN {Char8, Char16} THEN DevCPL486.GenJump(ccBE, local, TRUE) - ELSE DevCPL486.GenJump(ccLE, local, TRUE) - END - ELSE - IF x.typ.form IN {Char8, Char16} THEN DevCPL486.GenJump(ccAE, local, TRUE) - ELSE DevCPL486.GenJump(ccGE, local, TRUE) - END - END; - DevCPL486.GenMove(y, x); - DevCPL486.SetLabel(local) - END; - Free(y); - IF x.mode # Reg THEN Free(x) END - END IntDOp; - - PROCEDURE LargeInc* (VAR x, y: DevCPL486.Item; dec: BOOLEAN); (* INC(x, y) or DEC(x, y) *) - BEGIN - ASSERT(x.form = Int64); - IF ~(y.mode IN {Reg, Con}) THEN LoadLong(y, {}, {}) END; - Free(x); Free(y); x.form := Int32; y.form := Int32; - IF dec THEN DevCPL486.GenSubC(y, x, TRUE, FALSE) ELSE DevCPL486.GenAddC(y, x, TRUE, FALSE) END; - INC(x.offset, 4); - IF y.mode = Reg THEN y.reg := y.index ELSE y.offset := y.scale END; - IF dec THEN DevCPL486.GenSubC(y, x, FALSE, ovflchk) ELSE DevCPL486.GenAddC(y, x, FALSE, ovflchk) END; - END LargeInc; - - PROCEDURE FloatDOp* (VAR x, y: DevCPL486.Item; subcl: BYTE; rev: BOOLEAN); - VAR local: DevCPL486.Label; a, b: DevCPL486.Item; - BEGIN - ASSERT(x.mode = Reg); - IF y.form = Int64 THEN LoadR(y) END; - IF y.mode = Reg THEN rev := ~rev END; - CASE subcl OF - | eql..geq: DevCPL486.GenFDOp(FCOMP, y) - | times: DevCPL486.GenFDOp(FMUL, y) - | slash: IF rev THEN DevCPL486.GenFDOp(FDIVR, y) ELSE DevCPL486.GenFDOp(FDIV, y) END - | plus: DevCPL486.GenFDOp(FADD, y) - | minus: IF rev THEN DevCPL486.GenFDOp(FSUBR, y) ELSE DevCPL486.GenFDOp(FSUB, y) END - | min, max: - IF y.mode = Reg THEN - DevCPL486.GenFMOp(0D1H); (* FCOM ST1 *) - CheckAv(AX); DevCPL486.GenFMOp(FSTSW); (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; - IF subcl = min THEN DevCPL486.GenJump(ccAE, local, TRUE) ELSE DevCPL486.GenJump(ccBE, local, TRUE) END; - DevCPL486.GenFMOp(5D1H); (* FST ST1 *) - DevCPL486.SetLabel(local); - DevCPL486.GenFMOp(5D8H) (* FSTP ST0 *) - ELSE - DevCPL486.GenFDOp(FCOM, y); - CheckAv(AX); DevCPL486.GenFMOp(FSTSW); (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; - IF subcl = min THEN DevCPL486.GenJump(ccBE, local, TRUE) ELSE DevCPL486.GenJump(ccAE, local, TRUE) END; - DevCPL486.GenFMOp(5D8H); (* FSTP ST0 *) - DevCPL486.GenFLoad(y); - DevCPL486.SetLabel(local) - END - (* largeint support *) - | div: - IF rev THEN DevCPL486.GenFDOp(FDIVR, y) ELSE DevCPL486.GenFDOp(FDIV, y) END; - Floor(y, FALSE) - | mod: - IF y.mode # Reg THEN LoadR(y); rev := ~rev END; - IF rev THEN DevCPL486.GenFMOp(1C9H); (* FXCH ST1 *) END; - DevCPL486.GenFMOp(1F8H); (* FPREM *) - DevCPL486.GenFMOp(1E4H); (* FTST *) - CheckAv(AX); - DevCPL486.GenFMOp(FSTSW); - DevCPL486.MakeReg(a, AX, Int32); GetReg(b, Int32, {}, {AX}); - DevCPL486.GenMove(a, b); - DevCPL486.GenFMOp(0D1H); (* FCOM *) - DevCPL486.GenFMOp(FSTSW); - DevCPL486.GenXor(b, a); Free(b); - (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; DevCPL486.GenJump(ccBE, local, TRUE); - DevCPL486.GenFMOp(0C1H); (* FADD ST1 *) - DevCPL486.SetLabel(local); - DevCPL486.GenFMOp(5D9H); (* FSTP ST1 *) - | ash: - IF y.mode # Reg THEN LoadR(y); rev := ~rev END; - IF rev THEN DevCPL486.GenFMOp(1C9H); (* FXCH ST1 *) END; - DevCPL486.GenFMOp(1FDH); (* FSCALE *) - Floor(y, TRUE) - END; - IF y.mode = Stk THEN IncStack(y.form) END; - Free(y); - IF (subcl >= eql) & (subcl <= geq) THEN - Free(x); CheckAv(AX); - DevCPL486.GenFMOp(FSTSW); - (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - setCC(x, subcl, rev, FALSE) - END - END FloatDOp; - - PROCEDURE IntMOp* (VAR x: DevCPL486.Item; subcl: BYTE); - VAR L: DevCPL486.Label; c: DevCPL486.Item; - BEGIN - CASE subcl OF - | minus: - IF x.form = Set THEN DevCPL486.GenNot(x) ELSE DevCPL486.GenNeg(x, ovflchk) END - | abs: - L := DevCPL486.NewLbl; DevCPL486.MakeConst(c, 0, x.form); - DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccNS, L, TRUE); - DevCPL486.GenNeg(x, ovflchk); - DevCPL486.SetLabel(L) - | cap: - DevCPL486.MakeConst(c, -1 - 20H, x.form); - DevCPL486.GenAnd(c, x) - | not: - DevCPL486.MakeConst(c, 1, x.form); - DevCPL486.GenXor(c, x) - END; - IF x.mode # Reg THEN Free(x) END - END IntMOp; - - PROCEDURE FloatMOp* (VAR x: DevCPL486.Item; subcl: BYTE); - BEGIN - ASSERT(x.mode = Reg); - IF subcl = minus THEN DevCPL486.GenFMOp(FCHS) - ELSE ASSERT(subcl = abs); DevCPL486.GenFMOp(FABS) - END - END FloatMOp; - - PROCEDURE MakeSet* (VAR x: DevCPL486.Item; range, neg: BOOLEAN; hint, stop: SET); - (* range neg result - F F {x} - F T -{x} - T F {x..31} - T T -{0..x} *) - VAR c, r: DevCPL486.Item; val: INTEGER; - BEGIN - IF x.mode = Con THEN - IF range THEN - IF neg THEN val := -2 ELSE val := -1 END; - x.offset := SYSTEM.LSH(val, x.offset) - ELSE - val := 1; x.offset := SYSTEM.LSH(val, x.offset); - IF neg THEN x.offset := -1 - x.offset END - END - ELSE - Check(x, 0, 31); - IF neg THEN val := -2 - ELSIF range THEN val := -1 - ELSE val := 1 - END; - DevCPL486.MakeConst(c, val, Set); GetReg(r, Set, hint, stop); DevCPL486.GenMove(c, r); - IF range THEN DevCPL486.GenShiftOp(SHL, x, r) ELSE DevCPL486.GenShiftOp(ROL, x, r) END; - Free(x); x.reg := r.reg - END; - x.typ := DevCPT.settyp; x.form := Set - END MakeSet; - - PROCEDURE MakeCond* (VAR x: DevCPL486.Item); - VAR c: DevCPL486.Item; - BEGIN - IF x.mode = Con THEN - setCC(x, SHORT(SHORT(x.offset)), FALSE, FALSE) - ELSE - DevCPL486.MakeConst(c, 0, x.form); - DevCPL486.GenComp(c, x); Free(x); - setCC(x, neq, FALSE, FALSE) - END - END MakeCond; - - PROCEDURE Not* (VAR x: DevCPL486.Item); - VAR a: INTEGER; - BEGIN - x.offset := Inverted(x.offset); (* invert cc *) - END Not; - - PROCEDURE Odd* (VAR x: DevCPL486.Item); - VAR c: DevCPL486.Item; - BEGIN - IF x.mode = Stk THEN Pop(x, x.form, {}, {}) END; - Free(x); DevCPL486.MakeConst(c, 1, x.form); - IF x.mode = Reg THEN - IF x.form IN {Int16, Int64} THEN x.form := Int32; c.form := Int32 END; - DevCPL486.GenAnd(c, x) - ELSE - c.form := Int8; x.form := Int8; DevCPL486.GenTest(c, x) - END; - setCC(x, neq, FALSE, FALSE) - END Odd; - - PROCEDURE In* (VAR x, y: DevCPL486.Item); - BEGIN - IF y.form = Set THEN Check(x, 0, 31) END; - DevCPL486.GenBitOp(BT, x, y); Free(x); Free(y); - setCC(x, lss, FALSE, FALSE); (* carry set *) - END In; - - PROCEDURE Shift* (VAR x, y: DevCPL486.Item; subcl: BYTE); (* ASH, LSH, ROT *) - VAR L1, L2: DevCPL486.Label; c: DevCPL486.Item; opl, opr: INTEGER; - BEGIN - IF subcl = ash THEN opl := SHL; opr := SAR - ELSIF subcl = lsh THEN opl := SHL; opr := SHR - ELSE opl := ROL; opr := ROR - END; - IF y.mode = Con THEN - IF y.offset > 0 THEN - DevCPL486.GenShiftOp(opl, y, x) - ELSIF y.offset < 0 THEN - y.offset := -y.offset; - DevCPL486.GenShiftOp(opr, y, x) - END - ELSE - ASSERT(y.mode = Reg); - Check(y, -31, 31); - L1 := DevCPL486.NewLbl; L2 := DevCPL486.NewLbl; - DevCPL486.MakeConst(c, 0, y.form); DevCPL486.GenComp(c, y); - DevCPL486.GenJump(ccNS, L1, TRUE); - DevCPL486.GenNeg(y, FALSE); - DevCPL486.GenShiftOp(opr, y, x); - DevCPL486.GenJump(ccAlways, L2, TRUE); - DevCPL486.SetLabel(L1); - DevCPL486.GenShiftOp(opl, y, x); - DevCPL486.SetLabel(L2); - Free(y) - END; - IF x.mode # Reg THEN Free(x) END - END Shift; - - PROCEDURE DivMod* (VAR x, y: DevCPL486.Item; mod: BOOLEAN); - VAR s: SET; r: DevCPL486.Item; pos: BOOLEAN; - BEGIN - ASSERT((x.mode = Reg) & (x.reg = AX)); pos := FALSE; - IF y.mode = Con THEN pos := (y.offset > 0) & (y.obj = NIL); Load(y, {}, {AX, DX, con}) END; - DevCPL486.GenDiv(y, mod, pos); Free(y); - IF mod THEN - r := x; GetReg(x, x.form, {}, wreg - {AX, DX}); Free(r) (* ax -> dx; al -> ah *) (* ??? *) - END - END DivMod; - - PROCEDURE Mem* (VAR x: DevCPL486.Item; offset: INTEGER; typ: DevCPT.Struct); (* x := Mem[x+offset] *) - BEGIN - IF x.mode = Con THEN x.mode := Abs; x.obj := NIL; INC(x.offset, offset) - ELSE ASSERT(x.mode = Reg); x.mode := Ind; x.offset := offset - END; - x.scale := 0; x.typ := typ; x.form := typ.form - END Mem; - - PROCEDURE SysMove* (VAR len: DevCPL486.Item); (* implementation of SYSTEM.MOVE *) - BEGIN - IF len.mode = Con THEN - IF len.offset > 0 THEN DevCPL486.GenBlockMove(1, len.offset) END - ELSE - Load(len, {}, wreg - {CX} + {short, mem, stk}); DevCPL486.GenBlockMove(1, 0); Free(len) - END; - FreeWReg(SI); FreeWReg(DI) - END SysMove; - - PROCEDURE Len* (VAR x, y: DevCPL486.Item); - VAR typ: DevCPT.Struct; dim: INTEGER; - BEGIN - dim := y.offset; typ := x.typ; - IF typ.untagged THEN DevCPM.err(136) END; - WHILE dim > 0 DO typ := typ.BaseTyp; DEC(dim) END; - LenDesc(x, x, typ); - END Len; - - PROCEDURE StringWSize (VAR x: DevCPL486.Item): INTEGER; - BEGIN - CASE x.form OF - | String8, VString8: RETURN 1 - | String16, VString16: RETURN 2 - | VString16to8: RETURN 0 - | Comp: RETURN x.typ.BaseTyp.size - END - END StringWSize; - - PROCEDURE CmpString* (VAR x, y: DevCPL486.Item; rel: BYTE; rev: BOOLEAN); - VAR sw, dw: INTEGER; - BEGIN - CheckAv(CX); - IF (x.typ = DevCPT.guidtyp) OR (y.typ = DevCPT.guidtyp) THEN - DevCPL486.GenBlockComp(4, 4) - ELSIF x.form = String8 THEN DevCPL486.GenBlockComp(1, x.index) - ELSIF y.form = String8 THEN DevCPL486.GenBlockComp(1, y.index) - ELSIF x.form = String16 THEN DevCPL486.GenBlockComp(2, x.index) - ELSIF y.form = String16 THEN DevCPL486.GenBlockComp(2, y.index) - ELSE DevCPL486.GenStringComp(StringWSize(y), StringWSize(x)) - END; - FreeWReg(SI); FreeWReg(DI); setCC(x, rel, ~rev, FALSE); - END CmpString; - - PROCEDURE VarParDynArr (ftyp: DevCPT.Struct; VAR y: DevCPL486.Item); - VAR len, z: DevCPL486.Item; atyp: DevCPT.Struct; - BEGIN - atyp := y.typ; - WHILE ftyp.comp = DynArr DO - IF ftyp.BaseTyp = DevCPT.bytetyp THEN - IF atyp.comp = DynArr THEN - IF atyp.untagged THEN DevCPM.err(137) END; - LenDesc(y, len, atyp); - IF y.tmode = VarPar THEN Free(len) END; (* ??? *) - GetReg(z, Int32, {}, {}); DevCPL486.GenMove(len, z); - len.mode := Reg; len.reg := z.reg; atyp := atyp.BaseTyp; - WHILE atyp.comp = DynArr DO - LenDesc(y, z, atyp); DevCPL486.GenMul(z, len, FALSE); - IF y.tmode = VarPar THEN Free(z) END; (* ??? *) - atyp := atyp.BaseTyp - END; - DevCPL486.MakeConst(z, atyp.size, Int32); DevCPL486.GenMul(z, len, FALSE); - Free(len) - ELSE - DevCPL486.MakeConst(len, atyp.size, Int32) - END - ELSE - IF atyp.comp = DynArr THEN LenDesc(y, len, atyp); - IF atyp.untagged THEN DevCPM.err(137) END; - IF y.tmode = VarPar THEN Free(len) END; (* ??? *) - ELSE DevCPL486.MakeConst(len, atyp.n, Int32) - END - END; - DevCPL486.GenPush(len); - ftyp := ftyp.BaseTyp; atyp := atyp.BaseTyp - END - END VarParDynArr; - - PROCEDURE Assign* (VAR x, y: DevCPL486.Item); (* x := y *) - BEGIN - IF y.mode = Con THEN - IF y.form IN {Real32, Real64} THEN - DevCPL486.GenFLoad(y); GetReg(y, Real32, {}, {}); - IF x.mode # Reg THEN Free(y); DevCPL486.GenFStore(x, TRUE) END (* ??? move const *) - ELSIF x.form = Int64 THEN - ASSERT(x.mode IN {Ind, Abs}); - y.form := Int32; x.form := Int32; DevCPL486.GenMove(y, x); - y.offset := y.scale; INC(x.offset, 4); DevCPL486.GenMove(y, x); - DEC(x.offset, 4); x.form := Int64 - ELSE - DevCPL486.GenMove(y, x) - END - ELSE - IF y.form IN {Comp, String8, String16, VString8, VString16} THEN (* convert to pointer *) - ASSERT(x.form = Pointer); - GetAdr(y, {}, {}); y.typ := x.typ; y.form := Pointer - END; - IF ~(x.form IN realSet) OR ~(y.form IN intSet) THEN Assert(y, {}, {stk}) END; - ConvMove(x, y, FALSE, {}, {}) - END; - Free(x) - END Assign; - - PROCEDURE ArrayLen* (VAR x, len: DevCPL486.Item; hint, stop: SET); - VAR c: DevCPL486.Item; - BEGIN - IF x.typ.comp = Array THEN DevCPL486.MakeConst(c, x.typ.n, Int32); GetReg(len, Int32, hint, stop); DevCPL486.GenMove(c, len) - ELSIF ~x.typ.untagged THEN LenDesc(x, c, x.typ); GetReg(len, Int32, hint, stop); DevCPL486.GenMove(c, len) - ELSE len.mode := Con - END; - len.typ := DevCPT.int32typ - END ArrayLen; - -(* -(!) src dest zero -sx = sy x b y b -SHORT(lx) = sy x b+ x w y b -SHORT(lx) = SHORT(ly) x b+ x w y b+ - -lx = ly x w y w -LONG(sx) = ly x b y w * -LONG(SHORT(lx)) = ly x b+ x w* y w * - -sx := sy y b x b -sx := SHORT(ly) y b+ y w x b - -lx := ly y w x w -lx := LONG(sy) y b x w * -lx := LONG(SHORT(ly)) y b+ y w* x w * -(!)*) - - PROCEDURE AddCopy* (VAR x, y: DevCPL486.Item; last: BOOLEAN); (* x := .. + y + .. *) - BEGIN - IF (x.typ.comp = DynArr) & x.typ.untagged THEN - DevCPL486.GenStringMove(~last, StringWSize(y), StringWSize(x), -1) - ELSE - DevCPL486.GenStringMove(~last, StringWSize(y), StringWSize(x), 0) - END; - FreeWReg(SI); FreeWReg(DI) - END AddCopy; - - PROCEDURE Copy* (VAR x, y: DevCPL486.Item; short: BOOLEAN); (* x := y *) - VAR sx, sy, sy2, sy4: INTEGER; c, r: DevCPL486.Item; - BEGIN - sx := x.typ.size; CheckAv(CX); - IF y.form IN {String8, String16} THEN - sy := y.index * y.typ.BaseTyp.size; - IF x.typ.comp = Array THEN (* adjust size for optimal performance *) - sy2 := sy + sy MOD 2; sy4 := sy2 + sy2 MOD 4; - IF sy4 <= sx THEN sy := sy4 - ELSIF sy2 <= sx THEN sy := sy2 - ELSIF sy > sx THEN DevCPM.err(114); sy := 1 - END - ELSIF inxchk & ~x.typ.untagged THEN (* check array length *) - Free(x); LenDesc(x, c, x.typ); - DevCPL486.MakeConst(y, y.index, Int32); - DevCPL486.GenComp(y, c); DevCPL486.GenAssert(ccAE, copyTrap); - Free(c) - END; - DevCPL486.GenBlockMove(1, sy) - ELSIF x.typ.comp = DynArr THEN - IF x.typ.untagged THEN - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), -1) - ELSE - Free(x); LenDesc(x, c, x.typ); DevCPL486.MakeReg(r, CX, Int32); DevCPL486.GenMove(c, r); Free(c); - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), 0) - END - ELSIF y.form IN {VString16to8, VString8, VString16} THEN - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), x.typ.n); - ASSERT(y.mode # Stk) - ELSIF short THEN (* COPY *) - sy := y.typ.size; - IF (y.typ.comp # DynArr) & (sy < sx) THEN sx := sy END; - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), x.typ.n); - IF y.mode = Stk THEN AdjustStack(sy) END - ELSE (* := *) - IF sx > 0 THEN DevCPL486.GenBlockMove(1, sx) END; - IF y.mode = Stk THEN AdjustStack(sy) END - END; - FreeWReg(SI); FreeWReg(DI) - END Copy; - - PROCEDURE StrLen* (VAR x: DevCPL486.Item; typ: DevCPT.Struct; incl0x: BOOLEAN); - VAR c: DevCPL486.Item; - BEGIN - CheckAv(AX); CheckAv(CX); - DevCPL486.GenStringLength(typ.BaseTyp.size, -1); - Free(x); GetReg(x, Int32, {}, wreg - {CX}); - DevCPL486.GenNot(x); - IF ~incl0x THEN DevCPL486.MakeConst(c, 1, Int32); DevCPL486.GenSub(c, x, FALSE) END; - FreeWReg(DI) - END StrLen; - - PROCEDURE MulDim* (VAR y, z: DevCPL486.Item; VAR fact: INTEGER; dimtyp: DevCPT.Struct); (* z := z * y *) - VAR c: DevCPL486.Item; - BEGIN - IF y.mode = Con THEN fact := fact * y.offset - ELSE - IF ranchk OR inxchk THEN - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenComp(c, y); DevCPL486.GenAssert(ccG, ranTrap) - END; - DevCPL486.GenPush(y); - IF z.mode = Con THEN z := y - ELSE DevCPL486.GenMul(y, z, ovflchk OR inxchk); Free(y) - END - END - END MulDim; - - PROCEDURE SetDim* (VAR x, y: DevCPL486.Item; dimtyp: DevCPT.Struct); (* set LEN(x^, -dimtyp.n) *) - (* y const or on stack *) - VAR z: DevCPL486.Item; end: DevCPL486.Label; - BEGIN - ASSERT((x.mode = Reg) & (x.form = Pointer)); - z.mode := Ind; z.reg := x.reg; z.offset := ArrDOffs + 4 + dimtyp.n * 4; z.scale := 0; z.form := Int32; - IF y.mode = Con THEN y.form := Int32 - ELSE Pop(y, Int32, {}, {}) - END; - end := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, end, TRUE); (* flags set in New *) - DevCPL486.GenMove(y, z); - DevCPL486.SetLabel(end); - IF y.mode = Reg THEN Free(y) END - END SetDim; - - PROCEDURE SysNew* (VAR x: DevCPL486.Item); - BEGIN - DevCPM.err(141) - END SysNew; - - PROCEDURE New* (VAR x, nofel: DevCPL486.Item; fact: INTEGER); - (* x.typ.BaseTyp.comp IN {Record, Array, DynArr} *) - VAR p, tag, c: DevCPL486.Item; nofdim, dlen, n: INTEGER; typ, eltyp: DevCPT.Struct; lbl: DevCPL486.Label; - BEGIN - typ := x.typ.BaseTyp; - IF typ.untagged THEN DevCPM.err(138) END; - IF typ.comp = Record THEN (* call to Kernel.NewRec(tag: Tag): ADDRESS *) - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(typ); - IF ContainsIPtrs(typ) THEN INC(tag.offset) END; - DevCPL486.GenPush(tag); - p.mode := XProc; p.obj := DevCPE.KNewRec; - ELSE eltyp := typ.BaseTyp; - IF typ.comp = Array THEN - nofdim := 0; nofel.mode := Con; nofel.form := Int32; fact := typ.n - ELSE (* DynArr *) - nofdim := typ.n+1; - WHILE eltyp.comp = DynArr DO eltyp := eltyp.BaseTyp END - END ; - WHILE eltyp.comp = Array DO fact := fact * eltyp.n; eltyp := eltyp.BaseTyp END; - IF eltyp.comp = Record THEN - IF eltyp.untagged THEN DevCPM.err(138) END; - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(eltyp); - IF ContainsIPtrs(eltyp) THEN INC(tag.offset) END; - ELSIF eltyp.form = Pointer THEN - IF ~eltyp.untagged THEN - DevCPL486.MakeConst(tag, 0, Pointer) (* special TDesc in Kernel for ARRAY OF pointer *) - ELSIF eltyp.sysflag = interface THEN - DevCPL486.MakeConst(tag, -1, Pointer) (* special TDesc in Kernel for ARRAY OF interface pointer *) - ELSE - DevCPL486.MakeConst(tag, 12, Pointer) - END - ELSE (* eltyp is pointerless basic type *) - CASE eltyp.form OF - | Undef, Byte, Char8: n := 1; - | Int16: n := 2; - | Int8: n := 3; - | Int32: n := 4; - | Bool: n := 5; - | Set: n := 6; - | Real32: n := 7; - | Real64: n := 8; - | Char16: n := 9; - | Int64: n := 10; - | ProcTyp: n := 11; - END; - DevCPL486.MakeConst(tag, n, Pointer) -(* - DevCPL486.MakeConst(tag, eltyp.size, Pointer) -*) - END; - IF nofel.mode = Con THEN nofel.offset := fact; nofel.obj := NIL - ELSE DevCPL486.MakeConst(p, fact, Int32); DevCPL486.GenMul(p, nofel, ovflchk OR inxchk) - END; - DevCPL486.MakeConst(p, nofdim, Int32); DevCPL486.GenPush(p); - DevCPL486.GenPush(nofel); Free(nofel); DevCPL486.GenPush(tag); - p.mode := XProc; p.obj := DevCPE.KNewArr; - END; - DevCPL486.GenCall(p); GetReg(x, Pointer, {}, wreg - {AX}); - IF typ.comp = DynArr THEN (* set flags for nil test *) - DevCPL486.MakeConst(c, 0, Pointer); DevCPL486.GenComp(c, x) - ELSIF typ.comp = Record THEN - n := NumOfIntProc(typ); - IF n > 0 THEN (* interface method table pointer setup *) - DevCPL486.MakeConst(c, 0, Pointer); DevCPL486.GenComp(c, x); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE); - tag.offset := - 4 * (n + numPreIntProc); - p.mode := Ind; p.reg := AX; p.offset := 0; p.scale := 0; p.form := Pointer; - DevCPL486.GenMove(tag, p); - IF nofel.mode # Con THEN (* unk pointer setup *) - p.offset := 8; - DevCPL486.GenMove(nofel, p); - Free(nofel) - END; - DevCPL486.SetLabel(lbl); - END - END - END New; - - PROCEDURE Param* (fp: DevCPT.Object; rec, niltest: BOOLEAN; VAR ap, tag: DevCPL486.Item); (* returns tag if rec *) - VAR f: BYTE; s, ss: INTEGER; par, a, c: DevCPL486.Item; recTyp: DevCPT.Struct; - BEGIN - par.mode := Stk; par.typ := fp.typ; par.form := par.typ.form; - IF ODD(fp.sysflag DIV nilBit) THEN niltest := FALSE END; - IF ap.typ = DevCPT.niltyp THEN - IF ((par.typ.comp = Record) OR (par.typ.comp = DynArr)) & ~par.typ.untagged THEN - DevCPM.err(142) - END; - DevCPL486.GenPush(ap) - ELSIF par.typ.comp = DynArr THEN - IF ap.form IN {String8, String16} THEN - IF ~par.typ.untagged THEN - DevCPL486.MakeConst(c, ap.index (* * ap.typ.BaseTyp.size *), Int32); DevCPL486.GenPush(c) - END; - ap.mode := Con; DevCPL486.GenPush(ap); - ELSIF ap.form IN {VString8, VString16} THEN - DevCPL486.MakeReg(a, DX, Pointer); DevCPL486.GenLoadAdr(ap, a); - IF ~par.typ.untagged THEN - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenMove(a, c); - Free(ap); StrLen(c, ap.typ, TRUE); - DevCPL486.GenPush(c); Free(c) - END; - DevCPL486.GenPush(a) - ELSE - IF ~par.typ.untagged THEN - IF ap.typ.comp = DynArr THEN niltest := FALSE END; (* ap dereferenced for length descriptor *) - VarParDynArr(par.typ, ap) - END; - PushAdr(ap, niltest) - END - ELSIF fp.mode = VarPar THEN - recTyp := ap.typ; - IF recTyp.form = Pointer THEN recTyp := recTyp.BaseTyp END; - IF (par.typ.comp = Record) & (~fp.typ.untagged) THEN - Tag(ap, tag); - IF rec & (tag.mode # Con) THEN - GetReg(c, Pointer, {}, {}); DevCPL486.GenMove(tag, c); tag := c - END; - DevCPL486.GenPush(tag); - IF tag.mode # Con THEN niltest := FALSE END; - PushAdr(ap, niltest); - IF rec THEN Free(tag) END - ELSE PushAdr(ap, niltest) - END; - tag.typ := recTyp - ELSIF par.form = Comp THEN - s := par.typ.size; - IF initializeStr & (ap.form IN {String8, String16, VString8, VString16, VString16to8}) THEN - s := (s + 3) DIV 4 * 4; AdjustStack(-s); - IF ap.form IN {String8, String16} THEN - IF ap.index > 1 THEN (* nonempty string *) - ss := (ap.index * ap.typ.BaseTyp.size + 3) DIV 4 * 4; - DevCPL486.MakeReg(c, SI, Pointer); DevCPL486.GenLoadAdr(ap, c); Free(ap); - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c); - DevCPL486.GenBlockMove(1, ss); - ELSE - ss := 0; - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c) - END; - IF s > ss THEN - DevCPL486.MakeReg(a, AX, Int32); DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenMove(c, a); - DevCPL486.GenBlockStore(1, s - ss) - END; - ELSE - DevCPL486.MakeReg(c, SI, Pointer); DevCPL486.GenLoadAdr(ap, c); Free(ap); - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c); - DevCPL486.GenStringMove(TRUE, StringWSize(ap), StringWSize(par), par.typ.n); - DevCPL486.MakeReg(a, AX, Int32); DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenMove(c, a); - DevCPL486.GenBlockStore(StringWSize(par), 0) - END - ELSE - IF (ap.form IN {String8, String16}) & (ap.index = 1) THEN (* empty string *) - AdjustStack((4 - s) DIV 4 * 4); - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenPush(c) - ELSE - AdjustStack((-s) DIV 4 * 4); - DevCPL486.MakeReg(c, SI, Pointer); DevCPL486.GenLoadAdr(ap, c); Free(ap); - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c); - IF ap.form IN {String8, String16} THEN - DevCPL486.GenBlockMove(1, (ap.index * ap.typ.BaseTyp.size + 3) DIV 4 * 4) - ELSIF ap.form IN {VString8, VString16, VString16to8} THEN - DevCPL486.GenStringMove(FALSE, StringWSize(ap), StringWSize(par), par.typ.n) - ELSE - DevCPL486.GenBlockMove(1, (s + 3) DIV 4 * 4) - END - END - END - ELSIF ap.mode = Con THEN - IF ap.form IN {Real32, Real64} THEN (* ??? push const *) - DevCPL486.GenFLoad(ap); DecStack(par.typ.form); DevCPL486.GenFStore(par, TRUE) - ELSE - ap.form := Int32; - IF par.form = Int64 THEN DevCPL486.MakeConst(c, ap.scale, Int32); DevCPL486.GenPush(c) END; - DevCPL486.GenPush(ap) - END - ELSIF ap.typ.form = Pointer THEN - recTyp := ap.typ.BaseTyp; - IF rec THEN - Load(ap, {}, {}); Tag(ap, tag); - IF tag.mode = Con THEN (* explicit nil test needed *) - DevCPL486.MakeReg(a, AX, Int32); - c.mode := Ind; c.form := Int32; c.offset := 0; c.scale := 0; c.reg := ap.reg; - DevCPL486.GenTest(a, c) - END - END; - DevCPL486.GenPush(ap); Free(ap); - tag.typ := recTyp - ELSIF ap.form IN {Comp, String8, String16, VString8, VString16} THEN (* convert to pointer *) - ASSERT(par.form = Pointer); - PushAdr(ap, FALSE) - ELSE - ConvMove(par, ap, FALSE, {}, {high}); - END - END Param; - - PROCEDURE Result* (proc: DevCPT.Object; VAR res: DevCPL486.Item); - VAR r: DevCPL486.Item; - BEGIN - DevCPL486.MakeReg(r, AX, proc.typ.form); (* don't allocate AX ! *) - IF res.mode = Con THEN - IF r.form IN {Real32, Real64} THEN DevCPL486.GenFLoad(res); - ELSIF r.form = Int64 THEN - r.form := Int32; res.form := Int32; DevCPL486.GenMove(res, r); - r.reg := DX; res.offset := res.scale; DevCPL486.GenMove(res, r) - ELSE DevCPL486.GenMove(res, r); - END - ELSIF res.form IN {Comp, String8, String16, VString8, VString16} THEN (* convert to pointer *) - ASSERT(r.form = Pointer); - GetAdr(res, {}, wreg - {AX}) - ELSE - r.index := DX; (* for int64 *) - ConvMove(r, res, FALSE, wreg - {AX} + {high}, {}); - END; - Free(res) - END Result; - - PROCEDURE InitFpu; - VAR x: DevCPL486.Item; - BEGIN - DevCPL486.MakeConst(x, FpuControlRegister, Int32); DevCPL486.GenPush(x); - DevCPL486.GenFMOp(12CH); DevCPL486.GenCode(24H); (* FLDCW 0(SP) *) - DevCPL486.MakeReg(x, CX, Int32); DevCPL486.GenPop(x); (* reset stack *) - END InitFpu; - - PROCEDURE PrepCall* (proc: DevCPT.Object); - VAR lev: BYTE; r: DevCPL486.Item; - BEGIN - lev := proc.mnolev; - IF (slNeeded IN proc.conval.setval) & (imLevel[lev] > 0) & (imLevel[DevCPL486.level] > imLevel[lev]) THEN - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenPush(r) - END - END PrepCall; - - PROCEDURE Call* (VAR x, tag: DevCPL486.Item); (* TProc: tag.typ = actual receiver type *) - VAR i, n: INTEGER; r, y: DevCPL486.Item; typ: DevCPT.Struct; lev: BYTE; saved: BOOLEAN; p: DevCPT.Object; - BEGIN - IF x.mode IN {LProc, XProc, IProc} THEN - lev := x.obj.mnolev; saved := FALSE; - IF (slNeeded IN x.obj.conval.setval) & (imLevel[lev] > 0) THEN (* pass static link *) - n := imLevel[DevCPL486.level] - imLevel[lev]; - IF n > 0 THEN - saved := TRUE; - y.mode := Ind; y.scale := 0; y.form := Pointer; y.reg := BX; y.offset := -4; - DevCPL486.MakeReg(r, BX, Pointer); - WHILE n > 0 DO DevCPL486.GenMove(y, r); DEC(n) END - END - END; - DevCPL486.GenCall(x); - IF x.obj.sysflag = ccall THEN (* remove parameters *) - p := x.obj.link; n := 0; - WHILE p # NIL DO - IF p.mode = VarPar THEN INC(n, 4) - ELSE INC(n, (p.typ.size + 3) DIV 4 * 4) - END; - p := p.link - END; - AdjustStack(n) - END; - IF saved THEN DevCPL486.GenPop(r) END; - ELSIF x.mode = TProc THEN - IF x.scale = 1 THEN (* super *) - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(tag.typ.BaseTyp) - ELSIF x.scale = 2 THEN (* static call *) - DevCPL486.MakeConst(tag, 0, Pointer); typ := x.obj.link.typ; - IF typ.form = Pointer THEN typ := typ.BaseTyp END; - tag.obj := DevCPE.TypeObj(typ) - ELSIF x.scale = 3 THEN (* interface method call *) - DevCPM.err(200) - END; - IF tag.mode = Con THEN - y.mode := Abs; y.offset := tag.offset; y.obj := tag.obj; y.scale := 0 - ELSIF (x.obj.conval.setval * {absAttr, empAttr, extAttr} = {}) & ~(DevCPM.oberon IN DevCPM.options) THEN (* final method *) - y.mode := Abs; y.offset := 0; y.obj := DevCPE.TypeObj(tag.typ); y.scale := 0; - IF tag.mode = Ind THEN (* nil test *) - DevCPL486.MakeReg(r, AX, Int32); tag.offset := 0; DevCPL486.GenTest(r, tag) - END - ELSE - IF tag.mode = Reg THEN y.reg := tag.reg - ELSE GetReg(y, Pointer, {}, {}); DevCPL486.GenMove(tag, y) - END; - y.mode := Ind; y.offset := 0; y.scale := 0 - END; - IF (tag.typ.sysflag = interface) & (y.mode = Ind) THEN y.offset := 4 * x.offset - ELSIF tag.typ.untagged THEN DevCPM.err(140) - ELSE - IF x.obj.link.typ.sysflag = interface THEN (* correct method number *) - x.offset := numPreIntProc + NumOfIntProc(tag.typ) - 1 - x.offset - END; - INC(y.offset, Mth0Offset - 4 * x.offset) - END; - DevCPL486.GenCall(y); Free(y) - ELSIF x.mode = CProc THEN - IF x.obj.link # NIL THEN (* tag = first param *) - IF x.obj.link.mode = VarPar THEN - GetAdr(tag, {}, wreg - {AX} + {stk, mem, con}); Free(tag) - ELSE - (* Load(tag, {}, wreg - {AX} + {con}); Free(tag) *) - Result(x.obj.link, tag) (* use result load for first parameter *) - END - END; - i := 1; n := ORD(x.obj.conval.ext^[0]); - WHILE i <= n DO DevCPL486.GenCode(ORD(x.obj.conval.ext^[i])); INC(i) END - ELSE (* proc var *) - DevCPL486.GenCall(x); Free(x); - IF x.typ.sysflag = ccall THEN (* remove parameters *) - p := x.typ.link; n := 0; - WHILE p # NIL DO - IF p.mode = VarPar THEN INC(n, 4) - ELSE INC(n, (p.typ.size + 3) DIV 4 * 4) - END; - p := p.link - END; - AdjustStack(n) - END; - x.typ := x.typ.BaseTyp - END; - IF procedureUsesFpu & (x.mode = XProc) & (x.obj.mnolev < 0) & (x.obj.mnolev > -128) - & ((x.obj.library # NIL) OR (DevCPT.GlbMod[-x.obj.mnolev].library # NIL)) THEN (* restore fpu *) - InitFpu - END; - CheckReg; - IF x.typ.form = Int64 THEN - GetReg(x, Int32, {}, wreg - {AX}); GetReg(y, Int32, {}, wreg - {DX}); - x.index := y.reg; x.form := Int64 - ELSIF x.typ.form # NoTyp THEN GetReg(x, x.typ.form, {}, wreg - {AX} + {high}) - END - END Call; - - PROCEDURE CopyDynArray* (adr: INTEGER; typ: DevCPT.Struct); (* needs CX, SI, DI *) - VAR len, ptr, c, sp, src, dst: DevCPL486.Item; bt: DevCPT.Struct; - BEGIN - IF typ.untagged THEN DevCPM.err(-137) END; - ptr.mode := Ind; ptr.reg := BP; ptr.offset := adr+4; ptr.scale := 0; ptr.form := Pointer; - DevCPL486.MakeReg(len, CX, Int32); DevCPL486.MakeReg(sp, SP, Int32); - DevCPL486.MakeReg(src, SI, Int32); DevCPL486.MakeReg(dst, DI, Int32); - DevCPL486.GenMove(ptr, len); bt := typ.BaseTyp; - WHILE bt.comp = DynArr DO - INC(ptr.offset, 4); DevCPL486.GenMul(ptr, len, FALSE); bt := bt.BaseTyp - END; - ptr.offset := adr; DevCPL486.GenMove(ptr, src); - DevCPL486.MakeConst(c, bt.size, Int32); DevCPL486.GenMul(c, len, FALSE); - (* CX = length in bytes *) - StackAlloc; - (* CX = length in 32bit words *) - DevCPL486.GenMove(sp, dst); DevCPL486.GenMove(dst, ptr); - DevCPL486.GenBlockMove(4, 0) (* 32bit moves *) - END CopyDynArray; - - PROCEDURE Sort (VAR tab: ARRAY OF INTEGER; VAR n: INTEGER); - VAR i, j, x: INTEGER; - BEGIN - (* align *) - i := 1; - WHILE i < n DO - x := tab[i]; j := i-1; - WHILE (j >= 0) & (tab[j] < x) DO tab[j+1] := tab[j]; DEC(j) END; - tab[j+1] := x; INC(i) - END; - (* eliminate equals *) - i := 1; j := 1; - WHILE i < n DO - IF tab[i] # tab[i-1] THEN tab[j] := tab[i]; INC(j) END; - INC(i) - END; - n := j - END Sort; - - PROCEDURE FindPtrs (typ: DevCPT.Struct; adr: INTEGER; VAR num: INTEGER); - VAR fld: DevCPT.Object; btyp: DevCPT.Struct; i, n: INTEGER; - BEGIN - IF typ.form IN {Pointer, ProcTyp} THEN - IF num < MaxPtrs THEN ptrTab[num] := adr DIV 4 * 4 END; - INC(num); - IF adr MOD 4 # 0 THEN - IF num < MaxPtrs THEN ptrTab[num] := adr DIV 4 * 4 + 4 END; - INC(num) - END - ELSIF typ.comp = Record THEN - btyp := typ.BaseTyp; - IF btyp # NIL THEN FindPtrs(btyp, adr, num) END ; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF (fld.name^ = DevCPM.HdPtrName) OR - (fld.name^ = DevCPM.HdUtPtrName) OR - (fld.name^ = DevCPM.HdProcName) THEN - FindPtrs(DevCPT.sysptrtyp, fld.adr + adr, num) - ELSE FindPtrs(fld.typ, fld.adr + adr, num) - END; - fld := fld.link - END - ELSIF typ.comp = Array THEN - btyp := typ.BaseTyp; n := typ.n; - WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ; - IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN - i := num; FindPtrs(btyp, adr, num); - IF num # i THEN i := 1; - WHILE (i < n) & (num <= MaxPtrs) DO - INC(adr, btyp.size); FindPtrs(btyp, adr, num); INC(i) - END - END - END - END - END FindPtrs; - - PROCEDURE InitOutPar (par: DevCPT.Object; VAR zreg: DevCPL486.Item); - VAR x, y, c, len: DevCPL486.Item; lbl: DevCPL486.Label; size, s: INTEGER; bt: DevCPT.Struct; - BEGIN - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; x.offset := par.adr; - DevCPL486.MakeReg(y, DI, Int32); - IF par.typ.comp # DynArr THEN - DevCPL486.GenMove(x, y); - lbl := DevCPL486.NewLbl; - IF ODD(par.sysflag DIV nilBit) THEN - DevCPL486.GenComp(zreg, y); - DevCPL486.GenJump(ccE, lbl, TRUE) - END; - size := par.typ.size; - IF size <= 16 THEN - x.mode := Ind; x.reg := DI; x.form := Int32; x.offset := 0; - WHILE size > 0 DO - IF size = 1 THEN x.form := Int8; s := 1 - ELSIF size = 2 THEN x.form := Int16; s := 2 - ELSE x.form := Int32; s := 4 - END; - zreg.form := x.form; DevCPL486.GenMove(zreg, x); INC(x.offset, s); DEC(size, s) - END; - zreg.form := Int32 - ELSE - DevCPL486.GenBlockStore(1, size) - END; - DevCPL486.SetLabel(lbl) - ELSIF initializeDyn & ~par.typ.untagged THEN (* untagged open arrays not initialized !!! *) - DevCPL486.GenMove(x, y); - DevCPL486.MakeReg(len, CX, Int32); - INC(x.offset, 4); DevCPL486.GenMove(x, len); (* first len *) - bt := par.typ.BaseTyp; - WHILE bt.comp = DynArr DO - INC(x.offset, 4); DevCPL486.GenMul(x, len, FALSE); bt := bt.BaseTyp - END; - size := bt.size; - IF size MOD 4 = 0 THEN size := size DIV 4; s := 4 - ELSIF size MOD 2 = 0 THEN size := size DIV 2; s := 2 - ELSE s := 1 - END; - DevCPL486.MakeConst(c, size, Int32); DevCPL486.GenMul(c, len, FALSE); - DevCPL486.GenBlockStore(s, 0) - END - END InitOutPar; - - PROCEDURE AllocAndInitAll (proc: DevCPT.Object; adr, size: INTEGER; VAR nofptrs: INTEGER); - VAR x, y, z, zero: DevCPL486.Item; par: DevCPT.Object; op: INTEGER; - BEGIN - op := 0; par := proc.link; - WHILE par # NIL DO (* count out parameters [with COM pointers] *) - IF (par.mode = VarPar) & (par.vis = outPar) & (initializeOut OR ContainsIPtrs(par.typ)) THEN INC(op) END; - par := par.link - END; - DevCPL486.MakeConst(zero, 0, Int32); - IF (op = 0) & (size <= 8) THEN (* use PUSH 0 *) - WHILE size > 0 DO DevCPL486.GenPush(zero); DEC(size, 4) END - ELSE - DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(zero, z); - IF size <= 32 THEN (* use PUSH reg *) - WHILE size > 0 DO DevCPL486.GenPush(z); DEC(size, 4) END - ELSE (* use string store *) - AdjustStack(-size); - DevCPL486.MakeReg(x, SP, Int32); DevCPL486.MakeReg(y, DI, Int32); DevCPL486.GenMove(x, y); - DevCPL486.GenBlockStore(1, size) - END; - IF op > 0 THEN - par := proc.link; - WHILE par # NIL DO (* init out parameters [with COM pointers] *) - IF (par.mode = VarPar) & (par.vis = outPar) & (initializeOut OR ContainsIPtrs(par.typ)) THEN InitOutPar(par, z) END; - par := par.link - END - END - END - END AllocAndInitAll; - - PROCEDURE AllocAndInitPtrs1 (proc: DevCPT.Object; adr, size: INTEGER; VAR nofptrs: INTEGER); (* needs AX *) - VAR i, base, a, gaps: INTEGER; x, z: DevCPL486.Item; obj: DevCPT.Object; - BEGIN - IF ptrinit & (proc.scope # NIL) THEN - nofptrs := 0; obj := proc.scope.scope; (* local variables *) - WHILE (obj # NIL) & (nofptrs <= MaxPtrs) DO - FindPtrs(obj.typ, obj.adr, nofptrs); - obj := obj.link - END; - IF (nofptrs > 0) & (nofptrs <= MaxPtrs) THEN - base := proc.conval.intval2; - Sort(ptrTab, nofptrs); i := 0; a := size + base; gaps := 0; - WHILE i < nofptrs DO - DEC(a, 4); - IF a # ptrTab[i] THEN a := ptrTab[i]; INC(gaps) END; - INC(i) - END; - IF a # base THEN INC(gaps) END; - IF (gaps <= (nofptrs + 1) DIV 2) & (size < stackAllocLimit) THEN - DevCPL486.MakeConst(z, 0, Pointer); - IF (nofptrs > 4) THEN x := z; DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(x, z) END; - i := 0; a := size + base; - WHILE i < nofptrs DO - DEC(a, 4); - IF a # ptrTab[i] THEN AdjustStack(ptrTab[i] - a); a := ptrTab[i] END; - DevCPL486.GenPush(z); INC(i) - END; - IF a # base THEN AdjustStack(base - a) END - ELSE - AdjustStack(-size); - DevCPL486.MakeConst(x, 0, Pointer); DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(x, z); - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; i := 0; - WHILE i < nofptrs DO - x.offset := ptrTab[i]; DevCPL486.GenMove(z, x); INC(i) - END - END - ELSE - AdjustStack(-size) - END - ELSE - nofptrs := 0; - AdjustStack(-size) - END - END AllocAndInitPtrs1; - - PROCEDURE InitPtrs2 (proc: DevCPT.Object; adr, size, nofptrs: INTEGER); (* needs AX, CX, DI *) - VAR x, y, z, zero: DevCPL486.Item; obj: DevCPT.Object; zeroed: BOOLEAN; i: INTEGER; lbl: DevCPL486.Label; - BEGIN - IF ptrinit THEN - zeroed := FALSE; DevCPL486.MakeConst(zero, 0, Pointer); - IF nofptrs > MaxPtrs THEN - DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(zero, z); zeroed := TRUE; - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; x.offset := adr; - DevCPL486.MakeReg(y, DI, Int32); DevCPL486.GenLoadAdr(x, y); - DevCPL486.GenStrStore(size) - END; - obj := proc.link; (* parameters *) - WHILE obj # NIL DO - IF (obj.mode = VarPar) & (obj.vis = outPar) THEN - nofptrs := 0; - IF obj.typ.comp = DynArr THEN (* currently not initialized *) - ELSE FindPtrs(obj.typ, 0, nofptrs) - END; - IF nofptrs > 0 THEN - IF ~zeroed THEN - DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(zero, z); zeroed := TRUE - END; - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; x.offset := obj.adr; - DevCPL486.MakeReg(y, DI, Int32); DevCPL486.GenMove(x, y); - IF ODD(obj.sysflag DIV nilBit) THEN - DevCPL486.GenComp(zero, y); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE) - END; - IF nofptrs > MaxPtrs THEN - DevCPL486.GenStrStore(obj.typ.size) - ELSE - Sort(ptrTab, nofptrs); - x.reg := DI; i := 0; - WHILE i < nofptrs DO - x.offset := ptrTab[i]; DevCPL486.GenMove(z, x); INC(i) - END - END; - IF ODD(obj.sysflag DIV nilBit) THEN DevCPL486.SetLabel(lbl) END - END - END; - obj := obj.link - END - END - END InitPtrs2; - - PROCEDURE NeedOutPtrInit (proc: DevCPT.Object): BOOLEAN; - VAR obj: DevCPT.Object; nofptrs: INTEGER; - BEGIN - IF ptrinit THEN - obj := proc.link; - WHILE obj # NIL DO - IF (obj.mode = VarPar) & (obj.vis = outPar) THEN - nofptrs := 0; - IF obj.typ.comp = DynArr THEN (* currently not initialized *) - ELSE FindPtrs(obj.typ, 0, nofptrs) - END; - IF nofptrs > 0 THEN RETURN TRUE END - END; - obj := obj.link - END - END; - RETURN FALSE - END NeedOutPtrInit; - - PROCEDURE Enter* (proc: DevCPT.Object; empty, useFpu: BOOLEAN); - VAR sp, fp, r, r1: DevCPL486.Item; par: DevCPT.Object; adr, size, np: INTEGER; - BEGIN - procedureUsesFpu := useFpu; - SetReg({AX, CX, DX, SI, DI}); - DevCPL486.MakeReg(fp, BP, Pointer); DevCPL486.MakeReg(sp, SP, Pointer); - IF proc # NIL THEN (* enter proc *) - DevCPL486.SetLabel(proc.adr); - IF (~empty OR NeedOutPtrInit(proc)) & (proc.sysflag # noframe) THEN - DevCPL486.GenPush(fp); - DevCPL486.GenMove(sp, fp); - adr := proc.conval.intval2; size := -adr; - IF isGuarded IN proc.conval.setval THEN - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, DI, Pointer); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, SI, Pointer); DevCPL486.GenPush(r); - r1.mode := Con; r1.form := Int32; r1.offset := proc.conval.intval - 8; r1.obj := NIL; - DevCPL486.GenPush(r1); - intHandler.used := TRUE; - r1.mode := Con; r1.form := Int32; r1.offset := 0; r1.obj := intHandler; - DevCPL486.GenPush(r1); - r1.mode := Abs; r1.form := Int32; r1.offset := 0; r1.scale := 0; r1.obj := NIL; - DevCPL486.GenCode(64H); DevCPL486.GenPush(r1); - DevCPL486.GenCode(64H); DevCPL486.GenMove(sp, r1); - DEC(size, 24) - ELSE - IF imVar IN proc.conval.setval THEN (* set down pointer *) - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenPush(r); DEC(size, 4) - END; - IF isCallback IN proc.conval.setval THEN - DevCPL486.MakeReg(r, DI, Pointer); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, SI, Pointer); DevCPL486.GenPush(r); DEC(size, 8) - END - END; - ASSERT(size >= 0); - IF initializeAll THEN - AllocAndInitAll(proc, adr, size, np) - ELSE - AllocAndInitPtrs1(proc, adr, size, np); (* needs AX *) - InitPtrs2(proc, adr, size, np); (* needs AX, CX, DI *) - END; - par := proc.link; (* parameters *) - WHILE par # NIL DO - IF (par.mode = Var) & (par.typ.comp = DynArr) THEN - CopyDynArray(par.adr, par.typ) - END; - par := par.link - END; - IF imVar IN proc.conval.setval THEN - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenMove(fp, r) - END - END - ELSIF ~empty THEN (* enter module *) - DevCPL486.GenPush(fp); - DevCPL486.GenMove(sp, fp); - DevCPL486.MakeReg(r, DI, Int32); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, SI, Int32); DevCPL486.GenPush(r) - END; - IF useFpu THEN InitFpu END - END Enter; - - PROCEDURE Exit* (proc: DevCPT.Object; empty: BOOLEAN); - VAR sp, fp, r, x: DevCPL486.Item; mode: SHORTINT; size: INTEGER; - BEGIN - DevCPL486.MakeReg(sp, SP, Pointer); DevCPL486.MakeReg(fp, BP, Pointer); - IF proc # NIL THEN (* exit proc *) - IF proc.sysflag # noframe THEN - IF ~empty OR NeedOutPtrInit(proc) THEN - IF isGuarded IN proc.conval.setval THEN (* remove exception frame *) - x.mode := Ind; x.reg := BP; x.offset := -24; x.scale := 0; x.form := Int32; - DevCPL486.MakeReg(r, CX, Int32); DevCPL486.GenMove(x, r); - x.mode := Abs; x.offset := 0; x.scale := 0; x.form := Int32; x.obj := NIL; - DevCPL486.GenCode(64H); DevCPL486.GenMove(r, x); - size := 12 - ELSE - size := 0; - IF imVar IN proc.conval.setval THEN INC(size, 4) END; - IF isCallback IN proc.conval.setval THEN INC(size, 8) END - END; - IF size > 0 THEN - x.mode := Ind; x.reg := BP; x.offset := -size; x.scale := 0; x.form := Int32; - DevCPL486.GenLoadAdr(x, sp); - IF size > 4 THEN - DevCPL486.MakeReg(r, SI, Int32); DevCPL486.GenPop(r); - DevCPL486.MakeReg(r, DI, Int32); DevCPL486.GenPop(r) - END; - IF size # 8 THEN - DevCPL486.MakeReg(r, BX, Int32); DevCPL486.GenPop(r) - END - ELSE - DevCPL486.GenMove(fp, sp) - END; - DevCPL486.GenPop(fp) - END; - IF proc.sysflag = ccall THEN DevCPL486.GenReturn(0) - ELSE DevCPL486.GenReturn(proc.conval.intval - 8) - END - END - ELSE (* exit module *) - IF ~empty THEN - DevCPL486.MakeReg(r, SI, Int32); DevCPL486.GenPop(r); - DevCPL486.MakeReg(r, DI, Int32); DevCPL486.GenPop(r); - DevCPL486.GenMove(fp, sp); DevCPL486.GenPop(fp) - END; - DevCPL486.GenReturn(0) - END - END Exit; - - PROCEDURE InstallStackAlloc*; - VAR name: ARRAY 32 OF SHORTCHAR; ax, cx, sp, c, x: DevCPL486.Item; l1, l2: DevCPL486.Label; - BEGIN - IF stkAllocLbl # DevCPL486.NewLbl THEN - DevCPL486.SetLabel(stkAllocLbl); - DevCPL486.MakeReg(ax, AX, Int32); - DevCPL486.MakeReg(cx, CX, Int32); - DevCPL486.MakeReg(sp, SP, Int32); - DevCPL486.GenPush(ax); - DevCPL486.MakeConst(c, -5, Int32); DevCPL486.GenAdd(c, cx, FALSE); - l1 := DevCPL486.NewLbl; DevCPL486.GenJump(ccNS, l1, TRUE); - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenMove(c, cx); - DevCPL486.SetLabel(l1); - DevCPL486.MakeConst(c, -4, Int32); DevCPL486.GenAnd(c, cx); - DevCPL486.GenMove(cx, ax); - DevCPL486.MakeConst(c, 4095, Int32); DevCPL486.GenAnd(c, ax); - DevCPL486.GenSub(ax, sp, FALSE); - DevCPL486.GenMove(cx, ax); - DevCPL486.MakeConst(c, 12, Int32); DevCPL486.GenShiftOp(SHR, c, ax); - l2 := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, l2, TRUE); - l1 := DevCPL486.NewLbl; DevCPL486.SetLabel(l1); - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenPush(c); - DevCPL486.MakeConst(c, 4092, Int32); DevCPL486.GenSub(c, sp, FALSE); - DevCPL486.MakeConst(c, -1, Int32); DevCPL486.GenAdd(c, ax, FALSE); - DevCPL486.GenJump(ccNE, l1, TRUE); - DevCPL486.SetLabel(l2); - DevCPL486.MakeConst(c, 8, Int32); DevCPL486.GenAdd(c, cx, FALSE); - x.mode := Ind; x.form := Int32; x.offset := -4; x.index := CX; x.reg := SP; x.scale := 1; - DevCPL486.GenMove(x, ax); - DevCPL486.GenPush(ax); - DevCPL486.GenMove(x, ax); - DevCPL486.MakeConst(c, 2, Int32); DevCPL486.GenShiftOp(SHR, c, cx); - DevCPL486.GenReturn(0); - name := "$StackAlloc"; DevCPE.OutRefName(name); - END - END InstallStackAlloc; - - PROCEDURE Trap* (n: INTEGER); - BEGIN - DevCPL486.GenAssert(ccNever, n) - END Trap; - - PROCEDURE Jump* (VAR L: DevCPL486.Label); - BEGIN - DevCPL486.GenJump(ccAlways, L, FALSE) - END Jump; - - PROCEDURE JumpT* (VAR x: DevCPL486.Item; VAR L: DevCPL486.Label); - BEGIN - DevCPL486.GenJump(x.offset, L, FALSE); - END JumpT; - - PROCEDURE JumpF* (VAR x: DevCPL486.Item; VAR L: DevCPL486.Label); - BEGIN - DevCPL486.GenJump(Inverted(x.offset), L, FALSE); - END JumpF; - - PROCEDURE CaseTableJump* (VAR x: DevCPL486.Item; low, high: INTEGER; VAR else: DevCPL486.Label); - VAR c: DevCPL486.Item; n: INTEGER; - BEGIN - n := high - low + 1; - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenSub(c, x, FALSE); - DevCPL486.MakeConst(c, n, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccAE, else, FALSE); - DevCPL486.GenCaseJump(x) - END CaseTableJump; - - PROCEDURE CaseJump* (VAR x: DevCPL486.Item; low, high: INTEGER; VAR this, else: DevCPL486.Label; tree, first: BOOLEAN); - VAR c: DevCPL486.Item; - BEGIN - IF high = low THEN - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenComp(c, x); - IF tree THEN DevCPL486.GenJump(ccG, else, FALSE) END; - DevCPL486.GenJump(ccE, this, FALSE) - ELSIF first THEN - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccL, else, FALSE); - DevCPL486.MakeConst(c, high, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccLE, this, FALSE); - ELSE - DevCPL486.MakeConst(c, high, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccG, else, FALSE); - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccGE, this, FALSE); - END - END CaseJump; - -BEGIN - imLevel[0] := 0 -END DevCPC486. diff --git a/new/Dev/Mod/CPE.odc b/new/Dev/Mod/CPE.odc new file mode 100644 index 0000000000000000000000000000000000000000..f5992b5e164cf23256ee4b9b5d62fc729958bd8d GIT binary patch literal 39821 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 MAX(INTEGER) + 1.0 THEN rh := rh - 1; rl := rl + N - ELSIF rh < MIN(INTEGER) THEN rh := rh + 1; rl := rl - N - END; - hi := SHORT(ENTIER(rh)); - rl := rl + (rh - hi) * N; - IF rl < 0 THEN hi := hi - 1; rl := rl + N - ELSIF rl >= N THEN hi := hi + 1; rl := rl - N - END; - IF rl >= MAX(INTEGER) + 1.0 THEN rl := rl - N END; - low := SHORT(ENTIER(rl)) -(* - hi := SHORT(ENTIER((con.realval + con.intval) / 4294967296.0)); - r := con.realval + con.intval - hi * 4294967296.0; - IF r > MAX(INTEGER) THEN r := r - 4294967296.0 END; - low := SHORT(ENTIER(r)) -*) - END GetLongWords; - - PROCEDURE GetRealWord* (con: DevCPT.Const; OUT x: INTEGER); - VAR r: SHORTREAL; - BEGIN - r := SHORT(con.realval); x := SYSTEM.VAL(INTEGER, r) - END GetRealWord; - - PROCEDURE GetRealWords* (con: DevCPT.Const; OUT hi, low: INTEGER); - TYPE A = ARRAY 2 OF INTEGER; - VAR a: A; - BEGIN - a := SYSTEM.VAL(A, con.realval); - IF DevCPM.LEHost THEN hi := a[1]; low := a[0] ELSE hi := a[0]; low := a[1] END - END GetRealWords; - - PROCEDURE IsSame (x, y: REAL): BOOLEAN; - BEGIN - RETURN (x = y) & ((x # 0.) OR (1. / x = 1. / y)) - END IsSame; - - PROCEDURE AllocConst* (con: DevCPT.Const; form: BYTE; VAR obj: DevCPT.Object; VAR adr: INTEGER); - VAR c: DevCPT.Const; - BEGIN - INCL(con.setval, form); - CASE form OF - | String8: - obj := Const8; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval2 # c.intval2) OR (con.ext^ # c.ext^)) DO c := c.link END; - IF c = NIL THEN adr := idx8; INC(idx8, (con.intval2 + 3) DIV 4 * 4) END - | String16: - obj := Const16; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval2 # c.intval2) OR (con.ext^ # c.ext^)) DO c := c.link END; - IF c = NIL THEN adr := idx16; INC(idx16, (con.intval2 + 1) DIV 2 * 4) END - | Int64: - obj := Const64; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval # c.intval2) OR (con.realval # c.realval)) DO - c := c.link - END; - IF c = NIL THEN con.intval2 := con.intval; adr := idx64; INC(idx64, 8) END - | Real32: - obj := Const32; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR ~IsSame(con.realval, c.realval)) DO c := c.link END; - IF c = NIL THEN adr := idx32; INC(idx32, 4) END - | Real64: - obj := Const64; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR ~IsSame(con.realval, c.realval)) DO c := c.link END; - IF c = NIL THEN adr := idx64; INC(idx64, 8) END - | Guid: - obj := Const32; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval2 # c.intval2) OR (con.ext^ # c.ext^)) DO c := c.link END; - IF c = NIL THEN adr := idx32; INC(idx32, 16) END - END; - IF c = NIL THEN con.link := obj.conval; obj.conval := con ELSE adr := c.intval END; - con.intval := adr - END AllocConst; - - - PROCEDURE AllocTypDesc* (typ: DevCPT.Struct); (* typ.comp = Record *) - VAR obj: DevCPT.Object; name: DevCPT.Name; - BEGIN - IF typ.strobj = NIL THEN - name := "@"; DevCPT.Insert(name, obj); obj.name := DevCPT.null; (* avoid err 1 *) - obj.mode := Typ; obj.typ := typ; typ.strobj := obj - END - END AllocTypDesc; - - - PROCEDURE PutByte* (a, x: INTEGER); - BEGIN - code[a DIV CodeLength]^[a MOD CodeLength] := SHORT(CHR(x MOD 256)) - END PutByte; - - PROCEDURE PutShort* (a, x: INTEGER); - BEGIN - IF bigEndian THEN - PutByte(a, x DIV 256); PutByte(a + 1, x) - ELSE - PutByte(a, x); PutByte(a + 1, x DIV 256) - END - END PutShort; - - PROCEDURE PutWord* (a, x: INTEGER); - BEGIN - IF bigEndian THEN - PutByte(a, x DIV 1000000H); PutByte(a + 1, x DIV 10000H); - PutByte(a + 2, x DIV 256); PutByte(a + 3, x) - ELSE - PutByte(a, x); PutByte(a + 1, x DIV 256); - PutByte(a + 2, x DIV 10000H); PutByte(a + 3, x DIV 1000000H) - END - END PutWord; - - PROCEDURE ThisByte* (a: INTEGER): INTEGER; - BEGIN - RETURN ORD(code[a DIV CodeLength]^[a MOD CodeLength]) - END ThisByte; - - PROCEDURE ThisShort* (a: INTEGER): INTEGER; - BEGIN - IF bigEndian THEN - RETURN ThisByte(a) * 256 + ThisByte(a+1) - ELSE - RETURN ThisByte(a+1) * 256 + ThisByte(a) - END - END ThisShort; - - PROCEDURE ThisWord* (a: INTEGER): INTEGER; - BEGIN - IF bigEndian THEN - RETURN ((ThisByte(a) * 256 + ThisByte(a+1)) * 256 + ThisByte(a+2)) * 256 + ThisByte(a+3) - ELSE - RETURN ((ThisByte(a+3) * 256 + ThisByte(a+2)) * 256 + ThisByte(a+1)) * 256 + ThisByte(a) - END - END ThisWord; - - PROCEDURE GenByte* (x: INTEGER); - BEGIN - IF actIdx >= CodeLength THEN - IF blkIdx < CodeBlocks THEN - NEW(actual); code[blkIdx] := actual; INC(blkIdx); actIdx := 0 - ELSE - IF ~CodeOvF THEN DevCPM.err(210); CodeOvF := TRUE END; - actIdx := 0; pc := 0 - END - END; - actual^[actIdx] := SHORT(CHR(x MOD 256)); INC(actIdx); INC(pc) - END GenByte; - - PROCEDURE GenShort* (x: INTEGER); - BEGIN - IF bigEndian THEN - GenByte(x DIV 256); GenByte(x) - ELSE - GenByte(x); GenByte(x DIV 256) - END - END GenShort; - - PROCEDURE GenWord* (x: INTEGER); - BEGIN - IF bigEndian THEN - GenByte(x DIV 1000000H); GenByte(x DIV 10000H); GenByte(x DIV 256); GenByte(x) - ELSE - GenByte(x); GenByte(x DIV 256); GenByte(x DIV 10000H); GenByte(x DIV 1000000H) - END - END GenWord; - - PROCEDURE WriteCode; - VAR i, j, k, n: INTEGER; b: CodeBlock; - BEGIN - j := 0; k := 0; - WHILE j < pc DO - n := pc - j; i := 0; b := code[k]; - IF n > CodeLength THEN n := CodeLength END; - WHILE i < n DO DevCPM.ObjW(b^[i]); INC(i) END; - INC(j, n); INC(k) - END - END WriteCode; - - - PROCEDURE OffsetLink* (obj: DevCPT.Object; offs: INTEGER): DevCPT.LinkList; - VAR link: DevCPT.LinkList; m: DevCPT.Object; - BEGIN - ASSERT((obj.mode # Typ) OR (obj.typ # DevCPT.int32typ)); - ASSERT((obj.mode # Typ) OR (obj.typ # DevCPT.iunktyp) & (obj.typ # DevCPT.guidtyp)); - IF obj.mnolev >= 0 THEN (* not imported *) - CASE obj.mode OF - | Typ: IF obj.links = NIL THEN obj.link := descList; descList := obj END - | TProc: IF obj.adr = -1 THEN obj := obj.nlink ELSE offs := offs + obj.adr; obj := Code END - | Var: offs := offs + dsize; obj := Data - | Con, IProc, XProc, LProc: - END - ELSIF obj.mode = Typ THEN - IF obj.typ.untagged THEN (* add desc for imported untagged types *) - IF obj.links = NIL THEN obj.link := descList; descList := obj END - ELSE - m := DevCPT.GlbMod[-obj.mnolev]; - IF m.library # NIL THEN RETURN NIL END (* type import from dll *) - END - END; - link := obj.links; - WHILE (link # NIL) & (link.offset # offs) DO link := link.next END; - IF link = NIL THEN - NEW(link); link.offset := offs; link.linkadr := 0; - link.next := obj.links; obj.links := link - END; - RETURN link - END OffsetLink; - - - PROCEDURE TypeObj* (typ: DevCPT.Struct): DevCPT.Object; - VAR obj: DevCPT.Object; - BEGIN - obj := typ.strobj; - IF obj = NIL THEN - obj := DevCPT.NewObj(); obj.leaf := TRUE; obj.mnolev := 0; - obj.name := DevCPT.null; obj.mode := Typ; obj.typ := typ; typ.strobj := obj - END; - RETURN obj - END TypeObj; - - - PROCEDURE Align (n: INTEGER); - VAR p: INTEGER; - BEGIN - p := DevCPM.ObjLen(); - DevCPM.ObjWBytes(zero, (-p) MOD n) - END Align; - - PROCEDURE OutName (VAR name: ARRAY OF SHORTCHAR); - VAR ch: SHORTCHAR; i: SHORTINT; - BEGIN i := 0; - REPEAT ch := name[i]; DevCPM.ObjW(ch); INC(i) UNTIL ch = 0X - END OutName; - - PROCEDURE Out2 (x: INTEGER); (* byte ordering must correspond to target machine *) - BEGIN - IF bigEndian THEN - DevCPM.ObjW(SHORT(CHR(x DIV 256))); DevCPM.ObjW(SHORT(CHR(x))) - ELSE - DevCPM.ObjW(SHORT(CHR(x))); DevCPM.ObjW(SHORT(CHR(x DIV 256))) - END - END Out2; - - PROCEDURE Out4 (x: INTEGER); (* byte ordering must correspond to target machine *) - BEGIN - IF bigEndian THEN - DevCPM.ObjW(SHORT(CHR(x DIV 1000000H))); DevCPM.ObjW(SHORT(CHR(x DIV 10000H))); - DevCPM.ObjW(SHORT(CHR(x DIV 256))); DevCPM.ObjW(SHORT(CHR(x))) - ELSE - DevCPM.ObjWLInt(x) - END - END Out4; - - PROCEDURE OutReference (obj: DevCPT.Object; offs, typ: INTEGER); - VAR link: DevCPT.LinkList; - BEGIN - link := OffsetLink(obj, offs); - IF link # NIL THEN - Out4(typ * 1000000H + link.linkadr MOD 1000000H); - link.linkadr := -(DevCPM.ObjLen() - headSize - 4) - ELSE Out4(0) - END - END OutReference; - - PROCEDURE FindPtrs (typ: DevCPT.Struct; adr: INTEGER; ip: BOOLEAN; VAR num: INTEGER); - VAR fld: DevCPT.Object; btyp: DevCPT.Struct; i, n: INTEGER; - BEGIN - IF typ.form = Pointer THEN - IF ip & (typ.sysflag = interface) - OR ~ip & ~typ.untagged THEN Out4(adr); INC(num) END - ELSIF (typ.comp = Record) & (typ.sysflag # union) THEN - btyp := typ.BaseTyp; - IF btyp # NIL THEN FindPtrs(btyp, adr, ip, num) END ; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF ip & (fld.name^ = DevCPM.HdUtPtrName) & (fld.sysflag = interface) - OR ~ip & (fld.name^ = DevCPM.HdPtrName) THEN Out4(fld.adr + adr); INC(num) - ELSE FindPtrs(fld.typ, fld.adr + adr, ip, num) - END; - fld := fld.link - END - ELSIF typ.comp = Array THEN - btyp := typ.BaseTyp; n := typ.n; - WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ; - IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN - i := num; FindPtrs(btyp, adr, ip, num); - IF num # i THEN i := 1; - WHILE i < n DO - INC(adr, btyp.size); FindPtrs(btyp, adr, ip, num); INC(i) - END - END - END - END - END FindPtrs; - - - PROCEDURE OutRefName* (VAR name: ARRAY OF SHORTCHAR); - BEGIN - DevCPM.ObjW(0FCX); DevCPM.ObjWNum(pc); OutName(name) - END OutRefName; - - PROCEDURE OutRefs* (obj: DevCPT.Object); - VAR f: BYTE; - BEGIN - IF outRef & (obj # NIL) THEN - OutRefs(obj.left); - IF ((obj.mode = Var) OR (obj.mode = VarPar)) & (obj.history # removed) & (obj.name[0] # "@") THEN - f := obj.typ.form; - IF (f IN {Byte .. Set, Pointer, ProcTyp, Char16, Int64}) - OR outURef & (obj.typ.comp # DynArr) - OR outAllRef & ~obj.typ.untagged - OR (obj.typ.comp = Array) & (obj.typ.BaseTyp.form = Char8) THEN - IF obj.mode = Var THEN DevCPM.ObjW(0FDX) ELSE DevCPM.ObjW(0FFX) END; - IF obj.typ = DevCPT.anyptrtyp THEN DevCPM.ObjW(SHORT(CHR(mAnyPtr))) - ELSIF obj.typ = DevCPT.anytyp THEN DevCPM.ObjW(SHORT(CHR(mAnyRec))) - ELSIF obj.typ = DevCPT.sysptrtyp THEN DevCPM.ObjW(SHORT(CHR(mSysPtr))) - ELSIF f = Char16 THEN DevCPM.ObjW(SHORT(CHR(mChar16))) - ELSIF f = Int64 THEN DevCPM.ObjW(SHORT(CHR(mInt64))) - ELSIF obj.typ = DevCPT.guidtyp THEN DevCPM.ObjW(SHORT(CHR(mGuid))) - ELSIF obj.typ = DevCPT.restyp THEN DevCPM.ObjW(SHORT(CHR(mResult))) - ELSIF f = Pointer THEN - IF obj.typ.sysflag = interface THEN DevCPM.ObjW(SHORT(CHR(mInterface))) - ELSIF obj.typ.untagged THEN DevCPM.ObjW(SHORT(CHR(mSysPtr))) - ELSE DevCPM.ObjW(10X); OutReference(TypeObj(obj.typ), 0, absolute) - END - ELSIF (f = Comp) & outAllRef & (~obj.typ.untagged OR outURef & (obj.typ.comp # DynArr)) THEN - DevCPM.ObjW(10X); OutReference(TypeObj(obj.typ), 0, absolute) - ELSIF f < Int8 THEN DevCPM.ObjW(SHORT(CHR(f - 1))) - ELSE DevCPM.ObjW(SHORT(CHR(f))) - END; - IF obj.mnolev = 0 THEN DevCPM.ObjWNum(obj.adr + dsize) ELSE DevCPM.ObjWNum(obj.adr) END; - OutName(obj.name^) - END - END ; - OutRefs(obj.right) - END - END OutRefs; - - PROCEDURE OutSourceRef* (pos: INTEGER); - BEGIN - IF outSrc & (pos # 0) & (pos # srcPos) & (pc > codePos) THEN - WHILE pc > codePos + 250 DO - DevCPM.ObjW(SHORT(CHR(250))); - INC(codePos, 250); - DevCPM.ObjWNum(0) - END; - DevCPM.ObjW(SHORT(CHR(pc - codePos))); - codePos := pc; - DevCPM.ObjWNum(pos - srcPos); - srcPos := pos - END - END OutSourceRef; - - - PROCEDURE OutPLink (link: DevCPT.LinkList; adr: INTEGER); - BEGIN - WHILE link # NIL DO - ASSERT(link.linkadr # 0); - DevCPM.ObjWNum(link.linkadr); - DevCPM.ObjWNum(adr + link.offset); - link := link.next - END - END OutPLink; - - PROCEDURE OutLink (link: DevCPT.LinkList); - BEGIN - OutPLink(link, 0); DevCPM.ObjW(0X) - END OutLink; - - PROCEDURE OutNames; - VAR a, b, c: DevCPT.Object; - BEGIN - a := nameList; b := NIL; - WHILE a # NIL DO c := a; a := c.nlink; c.nlink := b; b := c END; - DevCPM.ObjW(0X); (* names[0] = 0X *) - WHILE b # NIL DO - OutName(b.name^); - b := b.nlink - END; - END OutNames; - - PROCEDURE OutGuid* (VAR str: ARRAY OF SHORTCHAR); - - PROCEDURE Copy (n: INTEGER); - VAR x, y: INTEGER; - BEGIN - x := ORD(str[n]); y := ORD(str[n + 1]); - IF x >= ORD("a") THEN DEC(x, ORD("a") - 10) - ELSIF x >= ORD("A") THEN DEC(x, ORD("A") - 10) - ELSE DEC(x, ORD("0")) - END; - IF y >= ORD("a") THEN DEC(y, ORD("a") - 10) - ELSIF y >= ORD("A") THEN DEC(y, ORD("A") - 10) - ELSE DEC(y, ORD("0")) - END; - DevCPM.ObjW(SHORT(CHR(x * 16 + y))) - END Copy; - - BEGIN - IF bigEndian THEN - Copy(1); Copy(3); Copy(5); Copy(7); Copy(10); Copy(12); Copy(15); Copy(17) - ELSE - Copy(7); Copy(5); Copy(3); Copy(1); Copy(12); Copy(10); Copy(17); Copy(15) - END; - Copy(20); Copy(22); Copy(25); Copy(27); Copy(29); Copy(31); Copy(33); Copy(35) - END OutGuid; - - PROCEDURE OutConst (obj: DevCPT.Object); - TYPE A4 = ARRAY 4 OF SHORTCHAR; A8 = ARRAY 8 OF SHORTCHAR; - VAR a, b, c: DevCPT.Const; r: SHORTREAL; lr: REAL; a4: A4; a8: A8; ch: SHORTCHAR; i, x, hi, low: INTEGER; - BEGIN - a := obj.conval; b := NIL; - WHILE a # NIL DO c := a; a := c.link; c.link := b; b := c END; - WHILE b # NIL DO - IF String8 IN b.setval THEN - DevCPM.ObjWBytes(b.ext^, b.intval2); - Align(4) - ELSIF String16 IN b.setval THEN - i := 0; REPEAT DevCPM.GetUtf8(b.ext^, x, i); Out2(x) UNTIL x = 0; - Align(4) - ELSIF Real32 IN b.setval THEN - r := SHORT(b.realval); a4 := SYSTEM.VAL(A4, r); - IF DevCPM.LEHost = bigEndian THEN - ch := a4[0]; a4[0] := a4[3]; a4[3] := ch; - ch := a4[1]; a4[1] := a4[2]; a4[2] := ch - END; - DevCPM.ObjWBytes(a4, 4) - ELSIF Real64 IN b.setval THEN - a8 := SYSTEM.VAL(A8, b.realval); - IF DevCPM.LEHost = bigEndian THEN - ch := a8[0]; a8[0] := a8[7]; a8[7] := ch; - ch := a8[1]; a8[1] := a8[6]; a8[6] := ch; - ch := a8[2]; a8[2] := a8[5]; a8[5] := ch; - ch := a8[3]; a8[3] := a8[4]; a8[4] := ch - END; - DevCPM.ObjWBytes(a8, 8) - ELSIF Int64 IN b.setval THEN - (* intval moved to intval2 by AllocConst *) - x := b.intval; b.intval := b.intval2; GetLongWords(b, hi, low); b.intval := x; - IF bigEndian THEN Out4(hi); Out4(low) ELSE Out4(low); Out4(hi) END - ELSIF Guid IN b.setval THEN - OutGuid(b.ext^) - END; - b := b.link - END - END OutConst; - - PROCEDURE OutStruct (typ: DevCPT.Struct; unt: BOOLEAN); - BEGIN - IF typ = NIL THEN Out4(0) - ELSIF typ = DevCPT.sysptrtyp THEN Out4(mSysPtr) - ELSIF typ = DevCPT.anytyp THEN Out4(mAnyRec) - ELSIF typ = DevCPT.anyptrtyp THEN Out4(mAnyPtr) - ELSIF typ = DevCPT.guidtyp THEN Out4(mGuid) - ELSIF typ = DevCPT.restyp THEN Out4(mResult) - ELSE - CASE typ.form OF - | Undef, Byte, String8, NilTyp, NoTyp, String16: Out4(0) - | Bool, Char8: Out4(typ.form - 1) - | Int8..Set: Out4(typ.form) - | Char16: Out4(mChar16) - | Int64: Out4(mInt64) - | ProcTyp: OutReference(TypeObj(typ), 0, absolute) - | Pointer: - IF typ.sysflag = interface THEN Out4(mInterface) - ELSIF typ.untagged THEN Out4(mSysPtr) - ELSE OutReference(TypeObj(typ), 0, absolute) - END - | Comp: - IF ~typ.untagged OR (outURef & unt) THEN OutReference(TypeObj(typ), 0, absolute) - ELSE Out4(0) - END - END - END - END OutStruct; - - PROCEDURE NameIdx (obj: DevCPT.Object): INTEGER; - VAR n: INTEGER; - BEGIN - n := 0; - IF obj.name # DevCPT.null THEN - IF obj.num = 0 THEN - obj.num := namex; - WHILE obj.name[n] # 0X DO INC(n) END; - INC(namex, n + 1); - obj.nlink := nameList; nameList := obj - END; - n := obj.num; - END; - RETURN n - END NameIdx; - - PROCEDURE OutSignature (par: DevCPT.Object; retTyp: DevCPT.Struct; OUT pos: INTEGER); - VAR p: DevCPT.Object; n, m: INTEGER; - BEGIN - pos := DevCPM.ObjLen() - headSize; - OutStruct(retTyp, TRUE); - p := par; n := 0; - WHILE p # NIL DO INC(n); p := p.link END; - Out4(n); p := par; - WHILE p # NIL DO - IF p.mode # VarPar THEN m := mValue - ELSIF p.vis = inPar THEN m := mInPar - ELSIF p.vis = outPar THEN m := mOutPar - ELSE m := mVarPar - END; - Out4(NameIdx(p) * 256 + m); - OutStruct(p.typ, TRUE); - p := p.link - END - END OutSignature; - - PROCEDURE PrepObject (obj: DevCPT.Object); - BEGIN - IF (obj.mode IN {LProc, XProc, IProc}) & outSignatures THEN (* write param list *) - OutSignature(obj.link, obj.typ, obj.conval.intval) - END - END PrepObject; - - PROCEDURE OutObject (mode, fprint, offs: INTEGER; typ: DevCPT.Struct; obj: DevCPT.Object); - VAR vis: INTEGER; - BEGIN - Out4(fprint); - Out4(offs); - IF obj.vis = internal THEN vis := mInternal - ELSIF obj.vis = externalR THEN vis := mReadonly - ELSIF obj.vis = external THEN vis := mExported - END; - Out4(mode + vis * 16 + NameIdx(obj) * 256); - IF (mode = mProc) & outSignatures THEN OutReference(Meta, obj.conval.intval, absolute) (* ref to par list *) - ELSE OutStruct(typ, mode = mField) - END - END OutObject; - - PROCEDURE PrepDesc (desc: DevCPT.Struct); - VAR fld: DevCPT.Object; n: INTEGER; l: DevCPT.LinkList; b: DevCPT.Struct; - BEGIN - IF desc.comp = Record THEN (* write field list *) - desc.strobj.adr := DevCPM.ObjLen() - headSize; - n := 0; fld := desc.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF expAllFields OR (fld.vis # internal) THEN INC(n) END; - fld := fld.link - END; - Out4(n); fld := desc.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF expAllFields OR (fld.vis # internal) THEN - OutObject(mField, 0, fld.adr, fld.typ, fld) - END; - fld := fld.link - END - ELSIF (desc.form = ProcTyp) & outSignatures THEN (* write param list *) - OutSignature(desc.link, desc.BaseTyp, desc.n) - END; - (* assert name and base type are included *) - IF desc.untagged THEN n := NameIdx(untgd) - ELSE n := NameIdx(desc.strobj) - END; - IF desc.form # ProcTyp THEN b := desc.BaseTyp; - IF (b # NIL) & (b # DevCPT.anytyp) & (b # DevCPT.anyptrtyp) & (b.form IN {Pointer, Comp, ProcTyp}) - & (b.sysflag # interface) & (b # DevCPT.guidtyp) - & (~b.untagged OR outURef & (b.form = Comp)) THEN - l := OffsetLink(TypeObj(b), 0) - END - END - END PrepDesc; - - PROCEDURE NumMeth (root: DevCPT.Object; num: INTEGER): DevCPT.Object; - VAR obj: DevCPT.Object; - BEGIN - IF (root = NIL) OR (root.mode = TProc) & (root.num = num) THEN RETURN root END; - obj := NumMeth(root.left, num); - IF obj = NIL THEN obj := NumMeth(root.right, num) END; - RETURN obj - END NumMeth; - - PROCEDURE OutDesc (desc: DevCPT.Struct); - VAR m: DevCPT.Object; i, nofptr, flddir, size: INTEGER; t, xb: DevCPT.Struct; form, lev, attr: BYTE; - name: DevCPT.Name; - BEGIN - ASSERT(~desc.untagged); - IF desc.comp = Record THEN - xb := desc; flddir := desc.strobj.adr; - REPEAT xb := xb.BaseTyp UNTIL (xb = NIL) OR (xb.mno # 0) OR xb.untagged; - Out4(-1); i := desc.n; - WHILE i > 0 DO DEC(i); t := desc; - REPEAT - m := NumMeth(t.link, i); t := t.BaseTyp - UNTIL (m # NIL) OR (t = xb); - IF m # NIL THEN - IF absAttr IN m.conval.setval THEN Out4(0) - ELSE OutReference(m, 0, absolute) - END - ELSIF (xb = NIL) OR xb.untagged THEN Out4(0) (* unimplemented ANYREC method *) - ELSE OutReference(xb.strobj, -4 - 4 * i, copy) - END - END; - desc.strobj.adr := DevCPM.ObjLen() - headSize; (* desc adr *) - Out4(desc.size); - OutReference(Mod, 0, absolute); - IF desc.untagged THEN m := untgd ELSE m := desc.strobj END; - IF desc.attribute = extAttr THEN attr := 1 - ELSIF desc.attribute = limAttr THEN attr := 2 - ELSIF desc.attribute = absAttr THEN attr := 3 - ELSE attr := 0 - END; - Out4(mRecord + attr * 4 + desc.extlev * 16 + NameIdx(m) * 256); i := 0; - WHILE i <= desc.extlev DO - t := desc; - WHILE t.extlev > i DO t := t.BaseTyp END; - IF t.sysflag = interface THEN Out4(0) - ELSIF t.untagged THEN OutReference(TypeObj(t), 0, absolute) - ELSIF (t.mno = 0) THEN OutReference(t.strobj, 0, absolute) - ELSIF t = xb THEN OutReference(xb.strobj, 0, absolute) - ELSE OutReference(xb.strobj, 12 + 4 * i, copy) - END; - INC(i) - END; - WHILE i <= DevCPM.MaxExts DO Out4(0); INC(i) END; - OutReference(Meta, flddir, absolute); (* ref to field list *) - nofptr := 0; FindPtrs(desc, 0, FALSE, nofptr); - Out4(-(4 * nofptr + 4)); - nofptr := 0; FindPtrs(desc, 0, TRUE, nofptr); - Out4(-1) - ELSE - desc.strobj.adr := DevCPM.ObjLen() - headSize; - lev := 0; size := 0; - IF desc.comp = Array THEN - size := desc.n; form := mArray - ELSIF desc.comp = DynArr THEN - form := mArray; lev := SHORT(SHORT(desc.n + 1)) - ELSIF desc.form = Pointer THEN - form := mPointer - ELSE ASSERT(desc.form = ProcTyp); - DevCPM.FPrint(size, XProc); DevCPT.FPrintSign(size, desc.BaseTyp, desc.link); form := mProctyp; - END; - Out4(size); - OutReference(Mod, 0, absolute); - IF desc.untagged THEN m := untgd ELSE m := desc.strobj END; - Out4(form + lev * 16 + NameIdx(m) * 256); - IF desc.form # ProcTyp THEN OutStruct(desc.BaseTyp, TRUE) - ELSIF outSignatures THEN OutReference(Meta, desc.n, absolute) (* ref to par list *) - END - END - END OutDesc; - - PROCEDURE OutModDesc (nofptr, refSize, namePos, ptrPos, expPos, impPos: INTEGER); - VAR i: INTEGER; t: Dates.Time; d: Dates.Date; - BEGIN - Out4(0); (* link *) - Out4(ORD(options)); (* opts *) - Out4(0); (* refcnt *) - Dates.GetDate(d); Dates.GetTime(t); (* compile time *) - Out2(d.year); Out2(d.month); Out2(d.day); - Out2(t.hour); Out2(t.minute); Out2(t.second); - Out4(0); Out4(0); Out4(0); (* load time *) - Out4(0); (* ext *) - IF closeLbl # 0 THEN OutReference(Code, closeLbl, absolute); (* terminator *) - ELSE Out4(0) - END; - Out4(imports); (* nofimps *) - Out4(nofptr); (* nofptrs *) - Out4(pc); (* csize *) - Out4(dsize); (* dsize *) - Out4(refSize); (* rsize *) - OutReference(Code, 0, absolute); (* code *) - OutReference(Data, 0, absolute); (* data *) - OutReference(Meta, 0, absolute); (* refs *) - IF procVarIndirect THEN - OutReference(Proc, 0, absolute); (* procBase *) - ELSE - OutReference(Code, 0, absolute); (* procBase *) - END; - OutReference(Data, 0, absolute); (* varBase *) - OutReference(Meta, namePos, absolute); (* names *) - OutReference(Meta, ptrPos, absolute); (* ptrs *) - OutReference(Meta, impPos, absolute); (* imports *) - OutReference(Meta, expPos, absolute); (* export *) - i := 0; (* name *) - WHILE DevCPT.SelfName[i] # 0X DO DevCPM.ObjW(DevCPT.SelfName[i]); INC(i) END; - DevCPM.ObjW(0X); - Align(4) - END OutModDesc; - - PROCEDURE OutProcTable (obj: DevCPT.Object); (* 68000 *) - BEGIN - IF obj # NIL THEN - OutProcTable(obj.left); - IF obj.mode IN {XProc, IProc} THEN - Out2(4EF9H); OutReference(Code, obj.adr, absolute); Out2(0); - END; - OutProcTable(obj.right); - END; - END OutProcTable; - - PROCEDURE PrepExport (obj: DevCPT.Object); - BEGIN - IF obj # NIL THEN - PrepExport(obj.left); - IF (obj.mode IN {LProc, XProc, IProc}) & (obj.history # removed) & (obj.vis # internal) THEN - PrepObject(obj) - END; - PrepExport(obj.right) - END - END PrepExport; - - PROCEDURE OutExport (obj: DevCPT.Object); - VAR num: INTEGER; - BEGIN - IF obj # NIL THEN - OutExport(obj.left); - IF (obj.history # removed) & ((obj.vis # internal) OR - (obj.mode = Typ) & (obj.typ.strobj = obj) & (obj.typ.form = Comp)) THEN - DevCPT.FPrintObj(obj); - IF obj.mode IN {LProc, XProc, IProc} THEN - IF procVarIndirect THEN - ASSERT(obj.nlink = NIL); - num := obj.num; obj.num := 0; - OutObject(mProc, obj.fprint, num, NIL, obj); - obj.num := num - ELSE - OutObject(mProc, obj.fprint, obj.adr, NIL, obj) - END - ELSIF obj.mode = Var THEN - OutObject(mVar, obj.fprint, dsize + obj.adr, obj.typ, obj) - ELSIF obj.mode = Typ THEN - OutObject(mTyp, obj.typ.pbfp, obj.typ.pvfp, obj.typ, obj) - ELSE ASSERT(obj.mode IN {Con, CProc}); - OutObject(mConst, obj.fprint, 0, NIL, obj) - END - END; - OutExport(obj.right) - END - END OutExport; - - PROCEDURE OutCLinks (obj: DevCPT.Object); - BEGIN - IF obj # NIL THEN - OutCLinks(obj.left); - IF obj.mode IN {LProc, XProc, IProc} THEN OutPLink(obj.links, obj.adr) END; - OutCLinks(obj.right) - END - END OutCLinks; - - PROCEDURE OutCPLinks (obj: DevCPT.Object; base: INTEGER); - BEGIN - IF obj # NIL THEN - OutCPLinks(obj.left, base); - IF obj.mode IN {LProc, XProc, IProc} THEN OutPLink(obj.links, obj.num + base) END; - OutCPLinks(obj.right, base) - END - END OutCPLinks; - - PROCEDURE OutImport (obj: DevCPT.Object); - VAR typ: DevCPT.Struct; strobj: DevCPT.Object; opt: INTEGER; - BEGIN - IF obj # NIL THEN - OutImport(obj.left); - IF obj.mode = Typ THEN typ := obj.typ; - IF obj.used OR - (typ.form IN {Pointer, Comp}) & (typ.strobj = obj) & - ((obj.links # NIL) OR (obj.name # DevCPT.null) & (typ.pvused OR typ.pbused)) THEN - DevCPT.FPrintStr(typ); - DevCPM.ObjW(SHORT(CHR(mTyp))); OutName(obj.name^); - IF obj.used THEN opt := 2 ELSE opt := 0 END; - IF (typ.form = Comp) & ((typ.pvused) OR (obj.name = DevCPT.null)) THEN - DevCPM.ObjWNum(typ.pvfp); DevCPM.ObjW(SHORT(CHR(opt + 1))); - IF obj.history = inconsistent THEN DevCPT.FPrintErr(obj, 249) END - ELSE DevCPM.ObjWNum(typ.pbfp); DevCPM.ObjW(SHORT(CHR(opt))) - END; - OutLink(obj.links) - END - ELSIF obj.used THEN - DevCPT.FPrintObj(obj); - IF obj.mode = Var THEN - DevCPM.ObjW(SHORT(CHR(mVar))); OutName(obj.name^); - DevCPM.ObjWNum(obj.fprint); OutLink(obj.links) - ELSIF obj.mode IN {XProc, IProc} THEN - DevCPM.ObjW(SHORT(CHR(mProc))); OutName(obj.name^); - DevCPM.ObjWNum(obj.fprint); OutLink(obj.links) - ELSE ASSERT(obj.mode IN {Con, CProc}); - DevCPM.ObjW(SHORT(CHR(mConst))); OutName(obj.name^); DevCPM.ObjWNum(obj.fprint) - END - END; - OutImport(obj.right) - END - END OutImport; - - PROCEDURE OutUseBlock; - VAR m, obj: DevCPT.Object; i: INTEGER; - BEGIN - m := dllList; - WHILE m # NIL DO - obj := m.nlink; - WHILE obj # NIL DO - IF obj.mode = Var THEN DevCPM.ObjW(SHORT(CHR(mVar))) - ELSE DevCPM.ObjW(SHORT(CHR(mProc))) - END; - IF obj.entry # NIL THEN OutName(obj.entry^) - ELSE OutName(obj.name^); - END; - DevCPT.FPrintObj(obj); DevCPM.ObjWNum(obj.fprint); OutLink(obj.links); - obj := obj.nlink - END; - DevCPM.ObjW(0X); m := m.link - END; - i := 1; - WHILE i < DevCPT.nofGmod DO - obj := DevCPT.GlbMod[i]; - IF obj.library = NIL THEN OutImport(obj.right); DevCPM.ObjW(0X) END; - INC(i) - END; - END OutUseBlock; - - PROCEDURE CollectDll (obj: DevCPT.Object; mod: DevCPT.String); - VAR name: DevCPT.String; dll: DevCPT.Object; - BEGIN - IF obj # NIL THEN - CollectDll(obj.left, mod); - IF obj.used & (obj.mode IN {Var, XProc, IProc}) THEN - IF obj.library # NIL THEN name := obj.library - ELSE name := mod - END; - dll := dllList; - WHILE (dll # NIL) & (dll.library^ # name^) DO dll := dll.link END; - IF dll = NIL THEN - NEW(dll); dll.library := name; INC(imports); - IF dllList = NIL THEN dllList := dll ELSE dllLast.link := dll END; - dllLast := dll; dll.left := dll; - END; - dll.left.nlink := obj; dll.left := obj - END; - CollectDll(obj.right, mod) - END - END CollectDll; - - PROCEDURE EnumXProc(obj: DevCPT.Object; VAR num: INTEGER); - BEGIN - IF obj # NIL THEN - EnumXProc(obj.left, num); - IF obj.mode IN {XProc, IProc} THEN - obj.num := num; INC(num, 8); - END; - EnumXProc(obj.right, num) - END; - END EnumXProc; - - PROCEDURE OutHeader*; - VAR i: INTEGER; m: DevCPT.Object; - BEGIN - DevCPM.ObjWLInt(processor); (* processor type *) - DevCPM.ObjWLInt(0); DevCPM.ObjWLInt(0); DevCPM.ObjWLInt(0); - DevCPM.ObjWLInt(0); DevCPM.ObjWLInt(0); (* sizes *) - imports := 0; i := 1; - WHILE i < DevCPT.nofGmod DO - m := DevCPT.GlbMod[i]; - IF m.library # NIL THEN (* dll import *) - CollectDll(m.right, m.library); - ELSE INC(imports) (* module import *) - END; - INC(i) - END; - DevCPM.ObjWNum(imports); (* num of import *) - OutName(DevCPT.SelfName); - m := dllList; - WHILE m # NIL DO DevCPM.ObjW("$"); OutName(m.library^); m := m.link END; - i := 1; - WHILE i < DevCPT.nofGmod DO - m := DevCPT.GlbMod[i]; - IF m.library = NIL THEN OutName(m.name^) END; - INC(i) - END; - Align(16); headSize := DevCPM.ObjLen(); - IF procVarIndirect THEN - i := 0; EnumXProc(DevCPT.topScope.right, i) - END - END OutHeader; - - PROCEDURE OutCode*; - VAR i, j, refSize, expPos, ptrPos, impPos, namePos, procPos, - con8Pos, con16Pos, con32Pos, con64Pos, modPos, codePos: INTEGER; - m, obj, dlist: DevCPT.Object; - BEGIN - (* Ref *) - DevCPM.ObjW(0X); (* end mark *) - refSize := DevCPM.ObjLen() - headSize; - (* Export *) - Align(4); - IF outSignatures THEN PrepExport(DevCPT.topScope.right) END; (* procedure signatures *) - Align(8); expPos := DevCPM.ObjLen(); - Out4(0); - OutExport(DevCPT.topScope.right); (* export objects *) - i := DevCPM.ObjLen(); DevCPM.ObjSet(expPos); Out4((i - expPos - 4) DIV 16); DevCPM.ObjSet(i); - (* Pointers *) - ptrPos := DevCPM.ObjLen(); - obj := DevCPT.topScope.scope; nofptrs := 0; - WHILE obj # NIL DO FindPtrs(obj.typ, dsize + obj.adr, FALSE, nofptrs); obj := obj.link END; - obj := DevCPT.topScope.scope; i := 0; - WHILE obj # NIL DO FindPtrs(obj.typ, dsize + obj.adr, TRUE, i); obj := obj.link END; - IF i > 0 THEN Out4(-1); INCL(options, iptrs) END; - (* Prepare Type Descriptors *) - dlist := NIL; - WHILE descList # NIL DO - obj := descList; descList := descList.link; - PrepDesc(obj.typ); - obj.link := dlist; dlist := obj - END; - (* Import List *) - impPos := DevCPM.ObjLen(); i := 0; - WHILE i < imports DO Out4(0); INC(i) END; - (* Names *) - namePos := DevCPM.ObjLen(); OutNames; - (* Const *) - Align(4); con8Pos := DevCPM.ObjLen(); - OutConst(Const8); con16Pos := DevCPM.ObjLen(); - ASSERT(con16Pos MOD 4 = 0); ASSERT(con16Pos - con8Pos = idx8); - OutConst(Const16); con32Pos := DevCPM.ObjLen(); - ASSERT(con32Pos MOD 4 = 0); ASSERT(con32Pos - con16Pos = idx16); - OutConst(Const32); con64Pos := DevCPM.ObjLen(); - ASSERT(con64Pos MOD 4 = 0); ASSERT(con64Pos - con32Pos = idx32); - IF ODD(con64Pos DIV 4) THEN Out4(0); INC(con64Pos, 4) END; - OutConst(Const64); ASSERT(DevCPM.ObjLen() - con64Pos = idx64); - (* Module Descriptor *) - Align(16); modPos := DevCPM.ObjLen(); - OutModDesc(nofptrs, refSize, namePos - headSize, ptrPos - headSize, expPos - headSize, impPos - headSize); - (* Procedure Table *) - procPos := DevCPM.ObjLen(); - OutProcTable(DevCPT.topScope.right); - Out4(0); Out4(0); (* at least one entry in ProcTable *) - Out4(0); (* sentinel *) - (* Type Descriptors *) - obj := dlist; - WHILE obj # NIL DO OutDesc(obj.typ); obj := obj.link END; - (* Code *) - codePos := DevCPM.ObjLen(); WriteCode; - WHILE pc MOD 4 # 0 DO DevCPM.ObjW(90X); INC(pc) END; - (* Fixups *) - OutLink(KNewRec.links); OutLink(KNewArr.links); - (* metalink *) - OutPLink(Const8.links, con8Pos - headSize); - OutPLink(Const16.links, con16Pos - headSize); - OutPLink(Const32.links, con32Pos - headSize); - OutPLink(Const64.links, con64Pos - headSize); - OutLink(Meta.links); - (* desclink *) - obj := dlist; i := modPos - headSize; - WHILE obj # NIL DO OutPLink(obj.links, obj.adr - i); obj.links := NIL; obj := obj.link END; - IF procVarIndirect THEN - OutPLink(Proc.links, procPos - modPos); - OutCPLinks(DevCPT.topScope.right, procPos - modPos) - END; - OutLink(Mod.links); - (* codelink *) - IF ~procVarIndirect THEN OutCLinks(DevCPT.topScope.right) END; - OutPLink(CaseLinks, 0); OutLink(Code.links); - (* datalink *) - OutLink(Data.links); - (* Use *) - OutUseBlock; - (* Header Fixups *) - DevCPM.ObjSet(8); - DevCPM.ObjWLInt(headSize); - DevCPM.ObjWLInt(modPos - headSize); - DevCPM.ObjWLInt(codePos - modPos); - DevCPM.ObjWLInt(pc); - DevCPM.ObjWLInt(dsize); - IF namex > MaxNameTab THEN DevCPM.err(242) END; - IF DevCPM.noerr & outObj THEN DevCPM.RegisterObj END - END OutCode; - - PROCEDURE Init* (proc: INTEGER; opt: SET); - CONST obj = 3; ref = 4; allref = 5; srcpos = 6; bigEnd = 15; pVarInd = 14; - BEGIN - processor := proc; - bigEndian := bigEnd IN opt; procVarIndirect := pVarInd IN opt; - outRef := ref IN opt; outAllRef := allref IN opt; outObj := obj IN opt; - outURef := useAllRef & outAllRef & (DevCPM.comAware IN DevCPM.options); - outSrc := srcpos IN opt; - pc := 0; actIdx := CodeLength; blkIdx := 0; - idx8 := 0; idx16 := 0; idx32 := 0; idx64 := 0; namex := 1; - options := opt * {0..15}; CodeOvF := FALSE; - KNewRec.links := NIL; KNewArr.links := NIL; CaseLinks := NIL; - Const8.links := NIL; Const8.conval := NIL; Const16.links := NIL; Const16.conval := NIL; - Const32.links := NIL; Const32.conval := NIL; Const64.links := NIL; Const64.conval := NIL; - Code.links := NIL; Data.links := NIL; Mod.links := NIL; Proc.links := NIL; Meta.links := NIL; - nameList := NIL; descList := NIL; dllList := NIL; dllLast := NIL; - codePos := 0; srcPos := 0; - NEW(untgd); untgd.name := DevCPT.NewName("!"); - closeLbl := 0 - END Init; - - PROCEDURE Close*; - BEGIN - KNewRec.links := NIL; KNewArr.links := NIL; CaseLinks := NIL; - Const8.links := NIL; Const8.conval := NIL; Const16.links := NIL; Const16.conval := NIL; - Const32.links := NIL; Const32.conval := NIL; Const64.links := NIL; Const64.conval := NIL; - Code.links := NIL; Data.links := NIL; Mod.links := NIL; Proc.links := NIL; Meta.links := NIL; - nameList := NIL; descList := NIL; dllList := NIL; dllLast := NIL; - WHILE blkIdx > 0 DO DEC(blkIdx); code[blkIdx] := NIL END; - actual := NIL; untgd := NIL; - END Close; - -BEGIN - NEW(KNewRec); KNewRec.mnolev := -128; - NEW(KNewArr); KNewArr.mnolev := -128; - NEW(Const8); Const8.mode := Con; Const8.mnolev := 0; - NEW(Const16); Const16.mode := Con; Const16.mnolev := 0; - NEW(Const32); Const32.mode := Con; Const32.mnolev := 0; - NEW(Const64); Const64.mode := Con; Const64.mnolev := 0; - NEW(Code); Code.mode := Con; Code.mnolev := 0; - NEW(Data); Data.mode := Con; Data.mnolev := 0; - NEW(Mod); Mod.mode := Con; Mod.mnolev := 0; - NEW(Proc); Proc.mode := Con; Proc.mnolev := 0; - NEW(Meta); Meta.mode := Con; Mod.mnolev := 0; -END DevCPE. diff --git a/new/Dev/Mod/CPH.odc b/new/Dev/Mod/CPH.odc new file mode 100644 index 0000000000000000000000000000000000000000..70c43c04122fc1edd90de6fb2967a12def52ff87 GIT binary patch literal 12821 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 literal 0 HcmV?d00001 diff --git a/new/Dev/Mod/CPH.txt b/new/Dev/Mod/CPH.txt deleted file mode 100644 index c55a9e6..0000000 --- a/new/Dev/Mod/CPH.txt +++ /dev/null @@ -1,291 +0,0 @@ -MODULE DevCPH; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/CPH.odc *) - (* DO NOT EDIT *) - - IMPORT DevCPT; - - CONST - (* UseCalls options *) - longMop* = 0; longDop* = 1; longConv* = 2; longOdd* = 3; - realMop* = 8; realDop* = 9; realConv* = 10; - intMulDiv* = 11; - force = 16; hide = 17; - - (* nodes classes *) - Nvar = 0; Nvarpar = 1; Nfield = 2; Nderef = 3; Nindex = 4; Nguard = 5; Neguard = 6; - Nconst = 7; Ntype = 8; Nproc = 9; Nupto = 10; Nmop = 11; Ndop = 12; Ncall = 13; - Ninittd = 14; Nif = 15; Ncaselse = 16; Ncasedo = 17; Nenter = 18; Nassign = 19; - Nifelse =20; Ncase = 21; Nwhile = 22; Nrepeat = 23; Nloop = 24; Nexit = 25; - Nreturn = 26; Nwith = 27; Ntrap = 28; Ncomp = 30; - Ndrop = 50; Nlabel = 51; Ngoto = 52; Njsr = 53; Nret = 54; Ncmp = 55; - - (*function number*) - assign = 0; newfn = 1; incfn = 13; decfn = 14; - inclfn = 15; exclfn = 16; copyfn = 18; assertfn = 32; - getfn = 24; putfn = 25; getrfn = 26; putrfn = 27; sysnewfn = 30; movefn = 31; - - (* symbol values and ops *) - times = 1; slash = 2; div = 3; mod = 4; - and = 5; plus = 6; minus = 7; or = 8; eql = 9; - neq = 10; lss = 11; leq = 12; gtr = 13; geq = 14; - in = 15; is = 16; ash = 17; msk = 18; len = 19; - conv = 20; abs = 21; cap = 22; odd = 23; not = 33; - adr = 24; cc = 25; bit = 26; lsh = 27; rot = 28; val = 29; - min = 34; max = 35; typfn = 36; - thisrecfn = 45; thisarrfn = 46; - shl = 50; shr = 51; lshr = 52; xor = 53; - - (* structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - Char16 = 16; String16 = 17; Int64 = 18; - VString16to8 = 29; VString8 = 30; VString16 = 31; - realSet = {Real32, Real64}; - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - - - PROCEDURE UseThisCall (n: DevCPT.Node; IN name: ARRAY OF SHORTCHAR); - VAR mod, nm, moda: DevCPT.Name; mobj, obj: DevCPT.Object; done: BOOLEAN; - BEGIN - IF (n.typ.form = Real64) OR (n.left.typ.form = Real64) THEN mod := "Real" - ELSIF (n.typ.form = Real32) OR (n.left.typ.form = Real32) THEN mod := "SReal" - ELSIF (n.typ.form = Int64) OR (n.left.typ.form = Int64) THEN mod := "Long" - ELSE mod := "Int" - END; - moda := mod + "%"; - DevCPT.Find(moda, mobj); - IF mobj = NIL THEN - DevCPT.Import(moda, mod, done); - IF done THEN DevCPT.Find(moda, mobj) END - END; - nm := name$; DevCPT.FindImport(nm, mobj, obj); - n.class := Ncall; n.subcl := 0; n.obj := obj.link; - n.left.link := n.right; n.right := n.left; - n.left := DevCPT.NewNode(Nproc); - n.left.obj := obj; n.left.typ := obj.typ; - ASSERT(n.typ.form = obj.typ.form) - END UseThisCall; - - PROCEDURE Convert (n: DevCPT.Node; typ: DevCPT.Struct); - VAR new: DevCPT.Node; r: REAL; - BEGIN - IF n.class = Nconst THEN - ASSERT((n.typ.form IN {Int32, Int64}) & (typ = DevCPT.intrealtyp)); - r := n.conval.realval + n.conval.intval; - IF r = n.conval.realval + n.conval.intval THEN - n.conval.realval := r; n.conval.intval := -1; n.typ := typ; n.obj := NIL - END - END; - IF (n.typ # typ) - & ((n.class # Nmop) OR (n.subcl # conv) - OR ~DevCPT.Includes(n.typ.form, n.left.typ.form) & ~DevCPT.Includes(n.typ.form, typ.form)) THEN - new := DevCPT.NewNode(0); new^ := n^; - n.class := Nmop; n.subcl := conv; n.left := new; n.right := NIL; n.obj := NIL - END; - n.typ := typ - END Convert; - - PROCEDURE UseCallForComp (n: DevCPT.Node); - VAR new: DevCPT.Node; - BEGIN - new := DevCPT.NewNode(0); - new.left := n.left; new.right := n.right; - new.typ := DevCPT.int32typ; - UseThisCall(new, "Comp"); - n.left := new; - n.right := DevCPT.NewNode(Nconst); n.right.conval := DevCPT.NewConst(); - n.right.conval.intval := 0; n.right.conval.realval := 0; n.right.typ := DevCPT.int32typ; - END UseCallForComp; - - PROCEDURE UseCallForConv (n: DevCPT.Node; opts: SET); - VAR f, g: INTEGER; typ: DevCPT.Struct; - BEGIN - typ := n.typ; f := typ.form; g := n.left.typ.form; - IF realConv IN opts THEN - IF f IN realSet THEN - IF g = Real32 THEN UseThisCall(n, "Long") - ELSIF g = Real64 THEN UseThisCall(n, "Short") - ELSIF g = Int64 THEN UseThisCall(n, "LFloat") - ELSIF g = Int32 THEN UseThisCall(n, "Float") - ELSE Convert(n.left, DevCPT.int32typ); UseThisCall(n, "Float") - END - ELSIF g IN realSet THEN - IF f = Int64 THEN UseThisCall(n, "LFloor") - ELSIF f = Int32 THEN UseThisCall(n, "Floor") - ELSE n.typ := DevCPT.int32typ; UseThisCall(n, "Floor"); Convert(n, typ) - END - END - END; - IF longConv IN opts THEN - IF f = Int64 THEN - IF g = Int32 THEN UseThisCall(n, "Long") - ELSIF ~(g IN realSet) THEN Convert(n.left, DevCPT.int32typ); UseThisCall(n, "IntToLong") - END - ELSIF g = Int64 THEN - IF f = Int32 THEN UseThisCall(n, "Short") - ELSIF ~(f IN realSet) THEN n.typ := DevCPT.int32typ; UseThisCall(n, "LongToInt"); Convert(n, typ) - END - END - END - END UseCallForConv; - - PROCEDURE UseCallForMop (n: DevCPT.Node; opts: SET); - BEGIN - CASE n.subcl OF - | minus: - IF (realMop IN opts) & (n.typ.form IN realSet) OR (longMop IN opts) & (n.typ.form = Int64) THEN - UseThisCall(n, "Neg") - END - | abs: - IF (realMop IN opts) & (n.typ.form IN realSet) OR (longMop IN opts) & (n.typ.form = Int64) THEN - UseThisCall(n, "Abs") - END - | odd: - IF (longOdd IN opts) & (n.left.typ.form = Int64) THEN UseThisCall(n, "Odd") END - | conv: - UseCallForConv(n, opts) - ELSE - END - END UseCallForMop; - - PROCEDURE UseCallForDop (n: DevCPT.Node; opts: SET); - BEGIN - IF (realDop IN opts) & (n.left.typ.form IN realSet) - OR (longDop IN opts) & (n.left.typ.form = Int64) - OR (intMulDiv IN opts) & (n.subcl IN {times, div, mod}) & (n.typ.form = Int32) THEN - CASE n.subcl OF - | times: UseThisCall(n, "Mul") - | slash: UseThisCall(n, "Div") - | div: UseThisCall(n, "Div") - | mod: UseThisCall(n, "Mod") - | plus: UseThisCall(n, "Add") - | minus: UseThisCall(n, "Sub") - | ash: UseThisCall(n, "Ash") - | min: UseThisCall(n, "Min") - | max: UseThisCall(n, "Max") - | eql..geq: UseCallForComp(n) - ELSE - END - END - END UseCallForDop; - - PROCEDURE UseCallForMove (n: DevCPT.Node; typ: DevCPT.Struct; opts: SET); - VAR f, g: INTEGER; - BEGIN - f := n.typ.form; g := typ.form; - IF f # g THEN - IF (realConv IN opts) & ((f IN realSet) OR (g IN realSet)) - OR (longConv IN opts) & ((f = Int64) OR (g = Int64)) THEN - Convert(n, typ); - UseCallForConv(n, opts) - END - END - END UseCallForMove; - - PROCEDURE UseCallForAssign (n: DevCPT.Node; opts: SET); - BEGIN - IF n.subcl = assign THEN UseCallForMove(n.right, n.left.typ, opts) END - END UseCallForAssign; - - PROCEDURE UseCallForReturn (n: DevCPT.Node; opts: SET); - BEGIN - IF (n.left # NIL) & (n.obj # NIL) THEN UseCallForMove(n.left, n.obj.typ, opts) END - END UseCallForReturn; - - PROCEDURE UseCallForParam (n: DevCPT.Node; fp: DevCPT.Object; opts: SET); - BEGIN - WHILE n # NIL DO - UseCallForMove(n, fp.typ, opts); - n := n.link; fp := fp.link - END - END UseCallForParam; - - PROCEDURE UseCalls* (n: DevCPT.Node; opts: SET); - BEGIN - WHILE n # NIL DO - CASE n.class OF - | Nmop: - UseCalls(n.left, opts); UseCallForMop(n, opts) - | Ndop: - UseCalls(n.left, opts); UseCalls(n.right, opts); UseCallForDop(n, opts) - | Ncase: - UseCalls(n.left, opts); UseCalls(n.right.left, opts); UseCalls(n.right.right, opts) - | Nassign: - UseCalls(n.left, opts); UseCalls(n.right, opts); UseCallForAssign(n, opts) - | Ncall: - UseCalls(n.left, opts); UseCalls(n.right, opts); UseCallForParam(n.right, n.obj, opts) - | Nreturn: - UseCalls(n.left, opts); UseCallForReturn(n, opts) - | Ncasedo: - UseCalls(n.right, opts) - | Ngoto, Ndrop, Nloop, Nfield, Nderef, Nguard: - UseCalls(n.left, opts) - | Nenter, Nifelse, Nif, Nwhile, Nrepeat, Nwith, Ncomp, Nupto, Nindex: - UseCalls(n.left, opts); UseCalls(n.right, opts) - | Njsr, Nret, Nlabel, Ntrap, Nexit, Ninittd, Ntype, Nproc, Nconst, Nvar, Nvarpar: - END; - n := n.link - END - END UseCalls; - - - PROCEDURE UseReals* (n: DevCPT.Node; opts: SET); - BEGIN - WHILE n # NIL DO - CASE n.class OF - | Nmop: - IF (longMop IN opts) & (n.typ.form = Int64) & ((n.subcl = abs) OR (n.subcl = minus)) THEN - UseReals(n.left, opts - {hide} + {force}); n.typ := DevCPT.intrealtyp - ELSIF n.subcl = conv THEN UseReals(n.left, opts - {force} + {hide}) - ELSE UseReals(n.left, opts - {force, hide}) - END - | Ndop: - IF (longDop IN opts) & (n.left.typ.form = Int64) THEN - UseReals(n.left, opts - {hide} + {force}); UseReals(n.right, opts - {hide} + {force}); - IF n.typ.form = Int64 THEN n.typ := DevCPT.intrealtyp END - ELSE UseReals(n.left, opts - {force, hide}); UseReals(n.right, opts - {force, hide}) - END - | Ncase: - UseReals(n.left, opts - {force, hide}); UseReals(n.right.left, opts - {force, hide}); - UseReals(n.right.right, opts - {force, hide}) - | Ncasedo: - UseReals(n.right, opts - {force, hide}) - | Ngoto, Ndrop, Nloop, Nreturn, Nfield, Nderef, Nguard: - UseReals(n.left, opts - {force, hide}) - | Nenter, Nassign, Ncall, Nifelse, Nif, Nwhile, Nrepeat, Nwith, Ncomp, Nupto, Nindex: - UseReals(n.left, opts - {force, hide}); UseReals(n.right, opts - {force, hide}) - | Njsr, Nret, Nlabel, Ntrap, Nexit, Ninittd, Ntype, Nproc, Nconst, Nvar, Nvarpar: - END; - IF force IN opts THEN Convert(n, DevCPT.intrealtyp) - ELSIF ~(hide IN opts) & (n.typ = DevCPT.intrealtyp) THEN Convert(n, DevCPT.int64typ) - END; - n := n.link - END - END UseReals; - -END DevCPH. - - - - - PROCEDURE Traverse (n: DevCPT.Node; opts: SET); - BEGIN - WHILE n # NIL DO - CASE n.class OF - | Ncase: - Traverse(n.left, opts); Traverse(n.right.left, opts); Traverse(n.right.right, opts) - | Ncasedo: - Traverse(n.right, opts) - | Ngoto, Ndrop, Nloop, Nreturn, Nmop, Nfield, Nderef, Nguard: - Traverse(n.left, opts) - | Nenter, Nassign, Ncall, Nifelse, Nif, Nwhile, Nrepeat, Nwith, Ncomp, Ndop, Nupto, Nindex: - Traverse(n.left, opts); Traverse(n.right, opts) - | Njsr, Nret, Nlabel, Ntrap, Nexit, Ninittd, Ntype, Nproc, Nconst, Nvar, Nvarpar: - END; - n := n.link - END - END Traverse; - diff --git a/new/Dev/Mod/CPL486.odc b/new/Dev/Mod/CPL486.odc new file mode 100644 index 0000000000000000000000000000000000000000..7300aa88e8251f7859df0b474411f37c8750505f GIT binary patch literal 36903 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 Bi?aX# literal 0 HcmV?d00001 diff --git a/new/Dev/Mod/CPL486.txt b/new/Dev/Mod/CPL486.txt deleted file mode 100644 index a0ae315..0000000 --- a/new/Dev/Mod/CPL486.txt +++ /dev/null @@ -1,1057 +0,0 @@ -MODULE DevCPL486; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/CPL486.odc *) - (* DO NOT EDIT *) - - IMPORT DevCPM, DevCPT, DevCPE; - - TYPE - Item* = RECORD - mode*, tmode*, form*: BYTE; - offset*, index*, reg*, scale*: INTEGER; (* adr = offset + index * scale *) - typ*: DevCPT.Struct; - obj*: DevCPT.Object - END ; - -(* Items: - - mode | offset index scale reg obj ------------------------------------------------- - 1 Var | adr xreg scale obj (ea = FP + adr + xreg * scale) - 2 VarPar| off xreg scale obj (ea = [FP + obj.adr] + off + xreg * scale) - 3 Con | val (val2) NIL - Con | off obj (val = adr(obj) + off) - Con | id NIL (for predefined reals) - 6 LProc | obj - 7 XProc | obj - 9 CProc | obj -10 IProc | obj -13 TProc | mthno 0/1 obj (0 = normal / 1 = super call) -14 Ind | off xreg scale Reg (ea = Reg + off + xreg * scale) -15 Abs | adr xreg scale NIL (ea = adr + xreg * scale) - Abs | off xreg scale obj (ea = adr(obj) + off + xreg * scale) - Abs | off len 0 obj (for constant strings and reals) -16 Stk | (ea = ESP) -17 Cond | CC -18 Reg | (Reg2) Reg -19 DInd | off xreg scale Reg (ea = [Reg + off + xreg * scale]) - - tmode | record tag array desc -------------------------------------- - VarPar | [FP + obj.adr + 4] [FP + obj.adr] - Ind | [Reg - 4] [Reg + 8] - Con | Adr(typ.strobj) - -*) - - CONST - processor* = 10; (* for i386 *) - NewLbl* = 0; - - TYPE - Label* = INTEGER; (* 0: unassigned, > 0: address, < 0: - (linkadr + linktype * 2^24) *) - - VAR - level*: BYTE; - one*: DevCPT.Const; - - CONST - (* item base modes (=object modes) *) - Var = 1; VarPar = 2; Con = 3; LProc = 6; XProc = 7; CProc = 9; IProc = 10; TProc = 13; - - (* item modes for i386 (must not overlap item basemodes, > 13) *) - Ind = 14; Abs = 15; Stk = 16; Cond = 17; Reg = 18; DInd = 19; - - (* structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - Char16 = 16; String16 = 17; Int64 = 18; Guid = 23; - - (* composite structure forms *) - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - (* condition codes *) - ccB = 2; ccAE = 3; ccBE = 6; ccA = 7; (* unsigned *) - ccL = 12; ccGE = 13; ccLE = 14; ccG = 15; (* signed *) - ccE = 4; ccNE = 5; ccS = 8; ccNS = 9; ccO = 0; ccNO = 1; - ccAlways = -1; ccNever = -2; ccCall = -3; - - (* registers *) - AX = 0; CX = 1; DX = 2; BX = 3; SP = 4; BP = 5; SI = 6; DI = 7; AH = 4; CH = 5; DH = 6; BH = 7; - - (* fixup types *) - absolute = 100; relative = 101; copy = 102; table = 103; tableend = 104; short = 105; - - (* system trap numbers *) - withTrap = -1; caseTrap = -2; funcTrap = -3; typTrap = -4; - recTrap = -5; ranTrap = -6; inxTrap = -7; copyTrap = -8; - - - VAR - Size: ARRAY 32 OF INTEGER; (* Size[typ.form] == +/- typ.size *) - a1, a2: Item; - - - PROCEDURE MakeReg* (VAR x: Item; reg: INTEGER; form: BYTE); - BEGIN - ASSERT((reg >= 0) & (reg < 8)); - x.mode := Reg; x.reg := reg; x.form := form - END MakeReg; - - PROCEDURE MakeConst* (VAR x: Item; val: INTEGER; form: BYTE); - BEGIN - x.mode := Con; x.offset := val; x.form := form; x.obj := NIL; - END MakeConst; - - PROCEDURE AllocConst* (VAR x: Item; con: DevCPT.Const; form: BYTE); - VAR r: REAL; short: SHORTREAL; c: DevCPT.Const; i: INTEGER; - BEGIN - IF form IN {Real32, Real64} THEN - r := con.realval; - IF ABS(r) <= MAX(SHORTREAL) THEN - short := SHORT(r); - IF short = r THEN form := Real32 (* a shortreal can represent the exact value *) - ELSE form := Real64 (* use a real *) - END - ELSE form := Real64 (* use a real *) - END - ELSIF form IN {String8, String16, Guid} THEN - x.index := con.intval2 (* string length *) - END; - DevCPE.AllocConst(con, form, x.obj, x.offset); - x.form := form; x.mode := Abs; x.scale := 0 - END AllocConst; - - (*******************************************************) - - PROCEDURE BegStat*; (* general-purpose procedure which is called before each statement *) - BEGIN - END BegStat; - - PROCEDURE EndStat*; (* general-purpose procedure which is called after each statement *) - BEGIN - END EndStat; - - (*******************************************************) - - PROCEDURE SetLabel* (VAR L: Label); - VAR link, typ, disp, x: INTEGER; c: SHORTCHAR; - BEGIN - ASSERT(L <= 0); link := -L; - WHILE link # 0 DO - typ := link DIV 1000000H; link := link MOD 1000000H; - IF typ = short THEN - disp := DevCPE.pc - link - 1; ASSERT(disp < 128); - DevCPE.PutByte(link, disp); link := 0 - ELSIF typ = relative THEN - x := DevCPE.ThisWord(link); DevCPE.PutWord(link, DevCPE.pc - link - 4); link := x - ELSE - x := DevCPE.ThisWord(link); DevCPE.PutWord(link, DevCPE.pc + typ * 1000000H); link := x - END - END; - L := DevCPE.pc; - a1.mode := 0; a2.mode := 0 - END SetLabel; - - - (*******************************************************) - - PROCEDURE GenWord (x: INTEGER); - BEGIN - DevCPE.GenByte(x); DevCPE.GenByte(x DIV 256) - END GenWord; - - PROCEDURE GenDbl (x: INTEGER); - BEGIN - DevCPE.GenByte(x); DevCPE.GenByte(x DIV 256); DevCPE.GenByte(x DIV 10000H); DevCPE.GenByte(x DIV 1000000H) - END GenDbl; - - PROCEDURE CaseEntry* (tab, from, to: INTEGER); - VAR a, e: INTEGER; - BEGIN - a := tab + 4 * from; e := tab + 4 * to; - WHILE a <= e DO - DevCPE.PutByte(a, DevCPE.pc); - DevCPE.PutByte(a + 1, DevCPE.pc DIV 256); - DevCPE.PutByte(a + 2, DevCPE.pc DIV 65536); - INC(a, 4) - END; - a1.mode := 0; a2.mode := 0 - END CaseEntry; - - PROCEDURE GenLinked (VAR x: Item; type: BYTE); - VAR link: DevCPT.LinkList; - BEGIN - IF x.obj = NIL THEN GenDbl(x.offset) - ELSE - link := DevCPE.OffsetLink(x.obj, x.offset); - IF link # NIL THEN - GenDbl(type * 1000000H + link.linkadr MOD 1000000H); - link.linkadr := DevCPE.pc - 4 - ELSE GenDbl(0) - END - END - END GenLinked; - - PROCEDURE CheckSize (form: BYTE; VAR w: INTEGER); - BEGIN - IF form IN {Int16, Char16} THEN DevCPE.GenByte(66H); w := 1 - ELSIF form >= Int32 THEN ASSERT(form IN {Int32, Set, NilTyp, Pointer, ProcTyp}); w := 1 - ELSE w := 0 - END - END CheckSize; - - PROCEDURE CheckForm (form: BYTE; VAR mf: INTEGER); - BEGIN - IF form = Real32 THEN mf := 0 - ELSIF form = Real64 THEN mf := 4 - ELSIF form = Int32 THEN mf := 2 - ELSE ASSERT(form = Int16); mf := 6 - END - END CheckForm; - - PROCEDURE CheckConst (VAR x: Item; VAR s: INTEGER); - BEGIN - IF (x.form > Int8) & (x.offset >= -128) & (x.offset < 128) & (x.obj = NIL) THEN s := 2 - ELSE s := 0 - END - END CheckConst; - - PROCEDURE GenConst (VAR x: Item; short: BOOLEAN); - BEGIN - IF x.obj # NIL THEN GenLinked(x, absolute) - ELSIF x.form <= Int8 THEN DevCPE.GenByte(x.offset) - ELSIF short & (x.offset >= -128) & (x.offset < 128) THEN DevCPE.GenByte(x.offset) - ELSIF x.form IN {Int16, Char16} THEN GenWord(x.offset) - ELSE GenDbl(x.offset) - END - END GenConst; - - PROCEDURE GenCExt (code: INTEGER; VAR x: Item); - VAR disp, mod, base, scale: INTEGER; - BEGIN - ASSERT(x.mode IN {Reg, Ind, Abs, Stk}); - ASSERT((code MOD 8 = 0) & (code < 64)); - disp := x.offset; base := x.reg; scale := x.scale; - IF x.mode = Reg THEN mod := 0C0H; scale := 0 - ELSIF x.mode = Stk THEN base := SP; mod := 0; disp := 0; scale := 0 - ELSIF x.mode = Abs THEN - IF scale = 1 THEN base := x.index; mod := 80H; scale := 0 - ELSE base := BP; mod := 0 - END - ELSIF (disp = 0) & (base # BP) THEN mod := 0 - ELSIF (disp >= -128) & (disp < 128) THEN mod := 40H - ELSE mod := 80H - END; - IF scale # 0 THEN - DevCPE.GenByte(mod + code + 4); base := base + x.index * 8; - IF scale = 8 THEN DevCPE.GenByte(0C0H + base); - ELSIF scale = 4 THEN DevCPE.GenByte(80H + base); - ELSIF scale = 2 THEN DevCPE.GenByte(40H + base); - ELSE ASSERT(scale = 1); DevCPE.GenByte(base); - END; - ELSE - DevCPE.GenByte(mod + code + base); - IF (base = SP) & (mod <= 80H) THEN DevCPE.GenByte(24H) END - END; - IF x.mode = Abs THEN GenLinked(x, absolute) - ELSIF mod = 80H THEN GenDbl(disp) - ELSIF mod = 40H THEN DevCPE.GenByte(disp) - END - END GenCExt; - - PROCEDURE GenDExt (VAR r, x: Item); - BEGIN - ASSERT(r.mode = Reg); - GenCExt(r.reg * 8, x) - END GenDExt; - - (*******************************************************) - - PROCEDURE GenMove* (VAR from, to: Item); - VAR w: INTEGER; - BEGIN - ASSERT(Size[from.form] = Size[to.form]); - IF to.mode = Reg THEN - IF from.mode = Con THEN - IF to.reg = AX THEN - - IF (a1.mode = Con) & (from.offset = a1.offset) & (from.obj = a1.obj) & (from.form = a1.form) THEN - RETURN - END; - - a1 := from; a2.mode := 0 - END; - CheckSize(from.form, w); - IF (from.offset = 0) & (from.obj = NIL) THEN - DevCPE.GenByte(30H + w); DevCPE.GenByte(0C0H + 9 * to.reg) (* XOR r,r *) - ELSE - DevCPE.GenByte(0B0H + w * 8 + to.reg); GenConst(from, FALSE) - END; - ELSIF (to.reg = AX) & (from.mode = Abs) & (from.scale = 0) THEN - - IF (a1.mode = Abs) & (from.offset = a1.offset) & (from.obj = a1.obj) & (from.form = a1.form) - OR (a2.mode = Abs) & (from.offset = a2.offset) & (from.obj = a2.obj) & (from.form = a2.form) THEN - RETURN - END; - - a1 := from; a2.mode := 0; - CheckSize(from.form, w); - DevCPE.GenByte(0A0H + w); GenLinked(from, absolute); - ELSIF (from.mode # Reg) OR (from.reg # to.reg) THEN - IF to.reg = AX THEN - IF (from.mode = Ind) & (from.scale = 0) & ((from.reg = BP) OR (from.reg = BX)) THEN - - IF (a1.mode = Ind) & (from.offset = a1.offset) & (from.reg = a1.reg) & (from.form = a1.form) - OR (a2.mode = Ind) & (from.offset = a2.offset) & (from.reg = a2.reg) & (from.form = a2.form) THEN - RETURN - END; - - a1 := from - ELSE a1.mode := 0 - END; - a2.mode := 0 - END; - CheckSize(from.form, w); - DevCPE.GenByte(8AH + w); GenDExt(to, from) - END - ELSE - CheckSize(from.form, w); - IF from.mode = Con THEN - DevCPE.GenByte(0C6H + w); GenCExt(0, to); GenConst(from, FALSE); - a1.mode := 0; a2.mode := 0 - ELSIF (from.reg = AX) & (to.mode = Abs) & (to.scale = 0) THEN - DevCPE.GenByte(0A2H + w); GenLinked(to, absolute); - a2 := to - ELSE - DevCPE.GenByte(88H + w); GenDExt(from, to); - IF from.reg = AX THEN - IF (to.mode = Ind) & (to.scale = 0) & ((to.reg = BP) OR (to.reg = BX)) THEN a2 := to END - ELSE a1.mode := 0; a2.mode := 0 - END - END - END - END GenMove; - - PROCEDURE GenExtMove* (VAR from, to: Item); - VAR w, op: INTEGER; - BEGIN - ASSERT(from.mode # Con); - IF from.form IN {Byte, Char8, Char16} THEN op := 0B6H (* MOVZX *) - ELSE op := 0BEH (* MOVSX *) - END; - IF from.form IN {Int16, Char16} THEN INC(op) END; - DevCPE.GenByte(0FH); DevCPE.GenByte(op); GenDExt(to, from); - IF to.reg = AX THEN a1.mode := 0; a2.mode := 0 END - END GenExtMove; - - PROCEDURE GenSignExt* (VAR from, to: Item); - BEGIN - ASSERT(to.mode = Reg); - IF (from.mode = Reg) & (from.reg = AX) & (to.reg = DX) THEN - DevCPE.GenByte(99H) (* cdq *) - ELSE - GenMove(from, to); (* mov to, from *) - DevCPE.GenByte(0C1H); GenCExt(38H, to); DevCPE.GenByte(31) (* sar to, 31 *) - END - END GenSignExt; - - PROCEDURE GenLoadAdr* (VAR from, to: Item); - BEGIN - ASSERT(to.form IN {Int32, Pointer, ProcTyp}); - IF (from.mode = Abs) & (from.scale = 0) THEN - DevCPE.GenByte(0B8H + to.reg); GenLinked(from, absolute) - ELSIF from.mode = Stk THEN - DevCPE.GenByte(89H); GenCExt(SP * 8, to) - ELSIF (from.mode # Ind) OR (from.offset # 0) OR (from.scale # 0) THEN - DevCPE.GenByte(8DH); GenDExt(to, from) - ELSIF from.reg # to.reg THEN - DevCPE.GenByte(89H); GenCExt(from.reg * 8, to) - ELSE RETURN - END; - IF to.reg = AX THEN a1.mode := 0; a2.mode := 0 END - END GenLoadAdr; - - PROCEDURE GenPush* (VAR src: Item); - VAR s: INTEGER; - BEGIN - IF src.mode = Con THEN - ASSERT(src.form >= Int32); - CheckConst(src, s); DevCPE.GenByte(68H + s); GenConst(src, TRUE) - ELSIF src.mode = Reg THEN - ASSERT((src.form >= Int16) OR (src.reg < 4)); - DevCPE.GenByte(50H + src.reg) - ELSE - ASSERT(src.form >= Int32); - DevCPE.GenByte(0FFH); GenCExt(30H, src) - END - END GenPush; - - PROCEDURE GenPop* (VAR dst: Item); - BEGIN - IF dst.mode = Reg THEN - ASSERT((dst.form >= Int16) OR (dst.reg < 4)); - DevCPE.GenByte(58H + dst.reg); - IF dst.reg = AX THEN a1.mode := 0; a2.mode := 0 END - ELSE - DevCPE.GenByte(08FH); GenCExt(0, dst) - END - END GenPop; - - PROCEDURE GenConOp (op: INTEGER; VAR src, dst: Item); - VAR w, s: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - CheckSize(src.form, w); - CheckConst(src, s); - IF (dst.mode = Reg) & (dst.reg = AX) & (s = 0) THEN - DevCPE.GenByte(op + 4 + w); GenConst(src, FALSE) - ELSE - DevCPE.GenByte(80H + s + w); GenCExt(op, dst); GenConst(src, TRUE) - END - END GenConOp; - - PROCEDURE GenDirOp (op: INTEGER; VAR src, dst: Item); - VAR w: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - CheckSize(src.form, w); - IF dst.mode = Reg THEN - DevCPE.GenByte(op + 2 + w); GenDExt(dst, src) - ELSE - DevCPE.GenByte(op + w); GenDExt(src, dst) - END - END GenDirOp; - - PROCEDURE GenAdd* (VAR src, dst: Item; ovflchk: BOOLEAN); - VAR w: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF src.mode = Con THEN - IF src.obj = NIL THEN - IF src.offset = 1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(40H + dst.reg) (* inc *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(0, dst) - END - ELSIF src.offset = -1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(48H + dst.reg) (* dec *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(8, dst) - END - ELSIF src.offset # 0 THEN - GenConOp(0, src, dst) - ELSE RETURN - END - ELSE - GenConOp(0, src, dst) - END - ELSE - GenDirOp(0, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenAdd; - - PROCEDURE GenAddC* (VAR src, dst: Item; first, ovflchk: BOOLEAN); - VAR op: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF first THEN op := 0 ELSE op := 10H END; - IF src.mode = Con THEN GenConOp(op, src, dst) - ELSE GenDirOp(op, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenAddC; - - PROCEDURE GenSub* (VAR src, dst: Item; ovflchk: BOOLEAN); - VAR w: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF src.mode = Con THEN - IF src.obj = NIL THEN - IF src.offset = 1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(48H + dst.reg) (* dec *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(8, dst) - END - ELSIF src.offset = -1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(40H + dst.reg) (* inc *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(0, dst) - END - ELSIF src.offset # 0 THEN - GenConOp(28H, src, dst) - ELSE RETURN - END - ELSE - GenConOp(28H, src, dst) - END - ELSE - GenDirOp(28H, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenSub; - - PROCEDURE GenSubC* (VAR src, dst: Item; first, ovflchk: BOOLEAN); - VAR op: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF first THEN op := 28H ELSE op := 18H END; - IF src.mode = Con THEN GenConOp(op, src, dst) - ELSE GenDirOp(op, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenSubC; - - PROCEDURE GenComp* (VAR src, dst: Item); - VAR w: INTEGER; - BEGIN - IF src.mode = Con THEN - IF (src.offset = 0) & (src.obj = NIL) & (dst.mode = Reg) THEN - CheckSize(dst.form, w); DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * dst.reg) (* or r,r *) - ELSE GenConOp(38H, src, dst) - END - ELSE - GenDirOp(38H, src, dst) - END - END GenComp; - - PROCEDURE GenAnd* (VAR src, dst: Item); - BEGIN - IF src.mode = Con THEN - IF (src.obj # NIL) OR (src.offset # -1) THEN GenConOp(20H, src, dst) END - ELSE GenDirOp(20H, src, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenAnd; - - PROCEDURE GenOr* (VAR src, dst: Item); - BEGIN - IF src.mode = Con THEN - IF (src.obj # NIL) OR (src.offset # 0) THEN GenConOp(8H, src, dst) END - ELSE GenDirOp(8H, src, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenOr; - - PROCEDURE GenXor* (VAR src, dst: Item); - BEGIN - IF src.mode = Con THEN - IF (src.obj # NIL) OR (src.offset # 0) THEN GenConOp(30H, src, dst) END - ELSE GenDirOp(30H, src, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenXor; - - PROCEDURE GenTest* (VAR x, y: Item); - VAR w: INTEGER; - BEGIN - ASSERT(Size[x.form] = Size[y.form]); - CheckSize(x.form, w); - IF x.mode = Con THEN - IF (x.mode = Reg) & (x.reg = AX) THEN - DevCPE.GenByte(0A8H + w); GenConst(x, FALSE) - ELSE - DevCPE.GenByte(0F6H + w); GenCExt(0, y); GenConst(x, FALSE) - END - ELSE - DevCPE.GenByte(84H + w); - IF y.mode = Reg THEN GenDExt(y, x) ELSE GenDExt(x, y) END - END - END GenTest; - - PROCEDURE GenNeg* (VAR dst: Item; ovflchk: BOOLEAN); - VAR w: INTEGER; - BEGIN - CheckSize(dst.form, w); DevCPE.GenByte(0F6H + w); GenCExt(18H, dst); - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenNeg; - - PROCEDURE GenNot* (VAR dst: Item); - VAR w: INTEGER; - BEGIN - CheckSize(dst.form, w); DevCPE.GenByte(0F6H + w); GenCExt(10H, dst); - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenNot; - - PROCEDURE GenMul* (VAR src, dst: Item; ovflchk: BOOLEAN); - VAR w, s, val, f2, f5, f9: INTEGER; - BEGIN - ASSERT((dst.mode = Reg) & (Size[src.form] = Size[dst.form])); - IF (src.mode = Con) & (src.offset = 1) THEN RETURN END; - IF src.form <= Int8 THEN - ASSERT(dst.reg = 0); - DevCPE.GenByte(0F6H); GenCExt(28H, src) - ELSIF src.mode = Con THEN - val := src.offset; - IF (src.obj = NIL) & (val # 0) & ~ovflchk THEN - f2 := 0; f5 := 0; f9 := 0; - WHILE ~ODD(val) DO val := val DIV 2; INC(f2) END; - WHILE val MOD 9 = 0 DO val := val DIV 9; INC(f9) END; - WHILE val MOD 5 = 0 DO val := val DIV 5; INC(f5) END; - IF ABS(val) <= 3 THEN - WHILE f9 > 0 DO - DevCPE.GenByte(8DH); - DevCPE.GenByte(dst.reg * 8 + 4); - DevCPE.GenByte(0C0H + dst.reg * 9); - DEC(f9) - END; - WHILE f5 > 0 DO - DevCPE.GenByte(8DH); - DevCPE.GenByte(dst.reg * 8 + 4); - DevCPE.GenByte(80H + dst.reg * 9); - DEC(f5) - END; - IF ABS(val) = 3 THEN - DevCPE.GenByte(8DH); DevCPE.GenByte(dst.reg * 8 + 4); DevCPE.GenByte(40H + dst.reg * 9) - END; - IF f2 > 1 THEN DevCPE.GenByte(0C1H); DevCPE.GenByte(0E0H + dst.reg); DevCPE.GenByte(f2) - ELSIF f2 = 1 THEN DevCPE.GenByte(1); DevCPE.GenByte(0C0H + dst.reg * 9) - END; - IF val < 0 THEN DevCPE.GenByte(0F7H); GenCExt(18H, dst) END; - IF dst.reg = AX THEN a1.mode := 0; a2.mode := 0 END; - RETURN - END - END; - CheckSize(src.form, w); CheckConst(src, s); - DevCPE.GenByte(69H + s); GenDExt(dst, dst); GenConst(src, TRUE) - ELSE - CheckSize(src.form, w); - DevCPE.GenByte(0FH); DevCPE.GenByte(0AFH); GenDExt(dst, src) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF dst.reg = AX THEN a1.mode := 0; a2.mode := 0 END - END GenMul; - - PROCEDURE GenDiv* (VAR src: Item; mod, pos: BOOLEAN); - VAR w, rem: INTEGER; - BEGIN - ASSERT(src.mode = Reg); - IF src.form >= Int32 THEN DevCPE.GenByte(99H) (* cdq *) - ELSIF src.form = Int16 THEN DevCPE.GenByte(66H); DevCPE.GenByte(99H) (* cwd *) - ELSE DevCPE.GenByte(66H); DevCPE.GenByte(98H) (* cbw *) - END; - CheckSize(src.form, w); DevCPE.GenByte(0F6H + w); GenCExt(38H, src); (* idiv src *) - IF src.form > Int8 THEN rem := 2 (* edx *) ELSE rem := 4 (* ah *) END; - IF pos THEN (* src > 0 *) - CheckSize(src.form, w); DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * rem); (* or rem,rem *) - IF mod THEN - DevCPE.GenByte(79H); DevCPE.GenByte(2); (* jns end *) - DevCPE.GenByte(2 + w); GenCExt(8 * rem, src); (* add rem,src *) - ELSE - DevCPE.GenByte(79H); DevCPE.GenByte(1); (* jns end *) - DevCPE.GenByte(48H); (* dec eax *) - END - ELSE - CheckSize(src.form, w); DevCPE.GenByte(30H + w); GenCExt(8 * rem, src); (* xor src,rem *) - IF mod THEN - DevCPE.GenByte(79H); (* jns end *) - IF src.form = Int16 THEN DevCPE.GenByte(9); DevCPE.GenByte(66H) ELSE DevCPE.GenByte(8) END; - DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * rem); (* or rem,rem *) - DevCPE.GenByte(74H); DevCPE.GenByte(4); (* je end *) - DevCPE.GenByte(30H + w); GenCExt(8 * rem, src); (* xor src,rem *) - DevCPE.GenByte(2 + w); GenCExt(8 * rem, src); (* add rem,src *) - ELSE - DevCPE.GenByte(79H); (* jns end *) - IF src.form = Int16 THEN DevCPE.GenByte(6); DevCPE.GenByte(66H) ELSE DevCPE.GenByte(5) END; - DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * rem); (* or rem,rem *) - DevCPE.GenByte(74H); DevCPE.GenByte(1); (* je end *) - DevCPE.GenByte(48H); (* dec eax *) - END -(* - CheckSize(src.form, w); DevCPE.GenByte(3AH + w); GenCExt(8 * rem, src); (* cmp rem,src *) - IF mod THEN - DevCPE.GenByte(72H); DevCPE.GenByte(4); (* jb end *) - DevCPE.GenByte(7FH); DevCPE.GenByte(2); (* jg end *) - DevCPE.GenByte(2 + w); GenCExt(8 * rem, src); (* add rem,src *) - ELSE - DevCPE.GenByte(72H); DevCPE.GenByte(3); (* jb end *) - DevCPE.GenByte(7FH); DevCPE.GenByte(1); (* jg end *) - DevCPE.GenByte(48H); (* dec eax *) - END -*) - END; - a1.mode := 0; a2.mode := 0 - END GenDiv; - - PROCEDURE GenShiftOp* (op: INTEGER; VAR cnt, dst: Item); - VAR w: INTEGER; - BEGIN - CheckSize(dst.form, w); - IF cnt.mode = Con THEN - ASSERT(cnt.offset >= 0); ASSERT(cnt.obj = NIL); - IF cnt.offset = 1 THEN - IF (op = 10H) & (dst.mode = Reg) THEN (* shl r *) - DevCPE.GenByte(w); GenDExt(dst, dst) (* add r, r *) - ELSE - DevCPE.GenByte(0D0H + w); GenCExt(op, dst) - END - ELSIF cnt.offset > 1 THEN - DevCPE.GenByte(0C0H + w); GenCExt(op, dst); DevCPE.GenByte(cnt.offset) - END - ELSE - ASSERT((cnt.mode = Reg) & (cnt.reg = CX)); - DevCPE.GenByte(0D2H + w); GenCExt(op, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenShiftOp; - - PROCEDURE GenBitOp* (op: INTEGER; VAR num, dst: Item); - BEGIN - DevCPE.GenByte(0FH); - IF num.mode = Con THEN - ASSERT(num.obj = NIL); - DevCPE.GenByte(0BAH); GenCExt(op, dst); DevCPE.GenByte(num.offset) - ELSE - ASSERT((num.mode = Reg) & (num.form = Int32)); - DevCPE.GenByte(83H + op); GenDExt(num, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenBitOp; - - PROCEDURE GenSetCC* (cc: INTEGER; VAR dst: Item); - BEGIN - ASSERT((dst.form = Bool) & (cc >= 0)); - DevCPE.GenByte(0FH); DevCPE.GenByte(90H + cc); GenCExt(0, dst); - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenSetCC; - - PROCEDURE GenFLoad* (VAR src: Item); - VAR mf: INTEGER; - BEGIN - IF src.mode = Con THEN (* predefined constants *) - DevCPE.GenByte(0D9H); DevCPE.GenByte(0E8H + src.offset) - ELSIF src.form = Int64 THEN - DevCPE.GenByte(0DFH); GenCExt(28H, src) - ELSE - CheckForm(src.form, mf); - DevCPE.GenByte(0D9H + mf); GenCExt(0, src) - END - END GenFLoad; - - PROCEDURE GenFStore* (VAR dst: Item; pop: BOOLEAN); - VAR mf: INTEGER; - BEGIN - IF dst.form = Int64 THEN ASSERT(pop); - DevCPE.GenByte(0DFH); GenCExt(38H, dst); DevCPE.GenByte(9BH) (* wait *) - ELSE - CheckForm(dst.form, mf); DevCPE.GenByte(0D9H + mf); - IF pop THEN GenCExt(18H, dst); DevCPE.GenByte(9BH) (* wait *) - ELSE GenCExt(10H, dst) - END - END; - a1.mode := 0; a2.mode := 0 - END GenFStore; - - PROCEDURE GenFDOp* (op: INTEGER; VAR src: Item); - VAR mf: INTEGER; - BEGIN - IF src.mode = Reg THEN - DevCPE.GenByte(0DEH); DevCPE.GenByte(0C1H + op) - ELSE - CheckForm(src.form, mf); - DevCPE.GenByte(0D8H + mf); GenCExt(op, src) - END - END GenFDOp; - - PROCEDURE GenFMOp* (op: INTEGER); - BEGIN - DevCPE.GenByte(0D8H + op DIV 256); - DevCPE.GenByte(op MOD 256); - IF op = 07E0H THEN a1.mode := 0; a2.mode := 0 END (* FSTSW AX *) - END GenFMOp; - - PROCEDURE GenJump* (cc: INTEGER; VAR L: Label; shortjmp: BOOLEAN); - BEGIN - IF cc # ccNever THEN - IF shortjmp OR (L > 0) & (DevCPE.pc + 2 - L <= 128) & (cc # ccCall) THEN - IF cc = ccAlways THEN DevCPE.GenByte(0EBH) - ELSE DevCPE.GenByte(70H + cc) - END; - IF L > 0 THEN DevCPE.GenByte(L - DevCPE.pc - 1) - ELSE ASSERT(L = 0); L := -(DevCPE.pc + short * 1000000H); DevCPE.GenByte(0) - END - ELSE - IF cc = ccAlways THEN DevCPE.GenByte(0E9H) - ELSIF cc = ccCall THEN DevCPE.GenByte(0E8H) - ELSE DevCPE.GenByte(0FH); DevCPE.GenByte(80H + cc) - END; - IF L > 0 THEN GenDbl(L - DevCPE.pc - 4) - ELSE GenDbl(-L); L := -(DevCPE.pc - 4 + relative * 1000000H) - END - END - END - END GenJump; - - PROCEDURE GenExtJump* (cc: INTEGER; VAR dst: Item); - BEGIN - IF cc = ccAlways THEN DevCPE.GenByte(0E9H) - ELSE DevCPE.GenByte(0FH); DevCPE.GenByte(80H + cc) - END; - dst.offset := 0; GenLinked(dst, relative) - END GenExtJump; - - PROCEDURE GenIndJump* (VAR dst: Item); - BEGIN - DevCPE.GenByte(0FFH); GenCExt(20H, dst) - END GenIndJump; - - PROCEDURE GenCaseJump* (VAR src: Item); - VAR link: DevCPT.LinkList; tab: INTEGER; - BEGIN - ASSERT((src.form = Int32) & (src.mode = Reg)); - DevCPE.GenByte(0FFH); DevCPE.GenByte(24H); DevCPE.GenByte(85H + 8 * src.reg); - tab := (DevCPE.pc + 7) DIV 4 * 4; - NEW(link); link.offset := tab; link.linkadr := DevCPE.pc; - link.next := DevCPE.CaseLinks; DevCPE.CaseLinks := link; - GenDbl(absolute * 1000000H + tab); - WHILE DevCPE.pc < tab DO DevCPE.GenByte(90H) END; - END GenCaseJump; -(* - PROCEDURE GenCaseJump* (VAR src: Item; num: LONGINT; VAR tab: LONGINT); - VAR link: DevCPT.LinkList; else, last: LONGINT; - BEGIN - ASSERT((src.form = Int32) & (src.mode = Reg)); - DevCPE.GenByte(0FFH); DevCPE.GenByte(24H); DevCPE.GenByte(85H + 8 * src.reg); - tab := (DevCPE.pc + 7) DIV 4 * 4; - else := tab + num * 4; last := else - 4; - NEW(link); link.offset := tab; link.linkadr := DevCPE.pc; - link.next := CaseLinks; CaseLinks := link; - GenDbl(absolute * 1000000H + tab); - WHILE DevCPE.pc < tab DO DevCPE.GenByte(90H) END; - WHILE DevCPE.pc < last DO GenDbl(table * 1000000H + else) END; - GenDbl(tableend * 1000000H + else) - END GenCaseJump; -*) - PROCEDURE GenCaseEntry* (VAR L: Label; last: BOOLEAN); - VAR typ: INTEGER; - BEGIN - IF last THEN typ := tableend * 1000000H ELSE typ := table * 1000000H END; - IF L > 0 THEN GenDbl(L + typ) ELSE GenDbl(-L); L := -(DevCPE.pc - 4 + typ) END - END GenCaseEntry; - - PROCEDURE GenCall* (VAR dst: Item); - BEGIN - IF dst.mode IN {LProc, XProc, IProc} THEN - DevCPE.GenByte(0E8H); - IF dst.obj.mnolev >= 0 THEN (* local *) - IF dst.obj.adr > 0 THEN GenDbl(dst.obj.adr - DevCPE.pc - 4) - ELSE GenDbl(-dst.obj.adr); dst.obj.adr := -(DevCPE.pc - 4 + relative * 1000000H) - END - ELSE (* imported *) - dst.offset := 0; GenLinked(dst, relative) - END - ELSE DevCPE.GenByte(0FFH); GenCExt(10H, dst) - END; - a1.mode := 0; a2.mode := 0 - END GenCall; - - PROCEDURE GenAssert* (cc, no: INTEGER); - BEGIN - IF cc # ccAlways THEN - IF cc >= 0 THEN - DevCPE.GenByte(70H + cc); (* jcc end *) - IF no < 0 THEN DevCPE.GenByte(2) ELSE DevCPE.GenByte(3) END - END; - IF no < 0 THEN - DevCPE.GenByte(8DH); DevCPE.GenByte(0E0H - no) - ELSE - DevCPE.GenByte(8DH); DevCPE.GenByte(0F0H); DevCPE.GenByte(no) - END - END - END GenAssert; - - PROCEDURE GenReturn* (val: INTEGER); - BEGIN - IF val = 0 THEN DevCPE.GenByte(0C3H) - ELSE DevCPE.GenByte(0C2H); GenWord(val) - END; - a1.mode := 0; a2.mode := 0 - END GenReturn; - - PROCEDURE LoadStr (size: INTEGER); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF size <= 1 THEN DevCPE.GenByte(0ACH) ELSE DevCPE.GenByte(0ADH) END (* lods *) - END LoadStr; - - PROCEDURE StoreStr (size: INTEGER); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF size <= 1 THEN DevCPE.GenByte(0AAH) ELSE DevCPE.GenByte(0ABH) END (* stos *) - END StoreStr; - - PROCEDURE ScanStr (size: INTEGER; rep: BOOLEAN); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF rep THEN DevCPE.GenByte(0F2H) END; - IF size <= 1 THEN DevCPE.GenByte(0AEH) ELSE DevCPE.GenByte(0AFH) END (* scas *) - END ScanStr; - - PROCEDURE TestNull (size: INTEGER); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF size <= 1 THEN DevCPE.GenByte(8); DevCPE.GenByte(0C0H); (* or al,al *) - ELSE DevCPE.GenByte(9); DevCPE.GenByte(0C0H); (* or ax,ax *) - END - END TestNull; - - PROCEDURE GenBlockMove* (wsize, len: INTEGER); (* len = 0: len in ECX *) - VAR w: INTEGER; - BEGIN - IF len = 0 THEN (* variable size move *) - IF wsize = 4 THEN w := 1 ELSIF wsize = 2 THEN w := 1; DevCPE.GenByte(66H) ELSE w := 0 END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0A4H + w); (* rep:movs *) - ELSE (* fixed size move *) - len := len * wsize; - IF len >= 16 THEN - DevCPE.GenByte(0B9H); GenDbl(len DIV 4); (* ld ecx,len/4 *) - DevCPE.GenByte(0F3H); DevCPE.GenByte(0A5H); (* rep:movs long*) - len := len MOD 4 - END; - WHILE len >= 4 DO DevCPE.GenByte(0A5H); DEC(len, 4) END; (* movs long *); - IF len >= 2 THEN DevCPE.GenByte(66H); DevCPE.GenByte(0A5H) END; (* movs word *); - IF ODD(len) THEN DevCPE.GenByte(0A4H) END; (* movs byte *) - END - END GenBlockMove; - - PROCEDURE GenBlockStore* (wsize, len: INTEGER); (* len = 0: len in ECX *) - VAR w: INTEGER; - BEGIN - IF len = 0 THEN (* variable size move *) - IF wsize = 4 THEN w := 1 ELSIF wsize = 2 THEN w := 1; DevCPE.GenByte(66H) ELSE w := 0 END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0AAH + w); (* rep:stos *) - ELSE (* fixed size move *) - len := len * wsize; - IF len >= 16 THEN - DevCPE.GenByte(0B9H); GenDbl(len DIV 4); (* ld ecx,len/4 *) - DevCPE.GenByte(0F3H); DevCPE.GenByte(0ABH); (* rep:stos long*) - len := len MOD 4 - END; - WHILE len >= 4 DO DevCPE.GenByte(0ABH); DEC(len, 4) END; (* stos long *); - IF len >= 2 THEN DevCPE.GenByte(66H); DevCPE.GenByte(0ABH) END; (* stos word *); - IF ODD(len) THEN DevCPE.GenByte(0ABH) END; (* stos byte *) - END - END GenBlockStore; - - PROCEDURE GenBlockComp* (wsize, len: INTEGER); (* len = 0: len in ECX *) - VAR w: INTEGER; - BEGIN - ASSERT(len >= 0); - IF len > 0 THEN DevCPE.GenByte(0B9H); GenDbl(len) END; (* ld ecx,len *) - IF wsize = 4 THEN w := 1 ELSIF wsize = 2 THEN w := 1; DevCPE.GenByte(66H) ELSE w := 0 END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0A6H + w) (* repe:cmps *) - END GenBlockComp; - - PROCEDURE GenStringMove* (excl: BOOLEAN; wsize, dsize, len: INTEGER); - (* - len = 0: len in ECX, len = -1: len undefined; wsize # dsize -> convert; size = 0: opsize = 1, incsize = 2; excl: don't move 0X - *) - VAR loop, end: Label; - BEGIN - IF len > 0 THEN DevCPE.GenByte(0B9H); GenDbl(len) END; (* ld ecx,len *) - (* len >= 0: len IN ECX *) - IF (dsize = 2) & (wsize < 2) THEN DevCPE.GenByte(31H); DevCPE.GenByte(0C0H) END; (* xor eax,eax *) - loop := NewLbl; end := NewLbl; - SetLabel(loop); LoadStr(wsize); - IF wsize = 0 THEN DevCPE.GenByte(46H) END; (* inc esi *) - IF len < 0 THEN (* no limit *) - StoreStr(dsize); TestNull(wsize); GenJump(ccNE, loop, TRUE); - IF excl THEN (* dec edi *) - DevCPE.GenByte(4FH); - IF dsize # 1 THEN DevCPE.GenByte(4FH) END - END; - ELSE (* cx limit *) - IF excl THEN TestNull(wsize); GenJump(ccE, end, TRUE); StoreStr(dsize) - ELSE StoreStr(dsize); TestNull(wsize); GenJump(ccE, end, TRUE) - END; - DevCPE.GenByte(49H); (* dec ecx *) - GenJump(ccNE, loop, TRUE); - GenAssert(ccNever, copyTrap); (* trap *) - SetLabel(end) - END; - a1.mode := 0; a2.mode := 0 - END GenStringMove; - - PROCEDURE GenStringComp* (wsize, dsize: INTEGER); - (* wsize # dsize -> convert; size = 0: opsize = 1, incsize = 2; *) - VAR loop, end: Label; - BEGIN - IF (dsize = 2) & (wsize < 2) THEN DevCPE.GenByte(31H); DevCPE.GenByte(0C0H); (* xor eax,eax *) END; - loop := NewLbl; end := NewLbl; - SetLabel(loop); LoadStr(wsize); - IF wsize = 0 THEN DevCPE.GenByte(46H) END; (* inc esi *) - ScanStr(dsize, FALSE); GenJump(ccNE, end, TRUE); - IF dsize = 0 THEN DevCPE.GenByte(47H) END; (* inc edi *) - TestNull(wsize); GenJump(ccNE, loop, TRUE); - SetLabel(end); - a1.mode := 0; a2.mode := 0 - END GenStringComp; - - PROCEDURE GenStringLength* (wsize, len: INTEGER); (* len = 0: len in ECX, len = -1: len undefined *) - BEGIN - DevCPE.GenByte(31H); DevCPE.GenByte(0C0H); (* xor eax,eax *) - IF len # 0 THEN DevCPE.GenByte(0B9H); GenDbl(len) END; (* ld ecx,len *) - ScanStr(wsize, TRUE); - a1.mode := 0; a2.mode := 0 - END GenStringLength; - - PROCEDURE GenStrStore* (size: INTEGER); - VAR w: INTEGER; - BEGIN - IF size # 0 THEN - IF size MOD 4 = 0 THEN w := 1; size := size DIV 4 - ELSIF size MOD 2 = 0 THEN w := 2; size := size DIV 2 - ELSE w := 0 - END; - DevCPE.GenByte(0B9H); GenDbl(size); (* ld ecx,size *) - IF w = 2 THEN DevCPE.GenByte(66H); w := 1 END - ELSE w := 0 - END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0AAH + w); (* rep:stos *) - a1.mode := 0; a2.mode := 0 - END GenStrStore; - - PROCEDURE GenCode* (op: INTEGER); - BEGIN - DevCPE.GenByte(op); - a1.mode := 0; a2.mode := 0 - END GenCode; - - - PROCEDURE Init*(opt: SET); - BEGIN - DevCPE.Init(processor, opt); - level := 0; - NEW(one); one.realval := 1.0; one.intval := DevCPM.ConstNotAlloc; - END Init; - - PROCEDURE Close*; - BEGIN - a1.obj := NIL; a1.typ := NIL; a2.obj := NIL; a2.typ := NIL; one := NIL; - DevCPE.Close - END Close; - -BEGIN - Size[Undef] := 0; - Size[Byte] := 1; - Size[Bool] := 1; - Size[Char8] := 1; - Size[Int8] := 1; - Size[Int16] := 2; - Size[Int32] := 4; - Size[Real32] := -4; - Size[Real64] := -8; - Size[Set] := 4; - Size[String8] := 0; - Size[NilTyp] := 4; - Size[NoTyp] := 0; - Size[Pointer] := 4; - Size[ProcTyp] := 4; - Size[Comp] := 0; - Size[Char16] := 2; - Size[Int64] := 8; - Size[String16] := 0 -END DevCPL486. diff --git a/new/Dev/Mod/CPM.odc b/new/Dev/Mod/CPM.odc new file mode 100644 index 0000000000000000000000000000000000000000..54734543762421ecc4922b5a00bd6c149e2bcc16 GIT binary patch literal 29690 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⁣knqh%?9z*ct%VXvleZ1^j+v_;FL`Dn3#sSF{s}+b!HAw8^FL%H_ zsvW^+(w9pf5avMbH5bgRrHS6*Cot4M6Z1i3I?OIf})t+RmLV&rvoGghe;d@Hr6H=(u^l9;88?i0tsihW%o`W#q8TjeqFsiZTGFm%Mf@dB< zQ~=8)EDe=xQaQ{8Md;_SVl1WN9LYh*Rooh8yJvyYx@Uq*Krw_()G1aex$Z(vm$)E? z0AE(2WKAC@P#B>2{u{H5uzBk!#3F#WMl4IYQPYnqz$_OV110$dMyA0?#-V0eSX!&C zmjLzYG5DY9xiPb`g~7BJzdHFEGDhFToD$BG8PnG!=Pl%jv#{zX6H{mIA+=i;pVeMN z80hphYoF><2`YSzoS{*cLKx+B#meLqRGt(_+RLvZpIF(<8Z)Sy7|kbzwVWgc3s7T% zJPFbX98WKr(d*i^#f42|(36ZV*m9SJN}nCpTS1``F4C8%_GCoP$Uvo@ND=FuT|hJh75ut&LLIgKn#6gj|IrU9l%%Q6eXuvIX> z-NiA%Y&9IC5}qd2B22X&G!FWz&Gc7mGypCOYGP`#zZNF?F;0&^AoirRZzlFrte znjNSny9n7@6VucE)pk#NSSRXd$HeqispyXg)KfPpA2)BpW--}kAkJyMd}Buc7C8Rq zTVgFGvKG3m+NKZHF>5wd7RnAQJ{Wp{3yMkvfW~!!)pZw33Mg%Cm0zNoytY~5gs5bl z#G^}rf&Btn{0>G$OP4&tdR01>s2sppZW#axw*eEzCq5 zT(@}(@w20uk+=Y%IMA=@XCuV`;sYIDRD(Uu#nPbL_9$cNE)lQux71Em9jnpm zC!(-rog)wkinlkGmP#O^Pop%7CUMWvCN$V`Dq$g4t=ktT6-J{f8(pN!*n}gBT_VWm zVP`rBIN|u{05%t$8)XC?<~Q#ZKETbzXUA2`xZv2~b1R$XP4L~5gR_Un>n*V4Vy7|5 zpsL&rn-)EAJ^^nD)uHS2md+EXV4VGEZ8YI*CSw(YMzbYL`0u~b7) zykce;I8s}KBce7By5lL!W9#jd9_z`hI<*la?!#n~0BMk%Gpzm5$e7L}BV$EEMD=_s z@_o(F{?FtgzUu385ns(ioG~OpJola>p3Osi&F}G1g#D27@oGfTuXfJ04CVN> zJp7CqJQw1|3lM?aB)moZn$^O74>J_$l&l!&h?|Z#6H}QH=RS0&uiG5-Gd^r62EfYe z*u+%EnC@eG@&qVy&7_*)9gMyY0dgL#3)O^4I?n*39>LRQTHj-gL=ife zWgP9qR3Z?vG22Y%4%1R_F;Ww=d|-4IVf+5q-19vG96Bb zHeIi<(~mSfhb;4_)s#dsFHGjnk2+~gd)C);%qTl`9EZgI8qcz%-QUF))N*F&XWpE< z98_|x(p8Bh=S3XTkcn`TgDDll4R(wxlsKQDlo%KIno0#}9$Ay^RL;b*!;m~-BI+P= zerVmQt*EnmSB|weWC$mLaN{Mwm9A<5B6uc@%m}j8-Qs_#w+V zDpRXP9#IS%6H`d3l3_ok2Bh`nWa+z%9kC2Y=qDQET z16pK@;I@yCkC-c?xf-1+>oAQ*g~<(q;zsl(BItHJnG#+`Pmy+ z^E`i??D^?X7BzU!$IeAav@+26 zD!{%*OVjni#g#1rLK_5V*uH6=q-*iozB)Pc2ms`K>g)`cHm_riKZPdNJru9Og&-V~ zW3%d<-%RB$dyvB$^Gxi_uJ#~paT`Mf!^yN=pn*q?ytWJpx8_jwGg_&tg;Fp>fH zv1ZYy1IbYakzU_<25(~#GR}$s>L8ncbCbI9Pxes0Pz0Pn_3UWkY{O9hG{$|nQh_={YWDZTEQ8D>-_W+2LmAs2;Eiw?}HvjrC~* zDp0!Jr?KO&xB(U(iksLTdSvEMuzrNY#3dZ(!(rvbE#-7)HR{Qhuj>rjWshF4J8O}D z^2!pk7Nsm$i+B~VIE0=3hl#-dik#PTyafFYe@<7>!9HdV1?U*Wjyi~s!k@K`b)25t z@%fV_l4sK8c()R+T=S4T0^1URWENCF-Y>NkbmfIo?L)kP3MWVQcaQceOZqhC37Ks; z_@-*c`+Ze`c9R!$rUwM=$$ex2 zGEXZ#?}9--KvR>$QnF2_HSEDaU37J)1fMh4(HIppye1ZRl9g~!Kn@8WOjdY+@OfNo za)+`Re@d~Q^L$mS$dDMxiNnoy*UtnvsSbs(U@=Z=BXCrlh2*1GJnrtTbI7o3ct5O! z<94!3#F}npjl7z;#saW$kkGVqC|hs)Buxw>RDFI*9B5WernrII*8tR_0_4h`)u|h( zLpCc6JoJHB#oK=39xLNANon}uQgK*tCiih77g9 za?2EQj8c0=27=Sjx;~L23$jneY{kX1MYw9EQ}n!JIgve;BL~uegVM*j9CJ!=cn0VB zD91WO-ur^c^-xdgeqtRI9~<6(4RoF0vd#vZO3rgrqFU||pcLr+v;ZjXBY&y3Sh}BR z3ANJ)aMIuK)DG}e!nCuYh(x<WJpnjvS&B?NvDw`?}IF`-T zvbk0^cr()!bCErT{3#r(sp6Y2nySveB^L+;rGSXAVIos1#se^{2I9rkuu}68)s_R) zDyI|pL&gkxT(m(&KS7iRAH~lKPC_$F8dz25`L#J)pXS%Vvz^IHbH;WzS9i8c4Zy*w z#}%QE!V`B_LjypRLe2AisT>(|QZBkf@vkN@VNX|#K(AiKVHGi_q_B}K6!YXnMyD~( z{bl6l3v_vtFUx}SlC?wJRd9#z8M!7;qROn%NV0%Py;Er%J=*KAfA(PI*2YdLp>MB~ z5D184W00vV>h0Ef*|gOPc`*+c-f;#?ZofjFBGPxETUkkfB#7cF78EV>1{sSgoIyFc zCp8(7X9~t-ng(DnNOCxfNyK_4qDB^+qbP%C1u+AsV?RzTgE&-hiL{=iEB*A-!Kiv= zBVx^yHxvwN9WESUB&?;OqyTO917;$H{M8QXE7OBj2t{@mMj%DSGVV zv3h)WVa;7XEz8x$EMj8F!@M>Ob<3R)rwY-UFu%nO2WN54po&H9m~>eWmzP>GC-+{y zo}rd}4NkO7aA%2HJb18;V~B&C$QrmTw98egJ>L0nm#M_Rx-f*X1kPO=Tx(Ty@Ymw? z+Y$V^m~EdvJ(&?^G)lXvy+IH4*fjRMI=J}CU4cWql7b}o-c4pnYnW}A(sAESCvT)k zbO2&e_?X4&O93&Uh`}H0yyYgg9ZI@xr2mJ`WXC8U88$+(byzW_{C^glN+aQKR^?y- zP31Z?o>z#v?h2bM0;glN@RpWw?+p}clX&9Yh~fZ6k-DL9Rs$IGm_ z;0n0DiAQbMM)iz!CT884E`+qR*cU`lJ3yH#KbKc!NehxW+f34$ea6B98^I4p@(6Ya zIIu%cH3yaz$VB1RV=E?Jo^hJztL^1Hoi5>8cUD)Sgoqa3jw=CpEgL@r9o$W3Jj(xF z2`#~IMsb)bE^MzrQDuD?Qx0;D1t8}dl38qnB1(aa!V#7Lqj(u?s7PiJeq$}+IdclD z;jnGlgr@;-3hrU(&QUj5u0L+0=T0|E$2xSM^vec-vf6C%3W8h-rATy2ohK0sq!f$u zR&OEEb7)l~#gfG?^rEmeq<6g2n~51*AL;AZ$-KBB+i612A|)}3b7+Tsyk~b?2=V*v zQ6vKv$tPPAkrS?vACfH>>IMf7j{xBX z-aeepQ=qUeRuMSF4R*9ZjQ@OqXBk8m?WMC4BQcLDjxJg9jzJOc*}4}4(^>jvfjhBV ziw8E=99aGqBHi$ok|%d=t~9?juI~C?#b#j#w$wFLpWnY1Rm-^m64w1#)3TS}82Yu#-7 zB8^(c7%9cdX?S<{hDySf-_q1o@9vMIT&)C>0F$%hqr4zM z3;azq;7dD!8+WdoUT#I-E#T!)ZCFtl#yH0V4y@wskNF~ubKLzsarXnR-noDQkIi)p zY%mL}u#JU24ooLqmDKeBNtP36c28Y+zV`^;Ti}ZOb|iYPRsamrC=S>Rw=L3^Ri1pWJj5U41sd{Bm~$Mdt7e_4dlaPkKImKr)JCNta=v#0-O!Z&s9%tPn>M>ju2Z;2P1Ni^_>x{B+ueUoF0hR0NazXL_Ni{WVuCb z<$T{LiuXIpYa^{#NF13iZ<%xP&spQ&(4KHKpb#8upC;(X7^_&@@xT#j$G_~bX5Us@ z0dKj?*cAr5rq*SVGmZ@oSS~x3@P5T!kTSzLhum&D89GntMB48reV|!C+17XQ?QvY} z3yZO3$qR zK}6?NmNyt;pTJFnNsvU=zI$ROO=D>PY%9AAsU&#E-ujD))E3)8)*=|>0~gr1k1Y#w zOuO?n*=RJ~yB1C5tKG~d;-Jm+wQd^3zUmHazGk;rR`>=iS?2?@hz0vin;x_MO(ZV9 zZzfaf1-v1JXTG`qk;CY2sq^`=!M?ydz9`k0v=Ibqw0j};?_f)pH@ z4Z^~J0a)1POoH$n-LazzYNgPSm*qb!7BpMtpD`Jb?mzyh0(T1hbSAQ^2~_`+gN%J` zm5NSZRz^}DWt3^#>I0(;xU z2ZZLb+(_eUDDE^MPap!3Z@1jP=DQyq^Wh1&Pnf)Auhq6seP;k!k7|NfsoAA4zB$Pz z=~P$&d(!eEANv*|RByH6&!*%hsP;XP1d_j)mcDIU^!v7ZMf&g-Nfo@ITidwzQl8Pq zRY}^oH>tBtvW{gz>$}Ly#(!M#QQ^dKrkVHZajXy8_hbr`73;K830$)7GIOTD6<^}C zN`Kv;a!G$W4=;r6#n|b`p_vMQKCKtq-*w!3f2w;1@F4EBQ`M*N6P*741sFyXIV;PdW(%u3tix7Yf9=#Tk>zXc+{XTu`=G(@4W zfY$}L3jgv4@?d{rkNNz3_&@Y-=j*Q)KK!Zq7yX~-?C&;zn!^9cZ&)xxethDGUwOUo Z7jJyE@Wuc9ko9~?|CTK4@gP%llzsmheuc?tT&1G1<^^{d{)L3MhU!;nAl|- zJFn%H66X|8B`mH(`ip6XU{@L`c?l;-bw9Kkqm3GY#7a8^a}Rb2h7D}3gt?#}<<_2? z3SuZevKJw$$Ib;gy^qnJ4=+3orF3MX5sMce>=uf$O3Kq9C4rA{AkxQ+*U~Fp%FKz2 z&`Gsi0-3W)kMh(hG6TGyo?11#EpN}=U+aTWa3!{!c7gv}rbPIL&dyKHWNQlyN1r}% z(uK1qo?nk3;zWf{!h#iucZ^{2VLI+9GU(+Kxoc0LP7_|686d)aRG`}w^B#&xz(*$=4~h^F;fZz5bXn#Nv2L2j=^ov1!SrXv z?gKB>oNxj@l@9f^Kj0n=8Ll&VyAWxnw3ag#UY|THVN?NZ}1~8-=u?7 zA3)NlSm=xMNm;lApOZD1cYI2Lr449u-N zu$-hXAvp5_aOhT`FMSugP99B=zFvo^JICnHh)92aP3bX` z-An}Lavm%rtFJl)Y~3LMDsV#S*Neq{?_^W84~_TyrG+Phh`Y|EmwlZA0EuFv3l>Y2 zvBn&2%#O-f%%NS=K=}5g)syNsqG!q1CPzHhDsy zDMY(y1$lj_l8(!dKC%|(&TNEY59t)`wD`}mQ zacXBs9(KQ~Ba)UIjdB>tg3Hn2;R&{q;awWfIkj-Q5j$U4pL;pIaI*PYhDupPVf)K!K)bqVhEB6qb(2}p5PY}@ z9!e2P_znv;XKqPFsGl6`Mz?{!Vzut^z!=WyWAi4(YWe_Mln=r*Zi7h*&j4SYA!W#h zHYn5I>OEig*DNs;l8F%Wz@6szpZmFLE6Sf&LL$5yA)oLl^+4gZOqeYplc@qz18y7e z26e!-l@0L|^IZ)HzvqA(d1RB9=vcPHbZ9Jdza293i5?YtFD@|v$9!S zuu%}+_aIj)Q{7X$3Y^`dW*z6+SRMHuDz+mK)9UYF8H5}xmhMswW#JGAX5||+k$SD8VD+! za|Ml3&{%pdV8I1wA8DXM*EzExRS?gs9?n*!ja_I|w3LJ&6M#>!meLkPaO&DGA;=~{ zXwHV5EccOaa#1|IcYHffymxwpg$Kt$COeF*Oy(~;Sr1s+HqK#dy1jS-eXR^HJNfNA zi)dKX(i~OPvKpSIl5^>(R}NNC_f|kkDl77WbfYxDaV1fBXr8}@ikx7eGK&*RAjU@m z%k3{?rWa65Lrwcv4>@^t(k7Vy`kt(enu?XNq37#ES;$OQ$HS0kL4bzQKG!@Wz)jGL z{jdTMg{T|W_@|4;czM; z(MO31wtJE_c5dSV%lXCmH?R5NWz8@mLWMy6U^EM@@dOYXLrIu^2o-^>DLIZgVcnynpIQ?n9tBYEjqTObcX&>_#V3Xvix&>U92+5&;Yh81OOIY7hG)0tZYtvWes z3GJImh;SZ`ux<9DoF)6lO#f;}PAO$4TFa%h*Qb<1A|HfxE>^m_p<*t&%Jvpr)P6@s zy;vAVJ|7{K-YKTh7blO8iUtDn@}`DjCdnfYfa(FbigXN2VNu?XSg)xsQf??YeZ-W; z(@GQEfai5#%dymEF-Kr*Cp z(RvN0o9HLnwIusQEL_c-+PacE)mf66^b4Z}SdM0BoPdTorEq}uJ9ETYC#R^s4p$RB z=Hh^SV)CX(Ot{L03WIA8G|&TfGF?#P(v46#ygWPs_JrGz;W zuyMFycBL&>Oferbqd9-J!5V^Oe_#3qOn>2C^EaS_p-C#*Owvj7f>6NdBx4%d6aaxW z;?vWPi%ixMWaF&y1+-V#uM$vrvpNB!!@b}I%E&wlZ&^3F#FDlk&?wHiP(~eF#MkhD zipD4mr~6YkC8EMv3s>~i!>;^PASvJVCL`EgZ@zUOGxu40$a|Lli?u#D(5(<{u3R3S z_KrG2I_)XoSW`8uKzP#JJA~%YL8tX;hSPHo=v06k0n5VeP7k-3VUCEI;$dejkH}!E z)9rzkF)uvPd1UOP^Yccovx90OTTnz#>tGdCZ0)8iV~*!Z;#rx5S@PW+#7mgpr3TDy zmV@Z-&g z-cq{-0@%oyf^pB(Ix#@mFPwb&&MGWS(3&AJqzcjF?ilC~9;&{E6X1p7YL@c*$3f#&it%q!7;>`xJ6 zjI_2Iq%$QQBw{S&4}D;3M4`drESk1f1bg+=MINcU;EAB=N95kpezq;>atKwjBe`2j zmcyx@+$tr@0Y@_eWJgD_Yb`Bo*Bf&xj#(Ud&xpdA9VG!jmKhfD0Ui=%enG`>@o!+=U#0v zCC`M=z4oAqjhvhT**7+`A|hBIDM)NT(UwM@W^NlYQA0u2w}`tU1~mO7501k5Mb)@2K5IT0blbFJv2b=Y!Wnu|!=2BLU_JCY{T5awU@|oE z+T6+E;Akw#z6xP%s?7=WWzfT~T_WoE#JX7+I8!cFu1VA zqNQNq$Jw*Qk`ka84>awK28Xh^F^;DSWiVwTSMS;#ya7MLJ<`eg1gfJ6a|Xk(YHFUbsxz8V8|@rgAi^D$Vs>@Gh@CZ7UJn+E&R| zGavT0VsQ?uU#%(>OU$llRheA`bWK0SrMo1*(TN?iaWvUL-^dAFZE$yws}^*-ahhaS zsX;>luOG?^?mBed2$mEU5@5<=&FW#dg<~mD0XBESZRVv46r@5VH0KW|yxZhz!=tab ztgMBqIM0gv+>VFZ3~4fssln2W0`X;nNKdIoXF<=v!gTA{qdWrC)1bBj^$SEQx17=p zz`C$lBC=7$baZ*E0Q#w5-rDn_GVE{(#9#fS)k?jWe$#G)8N9J^r?Ijwa?D)72G0{l zQ#RPj@MTb;r?+&&U=lMII!xx_VhPGETbOL68*u!@66h}`C7yG{>-0N~yYaQh!fW-x zt0LYMmpQ;N%^uD~ zdsN=p5pGoCV0jyxjP{+yq^s4_L7K{-W|oGJMt28TO(cgzD;NH0M(7JPWQvn9cP`}y zEpdDcZt?^`G?)*9nQ&W<%N@jbQ*v+ube`%^K6L`GZY0zN$&4l#fmR-JEgP3gSd`Hs z+7y+9ishe3F>`u;Ws(8cQ%F`jJI!){BF%*IqQ3OV=c1Zl$}V|o{=&-p$z#q$6 z_igmrSiF!Ev%H$EA5YPW@cN)%JkLx2^d^Kbn$894hDjF)>F- zGsDk2A_%P?uFwZ}bz9zoXd9fzl*<+1UKt~vcgaN)3UINQjn^g~b|(k$z5sO?R(sv! zqp*jiC9onSxv-OL3QwR7%ZA`R61Dx1eAv4o{cZeI8Ivb}AWZ%%vpfXqgyas-Q7m@AbN2 zl&uvH@p6ktIP?n=05%RYHgML;*CTlLR-5WQxY`?xJIa68h4o0g@E#S-6O~8T*0(fM zV9B%@Ad)=b00;vTA)hi<57F~r9_s+52(15)}kim~B<6@=D1O$@JDHIBuDZ>!@Ea5R>9>770 zZ)e;N=js3iefl7&EsMuJKfMYy%i!4{cRfNv)2!`s*Fnu@mDH}kHy#(f$%Xr5kVAWDLF+^Yyfm=D^h#!O;RJjFWyA@?_LPAeq`dMgVJjwVw}Aq~*I zSeYfTf)mocgN%ZRSH57=3RGd5C=;e3zu3c!bhbg5oy@4%$DBS|}7jF{bx7@05x2#nkX!&4)@tE2|$EWNxyS81qxeY>b#FbeI(xe(8s zy`5Ss^LWV0(!3+1I7<t4Z2(i`Vh56X|rrb%}mblu<@C@DwyMPKmv6;uOs!sQcYAF~`4Jhz z_R8vvx>^8;>0Z0ata_2Lc85F@!YzTOlyxx_O4p7}1XXOx*=8YXfEkFSJK=4@9YSQX zxGCVBcj5NIK#)UB-vdR|Uhjw-39xtI0I#lq1F@|GdzMwTyNIAGq;u>fms?(}C(Z@S zY{fZM(GE-CSoaiw`!%9veN84}hbCBQuNEu?dh4yb-7#DoITDgpII;4Dr;iTzEP>Ia_{Ggc~8`E9)#kzF< z&+$N2pW9<1MvpR1DtF+g62UB$#Xu^qL>Wtnq#1LiegCWQW+{w-qPUoXSc|7gbCme9 zIifeB0>w&Z)%SoQ*LwVG3QQh8s|G49<$Z)Sv8=SQd_2&@b&Eq8s;hK3e5{8s$5a!U zFP_v%%e&E0SssZ`D(|L3WqBm#%9pKzBsmxb)=D?XlTC?6ds%j{nQujR#6d&sT8A?} z7#v|jibuTHc~A_zF&N+!4z^M8XtrDf?^?3h^(2~k+X}oV!}& zVM!lYbNVa8nYvIH!iz`s%hL5!4x!Y$t`6_oQ@Ob@TWtHKrR9=spQT6t%0P1sa(iUNflAY%kiYlQ7(cBxX?JkUcOl@cS+L@SGO!apWgB})h!^z_Eu#HNt} zfTj*k@#j`uO1I%QF|(34;KP1tfBGo85z3Da>C_PPr}>9&gg0j&SKKiqY%V2u=^Z)E zE{j8M9=5@#fUSni#U>(BOk0}|!1Du-0L`5%a+9mgBlD@)E{fFGZ6RB#0?;>%{?j2Y zFTH*Z2GdlSOfN!RL6PWHU@V6RlqAcy1rQ9P+qL-2)up{D@SW++7HeAn!`lj3t z%oVRw%F6ArxZT$uAv$xV8Si(~f>Jq&S#dLP0uMRLy{4EW$!={$N37h~PV@211-rNM z(I@n3=}{)qzSg8h(01FEw+Y!!1Bp>X?n=k)Ja{k;K&~X0VVx7T#l@x9-gxuPHy3by z@zS-WtMdzTfAMPzctg#3xdPKOxBk@(?;gDQ`r>O#26<@_*LIj4C#`r23Sa|jGsBI~ zRe%c=(StN)QlFy%SC`*>W8vzx*A^ES7o0v0 zWcQ2>*{x`ZkbL)S4f*=ZrwvKSPh}(&9#Cx2Sf`KSY@A0Bpv3`;(Wt01X)w>_A zi%oF`ljfmfI|W*0ncYJQiYd^54+x*97%S#f=o|GjlBjZQ(aBn*4^KH- z2cLcM!?{Wn{xrxuAoD8cd)-IcY>0WMcNLZ@A0votv3k?u^v$LjVG-h6gf zM)Y8elZW2W0d_wgVsR3LJz^1B7b6goH=EF+HQ6{@w|)P(*~uQi@@@T|*NOpI_NXDl zNMml_SkF{jz_$IN3%*?(^IU&fi@6}_R<=LDdXLC21=n{}Yb;hFzK}BoDwb9P4TGDl zo`Y8j5cLE(cE{X;?$`>$D+nbg%}nqM4PqO=o|6Iw*wJXVChz0&6P!r2i7<%D$^zN) z9IHo}GPVbl!+1*mh8bj!luAR3e#^opTPp-H4sAz$${kuBkcHUrBFRBU8@4f8MHMW& zd1T-GeN^u-6GwsHV@Wepj`D@ourTbXz3Ek<;cg(PnOw5#@?aoBb_$1PM0#jbZ5$(|Rv>@?M5pj* zAfj_8HFtpv8m4gyAbCL#IB9ztIlL>{MDL4MNvv{h(x?BpI+C=8hS$hPnP>m%CX+22716HV(T!eUD&e_mT5F!>NsjEF$YviAZ}BIOcj2 z<@B2qCiFIpzHsFX(h`9Hl)NmlNg7iUx2f{={gfl#_%3Y#-U$z~#W{5&oVf|Dp6e`Z zzl!}+*&W7ySRbRSND7-Qf&M9tw+TE)Wm)aj7;Ho(ol#waqZG&=f)XsbEdKq%lCV!f zNs`NSlV#UBb~^Bu=T_j(+>v^;P1a51((aW8aM2xEAaJ`_K>tf8xLfyKlEEQn#q#tr=Su|+o_A1SqL*9 z`AYU3jDIBF=V%+vTyP_7PhFVcFnnumedW&DFE{40tp@HJfHzmiRKj9jG6xs;6`g`u zZV@Oi1*?1$B6*oXty8UAUp{2rzjV|YoxnlU8SOQ3gNjycyPxBL$9>T30VBdXg7w*M zf5PkRnI^6!pb4+bChpk@JHkm2+1)KjGN-!`k%A{a8Ds2^r_AKj8azDef66Aaam>a2 z1WsRul@=b09G=rq+|ZGlMazhH+h;&rp2>2kDc+8$BfgYF+}6}XK}V6DIUVt&tD&-{ z^|b(<+STzLjkK$E-JV^&(r$0@iGVFwgH7yn{@R$VJH9O^YeXuhvtojuPIb^ZXXvd7 zy#5v4MOv_Ttrv`$oO__iEd4C>7mJlLpjx1;<8aWX+rc|sGDZ&uSP}t$@wu*Su(!t{ z+ty1?8zq1bdO6=0tJ#ZQFZ_{*x|9BTrpVVn1j55mcywNcJifVyEH{nxZ9J`SzjV# zqZ83EQl^)^S5&ZgEvW$)ZvhEI*f-%3mJ=TQQor2Al%)%o^|$pprUC8+8nlma3QaF_ zfv|BAP{wc|R-dJBY!-7Ad6{|J6=QnogBkTM!fN-6I( zn6lp~r)=J13f$aPWwsjcX|XciD5t3?T28&OMyR{pGSv51?jQw5eW|{?8}GA^4smj% zl(utwZF{S+3g<6!P)ETwsmvsY>n#uVMQR@OsEegblX^s8KIc3nE@LzWp~I(g8E&)@ zg`V)v8Zql)ZYi#~B;l9tHMTxN+Gia5lT_i$t;Y7fJ0um1g5{;T>?+MVj!5K84asJE z@c&kaIwo@Cd-tSD?jeKPz!T**7P6!T!xhxrvwGb#z+%FAY(SKasxewli^?0Pv68iW z{ZDb*X8%4>L>M&z%dVOWtjU6fnmpEP+Oq5VJzlC>PKq~SuyygakJvo6pY(c^VIL8^ zJbRO@Ax*k^?Q?4OGMPc;O`&pGaZ*ObNF&uP7^rSK38s;?IH820 zoRq3=xfiWyxgsi4Hp>-wU@n`@8?|Txh9%s8>Ft|VObsMthdO3Q8abwAH#-XX!GMw< z%yoXLKI(UQ6^`(k%f8nwRnOkRRh+1$*E%SxHM~&1v(}L04lYRs)3l+t**`If)==m+6-$dO%8Es+R02i&PI^{&+@isL_8JBJ!PH%TIKtAa1uS7f zAg<%vO8;b&)5|Ir1h6=~g^$plz=km?K^KuAgA-dPvLPb|M@a@h`2-C_1Sdhpa;%Y* zFwRC1o5`UBm?@Uf4#kKgni6AdB%Rr3D)!QrV)YXIL2pc;A1ADngw0l^2w1QG| z#B&7f2rPj^jSNm@HnDGFGnnzt#`=5Z%;32sx7I6#ixo>`uI6nS;IWrW#t_Vq4f&{J z%ml(fqfLa;^A`GWk#v@&=Ib!K8Lp23H14kdust0UeN4C;-`V=H8Utwr&d)=s*_6 zGVg8RhUi(Il|?k<1^-fj7a$SsY*Fq@pl-lLmOMwL?m<`yLzo9pLS_Kd;S#LX1SrQY zz)Tc!@SxUb*Vb<#%>;d|zsDpJANw7;6FgL9a-w2%dqoVDgJ!R6)T!a@RIx0tR>uAPZqGk@65deDzsy*Ur|;DwT&Bje%)3!=1IeYdZ}xg&lG#q&Mzv z?y$A)xpS7+(v1&y8tdC@H}0^@Fv2pH0K^jP<6IJCfnx;4(muonWLT8PePm9S8$Xum zx2)RwY&P8J1|R;%oSsUmO-~D@Db||oOF+5Os~oc=JsF$Q+Sj1*B^~He^9#==1u{?ikL`}C72_56p#bfpXVU0^JHLO8L`8d zpNF6gwLFO_PymEZGjgI+h3ASHFrN@Sd>)V^6=xfgYIZ&EDo?4w*`=hLiIB$;Q&LIP ziR$%>^z6xKvNM12;)eL_@IcbV41eNx%O24M!cX(^Ln`5D=AYhpfdIUvdn_^ig1zb# zsYT=qwVd@2r}*T76DbULI?6qQZ$fc2AiQcZ4{y}j$3?Z+WHZ?19ThxDkL`*K4zch= z-^P(VuL8e4Mr((?*&Ll6HgSQ!RUu?`-A%aw0f65v=R5yTBk)St(<_=Ws( z9!?6w5h{h@!%Xv)TWzU2mB(fTcxVN{4%SRawzK|mIYVBM?MQLik&faR(MKoX0}PB~ zfRYzb=(5f+1`_UI<3LXc-Dw|zcUogv=ss5JY9?WF%vYH$dU9Oa}wH$_#lBvaPe+)__Hk zl+YdU7$1R^1Dq$3^X@>oCBQ5MLKPN|{P4<319^Qk`9$xH3FY8if?bP0X({E%{=e1ty-gfl~`$;YC}P!+sYnE98C;EF2=!}D8`8~ zp^XUnz%OqU^C52WS~(vMu;%Mk)1Vx8?P@*_gFma#m$eON8}oBzVo$+%u9Ys0yh z71;P^Gj@(gRrd{3HzBChawtPucma%ls{2$^Q)^9!L01n8iqDliGT7^Y=nX8G8xRNk zWEgrIz@x0)6}EdS7^=nv4~Rv!73d*~{RwRm<0VgfH&={C!fW6ScCXXz;>C67ED8<& zr9(F3o=`~qBmM(j|7cw*f3)7l1=@R$)^Qb7=lIe3{t>k0qxFvcPH?p0(K<}Z%-dklw+{Adpluf;<=XU`L2O#S+39Wx@u3@D&c==U)iz`~E# zA0A*@|7abv`A&195^8*~-Ww3_&T$v58Flam3mV5O#2>9sM$I7%ETOUG#t$AR8MEIo z1Rd?R)C9otro_Oi+Ecm8{fROP=%!iP& zOfD*ZOoJo*6|*rEq5@MU>C@l{gEAkc2d~07Pl^~LrZE||WGdek+a(;H&lEFD8r;KU5$qoLX)Vm-w8LMXtw7!{FZQMwe-6wQdEjKE}2VVo6cDE=+3HzS|ANYmx*rZ~84meyZDg4FKG4w?G40}aw z^_1;8P3@fnA2^kYf3b87J+WP#&q_|ASUQHD2&doq>}$cNXSQkrEMgHuPsFG9HQ}?5 zH$4h}5sMglB0l?H6F%@`75^d@G4w=yO49z6@^v^?KW&0k#3HK8C*p$@rv!uqqZN4$ zI4~=Ua3Vf2<}-;Ilbh@o|poP zB>KfT$)A!7^YZG-85{d8qM}}di_ue{fX!J@2`l&yaPOTs96VPY+)O4c*!a=mps-6# z6DLA@is2uHDb{8fT#PP@X^_>2;RrtYH`GzbUR;@}z)~wsQ^X^Z2Nq^(0YXBZ5Laim zchI?V+X#$?5@_|Z0Cot(dLkp{d$PbOv4HGkh@T8a7{+>tBYIO|$U6Qs7-z&oR{Xyr z4B&y~{~VCmmNVj^TL``y4Bb%h)nLd5<{XHmU-E5{T&4=K`*~_N$sbP_YJ4WcG;bbg0+?F%?nWz@0-h z0*av`MY;WZD$E?TGkny=&8g>@-pQ7^+Qx@1@+HqbcvZ-|`E&Dt{VRBu3o5OQ2ffPG zf01AuT9jy2c!(#t8bsyzRRu%c(A7Y+W~N1qs$kG-<3er zX`U+<1{*gY($vsG8EkYlVCrxqk9nr0lki!)oqqhJ*p%Sua{x$Qv0|~zOJI_dv3E#BD zFCSkF*);I8{w?KKMmS(J^C!QlzGU4Qq>@7)}L literal 0 HcmV?d00001 diff --git a/new/Dev/Mod/CPT.txt b/new/Dev/Mod/CPT.txt deleted file mode 100644 index 2fdbc03..0000000 --- a/new/Dev/Mod/CPT.txt +++ /dev/null @@ -1,1890 +0,0 @@ -MODULE DevCPT; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/CPT.odc *) - (* DO NOT EDIT *) - - IMPORT DevCPM; - - CONST - MaxIdLen = 256; - - TYPE - Name* = ARRAY MaxIdLen OF SHORTCHAR; - String* = POINTER TO ARRAY OF SHORTCHAR; - Const* = POINTER TO ConstDesc; - Object* = POINTER TO ObjDesc; - Struct* = POINTER TO StrDesc; - Node* = POINTER TO NodeDesc; - ConstExt* = String; - LinkList* = POINTER TO LinkDesc; - - ConstDesc* = RECORD - ext*: ConstExt; (* string or code for code proc (longstring in utf8) *) - intval*: INTEGER; (* constant value or adr, proc par size, text position or least case label *) - intval2*: INTEGER; (* string length (#char, incl 0X), proc var size or larger case label *) - setval*: SET; (* constant value, procedure body present or "ELSE" present in case *) - realval*: REAL; (* real or longreal constant value *) - link*: Const (* chain of constants present in obj file *) - END ; - - LinkDesc* = RECORD - offset*, linkadr*: INTEGER; - next*: LinkList; - END; - - ObjDesc* = RECORD - left*, right*, link*, scope*: Object; - name*: String; (* name = null OR name^ # "" *) - leaf*: BOOLEAN; - sysflag*: BYTE; - mode*, mnolev*: BYTE; (* mnolev < 0 -> mno = -mnolev *) - vis*: BYTE; (* internal, external, externalR, inPar, outPar *) - history*: BYTE; (* relevant if name # "" *) - used*, fpdone*: BOOLEAN; - fprint*: INTEGER; - typ*: Struct; (* actual type, changed in with statements *) - ptyp*: Struct; (* original type if typ is changed *) - conval*: Const; - adr*, num*: INTEGER; (* mthno *) - links*: LinkList; - nlink*: Object; (* link for name list, declaration order for methods, library link for imp obj *) - library*, entry*: String; (* library name, entry name *) - modifiers*: POINTER TO ARRAY OF String; (* additional interface strings *) - linkadr*: INTEGER; (* used in ofront *) - red: BOOLEAN; - END ; - - StrDesc* = RECORD - form*, comp*, mno*, extlev*: BYTE; - ref*, sysflag*: SHORTINT; - n*, size*, align*, txtpos*: INTEGER; (* align is alignment for records and len offset for dynarrs *) - untagged*, allocated*, pbused*, pvused*, exp*, fpdone, idfpdone: BOOLEAN; - attribute*: BYTE; - idfp, pbfp*, pvfp*:INTEGER; - BaseTyp*: Struct; - link*, strobj*: Object; - ext*: ConstExt (* id string for interface records *) - END ; - - NodeDesc* = RECORD - left*, right*, link*: Node; - class*, subcl*, hint*: BYTE; - readonly*: BOOLEAN; - typ*: Struct; - obj*: Object; - conval*: Const - END ; - - CONST - maxImps = 127; (* must be <= MAX(SHORTINT) *) - maxStruct = DevCPM.MaxStruct; (* must be < MAX(INTEGER) DIV 2 *) - FirstRef = 32; - FirstRef0 = 16; (* correction for version 0 *) - actVersion = 1; - - VAR - topScope*: Object; - undftyp*, bytetyp*, booltyp*, char8typ*, int8typ*, int16typ*, int32typ*, - real32typ*, real64typ*, settyp*, string8typ*, niltyp*, notyp*, sysptrtyp*, - anytyp*, anyptrtyp*, char16typ*, string16typ*, int64typ*, - restyp*, iunktyp*, punktyp*, guidtyp*, - intrealtyp*, lreal64typ*, lint64typ*, lchar16typ*: Struct; - nofGmod*: BYTE; (*nof imports*) - GlbMod*: ARRAY maxImps OF Object; (* .right = first object, .name = module import name (not alias) *) - SelfName*: Name; (* name of module being compiled *) - SYSimported*: BOOLEAN; - processor*, impProc*: SHORTINT; - libName*: Name; (* library alias of module being compiled *) - null*: String; (* "" *) - - CONST - (* object modes *) - Var = 1; VarPar = 2; Con = 3; Fld = 4; Typ = 5; LProc = 6; XProc = 7; - SProc = 8; CProc = 9; IProc = 10; Mod = 11; Head = 12; TProc = 13; Attr = 20; - - (* structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - AnyPtr = 14; AnyRec = 15; (* sym file only *) - Char16 = 16; String16 = 17; Int64 = 18; - Res = 20; IUnk = 21; PUnk = 22; Guid = 23; - - (* composite structure forms *) - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - (*function number*) - assign = 0; - haltfn = 0; newfn = 1; absfn = 2; capfn = 3; ordfn = 4; - entierfn = 5; oddfn = 6; minfn = 7; maxfn = 8; chrfn = 9; - shortfn = 10; longfn = 11; sizefn = 12; incfn = 13; decfn = 14; - inclfn = 15; exclfn = 16; lenfn = 17; copyfn = 18; ashfn = 19; assertfn = 32; - lchrfn = 33; lentierfcn = 34; typfn = 36; bitsfn = 37; bytesfn = 38; - - (*SYSTEM function number*) - adrfn = 20; ccfn = 21; lshfn = 22; rotfn = 23; - getfn = 24; putfn = 25; getrfn = 26; putrfn = 27; - bitfn = 28; valfn = 29; sysnewfn = 30; movefn = 31; - thisrecfn = 45; thisarrfn = 46; - - (* COM function number *) - validfn = 40; iidfn = 41; queryfn = 42; - - (* attribute flags (attr.adr, struct.attribute, proc.conval.setval) *) - newAttr = 16; absAttr = 17; limAttr = 18; empAttr = 19; extAttr = 20; - - (* procedure flags (conval.setval) *) - isHidden = 29; - - (* module visibility of objects *) - internal = 0; external = 1; externalR = 2; inPar = 3; outPar = 4; - - (* history of imported objects *) - inserted = 0; same = 1; pbmodified = 2; pvmodified = 3; removed = 4; inconsistent = 5; - - (* sysflags *) - inBit = 2; outBit = 4; interface = 10; - - (* symbol file items *) - Smname = 16; Send = 18; Stype = 19; Salias = 20; Svar = 21; Srvar = 22; - Svalpar = 23; Svarpar = 24; Sfld = 25; Srfld = 26; Shdptr = 27; Shdpro = 28; Stpro = 29; Shdtpro = 30; - Sxpro = 31; Sipro = 32; Scpro = 33; Sstruct = 34; Ssys = 35; Sptr = 36; Sarr = 37; Sdarr = 38; Srec = 39; Spro = 40; - Shdutptr = 41; Slib = 42; Sentry = 43; Sinpar = 25; Soutpar = 26; - Slimrec = 25; Sabsrec = 26; Sextrec = 27; Slimpro = 31; Sabspro = 32; Semppro = 33; Sextpro = 34; Simpo = 22; - - TYPE - ImpCtxt = RECORD - nextTag, reffp: INTEGER; - nofr, minr, nofm: SHORTINT; - self: BOOLEAN; - ref: ARRAY maxStruct OF Struct; - old: ARRAY maxStruct OF Object; - pvfp: ARRAY maxStruct OF INTEGER; (* set only if old # NIL *) - glbmno: ARRAY maxImps OF BYTE (* index is local mno *) - END ; - - ExpCtxt = RECORD - reffp: INTEGER; - ref: SHORTINT; - nofm: BYTE; - locmno: ARRAY maxImps OF BYTE (* index is global mno *) - END ; - - VAR - universe, syslink, comlink, infinity: Object; - impCtxt: ImpCtxt; - expCtxt: ExpCtxt; - nofhdfld: INTEGER; - sfpresent, symExtended, symNew: BOOLEAN; - version: INTEGER; - symChanges: INTEGER; - portable: BOOLEAN; - depth: INTEGER; - - - PROCEDURE err(n: SHORTINT); - BEGIN DevCPM.err(n) - END err; - - PROCEDURE NewConst*(): Const; - VAR const: Const; - BEGIN NEW(const); RETURN const - END NewConst; - - PROCEDURE NewObj*(): Object; - VAR obj: Object; - BEGIN NEW(obj); obj.name := null; RETURN obj - END NewObj; - - PROCEDURE NewStr*(form, comp: BYTE): Struct; - VAR typ: Struct; - BEGIN NEW(typ); typ.form := form; typ.comp := comp; typ.ref := maxStruct; (* ref >= maxStruct: not exported yet *) - typ.txtpos := DevCPM.errpos; typ.size := -1; typ.BaseTyp := undftyp; RETURN typ - END NewStr; - - PROCEDURE NewNode*(class: BYTE): Node; - VAR node: Node; - BEGIN - NEW(node); node.class := class; RETURN node - END NewNode; -(* - PROCEDURE NewExt*(): ConstExt; - VAR ext: ConstExt; - BEGIN NEW(ext); RETURN ext - END NewExt; -*) - PROCEDURE NewName* ((*IN*) name: ARRAY OF SHORTCHAR): String; - VAR i: INTEGER; p: String; - BEGIN - i := 0; WHILE name[i] # 0X DO INC(i) END; - IF i > 0 THEN NEW(p, i + 1); p^ := name$; RETURN p - ELSE RETURN null - END - END NewName; - - PROCEDURE OpenScope*(level: BYTE; owner: Object); - VAR head: Object; - BEGIN head := NewObj(); - head.mode := Head; head.mnolev := level; head.link := owner; - IF owner # NIL THEN owner.scope := head END ; - head.left := topScope; head.right := NIL; head.scope := NIL; topScope := head - END OpenScope; - - PROCEDURE CloseScope*; - BEGIN topScope := topScope.left - END CloseScope; - - PROCEDURE Init*(opt: SET); - BEGIN - topScope := universe; OpenScope(0, NIL); SYSimported := FALSE; - GlbMod[0] := topScope; nofGmod := 1; - sfpresent := TRUE; (* !!! *) - symChanges := 0; - infinity.conval.intval := DevCPM.ConstNotAlloc; - depth := 0 - END Init; - - PROCEDURE Open* (name: Name); - BEGIN - SelfName := name$; topScope.name := NewName(name); - END Open; - - PROCEDURE Close*; - VAR i: SHORTINT; - BEGIN (* garbage collection *) - CloseScope; - i := 0; WHILE i < maxImps DO GlbMod[i] := NIL; INC(i) END ; - i := FirstRef; WHILE i < maxStruct DO impCtxt.ref[i] := NIL; impCtxt.old[i] := NIL; INC(i) END - END Close; - - PROCEDURE SameType* (x, y: Struct): BOOLEAN; - BEGIN - RETURN (x = y) OR (x.form = y.form) & ~(x.form IN {Pointer, ProcTyp, Comp}) OR (x = undftyp) OR (y = undftyp) - END SameType; - - PROCEDURE EqualType* (x, y: Struct): BOOLEAN; - VAR xp, yp: Object; n: INTEGER; - BEGIN - n := 0; - WHILE (n < 100) & (x # y) - & (((x.comp = DynArr) & (y.comp = DynArr) & (x.sysflag = y.sysflag)) - OR ((x.form = Pointer) & (y.form = Pointer)) - OR ((x.form = ProcTyp) & (y.form = ProcTyp))) DO - IF x.form = ProcTyp THEN - IF x.sysflag # y.sysflag THEN RETURN FALSE END; - xp := x.link; yp := y.link; - INC(depth); - WHILE (xp # NIL) & (yp # NIL) & (xp.mode = yp.mode) & (xp.sysflag = yp.sysflag) - & (xp.vis = yp.vis) & (depth < 100) & EqualType(xp.typ, yp.typ) DO - xp := xp.link; yp := yp.link - END; - DEC(depth); - IF (xp # NIL) OR (yp # NIL) THEN RETURN FALSE END - END; - x := x.BaseTyp; y := y.BaseTyp; INC(n) - END; - RETURN SameType(x, y) - END EqualType; - - PROCEDURE Extends* (x, y: Struct): BOOLEAN; - BEGIN - IF (x.form = Pointer) & (y.form = Pointer) THEN x := x.BaseTyp; y := y.BaseTyp END; - IF (x.comp = Record) & (y.comp = Record) THEN - IF (y = anytyp) & ~x.untagged THEN RETURN TRUE END; - WHILE (x # NIL) & (x # undftyp) & (x # y) DO x := x.BaseTyp END - END; - RETURN (x # NIL) & EqualType(x, y) - END Extends; - - PROCEDURE Includes* (xform, yform: INTEGER): BOOLEAN; - BEGIN - CASE xform OF - | Char16: RETURN yform IN {Char8, Char16, Int8} - | Int16: RETURN yform IN {Char8, Int8, Int16} - | Int32: RETURN yform IN {Char8, Char16, Int8, Int16, Int32} - | Int64: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64} - | Real32: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64, Real32} - | Real64: RETURN yform IN {Char8, Char16, Int8, Int16, Int32, Int64, Real32, Real64} - | String16: RETURN yform IN {String8, String16} - ELSE RETURN xform = yform - END - END Includes; - - PROCEDURE FindImport*(VAR name: Name; mod: Object; VAR res: Object); - VAR obj: Object; (* i: INTEGER; n: Name; *) - BEGIN obj := mod.scope.right; - LOOP - IF obj = NIL THEN EXIT END ; - IF name < obj.name^ THEN obj := obj.left - ELSIF name > obj.name^ THEN obj := obj.right - ELSE (*found*) - IF (obj.mode = Typ) & (obj.vis = internal) THEN obj := NIL - ELSE obj.used := TRUE - END ; - EXIT - END - END ; - res := obj; -(* bh: checks usage of non Unicode WinApi functions and types - IF (res # NIL) & (mod.scope.library # NIL) - & ~(DevCPM.interface IN DevCPM.options) - & (SelfName # "Kernel") & (SelfName # "HostPorts") THEN - n := name + "W"; - FindImport(n, mod, obj); - IF obj # NIL THEN - DevCPM.err(733) - ELSE - i := LEN(name$); - IF name[i - 1] = "A" THEN - n[i - 1] := "W"; n[i] := 0X; - FindImport(n, mod, obj); - IF obj # NIL THEN - DevCPM.err(734) - END - END - END - END; -*) - END FindImport; - - PROCEDURE Find*(VAR name: Name; VAR res: Object); - VAR obj, head: Object; - BEGIN head := topScope; - LOOP obj := head.right; - LOOP - IF obj = NIL THEN EXIT END ; - IF name < obj.name^ THEN obj := obj.left - ELSIF name > obj.name^ THEN obj := obj.right - ELSE (* found, obj.used not set for local objects *) EXIT - END - END ; - IF obj # NIL THEN EXIT END ; - head := head.left; - IF head = NIL THEN EXIT END - END ; - res := obj - END Find; - - PROCEDURE FindFld (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object); - VAR obj: Object; - BEGIN - WHILE (typ # NIL) & (typ # undftyp) DO obj := typ.link; - WHILE obj # NIL DO - IF name < obj.name^ THEN obj := obj.left - ELSIF name > obj.name^ THEN obj := obj.right - ELSE (*found*) res := obj; RETURN - END - END ; - typ := typ.BaseTyp - END; - res := NIL - END FindFld; - - PROCEDURE FindField* (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object); - BEGIN - FindFld(name, typ, res); - IF (res = NIL) & ~typ.untagged THEN FindFld(name, anytyp, res) END - END FindField; - - PROCEDURE FindBaseField* (VAR name: ARRAY OF SHORTCHAR; typ: Struct; VAR res: Object); - BEGIN - FindFld(name, typ.BaseTyp, res); - IF (res = NIL) & ~typ.untagged THEN FindFld(name, anytyp, res) END - END FindBaseField; - -(* - PROCEDURE Rotated (y: Object; name: String): Object; - VAR c, gc: Object; - BEGIN - IF name^ < y.name^ THEN - c := y.left; - IF name^ < c.name^ THEN gc := c.left; c.left := gc.right; gc.right := c - ELSE gc := c.right; c.right := gc.left; gc.left := c - END; - y.left := gc - ELSE - c := y.right; - IF name^ < c.name^ THEN gc := c.left; c.left := gc.right; gc.right := c - ELSE gc := c.right; c.right := gc.left; gc.left := c - END; - y.right := gc - END; - RETURN gc - END Rotated; - - PROCEDURE InsertIn (obj, scope: Object; VAR old: Object); - VAR gg, g, p, x: Object; name, sname: String; - BEGIN - sname := scope.name; scope.name := null; - gg := scope; g := gg; p := g; x := p.right; name := obj.name; - WHILE x # NIL DO - IF (x.left # NIL) & (x.right # NIL) & x.left.red & x.right.red THEN - x.red := TRUE; x.left.red := FALSE; x.right.red := FALSE; - IF p.red THEN - g.red := TRUE; - IF (name^ < g.name^) # (name^ < p.name^) THEN p := Rotated(g, name) END; - x := Rotated(gg, name); x.red := FALSE - END - END; - gg := g; g := p; p := x; - IF name^ < x.name^ THEN x := x.left - ELSIF name^ > x.name^ THEN x := x.right - ELSE old := x; scope.right.red := FALSE; scope.name := sname; RETURN - END - END; - x := obj; old := NIL; - IF name^ < p.name^ THEN p.left := x ELSE p.right := x END; - x.red := TRUE; - IF p.red THEN - g.red := TRUE; - IF (name^ < g.name^) # (name^ < p.name^) THEN p := Rotated(g, name) END; - x := Rotated(gg, name); - x.red := FALSE - END; - scope.right.red := FALSE; scope.name := sname - END InsertIn; -*) - PROCEDURE InsertIn (obj, scope: Object; VAR old: Object); - VAR ob0, ob1: Object; left: BOOLEAN; name: String; - BEGIN - ASSERT((scope # NIL) & (scope.mode = Head), 100); - ob0 := scope; ob1 := scope.right; left := FALSE; name := obj.name; - WHILE ob1 # NIL DO - IF name^ < ob1.name^ THEN ob0 := ob1; ob1 := ob1.left; left := TRUE - ELSIF name^ > ob1.name^ THEN ob0 := ob1; ob1 := ob1.right; left := FALSE - ELSE old := ob1; RETURN - END - END; - IF left THEN ob0.left := obj ELSE ob0.right := obj END ; - obj.left := NIL; obj.right := NIL; old := NIL - END InsertIn; - - PROCEDURE Insert* (VAR name: Name; VAR obj: Object); - VAR old: Object; - BEGIN - obj := NewObj(); obj.leaf := TRUE; - obj.name := NewName(name); - obj.mnolev := topScope.mnolev; - InsertIn(obj, topScope, old); - IF old # NIL THEN err(1) END (*double def*) - END Insert; - - PROCEDURE InsertThisField (obj: Object; typ: Struct; VAR old: Object); - VAR ob0, ob1: Object; left: BOOLEAN; name: String; - BEGIN - IF typ.link = NIL THEN typ.link := obj - ELSE - ob1 := typ.link; name := obj.name; - REPEAT - IF name^ < ob1.name^ THEN ob0 := ob1; ob1 := ob1.left; left := TRUE - ELSIF name^ > ob1.name^ THEN ob0 := ob1; ob1 := ob1.right; left := FALSE - ELSE old := ob1; RETURN - END - UNTIL ob1 = NIL; - IF left THEN ob0.left := obj ELSE ob0.right := obj END - END - END InsertThisField; - - PROCEDURE InsertField* (VAR name: Name; typ: Struct; VAR obj: Object); - VAR old: Object; - BEGIN - obj := NewObj(); obj.leaf := TRUE; - obj.name := NewName(name); - InsertThisField(obj, typ, old); - IF old # NIL THEN err(1) END (*double def*) - END InsertField; - - -(*-------------------------- Fingerprinting --------------------------*) - - PROCEDURE FPrintName(VAR fp: INTEGER; VAR name: ARRAY OF SHORTCHAR); - VAR i: SHORTINT; ch: SHORTCHAR; - BEGIN i := 0; - REPEAT ch := name[i]; DevCPM.FPrint(fp, ORD(ch)); INC(i) UNTIL ch = 0X - END FPrintName; - - PROCEDURE ^IdFPrint*(typ: Struct); - - PROCEDURE FPrintSign*(VAR fp: INTEGER; result: Struct; par: Object); - (* depends on assignment compatibility of params only *) - BEGIN - IdFPrint(result); DevCPM.FPrint(fp, result.idfp); - WHILE par # NIL DO - DevCPM.FPrint(fp, par.mode); IdFPrint(par.typ); DevCPM.FPrint(fp, par.typ.idfp); - IF (par.mode = VarPar) & (par.vis # 0) THEN DevCPM.FPrint(fp, par.vis) END; (* IN / OUT *) - IF par.sysflag # 0 THEN DevCPM.FPrint(fp, par.sysflag) END; - (* par.name and par.adr not considered *) - par := par.link - END - END FPrintSign; - - PROCEDURE IdFPrint*(typ: Struct); (* idfp codifies assignment compatibility *) - VAR btyp: Struct; strobj: Object; idfp: INTEGER; f, c: SHORTINT; - BEGIN - IF ~typ.idfpdone THEN - typ.idfpdone := TRUE; (* may be recursive, temporary idfp is 0 in that case *) - idfp := 0; f := typ.form; c := typ.comp; DevCPM.FPrint(idfp, f); DevCPM.FPrint(idfp, c); - btyp := typ.BaseTyp; strobj := typ.strobj; - IF (strobj # NIL) & (strobj.name # null) THEN - FPrintName(idfp, GlbMod[typ.mno].name^); FPrintName(idfp, strobj.name^) - END ; - IF (f = Pointer) OR (c = Record) & (btyp # NIL) OR (c = DynArr) THEN - IdFPrint(btyp); DevCPM.FPrint(idfp, btyp.idfp) - ELSIF c = Array THEN IdFPrint(btyp); DevCPM.FPrint(idfp, btyp.idfp); DevCPM.FPrint(idfp, typ.n) - ELSIF f = ProcTyp THEN FPrintSign(idfp, btyp, typ.link) - END ; - typ.idfp := idfp - END - END IdFPrint; - - PROCEDURE FPrintStr*(typ: Struct); - VAR f, c: SHORTINT; btyp: Struct; strobj, bstrobj: Object; pbfp, pvfp: INTEGER; - - PROCEDURE ^FPrintFlds(fld: Object; adr: INTEGER; visible: BOOLEAN); - - PROCEDURE FPrintHdFld(typ: Struct; fld: Object; adr: INTEGER); (* modifies pvfp only *) - VAR i, j, n: INTEGER; btyp: Struct; - BEGIN - IF typ.comp = Record THEN FPrintFlds(typ.link, adr, FALSE) - ELSIF typ.comp = Array THEN btyp := typ.BaseTyp; n := typ.n; - WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ; - IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN - j := nofhdfld; FPrintHdFld(btyp, fld, adr); - IF j # nofhdfld THEN i := 1; - WHILE (i < n) (* & (nofhdfld <= DevCPM.MaxHdFld) *) DO (* !!! *) - INC(adr, btyp.size); FPrintHdFld(btyp, fld, adr); INC(i) - END - END - END - ELSIF DevCPM.ExpHdPtrFld & - ((typ.form = Pointer) & ~typ.untagged OR (fld.name^ = DevCPM.HdPtrName)) THEN (* !!! *) - DevCPM.FPrint(pvfp, Pointer); DevCPM.FPrint(pvfp, adr); INC(nofhdfld) - ELSIF DevCPM.ExpHdUtPtrFld & - ((typ.form = Pointer) & typ.untagged OR (fld.name^ = DevCPM.HdUtPtrName)) THEN (* !!! *) - DevCPM.FPrint(pvfp, Pointer); DevCPM.FPrint(pvfp, adr); INC(nofhdfld); - IF typ.form = Pointer THEN DevCPM.FPrint(pvfp, typ.sysflag) ELSE DevCPM.FPrint(pvfp, fld.sysflag) END - ELSIF DevCPM.ExpHdProcFld & ((typ.form = ProcTyp) OR (fld.name^ = DevCPM.HdProcName)) THEN - DevCPM.FPrint(pvfp, ProcTyp); DevCPM.FPrint(pvfp, adr); INC(nofhdfld) - END - END FPrintHdFld; - - PROCEDURE FPrintFlds(fld: Object; adr: INTEGER; visible: BOOLEAN); (* modifies pbfp and pvfp *) - BEGIN - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF (fld.vis # internal) & visible THEN - DevCPM.FPrint(pvfp, fld.vis); FPrintName(pvfp, fld.name^); DevCPM.FPrint(pvfp, fld.adr); - DevCPM.FPrint(pbfp, fld.vis); FPrintName(pbfp, fld.name^); DevCPM.FPrint(pbfp, fld.adr); - FPrintStr(fld.typ); DevCPM.FPrint(pbfp, fld.typ.pbfp); DevCPM.FPrint(pvfp, fld.typ.pvfp) - ELSE FPrintHdFld(fld.typ, fld, fld.adr + adr) - END ; - fld := fld.link - END - END FPrintFlds; - - PROCEDURE FPrintTProcs(obj: Object); (* modifies pbfp and pvfp *) - VAR fp: INTEGER; - BEGIN - IF obj # NIL THEN - FPrintTProcs(obj.left); - IF obj.mode = TProc THEN - IF obj.vis # internal THEN - fp := 0; - IF obj.vis = externalR THEN DevCPM.FPrint(fp, externalR) END; - IF limAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, limAttr) - ELSIF absAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, absAttr) - ELSIF empAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, empAttr) - ELSIF extAttr IN obj.conval.setval THEN DevCPM.FPrint(fp, extAttr) - END; - DevCPM.FPrint(fp, TProc); DevCPM.FPrint(fp, obj.num); - FPrintSign(fp, obj.typ, obj.link); FPrintName(fp, obj.name^); - IF obj.entry # NIL THEN FPrintName(fp, obj.entry^) END; - DevCPM.FPrint(pvfp, fp); DevCPM.FPrint(pbfp, fp) - ELSIF DevCPM.ExpHdTProc THEN - DevCPM.FPrint(pvfp, TProc); DevCPM.FPrint(pvfp, obj.num) - END - END; - FPrintTProcs(obj.right) - END - END FPrintTProcs; - - BEGIN - IF ~typ.fpdone THEN - IdFPrint(typ); pbfp := typ.idfp; - IF typ.sysflag # 0 THEN DevCPM.FPrint(pbfp, typ.sysflag) END; - IF typ.ext # NIL THEN FPrintName(pbfp, typ.ext^) END; - IF typ.attribute # 0 THEN DevCPM.FPrint(pbfp, typ.attribute) END; - pvfp := pbfp; typ.pbfp := pbfp; typ.pvfp := pvfp; (* initial fprints may be used recursively *) - typ.fpdone := TRUE; - f := typ.form; c := typ.comp; btyp := typ.BaseTyp; - IF f = Pointer THEN - strobj := typ.strobj; bstrobj := btyp.strobj; - IF (strobj = NIL) OR (strobj.name = null) OR (bstrobj = NIL) OR (bstrobj.name = null) THEN - FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); pvfp := pbfp - (* else use idfp as pbfp and as pvfp, do not call FPrintStr(btyp) here, else cycle not broken *) - END - ELSIF f = ProcTyp THEN (* use idfp as pbfp and as pvfp *) - ELSIF c IN {Array, DynArr} THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pvfp); pvfp := pbfp - ELSE (* c = Record *) - IF btyp # NIL THEN FPrintStr(btyp); DevCPM.FPrint(pbfp, btyp.pbfp); DevCPM.FPrint(pvfp, btyp.pvfp) END ; - DevCPM.FPrint(pvfp, typ.size); DevCPM.FPrint(pvfp, typ.align); DevCPM.FPrint(pvfp, typ.n); - nofhdfld := 0; FPrintFlds(typ.link, 0, TRUE); - FPrintTProcs(typ.link); (* DevCPM.FPrint(pvfp, pbfp); *) strobj := typ.strobj; - IF (strobj = NIL) OR (strobj.name = null) THEN pbfp := pvfp END - END ; - typ.pbfp := pbfp; typ.pvfp := pvfp - END - END FPrintStr; - - PROCEDURE FPrintObj*(obj: Object); - VAR fprint: INTEGER; f, m: SHORTINT; rval: SHORTREAL; ext: ConstExt; mod: Object; r: REAL; x: INTEGER; - BEGIN - IF ~obj.fpdone THEN - fprint := 0; obj.fpdone := TRUE; - DevCPM.FPrint(fprint, obj.mode); - IF obj.mode = Con THEN - f := obj.typ.form; DevCPM.FPrint(fprint, f); - CASE f OF - | Bool, Char8, Char16, Int8, Int16, Int32: - DevCPM.FPrint(fprint, obj.conval.intval) - | Int64: - x := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4294967296.0)); - r := obj.conval.realval + obj.conval.intval - x * 4294967296.0; - IF r > MAX(INTEGER) THEN r := r - 4294967296.0 END; - DevCPM.FPrint(fprint, SHORT(ENTIER(r))); - DevCPM.FPrint(fprint, x) - | Set: - DevCPM.FPrintSet(fprint, obj.conval.setval) - | Real32: - rval := SHORT(obj.conval.realval); DevCPM.FPrintReal(fprint, rval) - | Real64: - DevCPM.FPrintLReal(fprint, obj.conval.realval) - | String8, String16: - FPrintName(fprint, obj.conval.ext^) - | NilTyp: - ELSE err(127) - END - ELSIF obj.mode = Var THEN - DevCPM.FPrint(fprint, obj.vis); FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp) - ELSIF obj.mode IN {XProc, IProc} THEN - FPrintSign(fprint, obj.typ, obj.link) - ELSIF obj.mode = CProc THEN - FPrintSign(fprint, obj.typ, obj.link); ext := obj.conval.ext; - m := ORD(ext^[0]); f := 1; DevCPM.FPrint(fprint, m); - WHILE f <= m DO DevCPM.FPrint(fprint, ORD(ext^[f])); INC(f) END - ELSIF obj.mode = Typ THEN - FPrintStr(obj.typ); DevCPM.FPrint(fprint, obj.typ.pbfp) - END ; - IF obj.sysflag < 0 THEN DevCPM.FPrint(fprint, obj.sysflag) END; - IF obj.mode IN {LProc, XProc, CProc, Var, Typ, Con} THEN - IF obj.library # NIL THEN - FPrintName(fprint, obj.library^) - ELSIF obj.mnolev < 0 THEN - mod := GlbMod[-obj.mnolev]; - IF (mod.library # NIL) THEN - FPrintName(fprint, mod.library^) - END - ELSIF obj.mnolev = 0 THEN - IF libName # "" THEN FPrintName(fprint, libName) END - END; - IF obj.entry # NIL THEN FPrintName(fprint, obj.entry^) END - END; - obj.fprint := fprint - END - END FPrintObj; - - PROCEDURE FPrintErr* (obj: Object; errno: SHORTINT); (* !!! *) - BEGIN - IF errno = 249 THEN - DevCPM.LogWLn; DevCPM.LogWStr(" "); - DevCPM.LogWStr(GlbMod[-obj.mnolev].name^); - DevCPM.LogW("."); DevCPM.LogWStr(obj.name^); - DevCPM.LogWStr(" is not consistently imported"); - err(249) - ELSIF obj = NIL THEN (* changed module sys flags *) - IF ~symNew & sfpresent THEN - DevCPM.LogWLn; DevCPM.LogWStr(" changed library flag") - END - ELSIF obj.mnolev = 0 THEN (* don't report changes in imported modules *) - IF sfpresent THEN - IF symChanges < 20 THEN - DevCPM.LogWLn; DevCPM.LogWStr(" "); DevCPM.LogWStr(obj.name^); - IF errno = 250 THEN DevCPM.LogWStr(" is no longer in symbol file") - ELSIF errno = 251 THEN DevCPM.LogWStr(" is redefined internally ") - ELSIF errno = 252 THEN DevCPM.LogWStr(" is redefined") - ELSIF errno = 253 THEN DevCPM.LogWStr(" is new in symbol file") - END - ELSIF symChanges = 20 THEN - DevCPM.LogWLn; DevCPM.LogWStr(" ...") - END; - INC(symChanges) - ELSIF (errno = 253) & ~symExtended THEN - DevCPM.LogWLn; - DevCPM.LogWStr(" new symbol file") - END - END; - IF errno = 253 THEN symExtended := TRUE ELSE symNew := TRUE END - END FPrintErr; - -(*-------------------------- Import --------------------------*) - - PROCEDURE InName(VAR name: String); - VAR i: SHORTINT; ch: SHORTCHAR; n: Name; - BEGIN i := 0; - REPEAT - DevCPM.SymRCh(ch); n[i] := ch; INC(i) - UNTIL ch = 0X; - IF i > 1 THEN NEW(name, i); name^ := n$ ELSE name := null END - END InName; - - PROCEDURE InMod(tag: INTEGER; VAR mno: BYTE); (* mno is global *) - VAR head: Object; name: String; mn: INTEGER; i: BYTE; lib: String; - BEGIN - IF tag = 0 THEN mno := impCtxt.glbmno[0] - ELSIF tag > 0 THEN - lib := NIL; - IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END; - ASSERT(tag = Smname); - InName(name); - IF (name^ = SelfName) & ~impCtxt.self & ~(DevCPM.interface IN DevCPM.options) THEN err(154) END ; - i := 0; - WHILE (i < nofGmod) & (name^ # GlbMod[i].name^) DO INC(i) END ; - IF i < nofGmod THEN mno := i (*module already present*) - ELSE - head := NewObj(); head.mode := Head; head.name := name; - mno := nofGmod; head.mnolev := SHORT(SHORT(-mno)); - head.library := lib; - IF nofGmod < maxImps THEN - GlbMod[mno] := head; INC(nofGmod) - ELSE err(227) - END - END ; - impCtxt.glbmno[impCtxt.nofm] := mno; INC(impCtxt.nofm) - ELSE - mno := impCtxt.glbmno[-tag] - END - END InMod; - - PROCEDURE InConstant(f: INTEGER; conval: Const); - VAR ch, ch1: SHORTCHAR; ext, t: ConstExt; rval: SHORTREAL; r, s: REAL; i, x, y: INTEGER; str: Name; - BEGIN - CASE f OF - | Byte, Char8, Bool: - DevCPM.SymRCh(ch); conval.intval := ORD(ch) - | Char16: - DevCPM.SymRCh(ch); conval.intval := ORD(ch); - DevCPM.SymRCh(ch); conval.intval := conval.intval + ORD(ch) * 256 - | Int8, Int16, Int32: - conval.intval := DevCPM.SymRInt() - | Int64: - DevCPM.SymRCh(ch); x := 0; y := 1; r := 0; s := 268435456 (*2^28*); - WHILE (y < 268435456 (*2^28*)) & (ch >= 80X) DO - x := x + (ORD(ch) - 128) * y; y := y * 128; DevCPM.SymRCh(ch) - END; - WHILE ch >= 80X DO r := r + (ORD(ch) - 128) * s; s := s * 128; DevCPM.SymRCh(ch) END; - conval.realval := r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s; - conval.intval := SHORT(ENTIER(r + x + ((LONG(ORD(ch)) + 64) MOD 128 - 64) * s - conval.realval)) - | Set: - DevCPM.SymRSet(conval.setval) - | Real32: - DevCPM.SymRReal(rval); conval.realval := rval; - conval.intval := DevCPM.ConstNotAlloc - | Real64: - DevCPM.SymRLReal(conval.realval); - conval.intval := DevCPM.ConstNotAlloc - | String8, String16: - i := 0; - REPEAT - DevCPM.SymRCh(ch); - IF i < LEN(str) - 1 THEN str[i] := ch - ELSIF i = LEN(str) - 1 THEN str[i] := 0X; NEW(ext, 2 * LEN(str)); ext^ := str$; ext[i] := ch - ELSIF i < LEN(ext^) - 1 THEN ext[i] := ch - ELSE t := ext; t[i] := 0X; NEW(ext, 2 * LEN(t^)); ext^ := t^$; ext[i] := ch - END; - INC(i) - UNTIL ch = 0X; - IF i < LEN(str) THEN NEW(ext, i); ext^ := str$ END; - conval.ext := ext; conval.intval := DevCPM.ConstNotAlloc; - IF f = String8 THEN conval.intval2 := i - ELSE - i := 0; y := 0; - REPEAT DevCPM.GetUtf8(ext^, x, i); INC(y) UNTIL x = 0; - conval.intval2 := y - END -(* - ext := NewExt(); conval.ext := ext; i := 0; - REPEAT - DevCPM.SymRCh(ch); ext^[i] := ch; INC(i) - UNTIL ch = 0X; - conval.intval2 := i; - conval.intval := DevCPM.ConstNotAlloc - | String16: - ext := NewExt(); conval.ext := ext; i := 0; - REPEAT - DevCPM.SymRCh(ch); ext^[i] := ch; INC(i); - DevCPM.SymRCh(ch1); ext^[i] := ch1; INC(i) - UNTIL (ch = 0X) & (ch1 = 0X); - conval.intval2 := i; - conval.intval := DevCPM.ConstNotAlloc -*) - | NilTyp: - conval.intval := 0 -(* - | Guid: - ext := NewExt(); conval.ext := ext; i := 0; - WHILE i < 16 DO - DevCPM.SymRCh(ch); ext^[i] := ch; INC(i) - END; - ext[16] := 0X; - conval.intval2 := 16; - conval.intval := DevCPM.ConstNotAlloc; -*) - END - END InConstant; - - PROCEDURE ^InStruct(VAR typ: Struct); - - PROCEDURE InSign(mno: BYTE; VAR res: Struct; VAR par: Object); - VAR last, new: Object; tag: INTEGER; - BEGIN - InStruct(res); - tag := DevCPM.SymRInt(); last := NIL; - WHILE tag # Send DO - new := NewObj(); new.mnolev := SHORT(SHORT(-mno)); - IF last = NIL THEN par := new ELSE last.link := new END ; - IF tag = Ssys THEN - new.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt(); - IF ODD(new.sysflag DIV inBit) THEN new.vis := inPar - ELSIF ODD(new.sysflag DIV inBit) THEN new.vis := outPar - END - END; - IF tag = Svalpar THEN new.mode := Var - ELSE new.mode := VarPar; - IF tag = Sinpar THEN new.vis := inPar - ELSIF tag = Soutpar THEN new.vis := outPar - END - END ; - InStruct(new.typ); new.adr := DevCPM.SymRInt(); InName(new.name); - last := new; tag := DevCPM.SymRInt() - END - END InSign; - - PROCEDURE InFld(): Object; (* first number in impCtxt.nextTag, mno set outside *) - VAR tag: INTEGER; obj: Object; - BEGIN - tag := impCtxt.nextTag; obj := NewObj(); - IF tag <= Srfld THEN - obj.mode := Fld; - IF tag = Srfld THEN obj.vis := externalR ELSE obj.vis := external END ; - InStruct(obj.typ); InName(obj.name); - obj.adr := DevCPM.SymRInt() - ELSE - obj.mode := Fld; - IF tag = Shdptr THEN obj.name := NewName(DevCPM.HdPtrName) - ELSIF tag = Shdutptr THEN obj.name := NewName(DevCPM.HdUtPtrName); (* !!! *) - obj.sysflag := 1 - ELSIF tag = Ssys THEN - obj.name := NewName(DevCPM.HdUtPtrName); obj.sysflag := SHORT(SHORT(DevCPM.SymRInt())) - ELSE obj.name := NewName(DevCPM.HdProcName) - END; - obj.typ := undftyp; obj.vis := internal; - obj.adr := DevCPM.SymRInt() - END; - RETURN obj - END InFld; - - PROCEDURE InTProc(mno: BYTE): Object; (* first number in impCtxt.nextTag *) - VAR tag: INTEGER; obj: Object; - BEGIN - tag := impCtxt.nextTag; - obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno)); - IF tag = Shdtpro THEN - obj.mode := TProc; obj.name := NewName(DevCPM.HdTProcName); - obj.link := NewObj(); (* dummy, easier in Browser *) - obj.typ := undftyp; obj.vis := internal; - obj.num := DevCPM.SymRInt() - ELSE - obj.vis := external; - IF tag = Simpo THEN obj.vis := externalR; tag := DevCPM.SymRInt() END; - obj.mode := TProc; obj.conval := NewConst(); obj.conval.intval := -1; - IF tag = Sentry THEN InName(obj.entry); tag := DevCPM.SymRInt() END; - InSign(mno, obj.typ, obj.link); InName(obj.name); - obj.num := DevCPM.SymRInt(); - IF tag = Slimpro THEN INCL(obj.conval.setval, limAttr) - ELSIF tag = Sabspro THEN INCL(obj.conval.setval, absAttr) - ELSIF tag = Semppro THEN INCL(obj.conval.setval, empAttr) - ELSIF tag = Sextpro THEN INCL(obj.conval.setval, extAttr) - END - END ; - RETURN obj - END InTProc; - - PROCEDURE InStruct(VAR typ: Struct); - VAR mno: BYTE; ref: SHORTINT; tag: INTEGER; name: String; - t: Struct; obj, last, fld, old, dummy: Object; - BEGIN - tag := DevCPM.SymRInt(); - IF tag # Sstruct THEN - tag := -tag; - IF (version = 0) & (tag >= FirstRef0) THEN tag := tag + FirstRef - FirstRef0 END; (* correction for new FirstRef *) - typ := impCtxt.ref[tag] - ELSE - ref := impCtxt.nofr; INC(impCtxt.nofr); - IF ref < impCtxt.minr THEN impCtxt.minr := ref END ; - tag := DevCPM.SymRInt(); - InMod(tag, mno); InName(name); obj := NewObj(); - IF name = null THEN - IF impCtxt.self THEN old := NIL (* do not insert type desc anchor here, but in OPL *) - ELSE obj.name := NewName("@"); InsertIn(obj, GlbMod[mno], old(*=NIL*)); obj.name := null - END ; - typ := NewStr(Undef, Basic) - ELSE obj.name := name; InsertIn(obj, GlbMod[mno], old); - IF old # NIL THEN (* recalculate fprints to compare with old fprints *) - FPrintObj(old); impCtxt.pvfp[ref] := old.typ.pvfp; - IF impCtxt.self THEN (* do not overwrite old typ *) - typ := NewStr(Undef, Basic) - ELSE (* overwrite old typ for compatibility reason *) - typ := old.typ; typ.link := NIL; typ.sysflag := 0; typ.ext := NIL; - typ.fpdone := FALSE; typ.idfpdone := FALSE - END - ELSE typ := NewStr(Undef, Basic) - END - END ; - impCtxt.ref[ref] := typ; impCtxt.old[ref] := old; typ.ref := SHORT(ref + maxStruct); - (* ref >= maxStruct: not exported yet, ref used for err 155 *) - typ.mno := mno; typ.allocated := TRUE; - typ.strobj := obj; obj.mode := Typ; obj.typ := typ; - obj.mnolev := SHORT(SHORT(-mno)); obj.vis := internal; (* name not visible here *) - tag := DevCPM.SymRInt(); - IF tag = Ssys THEN - typ.sysflag := SHORT(DevCPM.SymRInt()); tag := DevCPM.SymRInt() - END; - typ.untagged := typ.sysflag > 0; - IF tag = Slib THEN - InName(obj.library); tag := DevCPM.SymRInt() - END; - IF tag = Sentry THEN - InName(obj.entry); tag := DevCPM.SymRInt() - END; - IF tag = String8 THEN - InName(typ.ext); tag := DevCPM.SymRInt() - END; - CASE tag OF - | Sptr: - typ.form := Pointer; typ.size := DevCPM.PointerSize; typ.n := 0; InStruct(typ.BaseTyp) - | Sarr: - typ.form := Comp; typ.comp := Array; InStruct(typ.BaseTyp); typ.n := DevCPM.SymRInt(); - typ.size := typ.n * typ.BaseTyp.size (* !!! *) - | Sdarr: - typ.form := Comp; typ.comp := DynArr; InStruct(typ.BaseTyp); - IF typ.BaseTyp.comp = DynArr THEN typ.n := typ.BaseTyp.n + 1 - ELSE typ.n := 0 - END ; - typ.size := DevCPM.DArrSizeA + DevCPM.DArrSizeB * typ.n; (* !!! *) - IF typ.untagged THEN typ.size := DevCPM.PointerSize END - | Srec, Sabsrec, Slimrec, Sextrec: - typ.form := Comp; typ.comp := Record; InStruct(typ.BaseTyp); - (* correction by ETH 18.1.96 *) - IF typ.BaseTyp = notyp THEN typ.BaseTyp := NIL END; - typ.extlev := 0; t := typ.BaseTyp; - WHILE (t # NIL) & (t.comp = Record) DO INC(typ.extlev); t := t.BaseTyp END; - typ.size := DevCPM.SymRInt(); typ.align := DevCPM.SymRInt(); - typ.n := DevCPM.SymRInt(); - IF tag = Sabsrec THEN typ.attribute := absAttr - ELSIF tag = Slimrec THEN typ.attribute := limAttr - ELSIF tag = Sextrec THEN typ.attribute := extAttr - END; - impCtxt.nextTag := DevCPM.SymRInt(); last := NIL; - WHILE (impCtxt.nextTag >= Sfld) & (impCtxt.nextTag <= Shdpro) - OR (impCtxt.nextTag = Shdutptr) OR (impCtxt.nextTag = Ssys) DO - fld := InFld(); fld.mnolev := SHORT(SHORT(-mno)); - IF last # NIL THEN last.link := fld END ; - last := fld; - InsertThisField(fld, typ, dummy); - impCtxt.nextTag := DevCPM.SymRInt() - END ; - WHILE impCtxt.nextTag # Send DO fld := InTProc(mno); - InsertThisField(fld, typ, dummy); - impCtxt.nextTag := DevCPM.SymRInt() - END - | Spro: - typ.form := ProcTyp; typ.size := DevCPM.ProcSize; InSign(mno, typ.BaseTyp, typ.link) - | Salias: - InStruct(t); - typ.form := t.form; typ.comp := Basic; typ.size := t.size; - typ.pbfp := t.pbfp; typ.pvfp := t.pvfp; typ.fpdone := TRUE; - typ.idfp := t.idfp; typ.idfpdone := TRUE; typ.BaseTyp := t - END ; - IF ref = impCtxt.minr THEN - WHILE ref < impCtxt.nofr DO - t := impCtxt.ref[ref]; FPrintStr(t); - obj := t.strobj; (* obj.typ.strobj = obj, else obj.fprint differs (alias) *) - IF obj.name # null THEN FPrintObj(obj) END ; - old := impCtxt.old[ref]; - IF old # NIL THEN t.strobj := old; (* restore strobj *) - IF impCtxt.self THEN - IF old.mnolev < 0 THEN - IF old.history # inconsistent THEN - IF old.fprint # obj.fprint THEN old.history := pbmodified - ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified - END - (* ELSE remain inconsistent *) - END - ELSIF old.fprint # obj.fprint THEN old.history := pbmodified - ELSIF impCtxt.pvfp[ref] # t.pvfp THEN old.history := pvmodified - ELSIF old.vis = internal THEN old.history := same (* may be changed to "removed" in InObj *) - ELSE old.history := inserted (* may be changed to "same" in InObj *) - END - ELSE - (* check private part, delay error message until really used *) - IF impCtxt.pvfp[ref] # t.pvfp THEN old.history := inconsistent END ; - IF old.fprint # obj.fprint THEN FPrintErr(old, 249) END - END - ELSIF impCtxt.self THEN obj.history := removed - ELSE obj.history := same - END ; - INC(ref) - END ; - impCtxt.minr := maxStruct - END - END - END InStruct; - - PROCEDURE InObj(mno: BYTE): Object; (* first number in impCtxt.nextTag *) - VAR ch: SHORTCHAR; obj, old: Object; typ: Struct; - tag, i, s: INTEGER; ext: ConstExt; - BEGIN - tag := impCtxt.nextTag; - IF tag = Stype THEN - InStruct(typ); obj := typ.strobj; - IF ~impCtxt.self THEN obj.vis := external END (* type name visible now, obj.fprint already done *) - ELSE - obj := NewObj(); obj.mnolev := SHORT(SHORT(-mno)); obj.vis := external; - IF tag = Ssys THEN obj.sysflag := SHORT(SHORT(DevCPM.SymRInt())); tag := DevCPM.SymRInt() END; - IF tag = Slib THEN - InName(obj.library); tag := DevCPM.SymRInt() - END; - IF tag = Sentry THEN - InName(obj.entry); tag := DevCPM.SymRInt() - END; - IF tag >= Sxpro THEN - IF obj.conval = NIL THEN obj.conval := NewConst() END; - obj.conval.intval := -1; - InSign(mno, obj.typ, obj.link); - CASE tag OF - | Sxpro: obj.mode := XProc - | Sipro: obj.mode := IProc - | Scpro: obj.mode := CProc; - s := DevCPM.SymRInt(); - NEW(ext, s + 1); obj.conval.ext := ext; - ext^[0] := SHORT(CHR(s)); i := 1; - WHILE i <= s DO DevCPM.SymRCh(ext^[i]); INC(i) END - END - ELSIF tag = Salias THEN - obj.mode := Typ; InStruct(obj.typ) - ELSIF (tag = Svar) OR (tag = Srvar) THEN - obj.mode := Var; - IF tag = Srvar THEN obj.vis := externalR END ; - InStruct(obj.typ) - ELSE (* Constant *) - obj.conval := NewConst(); InConstant(tag, obj.conval); - IF (tag = Int8) OR (tag = Int16) THEN tag := Int32 END; - obj.mode := Con; obj.typ := impCtxt.ref[tag]; - END ; - InName(obj.name) - END ; - FPrintObj(obj); - IF (obj.mode = Var) & ((obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null)) THEN - (* compute a global fingerprint to avoid structural type equivalence for anonymous types *) - DevCPM.FPrint(impCtxt.reffp, obj.typ.ref - maxStruct) - END ; - IF tag # Stype THEN - InsertIn(obj, GlbMod[mno], old); - IF impCtxt.self THEN - IF old # NIL THEN - (* obj is from old symbol file, old is new declaration *) - IF old.vis = internal THEN old.history := removed - ELSE FPrintObj(old); FPrintStr(old.typ); (* FPrint(obj) already called *) - IF obj.fprint # old.fprint THEN old.history := pbmodified - ELSIF obj.typ.pvfp # old.typ.pvfp THEN old.history := pvmodified - ELSE old.history := same - END - END - ELSE obj.history := removed (* OutObj not called if mnolev < 0 *) - END - (* ELSE old = NIL, or file read twice, consistent, OutObj not called *) - END - ELSE (* obj already inserted in InStruct *) - IF impCtxt.self THEN (* obj.mnolev = 0 *) - IF obj.vis = internal THEN obj.history := removed - ELSIF obj.history = inserted THEN obj.history := same - END - (* ELSE OutObj not called for obj with mnolev < 0 *) - END - END ; - RETURN obj - END InObj; - - PROCEDURE Import*(aliasName: Name; VAR name: Name; VAR done: BOOLEAN); - VAR obj, h: Object; mno: BYTE; tag, p: INTEGER; lib: String; (* done used in Browser *) - BEGIN - IF name = "SYSTEM" THEN - SYSimported := TRUE; - p := processor; - IF (p < 10) OR (p > 30) THEN p := DevCPM.sysImp END; - INCL(DevCPM.options, p); (* for sysflag handling *) - Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := syslink; obj.typ := notyp; - h := NewObj(); h.mode := Head; h.right := syslink; obj.scope := h - ELSIF name = "COM" THEN - IF DevCPM.comAware IN DevCPM.options THEN - INCL(DevCPM.options, DevCPM.com); (* for sysflag handling *) - Insert(aliasName, obj); obj.mode := Mod; obj.mnolev := 0; obj.scope := comlink; obj.typ := notyp; - h := NewObj(); h.mode := Head; h.right := comlink; obj.scope := h; - ELSE err(151) - END; - ELSIF name = "JAVA" THEN - INCL(DevCPM.options, DevCPM.java) - ELSE - impCtxt.nofr := FirstRef; impCtxt.minr := maxStruct; impCtxt.nofm := 0; - impCtxt.self := aliasName = "@self"; impCtxt.reffp := 0; - DevCPM.OldSym(name, done); - IF done THEN - lib := NIL; - impProc := SHORT(DevCPM.SymRInt()); - IF (impProc # 0) & (processor # 0) & (impProc # processor) THEN err(151) END; - DevCPM.checksum := 0; (* start checksum here to avoid problems with proc id fixup *) - tag := DevCPM.SymRInt(); - IF tag < Smname THEN version := tag; tag := DevCPM.SymRInt() - ELSE version := 0 - END; - IF tag = Slib THEN InName(lib); tag := DevCPM.SymRInt() END; - InMod(tag, mno); - IF (name[0] # "@") & (GlbMod[mno].name^ # name) THEN (* symbol file name conflict *) - GlbMod[mno] := NIL; nofGmod := mno; DEC(impCtxt.nofm); - DevCPM.CloseOldSym; done := FALSE - END; - END; - IF done THEN - GlbMod[mno].library := lib; - impCtxt.nextTag := DevCPM.SymRInt(); - WHILE ~DevCPM.eofSF() DO - obj := InObj(mno); impCtxt.nextTag := DevCPM.SymRInt() - END ; - Insert(aliasName, obj); - obj.mode := Mod; obj.scope := GlbMod[mno](*.right*); - GlbMod[mno].link := obj; - obj.mnolev := SHORT(SHORT(-mno)); obj.typ := notyp; - DevCPM.CloseOldSym - ELSIF impCtxt.self THEN - sfpresent := FALSE - ELSE err(152) (*sym file not found*) - END - END - END Import; - -(*-------------------------- Export --------------------------*) - - PROCEDURE OutName(VAR name: ARRAY OF SHORTCHAR); - VAR i: SHORTINT; ch: SHORTCHAR; - BEGIN i := 0; - REPEAT ch := name[i]; DevCPM.SymWCh(ch); INC(i) UNTIL ch = 0X - END OutName; - - PROCEDURE OutMod(mno: SHORTINT); - VAR mod: Object; - BEGIN - IF expCtxt.locmno[mno] < 0 THEN (* new mod *) - mod := GlbMod[mno]; - IF mod.library # NIL THEN - DevCPM.SymWInt(Slib); OutName(mod.library^) - END; - DevCPM.SymWInt(Smname); - expCtxt.locmno[mno] := expCtxt.nofm; INC(expCtxt.nofm); - OutName(mod.name^) - ELSE DevCPM.SymWInt(-expCtxt.locmno[mno]) - END - END OutMod; - - PROCEDURE ^OutStr(typ: Struct); - PROCEDURE ^OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN); - - PROCEDURE OutHdFld(typ: Struct; fld: Object; adr: INTEGER); - VAR i, j, n: INTEGER; btyp: Struct; - BEGIN - IF typ.comp = Record THEN OutFlds(typ.link, adr, FALSE) - ELSIF typ.comp = Array THEN btyp := typ.BaseTyp; n := typ.n; - WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ; - IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN - j := nofhdfld; OutHdFld(btyp, fld, adr); - IF j # nofhdfld THEN i := 1; - WHILE (i < n) (* & (nofhdfld <= DevCPM.MaxHdFld) *) DO (* !!! *) - INC(adr, btyp.size); OutHdFld(btyp, fld, adr); INC(i) - END - END - END - ELSIF DevCPM.ExpHdPtrFld & - ((typ.form = Pointer) & ~typ.untagged OR (fld.name^ = DevCPM.HdPtrName)) THEN (* !!! *) - DevCPM.SymWInt(Shdptr); DevCPM.SymWInt(adr); INC(nofhdfld) - ELSIF DevCPM.ExpHdUtPtrFld & - ((typ.form = Pointer) & typ.untagged OR (fld.name^ = DevCPM.HdUtPtrName)) THEN (* !!! *) - DevCPM.SymWInt(Ssys); (* DevCPM.SymWInt(Shdutptr); *) - IF typ.form = Pointer THEN n := typ.sysflag ELSE n := fld.sysflag END; - DevCPM.SymWInt(n); - DevCPM.SymWInt(adr); INC(nofhdfld); - IF n > 1 THEN portable := FALSE END (* hidden untagged pointer are portable *) - ELSIF DevCPM.ExpHdProcFld & ((typ.form = ProcTyp) OR (fld.name^ = DevCPM.HdProcName)) THEN - DevCPM.SymWInt(Shdpro); DevCPM.SymWInt(adr); INC(nofhdfld) - END - END OutHdFld; - - PROCEDURE OutFlds(fld: Object; adr: INTEGER; visible: BOOLEAN); - BEGIN - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF (fld.vis # internal) & visible THEN - IF fld.vis = externalR THEN DevCPM.SymWInt(Srfld) ELSE DevCPM.SymWInt(Sfld) END ; - OutStr(fld.typ); OutName(fld.name^); DevCPM.SymWInt(fld.adr) - ELSE OutHdFld(fld.typ, fld, fld.adr + adr) - END ; - fld := fld.link - END - END OutFlds; - - PROCEDURE OutSign(result: Struct; par: Object); - BEGIN - OutStr(result); - WHILE par # NIL DO - IF par.sysflag # 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(par.sysflag) END; - IF par.mode = Var THEN DevCPM.SymWInt(Svalpar) - ELSIF par.vis = inPar THEN DevCPM.SymWInt(Sinpar) - ELSIF par.vis = outPar THEN DevCPM.SymWInt(Soutpar) - ELSE DevCPM.SymWInt(Svarpar) - END ; - OutStr(par.typ); - DevCPM.SymWInt(par.adr); - OutName(par.name^); par := par.link - END ; - DevCPM.SymWInt(Send) - END OutSign; - - PROCEDURE OutTProcs(typ: Struct; obj: Object); - VAR bObj: Object; - BEGIN - IF obj # NIL THEN - IF obj.mode = TProc THEN -(* - IF (typ.BaseTyp # NIL) & (obj.num < typ.BaseTyp.n) & (obj.vis = internal) & (obj.scope # NIL) THEN - FindBaseField(obj.name^, typ, bObj); - ASSERT((bObj # NIL) & (bObj.num = obj.num)); - IF bObj.vis # internal THEN DevCPM.Mark(109, typ.txtpos) END - (* hidden and overriding, not detected in OPP because record exported indirectly or via aliasing *) - END; -*) - IF obj.vis # internal THEN - IF obj.vis = externalR THEN DevCPM.SymWInt(Simpo) END; - IF obj.entry # NIL THEN - DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE - END; - IF limAttr IN obj.conval.setval THEN DevCPM.SymWInt(Slimpro) - ELSIF absAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sabspro) - ELSIF empAttr IN obj.conval.setval THEN DevCPM.SymWInt(Semppro) - ELSIF extAttr IN obj.conval.setval THEN DevCPM.SymWInt(Sextpro) - ELSE DevCPM.SymWInt(Stpro) - END; - OutSign(obj.typ, obj.link); OutName(obj.name^); - DevCPM.SymWInt(obj.num) - ELSIF DevCPM.ExpHdTProc THEN - DevCPM.SymWInt(Shdtpro); - DevCPM.SymWInt(obj.num) - END - END; - OutTProcs(typ, obj.left); - OutTProcs(typ, obj.right) - END - END OutTProcs; - - PROCEDURE OutStr(typ: Struct); (* OPV.TypeAlloc already applied *) - VAR strobj: Object; - BEGIN - IF typ.ref < expCtxt.ref THEN DevCPM.SymWInt(-typ.ref) - ELSE - DevCPM.SymWInt(Sstruct); - typ.ref := expCtxt.ref; INC(expCtxt.ref); - IF expCtxt.ref >= maxStruct THEN err(228) END ; - OutMod(typ.mno); strobj := typ.strobj; - IF (strobj # NIL) & (strobj.name # null) THEN OutName(strobj.name^); - CASE strobj.history OF - | pbmodified: FPrintErr(strobj, 252) - | pvmodified: FPrintErr(strobj, 251) - | inconsistent: FPrintErr(strobj, 249) - ELSE (* checked in OutObj or correct indirect export *) - END - ELSE DevCPM.SymWCh(0X) (* anonymous => never inconsistent, pvfp influences the client fp *) - END; - IF typ.sysflag # 0 THEN (* !!! *) - DevCPM.SymWInt(Ssys); DevCPM.SymWInt(typ.sysflag); - IF typ.sysflag > 0 THEN portable := FALSE END - END; - IF strobj # NIL THEN - IF strobj.library # NIL THEN - DevCPM.SymWInt(Slib); OutName(strobj.library^); portable := FALSE - END; - IF strobj.entry # NIL THEN - DevCPM.SymWInt(Sentry); OutName(strobj.entry^); portable := FALSE - END - END; - IF typ.ext # NIL THEN - DevCPM.SymWInt(String8); OutName(typ.ext^); portable := FALSE - END; - CASE typ.form OF - | Pointer: - DevCPM.SymWInt(Sptr); OutStr(typ.BaseTyp) - | ProcTyp: - DevCPM.SymWInt(Spro); OutSign(typ.BaseTyp, typ.link) - | Comp: - CASE typ.comp OF - | Array: - DevCPM.SymWInt(Sarr); OutStr(typ.BaseTyp); DevCPM.SymWInt(typ.n) - | DynArr: - DevCPM.SymWInt(Sdarr); OutStr(typ.BaseTyp) - | Record: - IF typ.attribute = limAttr THEN DevCPM.SymWInt(Slimrec) - ELSIF typ.attribute = absAttr THEN DevCPM.SymWInt(Sabsrec) - ELSIF typ.attribute = extAttr THEN DevCPM.SymWInt(Sextrec) - ELSE DevCPM.SymWInt(Srec) - END; - IF typ.BaseTyp = NIL THEN OutStr(notyp) ELSE OutStr(typ.BaseTyp) END ; - (* BaseTyp should be Notyp, too late to change *) - DevCPM.SymWInt(typ.size); DevCPM.SymWInt(typ.align); DevCPM.SymWInt(typ.n); - nofhdfld := 0; OutFlds(typ.link, 0, TRUE); -(* - IF nofhdfld > DevCPM.MaxHdFld THEN DevCPM.Mark(223, typ.txtpos) END ; (* !!! *) -*) - OutTProcs(typ, typ.link); DevCPM.SymWInt(Send) - END - ELSE (* alias structure *) - DevCPM.SymWInt(Salias); OutStr(typ.BaseTyp) - END - END - END OutStr; - - PROCEDURE OutConstant(obj: Object); - VAR f, i: SHORTINT; rval: SHORTREAL; a, b, c: INTEGER; r: REAL; - BEGIN - f := obj.typ.form; -(* - IF obj.typ = guidtyp THEN f := Guid END; -*) - IF f = Int32 THEN - IF (obj.conval.intval >= -128) & (obj.conval.intval <= -127) THEN f := Int8 - ELSIF (obj.conval.intval >= -32768) & (obj.conval.intval <= -32767) THEN f := Int16 - END - END; - DevCPM.SymWInt(f); - CASE f OF - | Bool, Char8: - DevCPM.SymWCh(SHORT(CHR(obj.conval.intval))) - | Char16: - DevCPM.SymWCh(SHORT(CHR(obj.conval.intval MOD 256))); - DevCPM.SymWCh(SHORT(CHR(obj.conval.intval DIV 256))) - | Int8, Int16, Int32: - DevCPM.SymWInt(obj.conval.intval) - | Int64: - IF ABS(obj.conval.realval + obj.conval.intval) <= MAX(INTEGER) THEN - a := SHORT(ENTIER(obj.conval.realval + obj.conval.intval)); b := -1; c := -1 - ELSIF ABS(obj.conval.realval + obj.conval.intval) <= 1125899906842624.0 (*2^50*) THEN - a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 2097152.0 (*2^21*))); - b := SHORT(ENTIER(obj.conval.realval + obj.conval.intval - a * 2097152.0 (*2^21*))); c := -1 - ELSE - a := SHORT(ENTIER((obj.conval.realval + obj.conval.intval) / 4398046511104.0 (*2^42*))); - r := obj.conval.realval + obj.conval.intval - a * 4398046511104.0 (*2^42*); - b := SHORT(ENTIER(r / 2097152.0 (*2^21*))); - c := SHORT(ENTIER(r - b * 2097152.0 (*2^21*))) - END; - IF c >= 0 THEN - DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128; - DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))); c := c DIV 128; - DevCPM.SymWCh(SHORT(CHR(c MOD 128 + 128))) - END; - IF b >= 0 THEN - DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128; - DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))); b := b DIV 128; - DevCPM.SymWCh(SHORT(CHR(b MOD 128 + 128))) - END; - DevCPM.SymWInt(a) - | Set: - DevCPM.SymWSet(obj.conval.setval) - | Real32: - rval := SHORT(obj.conval.realval); DevCPM.SymWReal(rval) - | Real64: - DevCPM.SymWLReal(obj.conval.realval) - | String8, String16: - OutName(obj.conval.ext^) - | NilTyp: -(* - | Guid: - i := 0; - WHILE i < 16 DO DevCPM.SymWCh(obj.conval.ext[i]); INC(i) END -*) - ELSE err(127) - END - END OutConstant; - - PROCEDURE OutObj(obj: Object); - VAR i, j: SHORTINT; ext: ConstExt; - BEGIN - IF obj # NIL THEN - OutObj(obj.left); - IF obj.mode IN {Con, Typ, Var, LProc, XProc, CProc, IProc} THEN - IF obj.history = removed THEN FPrintErr(obj, 250) - ELSIF obj.vis # internal THEN - CASE obj.history OF - | inserted: FPrintErr(obj, 253) - | same: (* ok *) - | pbmodified: - IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 252) END - | pvmodified: - IF (obj.mode # Typ) OR (obj.typ.strobj # obj) THEN FPrintErr(obj, 251) END - END ; - IF obj.sysflag < 0 THEN DevCPM.SymWInt(Ssys); DevCPM.SymWInt(obj.sysflag); portable := FALSE END; - IF obj.mode IN {LProc, XProc, CProc, Var, Con} THEN - (* name alias for types handled in OutStr *) - IF obj.library # NIL THEN - DevCPM.SymWInt(Slib); OutName(obj.library^); portable := FALSE - END; - IF obj.entry # NIL THEN - DevCPM.SymWInt(Sentry); OutName(obj.entry^); portable := FALSE - END - END; - CASE obj.mode OF - | Con: - OutConstant(obj); OutName(obj.name^) - | Typ: - IF obj.typ.strobj = obj THEN DevCPM.SymWInt(Stype); OutStr(obj.typ) - ELSE DevCPM.SymWInt(Salias); OutStr(obj.typ); OutName(obj.name^) - END - | Var: - IF obj.vis = externalR THEN DevCPM.SymWInt(Srvar) ELSE DevCPM.SymWInt(Svar) END ; - OutStr(obj.typ); OutName(obj.name^); - IF (obj.typ.strobj = NIL) OR (obj.typ.strobj.name = null) THEN - (* compute fingerprint to avoid structural type equivalence *) - DevCPM.FPrint(expCtxt.reffp, obj.typ.ref) - END - | XProc: - DevCPM.SymWInt(Sxpro); OutSign(obj.typ, obj.link); OutName(obj.name^) - | IProc: - DevCPM.SymWInt(Sipro); OutSign(obj.typ, obj.link); OutName(obj.name^) - | CProc: - DevCPM.SymWInt(Scpro); OutSign(obj.typ, obj.link); ext := obj.conval.ext; - j := ORD(ext^[0]); i := 1; DevCPM.SymWInt(j); - WHILE i <= j DO DevCPM.SymWCh(ext^[i]); INC(i) END ; - OutName(obj.name^); portable := FALSE - END - END - END ; - OutObj(obj.right) - END - END OutObj; - - PROCEDURE Export*(VAR ext, new: BOOLEAN); - VAR i: SHORTINT; nofmod: BYTE; done: BOOLEAN; old: Object; oldCSum: INTEGER; - BEGIN - symExtended := FALSE; symNew := FALSE; nofmod := nofGmod; - Import("@self", SelfName, done); nofGmod := nofmod; - oldCSum := DevCPM.checksum; - ASSERT(GlbMod[0].name^ = SelfName); - IF DevCPM.noerr THEN (* ~DevCPM.noerr => ~done *) - DevCPM.NewSym(SelfName); - IF DevCPM.noerr THEN - DevCPM.SymWInt(0); (* portable symfile *) - DevCPM.checksum := 0; (* start checksum here to avoid problems with proc id fixup *) - DevCPM.SymWInt(actVersion); - old := GlbMod[0]; portable := TRUE; - IF libName # "" THEN - DevCPM.SymWInt(Slib); OutName(libName); portable := FALSE; - IF done & ((old.library = NIL) OR (old.library^ # libName)) THEN - FPrintErr(NIL, 252) - END - ELSIF done & (old.library # NIL) THEN FPrintErr(NIL, 252) - END; - DevCPM.SymWInt(Smname); OutName(SelfName); - expCtxt.reffp := 0; expCtxt.ref := FirstRef; - expCtxt.nofm := 1; expCtxt.locmno[0] := 0; - i := 1; WHILE i < maxImps DO expCtxt.locmno[i] := -1; INC(i) END ; - OutObj(topScope.right); - ext := sfpresent & symExtended; - new := ~sfpresent OR symNew OR (DevCPM.checksum # oldCSum); - IF DevCPM.noerr & ~portable THEN - DevCPM.SymReset; - DevCPM.SymWInt(processor) (* nonportable symfile *) - END; - IF DevCPM.noerr & sfpresent & (impCtxt.reffp # expCtxt.reffp) THEN - new := TRUE - END ; - IF ~DevCPM.noerr THEN DevCPM.DeleteNewSym END - (* DevCPM.RegisterNewSym is called in OP2 after writing the object file *) - END - END - END Export; (* no new symbol file if ~DevCPM.noerr *) - - - PROCEDURE InitStruct(VAR typ: Struct; form: BYTE); - BEGIN - typ := NewStr(form, Basic); typ.ref := form; typ.size := 1; typ.allocated := TRUE; - typ.strobj := NewObj(); typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE; - typ.idfp := form; typ.idfpdone := TRUE - END InitStruct; - - PROCEDURE EnterBoolConst(name: Name; val: INTEGER); - VAR obj: Object; - BEGIN - Insert(name, obj); obj.conval := NewConst(); - obj.mode := Con; obj.typ := booltyp; obj.conval.intval := val - END EnterBoolConst; - - PROCEDURE EnterRealConst(name: Name; val: REAL; VAR obj: Object); - BEGIN - Insert(name, obj); obj.conval := NewConst(); - obj.mode := Con; obj.typ := real32typ; obj.conval.realval := val - END EnterRealConst; - - PROCEDURE EnterTyp(name: Name; form: BYTE; size: SHORTINT; VAR res: Struct); - VAR obj: Object; typ: Struct; - BEGIN - Insert(name, obj); - typ := NewStr(form, Basic); obj.mode := Typ; obj.typ := typ; obj.vis := external; - typ.strobj := obj; typ.size := size; typ.ref := form; typ.allocated := TRUE; - typ.pbfp := form; typ.pvfp := form; typ.fpdone := TRUE; - typ.idfp := form; typ.idfpdone := TRUE; res := typ - END EnterTyp; - - PROCEDURE EnterProc(name: Name; num: SHORTINT); - VAR obj: Object; - BEGIN Insert(name, obj); - obj.mode := SProc; obj.typ := notyp; obj.adr := num - END EnterProc; - - PROCEDURE EnterAttr(name: Name; num: SHORTINT); - VAR obj: Object; - BEGIN Insert(name, obj); - obj.mode := Attr; obj.adr := num - END EnterAttr; - - PROCEDURE EnterTProc(ptr, rec: Struct; name: Name; num, typ: SHORTINT); - VAR obj, par: Object; - BEGIN - InsertField(name, rec, obj); - obj.mnolev := -128; (* for correct implement only behaviour *) - obj.mode := TProc; obj.num := num; obj.conval := NewConst(); - obj.conval.setval := obj.conval.setval + {newAttr}; - IF typ = 0 THEN (* FINALIZE, RELEASE *) - obj.typ := notyp; obj.vis := externalR; - INCL(obj.conval.setval, empAttr) - ELSIF typ = 1 THEN (* QueryInterface *) - par := NewObj(); par.name := NewName("int"); par.mode := VarPar; par.vis := outPar; - par.sysflag := 8; par.adr := 16; par.typ := punktyp; - par.link := obj.link; obj.link := par; - par := NewObj(); par.name := NewName("iid"); par.mode := VarPar; par.vis := inPar; - par.sysflag := 16; par.adr := 12; par.typ := guidtyp; - par.link := obj.link; obj.link := par; - obj.typ := restyp; obj.vis := external; - INCL(obj.conval.setval, extAttr) - ELSIF typ = 2 THEN (* AddRef, Release *) - obj.typ := notyp; obj.vis := externalR; - INCL(obj.conval.setval, isHidden); - INCL(obj.conval.setval, extAttr) - END; - par := NewObj(); par.name := NewName("this"); par.mode := Var; - par.adr := 8; par.typ := ptr; - par.link := obj.link; obj.link := par; - END EnterTProc; - - PROCEDURE EnterHdField(VAR root: Object; offs: SHORTINT); - VAR obj: Object; - BEGIN - obj := NewObj(); obj.mode := Fld; - obj.name := NewName(DevCPM.HdPtrName); obj.typ := undftyp; obj.adr := offs; - obj.link := root; root := obj - END EnterHdField; - -BEGIN - NEW(null, 1); null^ := ""; - topScope := NIL; OpenScope(0, NIL); DevCPM.errpos := 0; - InitStruct(undftyp, Undef); InitStruct(notyp, NoTyp); - InitStruct(string8typ, String8); InitStruct(niltyp, NilTyp); niltyp.size := DevCPM.PointerSize; - InitStruct(string16typ, String16); - undftyp.BaseTyp := undftyp; - - (*initialization of module SYSTEM*) -(* - EnterTyp("BYTE", Byte, 1, bytetyp); - EnterProc("NEW", sysnewfn); -*) - EnterTyp("PTR", Pointer, DevCPM.PointerSize, sysptrtyp); - EnterProc("ADR", adrfn); - EnterProc("TYP", typfn); - EnterProc("CC", ccfn); - EnterProc("LSH", lshfn); - EnterProc("ROT", rotfn); - EnterProc("GET", getfn); - EnterProc("PUT", putfn); - EnterProc("GETREG", getrfn); - EnterProc("PUTREG", putrfn); - EnterProc("BIT", bitfn); - EnterProc("VAL", valfn); - EnterProc("MOVE", movefn); - EnterProc("THISRECORD", thisrecfn); - EnterProc("THISARRAY", thisarrfn); - syslink := topScope.right; topScope.right := NIL; - - (* initialization of module COM *) - EnterProc("ID", iidfn); - EnterProc("QUERY", queryfn); - EnterTyp("RESULT", Int32, 4, restyp); - restyp.ref := Res; - EnterTyp("GUID", Guid, 16, guidtyp); - guidtyp.form := Comp; guidtyp.comp := Array; guidtyp.n := 16; - EnterTyp("IUnknown^", IUnk, 12, iunktyp); - iunktyp.form := Comp; iunktyp.comp := Record; iunktyp.n := 3; - iunktyp.attribute := absAttr; -(* - EnterHdField(iunktyp.link, 12); -*) - iunktyp.BaseTyp := NIL; iunktyp.align := 4; - iunktyp.sysflag := interface; iunktyp.untagged := TRUE; - NEW(iunktyp.ext, 40); iunktyp.ext^ := "{00000000-0000-0000-C000-000000000046}"; - EnterTyp("IUnknown", PUnk, DevCPM.PointerSize, punktyp); - punktyp.form := Pointer; punktyp.BaseTyp := iunktyp; - punktyp.sysflag := interface; punktyp.untagged := TRUE; - EnterTProc(punktyp, iunktyp, "QueryInterface", 0, 1); - EnterTProc(punktyp, iunktyp, "AddRef", 1, 2); - EnterTProc(punktyp, iunktyp, "Release", 2, 2); - comlink := topScope.right; topScope.right := NIL; - - universe := topScope; - EnterProc("LCHR", lchrfn); - EnterProc("LENTIER", lentierfcn); - EnterTyp("ANYREC", AnyRec, 0, anytyp); - anytyp.form := Comp; anytyp.comp := Record; anytyp.n := 1; - anytyp.BaseTyp := NIL; anytyp.extlev := -1; (* !!! *) - anytyp.attribute := absAttr; - EnterTyp("ANYPTR", AnyPtr, DevCPM.PointerSize, anyptrtyp); - anyptrtyp.form := Pointer; anyptrtyp.BaseTyp := anytyp; - EnterTProc(anyptrtyp, anytyp, "FINALIZE", 0, 0); - EnterTProc(anyptrtyp, iunktyp, "RELEASE", 1, 0); - EnterProc("VALID", validfn); - - EnterTyp("SHORTCHAR", Char8, 1, char8typ); - string8typ.BaseTyp := char8typ; - EnterTyp("CHAR", Char16, 2, char16typ); - EnterTyp("LONGCHAR", Char16, 2, lchar16typ); - string16typ.BaseTyp := char16typ; - EnterTyp("SET", Set, 4, settyp); - EnterTyp("BYTE", Int8, 1, int8typ); - guidtyp.BaseTyp := int8typ; - EnterTyp("SHORTINT", Int16, 2, int16typ); - EnterTyp("INTEGER", Int32, 4, int32typ); - EnterTyp("LONGINT", Int64, 8, int64typ); - EnterTyp("LARGEINT", Int64, 8, lint64typ); - EnterTyp("SHORTREAL", Real32, 4, real32typ); - EnterTyp("REAL", Real64, 8, real64typ); - EnterTyp("LONGREAL", Real64, 8, lreal64typ); - EnterTyp("BOOLEAN", Bool, 1, booltyp); - EnterBoolConst("FALSE", 0); (* 0 and 1 are compiler internal representation only *) - EnterBoolConst("TRUE", 1); - EnterRealConst("INF", DevCPM.InfReal, infinity); - EnterProc("HALT", haltfn); - EnterProc("NEW", newfn); - EnterProc("ABS", absfn); - EnterProc("CAP", capfn); - EnterProc("ORD", ordfn); - EnterProc("ENTIER", entierfn); - EnterProc("ODD", oddfn); - EnterProc("MIN", minfn); - EnterProc("MAX", maxfn); - EnterProc("CHR", chrfn); - EnterProc("SHORT", shortfn); - EnterProc("LONG", longfn); - EnterProc("SIZE", sizefn); - EnterProc("INC", incfn); - EnterProc("DEC", decfn); - EnterProc("INCL", inclfn); - EnterProc("EXCL", exclfn); - EnterProc("LEN", lenfn); - EnterProc("COPY", copyfn); - EnterProc("ASH", ashfn); - EnterProc("ASSERT", assertfn); -(* - EnterProc("ADR", adrfn); - EnterProc("TYP", typfn); -*) - EnterProc("BITS", bitsfn); - EnterAttr("ABSTRACT", absAttr); - EnterAttr("LIMITED", limAttr); - EnterAttr("EMPTY", empAttr); - EnterAttr("EXTENSIBLE", extAttr); - NEW(intrealtyp); intrealtyp^ := real64typ^; - impCtxt.ref[Undef] := undftyp; impCtxt.ref[Byte] := bytetyp; - impCtxt.ref[Bool] := booltyp; impCtxt.ref[Char8] := char8typ; - impCtxt.ref[Int8] := int8typ; impCtxt.ref[Int16] := int16typ; - impCtxt.ref[Int32] := int32typ; impCtxt.ref[Real32] := real32typ; - impCtxt.ref[Real64] := real64typ; impCtxt.ref[Set] := settyp; - impCtxt.ref[String8] := string8typ; impCtxt.ref[NilTyp] := niltyp; - impCtxt.ref[NoTyp] := notyp; impCtxt.ref[Pointer] := sysptrtyp; - impCtxt.ref[AnyPtr] := anyptrtyp; impCtxt.ref[AnyRec] := anytyp; - impCtxt.ref[Char16] := char16typ; impCtxt.ref[String16] := string16typ; - impCtxt.ref[Int64] := int64typ; - impCtxt.ref[IUnk] := iunktyp; impCtxt.ref[PUnk] := punktyp; - impCtxt.ref[Guid] := guidtyp; impCtxt.ref[Res] := restyp; -END DevCPT. - -Objects: - - mode | adr conval link scope leaf - ------------------------------------------------ - Undef | Not used - Var | vadr next regopt Glob or loc var or proc value parameter - VarPar| vadr next regopt Var parameter (vis = 0 | inPar | outPar) - Con | val Constant - Fld | off next Record field - Typ | Named type - LProc | entry sizes firstpar scope leaf Local procedure, entry adr set in back-end - XProc | entry sizes firstpar scope leaf External procedure, entry adr set in back-end - SProc | fno sizes Standard procedure - CProc | code firstpar scope Code procedure - IProc | entry sizes scope leaf Interrupt procedure, entry adr set in back-end - Mod | scope Module - Head | txtpos owner firstvar Scope anchor - TProc | entry sizes firstpar scope leaf Bound procedure, mthno = obj.num - - Structures: - - form comp | n BaseTyp link mno txtpos sysflag - ---------------------------------------------------------------------------------- - Undef Basic | - Byte Basic | - Bool Basic | - Char8 Basic | - Int8 Basic | - Int16 Basic | - Int32 Basic | - Real32 Basic | - Real64 Basic | - Set Basic | - String8 Basic | - NilTyp Basic | - NoTyp Basic | - Pointer Basic | PBaseTyp mno txtpos sysflag - ProcTyp Basic | ResTyp params mno txtpos sysflag - Comp Array | nofel ElemTyp mno txtpos sysflag - Comp DynArr| dim ElemTyp mno txtpos sysflag - Comp Record| nofmth RBaseTyp fields mno txtpos sysflag - Char16 Basic | - String16Basic | - Int64 Basic | - -Nodes: - -design = Nvar|Nvarpar|Nfield|Nderef|Nindex|Nguard|Neguard|Ntype|Nproc. -expr = design|Nconst|Nupto|Nmop|Ndop|Ncall. -nextexpr = NIL|expr. -ifstat = NIL|Nif. -casestat = Ncaselse. -sglcase = NIL|Ncasedo. -stat = NIL|Ninittd|Nenter|Nassign|Ncall|Nifelse|Ncase|Nwhile|Nrepeat| - Nloop|Nexit|Nreturn|Nwith|Ntrap. - - - class subcl obj left right link - --------------------------------------------------------- - -design Nvar var nextexpr - Nvarpar varpar nextexpr - Nfield field design nextexpr - Nderef ptr/str design nextexpr - Nindex design expr nextexpr - Nguard design nextexpr (typ = guard type) - Neguard design nextexpr (typ = guard type) - Ntype type nextexpr - Nproc normal proc nextexpr - super proc nextexpr - - -expr design - Nconst const (val = node.conval) - Nupto expr expr nextexpr - Nmop not expr nextexpr - minus expr nextexpr - is tsttype expr nextexpr - conv expr nextexpr - abs expr nextexpr - cap expr nextexpr - odd expr nextexpr - bit expr nextexpr {x} - adr expr nextexpr SYSTEM.ADR - typ expr nextexpr SYSTEM.TYP - cc Nconst nextexpr SYSTEM.CC - val expr nextexpr SYSTEM.VAL - Ndop times expr expr nextexpr - slash expr expr nextexpr - div expr expr nextexpr - mod expr expr nextexpr - and expr expr nextexpr - plus expr expr nextexpr - minus expr expr nextexpr - or expr expr nextexpr - eql expr expr nextexpr - neq expr expr nextexpr - lss expr expr nextexpr - leq expr expr nextexpr - grt expr expr nextexpr - geq expr expr nextexpr - in expr expr nextexpr - ash expr expr nextexpr - msk expr Nconst nextexpr - len design Nconst nextexpr - min expr expr nextexpr MIN - max expr expr nextexpr MAX - bit expr expr nextexpr SYSTEM.BIT - lsh expr expr nextexpr SYSTEM.LSH - rot expr expr nextexpr SYSTEM.ROT - Ncall fpar design nextexpr nextexpr - Ncomp stat expr nextexpr - -nextexpr NIL - expr - -ifstat NIL - Nif expr stat ifstat - -casestat Ncaselse sglcase stat (minmax = node.conval) - -sglcase NIL - Ncasedo Nconst stat sglcase - -stat NIL - Ninittd stat (of node.typ) - Nenter proc stat stat stat (proc=NIL for mod) - Nassign assign design expr stat - newfn design nextexp stat - incfn design expr stat - decfn design expr stat - inclfn design expr stat - exclfn design expr stat - copyfn design expr stat - getfn design expr stat SYSTEM.GET - putfn expr expr stat SYSTEM.PUT - getrfn design Nconst stat SYSTEM.GETREG - putrfn Nconst expr stat SYSTEM.PUTREG - sysnewfn design expr stat SYSTEM.NEW - movefn expr expr stat SYSTEM.MOVE - (right.link = 3rd par) - Ncall fpar design nextexpr stat - Nifelse ifstat stat stat - Ncase expr casestat stat - Nwhile expr stat stat - Nrepeat stat expr stat - Nloop stat stat - Nexit stat - Nreturn proc nextexpr stat (proc = NIL for mod) - Nwith ifstat stat stat - Ntrap expr stat - Ncomp stat stat stat diff --git a/new/Dev/Mod/CPV486.odc b/new/Dev/Mod/CPV486.odc new file mode 100644 index 0000000000000000000000000000000000000000..d90a3a8c1b394f94f72036e9ab673dacfe116ced GIT binary patch literal 67677 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 Y limit THEN RETURN limit ELSE RETURN align END - END Base; - -(* ----------------------------------------------------- - reference implementation of TypeSize for portable symbol files - mandatory for all non-system structures - - PROCEDURE TypeSize (typ: DevCPT.Struct); - VAR f, c: SHORTINT; offset: LONGINT; fld: DevCPT.Object; btyp: DevCPT.Struct; - BEGIN - IF typ.size = -1 THEN - f := typ.form; c := typ.comp; btyp := typ.BaseTyp; - IF c = Record THEN - IF btyp = NIL THEN offset := 0 ELSE TypeSize(btyp); offset := btyp.size END; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - btyp := fld.typ; TypeSize(btyp); - IF btyp.size >= 4 THEN INC(offset, (-offset) MOD 4) - ELSIF btyp.size >= 2 THEN INC(offset, offset MOD 2) - END; - fld.adr := offset; INC(offset, btyp.size); - fld := fld.link - END; - IF offset > 2 THEN INC(offset, (-offset) MOD 4) END; - typ.size := offset; typ.align := 4; - typ.n := -1 (* methods not counted yet *) - ELSIF c = Array THEN - TypeSize(btyp); - typ.size := typ.n * btyp.size - ELSIF f = Pointer THEN - typ.size := DevCPM.PointerSize - ELSIF f = ProcTyp THEN - typ.size := DevCPM.ProcSize - ELSE (* c = DynArr *) - TypeSize(btyp); - IF btyp.comp = DynArr THEN typ.size := btyp.size + 4 - ELSE typ.size := 8 - END - END - END - END TypeSize; - ------------------------------------------------------ *) - - PROCEDURE GTypeSize (typ: DevCPT.Struct; guarded: BOOLEAN); - VAR f, c: BYTE; offset, align, falign, alignLimit: INTEGER; - fld: DevCPT.Object; btyp: DevCPT.Struct; name: DevCPT.Name; - BEGIN - IF typ.untagged THEN guarded := TRUE END; - IF typ = DevCPT.undftyp THEN DevCPM.err(58) - ELSIF typ.size = -1 THEN - f := typ.form; c := typ.comp; btyp := typ.BaseTyp; - IF c = Record THEN - IF btyp = NIL THEN offset := 0; align := 1; - ELSE GTypeSize(btyp, guarded); offset := btyp.size; align := btyp.align - END ; - IF typ.sysflag = noAlign THEN alignLimit := 1 - ELSIF typ.sysflag = align2 THEN alignLimit := 2 - ELSIF typ.sysflag = align8 THEN alignLimit := 8 - ELSE alignLimit := 4 - END; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - btyp := fld.typ; GTypeSize(btyp, guarded); - IF typ.sysflag > 0 THEN falign := Base(btyp, alignLimit) - ELSIF btyp.size >= 4 THEN falign := 4 - ELSIF btyp.size >= 2 THEN falign := 2 - ELSE falign := 1 - END; - IF typ.sysflag = union THEN - fld.adr := 0; - IF btyp.size > offset THEN offset := btyp.size END; - ELSE - Align(offset, falign); - fld.adr := offset; - IF offset <= MAX(INTEGER) - 4 - btyp.size THEN INC(offset, btyp.size) - ELSE offset := 4; DevCPM.Mark(214, typ.txtpos) - END - END; - IF falign > align THEN align := falign END ; - fld := fld.link - END; -(* - IF (typ.sysflag = interface) & (typ.BaseTyp = NIL) THEN - fld := DevCPT.NewObj(); fld.name^ := DevCPM.HdPtrName; fld.mode := Fld; - fld.typ := DevCPT.undftyp; fld.adr := 8; - fld.right := typ.link; typ.link := fld; - fld := DevCPT.NewObj(); fld.name^ := DevCPM.HdPtrName; fld.mode := Fld; - fld.typ := DevCPT.undftyp; fld.adr := 12; - typ.link.link := fld; typ.link.left := fld; - offset := interfaceSize; align := 4 - END; -*) - IF typ.sysflag <= 0 THEN align := 4 END; - typ.align := align; - IF (typ.sysflag > 0) OR (offset > 2) THEN Align(offset, align) END; - typ.size := offset; - typ.n := -1 (* methods not counted yet *) - ELSIF c = Array THEN - GTypeSize(btyp, guarded); - IF (btyp.size = 0) OR (typ.n <= MAX(INTEGER) DIV btyp.size) THEN typ.size := typ.n * btyp.size - ELSE typ.size := 4; DevCPM.Mark(214, typ.txtpos) - END - ELSIF f = Pointer THEN - typ.size := DevCPM.PointerSize; - IF guarded & ~typ.untagged THEN DevCPM.Mark(143, typ.txtpos) END - ELSIF f = ProcTyp THEN - typ.size := DevCPM.ProcSize - ELSE (* c = DynArr *) - GTypeSize(btyp, guarded); - IF (typ.sysflag = untagged) OR typ.untagged THEN typ.size := 4 - ELSE - IF btyp.comp = DynArr THEN typ.size := btyp.size + 4 - ELSE typ.size := 8 - END - END - END - END - END GTypeSize; - - PROCEDURE TypeSize*(typ: DevCPT.Struct); (* also called from DevCPT.InStruct for arrays *) - BEGIN - GTypeSize(typ, FALSE) - END TypeSize; - - PROCEDURE GetComKernel; - VAR name: DevCPT.Name; mod: DevCPT.Object; - BEGIN - IF addRef = NIL THEN - DevCPT.OpenScope(SHORT(SHORT(-DevCPT.nofGmod)), NIL); - DevCPT.topScope.name := DevCPT.NewName("$$"); - name := "AddRef"; DevCPT.Insert(name, addRef); - addRef.mode := XProc; - addRef.fprint := addRefFP; - addRef.fpdone := TRUE; - name := "Release"; DevCPT.Insert(name, release); - release.mode := XProc; - release.fprint := addRefFP; - release.fpdone := TRUE; - name := "Release2"; DevCPT.Insert(name, release2); - release2.mode := XProc; - release2.fprint := addRefFP; - release2.fpdone := TRUE; - name := "InterfaceTrapHandler"; DevCPT.Insert(name, DevCPC486.intHandler); - DevCPC486.intHandler.mode := XProc; - DevCPC486.intHandler.fprint := intHandlerFP; - DevCPC486.intHandler.fpdone := TRUE; - DevCPT.GlbMod[DevCPT.nofGmod] := DevCPT.topScope; - INC(DevCPT.nofGmod); - DevCPT.CloseScope; - END - END GetComKernel; - - PROCEDURE EnumTProcs(rec: DevCPT.Struct); (* method numbers in declaration order *) - VAR btyp: DevCPT.Struct; obj, redef: DevCPT.Object; - BEGIN - IF rec.n = -1 THEN - rec.n := 0; btyp := rec.BaseTyp; - IF btyp # NIL THEN - EnumTProcs(btyp); rec.n := btyp.n; - END; - obj := rec.strobj.link; - WHILE obj # NIL DO - DevCPT.FindBaseField(obj.name^, rec, redef); - IF redef # NIL THEN obj.num := redef.num (*mthno*); - IF ~(isRedef IN obj.conval.setval) OR (redef.conval.setval * {extAttr, absAttr, empAttr} = {}) THEN - DevCPM.Mark(119, rec.txtpos) - END - ELSE obj.num := rec.n; INC(rec.n) - END ; - IF obj.conval.setval * {hasBody, absAttr, empAttr} = {} THEN DevCPM.Mark(129, obj.adr) END; - obj := obj.nlink - END - END - END EnumTProcs; - - PROCEDURE CountTProcs(rec: DevCPT.Struct); - VAR btyp: DevCPT.Struct; comProc: INTEGER; m, rel: DevCPT.Object; name: DevCPT.Name; - - PROCEDURE TProcs(obj: DevCPT.Object); (* obj.mnolev = 0, TProcs of base type already counted *) - VAR redef: DevCPT.Object; - BEGIN - IF obj # NIL THEN - TProcs(obj.left); - IF obj.mode = TProc THEN - DevCPT.FindBaseField(obj.name^, rec, redef); - (* obj.adr := 0 *) - IF redef # NIL THEN - obj.num := redef.num (*mthno*); - IF (redef.link # NIL) & (redef.link.typ.sysflag = interface) THEN - obj.num := numPreIntProc + comProc - 1 - obj.num - END; - IF ~(isRedef IN obj.conval.setval) OR (redef.conval.setval * {extAttr, absAttr, empAttr} = {}) THEN - DevCPM.Mark(119, rec.txtpos) - END - ELSE obj.num := rec.n; INC(rec.n) - END ; - IF obj.conval.setval * {hasBody, absAttr, empAttr} = {} THEN DevCPM.Mark(129, obj.adr) END - END ; - TProcs(obj.right) - END - END TProcs; - - BEGIN - IF rec.n = -1 THEN - comProc := 0; - IF rec.untagged THEN rec.n := 0 ELSE rec.n := DevCPT.anytyp.n END; - btyp := rec.BaseTyp; - IF btyp # NIL THEN - IF btyp.sysflag = interface THEN - EnumTProcs(btyp); rec.n := btyp.n + numPreIntProc; comProc := btyp.n; - ELSE - CountTProcs(btyp); rec.n := btyp.n - END - END; - WHILE (btyp # NIL) & (btyp # DevCPT.undftyp) & (btyp.sysflag # interface) DO btyp := btyp.BaseTyp END; - IF (btyp # NIL) & (btyp.sysflag = interface) THEN - IF comProc > 0 THEN - name := "QueryInterface"; DevCPT.FindField(name, rec, m); - IF m.link.typ.sysflag = interface THEN - DevCPT.InsertField(name, rec, m); m.mode := TProc; m.typ := rec; - m.conval := DevCPT.NewConst(); m.conval.setval := {isRedef, hasBody, isCallback, extAttr}; - m.nlink := query; query := m - END; - name := "AddRef"; - DevCPT.InsertField(name, rec, m); m.mode := TProc; m.mnolev := 0; - m.conval := DevCPT.NewConst(); m.conval.setval := {isRedef, hasBody, isCallback, isHidden, extAttr}; - GetComKernel; addRef.used := TRUE; m.adr := -1; m.nlink := addRef; - END; - name := "RELEASE"; - DevCPT.FindField(name, rec, rel); - IF (rel # NIL) & (rel.link.typ = DevCPT.anyptrtyp) THEN rel := NIL END; - IF (comProc > 0) OR (rel # NIL) THEN - name := "Release"; - DevCPT.InsertField(name, rec, m); m.mode := TProc; m.mnolev := 0; - m.conval := DevCPT.NewConst(); m.conval.setval := {isRedef, hasBody, isCallback, isHidden, extAttr}; - GetComKernel; m.adr := -1; - IF rel # NIL THEN release2.used := TRUE; m.nlink := release2 - ELSE release.used := TRUE; m.nlink := release - END - END - END; - TProcs(rec.link); - END - END CountTProcs; - - PROCEDURE ^Parameters(firstPar, proc: DevCPT.Object); - - PROCEDURE ^TProcedures(obj: DevCPT.Object); - - PROCEDURE TypeAlloc(typ: DevCPT.Struct); - VAR f, c: SHORTINT; fld: DevCPT.Object; btyp: DevCPT.Struct; - BEGIN - IF ~typ.allocated THEN (* not imported, not predefined, not allocated yet *) - typ.allocated := TRUE; - TypeSize(typ); - f := typ.form; c := typ.comp; btyp := typ.BaseTyp; - IF c = Record THEN - IF typ.sysflag = interface THEN - EnumTProcs(typ); - ELSE - CountTProcs(typ) - END; - IF typ.extlev > 14 THEN DevCPM.Mark(233, typ.txtpos) END; - IF btyp # NIL THEN TypeAlloc(btyp) END; - IF ~typ.untagged THEN DevCPE.AllocTypDesc(typ) END; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - TypeAlloc(fld.typ); fld := fld.link - END; - TProcedures(typ.link) - ELSIF f = Pointer THEN - IF btyp = DevCPT.undftyp THEN DevCPM.Mark(128, typ.txtpos) - ELSE TypeAlloc(btyp); - END - ELSIF f = ProcTyp THEN - TypeAlloc(btyp); - Parameters(typ.link, NIL) - ELSE (* c IN {Array, DynArr} *) - TypeAlloc(btyp); - IF (btyp.comp = DynArr) & btyp.untagged & ~typ.untagged THEN DevCPM.Mark(225, typ.txtpos) END; - END - END - END TypeAlloc; - - PROCEDURE NumOfIntProc (typ: DevCPT.Struct): INTEGER; - BEGIN - WHILE (typ # NIL) & (typ.sysflag # interface) DO typ := typ.BaseTyp END; - IF typ # NIL THEN RETURN typ.n - ELSE RETURN 0 - END - END NumOfIntProc; - - PROCEDURE Parameters(firstPar, proc: DevCPT.Object); - (* firstPar.mnolev = 0 *) - VAR par: DevCPT.Object; typ: DevCPT.Struct; padr, vadr: INTEGER; - BEGIN - padr := ParOff; par := firstPar; - WHILE par # NIL DO - typ := par.typ; TypeAlloc(typ); - par.adr := padr; - IF (par.mode = VarPar) & (typ.comp # DynArr) THEN - IF (typ.comp = Record) & ~typ.untagged THEN INC(padr, 8) - ELSE INC(padr, 4) - END - ELSE - IF (par.mode = Var) & (typ.comp = DynArr) & typ.untagged THEN DevCPM.err(145) END; - INC(padr, typ.size); Align(padr, 4) - END; - par := par.link - END; - IF proc # NIL THEN - IF proc.mode = XProc THEN - INCL(proc.conval.setval, isCallback) - ELSIF (proc.mode = TProc) - & (proc.num >= numPreIntProc) - & (proc.num < numPreIntProc + NumOfIntProc(proc.link.typ)) - THEN - INCL(proc.conval.setval, isCallback); - INCL(proc.conval.setval, isGuarded) - END; - IF proc.sysflag = guarded THEN INCL(proc.conval.setval, isGuarded) END; - IF isGuarded IN proc.conval.setval THEN - GetComKernel; vadr := -24 - ELSE - vadr := 0; - IF imVar IN proc.conval.setval THEN DEC(vadr, 4) END; - IF isCallback IN proc.conval.setval THEN DEC(vadr, 8) END - END; - proc.conval.intval := padr; proc.conval.intval2 := vadr; - END - END Parameters; - - PROCEDURE Variables(var: DevCPT.Object; VAR varSize: INTEGER); - (* allocates only offsets, regs allocated in DevCPC486.Enter *) - VAR adr: INTEGER; typ: DevCPT.Struct; - BEGIN - adr := varSize; - WHILE var # NIL DO - typ := var.typ; TypeAlloc(typ); - DEC(adr, typ.size); NegAlign(adr, Base(typ, 4)); - var.adr := adr; - var := var.link - END; - NegAlign(adr, 4); varSize := adr - END Variables; - - PROCEDURE ^Objects(obj: DevCPT.Object); - - PROCEDURE Procedure(obj: DevCPT.Object); - (* obj.mnolev = 0 *) - VAR oldPos: INTEGER; - BEGIN - oldPos := DevCPM.errpos; DevCPM.errpos := obj.scope.adr; - TypeAlloc(obj.typ); - Parameters(obj.link, obj); - IF ~(hasBody IN obj.conval.setval) THEN DevCPM.Mark(129, obj.adr) END ; - Variables(obj.scope.scope, obj.conval.intval2); (* local variables *) - Objects(obj.scope.right); - DevCPM.errpos := oldPos - END Procedure; - - PROCEDURE TProcedures(obj: DevCPT.Object); - (* obj.mnolev = 0 *) - VAR par: DevCPT.Object; psize: INTEGER; - BEGIN - IF obj # NIL THEN - TProcedures(obj.left); - IF (obj.mode = TProc) & (obj.scope # NIL) THEN - TypeAlloc(obj.typ); - Parameters(obj.link, obj); - Variables(obj.scope.scope, obj.conval.intval2); (* local variables *) - Objects(obj.scope.right); - END ; - TProcedures(obj.right) - END - END TProcedures; - - PROCEDURE Objects(obj: DevCPT.Object); - BEGIN - IF obj # NIL THEN - Objects(obj.left); - IF obj.mode IN {Con, Typ, LProc, XProc, CProc, IProc} THEN - IF (obj.mode IN {Con, Typ}) THEN TypeAlloc(obj.typ); - ELSE Procedure(obj) - END - END ; - Objects(obj.right) - END - END Objects; - - PROCEDURE Allocate*; - VAR gvarSize: INTEGER; name: DevCPT.Name; - BEGIN - DevCPM.errpos := DevCPT.topScope.adr; (* text position of scope used if error *) - gvarSize := 0; - Variables(DevCPT.topScope.scope, gvarSize); DevCPE.dsize := -gvarSize; - Objects(DevCPT.topScope.right) - END Allocate; - - (************************) - - PROCEDURE SameExp (n1, n2: DevCPT.Node): BOOLEAN; - BEGIN - WHILE (n1.class = n2.class) & (n1.typ = n2.typ) DO - CASE n1.class OF - | Nvar, Nvarpar, Nproc: RETURN n1.obj = n2.obj - | Nconst: RETURN (n1.typ.form IN {Int8..Int32}) & (n1.conval.intval = n2.conval.intval) - | Nfield: IF n1.obj # n2.obj THEN RETURN FALSE END - | Nderef, Nguard: - | Nindex: IF ~SameExp(n1.right, n2.right) THEN RETURN FALSE END - | Nmop: IF (n1.subcl # n2.subcl) OR (n1.subcl = is) THEN RETURN FALSE END - | Ndop: IF (n1.subcl # n2.subcl) OR ~SameExp(n1.right, n2.right) THEN RETURN FALSE END - ELSE RETURN FALSE - END ; - n1 := n1.left; n2 := n2.left - END; - RETURN FALSE - END SameExp; - - PROCEDURE Check (n: DevCPT.Node; VAR used: SET; VAR size: INTEGER); - VAR ux, uy: SET; sx, sy, sf: INTEGER; f: BYTE; - BEGIN - used := {}; size := 0; - WHILE n # NIL DO - IF n.class # Ncomp THEN - Check(n.left, ux, sx); - Check(n.right, uy, sy) - END; - ux := ux + uy; sf := 0; - CASE n.class OF - | Nvar, Nvarpar: - IF (n.class = Nvarpar) OR (n.typ.comp = DynArr) OR - (n.obj.mnolev > 0) & - (DevCPC486.imLevel[n.obj.mnolev] < DevCPC486.imLevel[DevCPL486.level]) THEN sf := 1 END - | Nguard: sf := 2 - | Neguard, Nderef: sf := 1 - | Nindex: - IF (n.right.class # Nconst) OR (n.left.typ.comp = DynArr) THEN sf := 1 END; - IF sx > 0 THEN INC(sy) END - | Nmop: - CASE n.subcl OF - | is, adr, typfn, minus, abs, cap, val: sf := 1 - | bit: sf := 2; INCL(ux, CX) - | conv: - IF n.typ.form = Int64 THEN sf := 2 - ELSIF ~(n.typ.form IN realSet) THEN sf := 1; - IF n.left.typ.form IN realSet THEN INCL(ux, AX) END - END - | odd, cc, not: - END - | Ndop: - f := n.left.typ.form; - IF f # Bool THEN - CASE n.subcl OF - | times: - sf := 1; - IF f = Int8 THEN INCL(ux, AX) END - | div, mod: - sf := 3; INCL(ux, AX); - IF f > Int8 THEN INCL(ux, DX) END - | eql..geq: - IF f IN {String8, String16, Comp} THEN ux := ux + {AX, CX, SI, DI}; sf := 4 - ELSIF f IN realSet THEN INCL(ux, AX); sf := 1 - ELSE sf := 1 - END - | ash, lsh, rot: - IF n.right.class = Nconst THEN sf := 1 ELSE sf := 2; INCL(ux, CX) END - | slash, plus, minus, msk, in, bit: - sf := 1 - | len: - IF f IN {String8, String16} THEN ux := ux + {AX, CX, DI}; sf := 3 - ELSE sf := 1 - END - | min, max: - sf := 1; - IF f IN realSet THEN INCL(ux, AX) END - | queryfn: - ux := ux + {CX, SI, DI}; sf := 4 - END; - IF sy > sx THEN INC(sx) ELSE INC(sy) END - END - | Nupto: - IF (n.right.class = Nconst) OR (n.left.class = Nconst) THEN sf := 2 - ELSE sf := 3 - END; - INCL(ux, CX); INC(sx) - | Ncall, Ncomp: - sf := 10; ux := wreg + {float} - | Nfield, Nconst, Nproc, Ntype: - END; - used := used + ux; - IF sx > size THEN size := sx END; - IF sy > size THEN size := sy END; - IF sf > size THEN size := sf END; - n := n.link - END; - IF size > 10 THEN size := 10 END - END Check; - - PROCEDURE^ expr (n: DevCPT.Node; VAR x: DevCPL486.Item; hint, stop: SET); - - PROCEDURE DualExp (left, right: DevCPT.Node; VAR x, y: DevCPL486.Item; hx, hy, stpx, stpy: SET); - VAR ux, uy: SET; sx, sy: INTEGER; - BEGIN - Check(left, ux, sx); Check(right, uy, sy); - IF sy > sx THEN - expr(right, y, hy + stpy, ux + stpy * {AX, CX}); - expr(left, x, hx, stpx); - DevCPC486.Assert(y, hy, stpy) - ELSE - expr(left, x, hx + stpx, uy); - expr(right, y, hy, stpy); - DevCPC486.Assert(x, hx, stpx) - END; - END DualExp; - - PROCEDURE IntDOp (n: DevCPT.Node; VAR x: DevCPL486.Item; hint: SET); - VAR y: DevCPL486.Item; rev: BOOLEAN; - BEGIN - DualExp(n.left, n.right, x, y, hint, hint, {stk}, {stk}); - IF (x.mode = Reg) & DevCPC486.Fits(x, hint) THEN - DevCPC486.IntDOp(x, y, n.subcl, FALSE) - ELSIF (y.mode = Reg) & DevCPC486.Fits(y, hint) THEN - DevCPC486.IntDOp(y, x, n.subcl, TRUE); x := y - ELSIF x.mode # Reg THEN - DevCPC486.Load(x, hint, {con}); DevCPC486.IntDOp(x, y, n.subcl, FALSE) - ELSIF y.mode # Reg THEN - DevCPC486.Load(y, hint, {con}); DevCPC486.IntDOp(y, x, n.subcl, TRUE); x := y - ELSE - DevCPC486.IntDOp(x, y, n.subcl, FALSE) - END - END IntDOp; - - PROCEDURE FloatDOp (n: DevCPT.Node; VAR x: DevCPL486.Item); - VAR y: DevCPL486.Item; ux, uy, uf: SET; sx, sy: INTEGER; - BEGIN - Check(n.left, ux, sx); Check(n.right, uy, sy); - IF (n.subcl = min) OR (n.subcl = max) THEN uf := {AX} ELSE uf := {} END; - IF (sy > sx) OR (sy = sx) & ((n.subcl = mod) OR (n.subcl = ash)) THEN - expr(n.right, x, {}, ux + {mem, stk}); - expr(n.left, y, {}, uf); - DevCPC486.FloatDOp(x, y, n.subcl, TRUE) - ELSIF float IN uy THEN (* function calls in both operands *) - expr(n.left, y, {}, uy + {mem}); - expr(n.right, x, {}, {mem, stk}); - DevCPC486.FloatDOp(x, y, n.subcl, TRUE) - ELSE - expr(n.left, x, {}, uy + {mem, stk}); - expr(n.right, y, {}, uf); - DevCPC486.FloatDOp(x, y, n.subcl, FALSE) - END - END FloatDOp; - - PROCEDURE design (n: DevCPT.Node; VAR x: DevCPL486.Item; hint, stop: SET); - VAR obj: DevCPT.Object; y: DevCPL486.Item; ux, uy: SET; sx, sy: INTEGER; - BEGIN - CASE n.class OF - Nvar, Nvarpar: - obj := n.obj; x.mode := obj.mode; x.obj := obj; x.scale := 0; - IF obj.typ.comp = DynArr THEN x.mode := VarPar END; - IF obj.mnolev < 0 THEN x.offset := 0; x.tmode := Con - ELSIF x.mode = Var THEN x.offset := obj.adr; x.tmode := Con - ELSE x.offset := 0; x.tmode := VarPar - END - | Nfield: - design(n.left, x, hint, stop); DevCPC486.Field(x, n.obj) - | Nderef: - IF n.subcl # 0 THEN - expr(n.left, x, hint, stop); - IF n.typ.form = String8 THEN x.form := VString8 ELSE x.form := VString16 END - ELSE - expr(n.left, x, hint, stop + {mem} - {loaded}); DevCPC486.DeRef(x) - END - | Nindex: - Check(n.left, ux, sx); Check(n.right, uy, sy); - IF wreg - uy = {} THEN - expr(n.right, y, hint + stop, ux); - design(n.left, x, hint, stop); - IF x.scale # 0 THEN DevCPC486.Index(x, y, {}, {}) ELSE DevCPC486.Index(x, y, hint, stop) END - ELSE - design(n.left, x, hint, stop + uy); - IF x.scale # 0 THEN expr(n.right, y, {}, {}); DevCPC486.Index(x, y, {}, {}) - ELSE expr(n.right, y, hint, stop); DevCPC486.Index(x, y, hint, stop) - END - END - | Nguard, Neguard: - IF n.typ.form = Pointer THEN - IF loaded IN stop THEN expr(n.left, x, hint, stop) ELSE expr(n.left, x, hint, stop + {mem}) END - ELSE design(n.left, x, hint, stop) - END; - DevCPC486.TypTest(x, n.typ, TRUE, n.class = Neguard) - | Nproc: - obj := n.obj; x.mode := obj.mode; x.obj := obj; - IF x.mode = TProc THEN x.offset := obj.num; (*mthno*) x.scale := n.subcl (* super *) END - END; - x.typ := n.typ - END design; - - PROCEDURE IsAllocDynArr (x: DevCPT.Node): BOOLEAN; - BEGIN - IF (x.typ.comp = DynArr) & ~x.typ.untagged THEN - WHILE x.class = Nindex DO x := x.left END; - IF x.class = Nderef THEN RETURN TRUE END - END; - RETURN FALSE - END IsAllocDynArr; - - PROCEDURE StringOp (left, right: DevCPT.Node; VAR x, y: DevCPL486.Item; useLen: BOOLEAN); - VAR ax, ay: DevCPL486.Item; ux: SET; sx: INTEGER; - BEGIN - Check(left, ux, sx); - expr(right, y, wreg - {SI} + ux, {}); - ay := y; DevCPC486.GetAdr(ay, wreg - {SI} + ux, {}); DevCPC486.Assert(ay, wreg - {SI}, ux); - IF useLen & IsAllocDynArr(left) THEN (* keep len descriptor *) - design(left, x, wreg - {CX}, {loaded}); - DevCPC486.Prepare(x, wreg - {CX} + {deref}, {DI}) - ELSE - expr(left, x, wreg - {DI}, {}) - END; - ax := x; DevCPC486.GetAdr(ax, {}, wreg - {DI} + {stk, con}); - DevCPC486.Load(ay, {}, wreg - {SI} + {con}); - DevCPC486.Free(ax); DevCPC486.Free(ay) - END StringOp; - - PROCEDURE AdrExpr (n: DevCPT.Node; VAR x: DevCPL486.Item; hint, stop: SET); - BEGIN - IF n.class < Nconst THEN - design(n, x, hint + stop, {loaded}); DevCPC486.Prepare(x, hint + {deref}, stop) - ELSE expr(n, x, hint, stop) - END - END AdrExpr; - - (* ---------- interface pointer reference counting ---------- *) - - PROCEDURE HandleIPtrs (typ: DevCPT.Struct; VAR x, y: DevCPL486.Item; add, rel, init: BOOLEAN); - - PROCEDURE FindPtrs (typ: DevCPT.Struct; adr: INTEGER); - VAR fld: DevCPT.Object; btyp: DevCPT.Struct; i, n: INTEGER; - BEGIN - IF (typ.form = Pointer) & (typ.sysflag = interface) THEN - IF add THEN DevCPC486.IPAddRef(y, adr, TRUE) END; - IF rel THEN DevCPC486.IPRelease(x, adr, TRUE, init) END - ELSIF (typ.comp = Record) & (typ.sysflag # union) THEN - btyp := typ.BaseTyp; - IF btyp # NIL THEN FindPtrs(btyp, adr) END ; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF (fld.sysflag = interface) & (fld.name^ = DevCPM.HdUtPtrName) THEN - IF add THEN DevCPC486.IPAddRef(y, fld.adr + adr, TRUE) END; - IF rel THEN DevCPC486.IPRelease(x, fld.adr + adr, TRUE, init) END - ELSE FindPtrs(fld.typ, fld.adr + adr) - END; - fld := fld.link - END - ELSIF typ.comp = Array THEN - btyp := typ.BaseTyp; n := typ.n; - WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ; - IF DevCPC486.ContainsIPtrs(btyp) THEN - i := 0; - WHILE i < n DO FindPtrs(btyp, adr); INC(adr, btyp.size); INC(i) END - END - ELSIF typ.comp = DynArr THEN - IF DevCPC486.ContainsIPtrs(typ) THEN DevCPM.err(221) END - END - END FindPtrs; - - BEGIN - FindPtrs(typ, 0) - END HandleIPtrs; - - PROCEDURE CountedPtr (n: DevCPT.Node): BOOLEAN; - BEGIN - RETURN (n.typ.form = Pointer) & (n.typ.sysflag = interface) - & ((n.class = Ncall) OR (n.class = Ncomp) & (n.right.class = Ncall)) - END CountedPtr; - - PROCEDURE IPAssign (nx, ny: DevCPT.Node; VAR x, y: DevCPL486.Item; ux: SET); - (* nx.typ.form = Pointer & nx.typ.sysflag = interface *) - BEGIN - expr(ny, y, {}, wreg - {SI} + {mem, stk}); - IF (ny.class # Nconst) & ~CountedPtr(ny) THEN - DevCPC486.IPAddRef(y, 0, TRUE) - END; - IF nx # NIL THEN - DevCPC486.Assert(y, {}, wreg - {SI} + ux); - expr(nx, x, wreg - {DI}, {loaded}); - IF (x.mode = Ind) & (x.reg IN wreg - {SI, DI}) OR (x.scale # 0) THEN - DevCPC486.GetAdr(x, {}, wreg - {DI} + {con}); - x.mode := Ind; x.offset := 0; x.scale := 0 - END; - DevCPC486.IPRelease(x, 0, TRUE, FALSE); - END - END IPAssign; - - PROCEDURE IPStructAssign (typ: DevCPT.Struct); - VAR x, y: DevCPL486.Item; - BEGIN - IF typ.comp = DynArr THEN DevCPM.err(270) END; - (* addresses in SI and DI *) - x.mode := Ind; x.reg := DI; x.offset := 0; x.scale := 0; - y.mode := Ind; y.reg := SI; y.offset := 0; y.scale := 0; - HandleIPtrs(typ, x, y, TRUE, TRUE, FALSE) - END IPStructAssign; - - PROCEDURE IPFree (nx: DevCPT.Node; VAR x: DevCPL486.Item); - BEGIN - expr(nx, x, wreg - {DI}, {loaded}); DevCPC486.GetAdr(x, {}, wreg - {DI} + {con}); - x.mode := Ind; x.offset := 0; x.scale := 0; - IF nx.typ.form = Comp THEN - HandleIPtrs(nx.typ, x, x, FALSE, TRUE, TRUE) - ELSE (* nx.typ.form = Pointer & nx.typ.sysflag = interface *) - DevCPC486.IPRelease(x, 0, TRUE, TRUE); - END - END IPFree; - - (* unchanged val parameters allways counted because of aliasing problems REMOVED! *) - - PROCEDURE InitializeIPVars (proc: DevCPT.Object); - VAR x: DevCPL486.Item; obj: DevCPT.Object; - BEGIN - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; - obj := proc.link; - WHILE obj # NIL DO - IF (obj.mode = Var) & obj.used THEN (* changed value parameters *) - x.offset := obj.adr; - HandleIPtrs(obj.typ, x, x, TRUE, FALSE, FALSE) - END; - obj := obj.link - END - END InitializeIPVars; - - PROCEDURE ReleaseIPVars (proc: DevCPT.Object); - VAR x, ax, dx, si, di: DevCPL486.Item; obj: DevCPT.Object; - BEGIN - obj := proc.link; - WHILE (obj # NIL) & ((obj.mode # Var) OR ~obj.used OR ~DevCPC486.ContainsIPtrs(obj.typ)) DO - obj := obj.link - END; - IF obj = NIL THEN - obj := proc.scope.scope; - WHILE (obj # NIL) & ~DevCPC486.ContainsIPtrs(obj.typ) DO obj := obj.link END; - IF obj = NIL THEN RETURN END - END; - DevCPL486.MakeReg(ax, AX, Int32); DevCPL486.MakeReg(si, SI, Int32); - DevCPL486.MakeReg(dx, DX, Int32); DevCPL486.MakeReg(di, DI, Int32); - IF ~(proc.typ.form IN {Real32, Real64, NoTyp}) THEN DevCPL486.GenMove(ax, si) END; - IF proc.typ.form = Int64 THEN DevCPL486.GenMove(dx, di) END; - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; - obj := proc.link; - WHILE obj # NIL DO - IF (obj.mode = Var) & obj.used THEN (* value parameters *) - x.offset := obj.adr; - HandleIPtrs(obj.typ, x, x, FALSE, TRUE, FALSE) - END; - obj := obj.link - END; - obj := proc.scope.scope; - WHILE obj # NIL DO (* local variables *) - IF obj.used THEN - x.offset := obj.adr; - HandleIPtrs(obj.typ, x, x, FALSE, TRUE, FALSE); - END; - obj := obj.link - END; - IF ~(proc.typ.form IN {Real32, Real64, NoTyp}) THEN DevCPL486.GenMove(si, ax) END; - IF proc.typ.form = Int64 THEN DevCPL486.GenMove(di, dx) END - END ReleaseIPVars; - - PROCEDURE CompareIntTypes ( - typ: DevCPT.Struct; VAR id: DevCPL486.Item; VAR exit: DevCPL486.Label; VAR num: INTEGER - ); - VAR x, y: DevCPL486.Item; local: DevCPL486.Label; - BEGIN - local := DevCPL486.NewLbl; - typ := typ.BaseTyp; num := 0; - WHILE (typ # NIL) & (typ # DevCPT.undftyp) DO - IF (typ.sysflag = interface) & (typ.ext # NIL) THEN - IF num > 0 THEN DevCPC486.JumpT(x, local) END; - DevCPC486.GuidFromString(typ.ext, y); - x := id; DevCPC486.GetAdr(x, wreg - {SI}, {mem}); - x := y; DevCPC486.GetAdr(x, wreg - {DI}, {}); - x := id; DevCPC486.CmpString(x, y, eql, FALSE); - INC(num) - END; - typ := typ.BaseTyp - END; - IF num > 0 THEN DevCPC486.JumpF(x, exit) END; - IF num > 1 THEN DevCPL486.SetLabel(local) END - END CompareIntTypes; - - PROCEDURE InstallQueryInterface (typ: DevCPT.Struct; proc: DevCPT.Object); - VAR this, id, int, unk, c: DevCPL486.Item; nil, end: DevCPL486.Label; num: INTEGER; - BEGIN - nil := DevCPL486.NewLbl; end := DevCPL486.NewLbl; - this.mode := Ind; this.reg := BP; this.offset := 8; this.scale := 0; this.form := Pointer; this.typ := DevCPT.anyptrtyp; - id.mode := DInd; id.reg := BP; id.offset := 12; id.scale := 0; id.form := Pointer; - int.mode := DInd; int.reg := BP; int.offset := 16; int.scale := 0; int.form := Pointer; - DevCPC486.GetAdr(int, {}, {AX, CX, SI, DI, mem}); int.mode := Ind; int.offset := 0; - DevCPL486.MakeConst(c, 0, Pointer); DevCPC486.Assign(int, c); - unk.mode := Ind; unk.reg := BP; unk.offset := 8; unk.scale := 0; unk.form := Pointer; unk.typ := DevCPT.punktyp; - DevCPC486.Load(unk, {}, {}); - unk.mode := Ind; unk.offset := 8; - DevCPC486.Load(unk, {}, {}); - DevCPL486.GenComp(c, unk); - DevCPL486.GenJump(4, nil, TRUE); - DevCPL486.MakeReg(c, int.reg, Pointer); - DevCPL486.GenPush(c); - c.mode := Ind; c.reg := BP; c.offset := 12; c.scale := 0; c.form := Pointer; - DevCPL486.GenPush(c); - DevCPL486.GenPush(unk); - c.mode := Ind; c.reg := unk.reg; c.offset := 0; c.scale := 0; c.form := Pointer; - DevCPL486.GenMove(c, unk); - unk.mode := Ind; unk.offset := 0; unk.scale := 0; unk.form := Pointer; - DevCPL486.GenCall(unk); - DevCPC486.Free(unk); - DevCPL486.GenJump(-1, end, FALSE); - DevCPL486.SetLabel(nil); - DevCPL486.MakeConst(c, 80004002H, Int32); (* E_NOINTERFACE *) - DevCPC486.Result(proc, c); - CompareIntTypes(typ, id, end, num); - IF num > 0 THEN - DevCPC486.Load(this, {}, {}); - DevCPC486.Assign(int, this); - DevCPC486.IPAddRef(this, 0, FALSE); - DevCPL486.MakeConst(c, 0, Int32); (* S_OK *) - DevCPC486.Result(proc, c); - END; - DevCPL486.SetLabel(end) - END InstallQueryInterface; - - (* -------------------- *) - - PROCEDURE ActualPar (n: DevCPT.Node; fp: DevCPT.Object; rec: BOOLEAN; VAR tag: DevCPL486.Item); - VAR ap: DevCPL486.Item; x: DevCPT.Node; niltest: BOOLEAN; - BEGIN - IF n # NIL THEN - ActualPar(n.link, fp.link, FALSE, ap); - niltest := FALSE; - IF fp.mode = VarPar THEN - IF (n.class = Ndop) & ((n.subcl = thisarrfn) OR (n.subcl = thisrecfn)) THEN - expr(n.right, ap, {}, {}); DevCPC486.Push(ap); (* push type/length *) - expr(n.left, ap, {}, {}); DevCPC486.Push(ap); (* push adr *) - RETURN - ELSIF (fp.vis = outPar) & DevCPC486.ContainsIPtrs(fp.typ) & (ap.typ # DevCPT.niltyp) THEN - IPFree(n, ap) - ELSE - x := n; - WHILE (x.class = Nfield) OR (x.class = Nindex) DO x := x.left END; - niltest := x.class = Nderef; (* explicit nil test needed *) - AdrExpr(n, ap, {}, {}) - END - ELSIF (n.class = Nmop) & (n.subcl = conv) THEN - IF n.typ.form IN {String8, String16} THEN expr(n, ap, {}, {}); DevCPM.err(265) - ELSIF (DevCPT.Includes(n.typ.form, n.left.typ.form) OR DevCPT.Includes(n.typ.form, fp.typ.form)) - & (n.typ.form # Set) & (fp.typ # DevCPT.bytetyp) THEN expr(n.left, ap, {}, {high}); - ELSE expr(n, ap, {}, {high}); - END - ELSE expr(n, ap, {}, {high}); - IF CountedPtr(n) THEN DevCPM.err(270) END - END; - DevCPC486.Param(fp, rec, niltest, ap, tag) - END - END ActualPar; - - PROCEDURE Call (n: DevCPT.Node; VAR x: DevCPL486.Item); - VAR tag: DevCPL486.Item; proc: DevCPT.Object; m: BYTE; - BEGIN - IF n.left.class = Nproc THEN - proc := n.left.obj; m := proc.mode; - ELSE proc := NIL; m := 0 - END; - IF (m = CProc) & (n.right # NIL) THEN - ActualPar(n.right.link, n.obj.link, FALSE, tag); - expr(n.right, tag, wreg - {AX}, {}); (* tag = first param *) - ELSE - IF proc # NIL THEN DevCPC486.PrepCall(proc) END; - ActualPar(n.right, n.obj, (m = TProc) & (n.left.subcl = 0), tag); - END; - IF proc # NIL THEN design(n.left, x, {}, {}) ELSE expr(n.left, x, {}, {}) END; - DevCPC486.Call(x, tag) - END Call; - - PROCEDURE Mem (n: DevCPT.Node; VAR x: DevCPL486.Item; typ: DevCPT.Struct; hint, stop: SET); - VAR offset: INTEGER; - BEGIN - IF (n.class = Ndop) & (n.subcl IN {plus, minus}) & (n.right.class = Nconst) THEN - expr(n.left, x, hint, stop + {mem}); offset := n.right.conval.intval; - IF n.subcl = minus THEN offset := -offset END - ELSE - expr(n, x, hint, stop + {mem}); offset := 0 - END; - DevCPC486.Mem(x, offset, typ) - END Mem; - - PROCEDURE^ CompStat (n: DevCPT.Node); - PROCEDURE^ CompRelease (n: DevCPT.Node; VAR res: DevCPL486.Item); - - PROCEDURE condition (n: DevCPT.Node; VAR x: DevCPL486.Item; VAR false, true: DevCPL486.Label); - VAR local: DevCPL486.Label; y, z: DevCPL486.Item; ux: SET; sx, num: INTEGER; f: BYTE; typ: DevCPT.Struct; - BEGIN - IF n.class = Nmop THEN - CASE n.subcl OF - not: condition(n.left, x, true, false); DevCPC486.Not(x) - | is: IF n.left.typ.form = Pointer THEN expr(n.left, x, {}, {mem}) - ELSE design(n.left, x, {}, {}) - END; - DevCPC486.TypTest(x, n.obj.typ, FALSE, FALSE) - | odd: expr(n.left, x, {}, {}); DevCPC486.Odd(x) - | cc: expr(n.left, x, {}, {}); x.mode := Cond; x.form := Bool - | val: DevCPM.err(220) - END - ELSIF n.class = Ndop THEN - CASE n.subcl OF - and: local := DevCPL486.NewLbl; condition(n.left, y, false, local); - DevCPC486.JumpF(y, false); - IF local # DevCPL486.NewLbl THEN DevCPL486.SetLabel(local) END; - condition(n.right, x, false, true) - | or: local := DevCPL486.NewLbl; condition(n.left, y, local, true); - DevCPC486.JumpT(y, true); - IF local # DevCPL486.NewLbl THEN DevCPL486.SetLabel(local) END; - condition(n.right, x, false, true) - | eql..geq: - f := n.left.typ.form; - IF f = Int64 THEN DevCPM.err(260) - ELSIF f IN {String8, String16, Comp} THEN - IF (n.left.class = Nmop) & (n.left.subcl = conv) THEN (* converted must be source *) - StringOp(n.right, n.left, x, y, FALSE); DevCPC486.CmpString(x, y, n.subcl, TRUE) - ELSE - StringOp(n.left, n.right, x, y, FALSE); DevCPC486.CmpString(x, y, n.subcl, FALSE) - END - ELSIF f IN {Real32, Real64} THEN FloatDOp(n, x) - ELSE - IF CountedPtr(n.left) OR CountedPtr(n.right) THEN DevCPM.err(270) END; - DualExp(n.left, n.right, x, y, {}, {}, {stk}, {stk}); - IF (x.mode = Reg) OR (y.mode = Con) THEN DevCPC486.IntDOp(x, y, n.subcl, FALSE) - ELSIF (y.mode = Reg) OR (x.mode = Con) THEN DevCPC486.IntDOp(y, x, n.subcl, TRUE); x := y - ELSE DevCPC486.Load(x, {}, {}); DevCPC486.IntDOp(x, y, n.subcl, FALSE) - END - END - | in: DualExp(n.left, n.right, x, y, {}, {}, {short, mem, stk}, {con, stk}); - DevCPC486.In(x, y) - | bit: Check(n.left, ux, sx); - expr(n.right, x, {}, ux + {short}); - Mem(n.left, y, DevCPT.notyp, {}, {}); - DevCPC486.Load(x, {}, {short}); - DevCPC486.In(x, y) - | queryfn: - AdrExpr(n.right, x, {}, {CX, SI, DI}); - CompareIntTypes(n.left.typ, x, false, num); - IF num > 0 THEN - Check(n.right.link, ux, sx); IPAssign(n.right.link, n.left, x, y, ux); DevCPC486.Assign(x, y); - x.offset := 1 (* true *) - ELSE x.offset := 0 (* false *) - END; - x.mode := Con; DevCPC486.MakeCond(x) - END - ELSIF n.class = Ncomp THEN - CompStat(n.left); condition(n.right, x, false, true); CompRelease(n.left, x); - IF x.mode = Stk THEN DevCPL486.GenCode(9DH); (* pop flags *) x.mode := Cond END - ELSE expr(n, x, {}, {}); DevCPC486.MakeCond(x) (* const, var, or call *) - END - END condition; - - PROCEDURE expr(n: DevCPT.Node; VAR x: DevCPL486.Item; hint, stop: SET); - VAR y, z: DevCPL486.Item; f, g: BYTE; cval: DevCPT.Const; false, true: DevCPL486.Label; - uy: SET; sy: INTEGER; r: REAL; - BEGIN - f := n.typ.form; - IF (f = Bool) & (n.class IN {Ndop, Nmop}) THEN - false := DevCPL486.NewLbl; true := DevCPL486.NewLbl; - condition(n, y, false, true); - DevCPC486.LoadCond(x, y, false, true, hint, stop + {mem}) - ELSE - CASE n.class OF - Nconst: - IF n.obj = NIL THEN cval := n.conval ELSE cval := n.obj.conval END; - CASE f OF - Byte..Int32, NilTyp, Pointer, Char16: DevCPL486.MakeConst(x, cval.intval, f) - | Int64: - DevCPL486.MakeConst(x, cval.intval, f); - DevCPE.GetLongWords(cval, x.scale, x.offset) - | Set: DevCPL486.MakeConst(x, SYSTEM.VAL(INTEGER, cval.setval), Set) - | String8, String16, Real32, Real64: DevCPL486.AllocConst(x, cval, f) - | Comp: - ASSERT(n.typ = DevCPT.guidtyp); - IF n.conval # NIL THEN DevCPC486.GuidFromString(n.conval.ext, x) - ELSE DevCPC486.GuidFromString(n.obj.typ.ext, x) - END - END - | Nupto: (* n.typ = DevCPT.settyp *) - Check(n.right, uy, sy); - expr(n.left, x, {}, wreg - {CX} + {high, mem, stk}); - DevCPC486.MakeSet(x, TRUE, FALSE, hint + stop + uy, {}); - DevCPC486.Assert(x, {}, uy); - expr(n.right, y, {}, wreg - {CX} + {high, mem, stk}); - DevCPC486.MakeSet(y, TRUE, TRUE, hint + stop, {}); - DevCPC486.Load(x, hint + stop, {}); - IF x.mode = Con THEN DevCPC486.IntDOp(y, x, msk, TRUE); x := y - ELSE DevCPC486.IntDOp(x, y, msk, FALSE) - END - | Nmop: - CASE n.subcl OF - | bit: - expr(n.left, x, {}, wreg - {CX} + {high, mem, stk}); - DevCPC486.MakeSet(x, FALSE, FALSE, hint + stop, {}) - | conv: - IF f IN {String8, String16} THEN - expr(n.left, x, hint, stop); - IF f = String8 THEN x.form := VString16to8 END (* SHORT *) - ELSE - IF n.left.class = Nconst THEN (* largeint -> longreal *) - ASSERT((n.left.typ.form = Int64) & (f = Real64)); - DevCPL486.AllocConst(x, n.left.conval, n.left.typ.form); - ELSE - expr(n.left, x, hint + stop, {high}); - END; - DevCPC486.Convert(x, f, -1, hint + stop, {}) (* ??? *) - END - | val: - expr(n.left, x, hint + stop, {high, con}); DevCPC486.Convert(x, f, n.typ.size, hint, stop) (* ??? *) - | adr: - IF n.left.class = Ntype THEN - x.mode := Con; x.offset := 0; x.obj := n.left.obj; x.form := Int32; x.typ := n.left.typ; - ELSE - AdrExpr(n.left, x, hint + stop, {}); - END; - DevCPC486.GetAdr(x, hint + stop, {}) - | typfn: - IF n.left.class = Ntype THEN - x.mode := Con; x.offset := 0; x.obj := n.left.obj; x.form := Int32; x.typ := n.left.typ; - IF x.obj.typ.untagged THEN DevCPM.err(111) END - ELSE - expr(n.left, x, hint + stop, {}); - DevCPC486.Tag(x, y); DevCPC486.Free(x); x := y - END; - DevCPC486.Load(x, hint + stop, {}) - | minus, abs, cap: - expr(n.left, x, hint + stop, {mem, stk}); - IF f = Int64 THEN DevCPM.err(260) - ELSIF f IN realSet THEN DevCPC486.FloatMOp(x, n.subcl) - ELSE DevCPC486.IntMOp(x, n.subcl) - END - END - | Ndop: - IF (f IN realSet) & (n.subcl # lsh) & (n.subcl # rot) THEN - IF (n.subcl = ash) & (n.right.class = Nconst) & (n.right.conval.realval >= 0) THEN - expr(n.left, x, {}, {mem, stk}); - cval := n.right.conval; sy := SHORT(ENTIER(cval.realval)); cval.realval := 1; - WHILE sy > 0 DO cval.realval := cval.realval * 2; DEC(sy) END; - DevCPL486.AllocConst(y, cval, Real32); - DevCPC486.FloatDOp(x, y, times, FALSE) - ELSE FloatDOp(n, x) - END - ELSIF (f = Int64) OR (n.typ = DevCPT.intrealtyp) THEN DevCPM.err(260); expr(n.left, x, {}, {}) - ELSE - CASE n.subcl OF - times: - IF f = Int8 THEN - DualExp(n.left, n.right, x, y, {}, {}, wreg - {AX} + {high, mem, stk, con}, {AX, con, stk}); - DevCPC486.IntDOp(x, y, times, FALSE) - ELSE IntDOp(n, x, hint + stop) - END - | div, mod: - DualExp(n.left, n.right, x, y, {}, {}, wreg - {AX} + {high, mem, stk, con}, {AX, DX, mem, stk}); - DevCPC486.DivMod(x, y, n.subcl = mod) - | plus: - IF n.typ.form IN {String8, String16} THEN DevCPM.err(265); expr(n.left, x, {}, {}) - ELSE IntDOp(n, x, hint + stop) - END - | slash, minus, msk, min, max: - IntDOp(n, x, hint + stop) - | ash, lsh, rot: - uy := {}; IF n.right.class # Nconst THEN uy := {CX} END; - DualExp(n^.right, n^.left, y, x, {}, hint + stop, wreg - {CX} + {high, mem, stk}, uy + {con, mem, stk}); - DevCPC486.Shift(x, y, n^.subcl) - | len: - IF n.left.typ.form IN {String8, String16} THEN - expr(n.left, x, wreg - {DI} , {}); DevCPC486.GetAdr(x, {}, wreg - {DI} + {con}); - DevCPC486.StrLen(x, n.left.typ, FALSE) - ELSE - design(n.left, x, hint + stop, {}); expr(n.right, y, {}, {}); DevCPC486.Len(x, y) - END - END - END - | Ncall: - Call(n, x) - | Ncomp: - CompStat(n.left); expr(n.right, x, hint, stop); CompRelease(n.left, x); - IF x.mode = Stk THEN DevCPC486.Pop(x, x.form, hint, stop) END - ELSE - design(n, x, hint + stop, stop * {loaded}); DevCPC486.Prepare(x, hint + stop, {}) (* ??? *) - END - END; - x.typ := n.typ; - DevCPC486.Assert(x, hint, stop) - END expr; - - PROCEDURE AddCopy (n: DevCPT.Node; VAR dest, dadr, len: DevCPL486.Item; last: BOOLEAN); - VAR adr, src: DevCPL486.Item; u: SET; s: INTEGER; - BEGIN - Check(n, u, s); - DevCPC486.Assert(dadr, wreg - {DI}, u + {SI, CX}); - IF len.mode # Con THEN DevCPC486.Assert(len, wreg - {CX}, u + {SI, DI}) END; - expr(n, src, wreg - {SI}, {}); - adr := src; DevCPC486.GetAdr(adr, {}, wreg - {SI} + {con}); - IF len.mode # Con THEN DevCPC486.Load(len, {}, wreg - {CX} + {con}) END; - DevCPC486.Load(dadr, {}, wreg - {DI} + {con}); - DevCPC486.AddCopy(dest, src, last) - END AddCopy; - - PROCEDURE StringCopy (left, right: DevCPT.Node); - VAR x, y, ax, ay, len: DevCPL486.Item; - BEGIN - IF IsAllocDynArr(left) THEN expr(left, x, wreg - {CX}, {DI}) (* keep len descriptor *) - ELSE expr(left, x, wreg - {DI}, {}) - END; - ax := x; DevCPC486.GetAdr(ax, {}, wreg - {DI}); - DevCPC486.Free(x); DevCPC486.ArrayLen(x, len, wreg - {CX}, {}); - WHILE right.class = Ndop DO - ASSERT(right.subcl = plus); - AddCopy(right.left, x, ax, len, FALSE); - right := right.right - END; - AddCopy(right, x, ax, len, TRUE); - DevCPC486.Free(len) - END StringCopy; - - PROCEDURE Checkpc; - BEGIN - DevCPE.OutSourceRef(DevCPM.errpos) - END Checkpc; - - PROCEDURE^ stat (n: DevCPT.Node; VAR end: DevCPL486.Label); - - PROCEDURE CondStat (if, last: DevCPT.Node; VAR hint: INTEGER; VAR else, end: DevCPL486.Label); - VAR local: DevCPL486.Label; x: DevCPL486.Item; cond, lcond: DevCPT.Node; - BEGIN - local := DevCPL486.NewLbl; - DevCPM.errpos := if.conval.intval; Checkpc; cond := if.left; - IF (last # NIL) & (cond.class = Ndop) & (cond.subcl >= eql) & (cond.subcl <= geq) - & (last.class = Ndop) & (last.subcl >= eql) & (last.subcl <= geq) - & SameExp(cond.left, last.left) & SameExp(cond.right, last.right) THEN (* reuse comparison *) - DevCPC486.setCC(x, cond.subcl, ODD(hint), hint >= 2) - ELSIF (last # NIL) & (cond.class = Nmop) & (cond.subcl = is) & (last.class = Nmop) & (last.subcl = is) - & SameExp(cond.left, last.left) THEN - DevCPC486.ShortTypTest(x, cond.obj.typ) (* !!! *) - ELSE condition(cond, x, else, local) - END; - hint := x.reg; - DevCPC486.JumpF(x, else); - IF local # DevCPL486.NewLbl THEN DevCPL486.SetLabel(local) END; - stat(if.right, end); - END CondStat; - - PROCEDURE IfStat (n: DevCPT.Node; withtrap: BOOLEAN; VAR end: DevCPL486.Label); - VAR else, local: DevCPL486.Label; if, last: DevCPT.Node; hint: INTEGER; - BEGIN (* n.class = Nifelse *) - if := n.left; last := NIL; - WHILE (if # NIL) & ((if.link # NIL) OR (n.right # NIL) OR withtrap) DO - else := DevCPL486.NewLbl; - CondStat(if, last, hint, else, end); - IF sequential THEN DevCPC486.Jump(end) END; - DevCPL486.SetLabel(else); last := if.left; if := if.link - END; - IF n.right # NIL THEN stat(n.right, end) - ELSIF withtrap THEN DevCPM.errpos := n.conval.intval; Checkpc; DevCPC486.Trap(withTrap); sequential := FALSE - ELSE CondStat(if, last, hint, end, end) - END - END IfStat; - - PROCEDURE CasePart (n: DevCPT.Node; VAR x: DevCPL486.Item; VAR else: DevCPL486.Label; last: BOOLEAN); - VAR this, higher: DevCPL486.Label; m: DevCPT.Node; low, high: INTEGER; - BEGIN - IF n # NIL THEN - this := SHORT(ENTIER(n.conval.realval)); - IF useTree IN n.conval.setval THEN - IF n.left # NIL THEN - IF n.right # NIL THEN - higher := DevCPL486.NewLbl; - DevCPC486.CaseJump(x, n.conval.intval, n.conval.intval2, this, higher, TRUE, FALSE); - CasePart(n.left, x, else, FALSE); - DevCPL486.SetLabel(higher); - CasePart(n.right, x, else, last) - ELSE - DevCPC486.CaseJump(x, n.conval.intval, n.conval.intval2, this, else, FALSE, FALSE); - CasePart(n.left, x, else, last); - END - ELSE - DevCPC486.CaseJump(x, n.conval.intval, n.conval.intval2, this, else, FALSE, TRUE); - IF n.right # NIL THEN CasePart(n.right, x, else, last) - ELSIF ~last THEN DevCPC486.Jump(else) - END - END - ELSE - IF useTable IN n.conval.setval THEN - m := n; WHILE m.left # NIL DO m := m.left END; low := m.conval.intval; - m := n; WHILE m.right # NIL DO m := m.right END; high := m.conval.intval2; - DevCPC486.CaseTableJump(x, low, high, else); - actual := low; last := TRUE - END; - CasePart(n.left, x, else, FALSE); - WHILE actual < n.conval.intval DO - DevCPL486.GenCaseEntry(else, FALSE); INC(actual) - END; - WHILE actual < n.conval.intval2 DO - DevCPL486.GenCaseEntry(this, FALSE); INC(actual) - END; - DevCPL486.GenCaseEntry(this, last & (n.right = NIL)); INC(actual); - CasePart(n.right, x, else, last) - END; - n.conval.realval := this - END - END CasePart; - - PROCEDURE CaseStat (n: DevCPT.Node; VAR end: DevCPL486.Label); - VAR x: DevCPL486.Item; case, lab: DevCPT.Node; low, high, tab: INTEGER; else, this: DevCPL486.Label; - BEGIN - expr(n.left, x, {}, {mem, con, short, float, stk}); else := DevCPL486.NewLbl; - IF (n.right.right # NIL) & (n.right.right.class = Ngoto) THEN (* jump to goto optimization *) - CasePart(n.right.link, x, else, FALSE); DevCPC486.Free(x); - n.right.right.right.conval.intval2 := else; sequential := FALSE - ELSE - CasePart(n.right.link, x, else, TRUE); DevCPC486.Free(x); - DevCPL486.SetLabel(else); - IF n.right.conval.setval # {} THEN stat(n.right.right, end) - ELSE DevCPC486.Trap(caseTrap); sequential := FALSE - END - END; - case := n.right.left; - WHILE case # NIL DO (* case.class = Ncasedo *) - IF sequential THEN DevCPC486.Jump(end) END; - lab := case.left; - IF (case.right # NIL) & (case.right.class = Ngoto) THEN (* jump to goto optimization *) - case.right.right.conval.intval2 := SHORT(ENTIER(lab.conval.realval)); - ASSERT(lab.link = NIL); sequential := FALSE - ELSE - WHILE lab # NIL DO - this := SHORT(ENTIER(lab.conval.realval)); DevCPL486.SetLabel(this); lab := lab.link - END; - stat(case.right, end) - END; - case := case.link - END - END CaseStat; - - PROCEDURE Dim(n: DevCPT.Node; VAR x, nofel: DevCPL486.Item; VAR fact: INTEGER; dimtyp: DevCPT.Struct); - VAR len: DevCPL486.Item; u: SET; s: INTEGER; - BEGIN - Check(n, u, s); - IF (nofel.mode = Reg) & (nofel.reg IN u) THEN DevCPC486.Push(nofel) END; - expr(n, len, {}, {mem, short}); - IF nofel.mode = Stk THEN DevCPC486.Pop(nofel, Int32, {}, {}) END; - IF len.mode = Stk THEN DevCPC486.Pop(len, Int32, {}, {}) END; - DevCPC486.MulDim(len, nofel, fact, dimtyp); - IF n.link # NIL THEN - Dim(n.link, x, nofel, fact, dimtyp.BaseTyp); - ELSE - DevCPC486.New(x, nofel, fact) - END; - DevCPC486.SetDim(x, len, dimtyp) - END Dim; - - PROCEDURE CompStat (n: DevCPT.Node); - VAR x, y, sp, old, len, nofel: DevCPL486.Item; fact: INTEGER; typ: DevCPT.Struct; - BEGIN - Checkpc; - WHILE (n # NIL) & DevCPM.noerr DO - ASSERT(n.class = Nassign); - IF n.subcl = assign THEN - IF n.right.typ.form IN {String8, String16} THEN - StringCopy(n.left, n.right) - ELSE - IF (n.left.typ.sysflag = interface) & ~CountedPtr(n.right) THEN - IPAssign(NIL, n.right, x, y, {}); (* no Release *) - ELSE expr(n.right, y, {}, {}) - END; - expr(n.left, x, {}, {}); - DevCPC486.Assign(x, y) - END - ELSE ASSERT(n.subcl = newfn); - typ := n.left.typ.BaseTyp; - ASSERT(typ.comp = DynArr); - ASSERT(n.right.link = NIL); - expr(n.right, y, {}, wreg - {CX} + {mem, stk}); - DevCPL486.MakeReg(sp, SP, Int32); - DevCPC486.CopyReg(sp, old, {}, {CX}); - DevCPC486.CopyReg(y, len, {}, {CX}); - IF typ.BaseTyp.form = Char16 THEN - DevCPL486.MakeConst(x, 2, Int32); DevCPL486.GenMul(x, y, FALSE) - END; - DevCPC486.StackAlloc; - DevCPC486.Free(y); - expr(n.left, x, {}, {}); DevCPC486.Assign(x, sp); - DevCPC486.Push(len); - DevCPC486.Push(old); - typ.sysflag := stackArray - END; - n := n.link - END - END CompStat; - - PROCEDURE CompRelease (n: DevCPT.Node; VAR res: DevCPL486.Item); - VAR x, y, sp: DevCPL486.Item; - BEGIN - IF n.link # NIL THEN CompRelease(n.link, res) END; - ASSERT(n.class = Nassign); - IF n.subcl = assign THEN - IF (n.left.typ.form = Pointer) & (n.left.typ.sysflag = interface) THEN - IF res.mode = Cond THEN - DevCPL486.GenCode(9CH); (* push flags *) - res.mode := Stk - ELSIF res.mode = Reg THEN - IF res.form < Int16 THEN DevCPC486.Push(res) - ELSE DevCPC486.Assert(res, {}, {AX, CX, DX}) - END - END; - expr(n.left, x, wreg - {DI}, {loaded}); - DevCPC486.IPRelease(x, 0, TRUE, TRUE); - n.left.obj.used := FALSE - END - ELSE ASSERT(n.subcl = newfn); - DevCPL486.MakeReg(sp, SP, Int32); DevCPL486.GenPop(sp); - DevCPL486.MakeConst(y, 0, Pointer); - expr(n.left, x, {}, {}); DevCPC486.Assign(x, y) - END - END CompRelease; - - PROCEDURE Assign(n: DevCPT.Node; ux: SET); - VAR r: DevCPT.Node; f: BYTE; false, true: DevCPL486.Label; x, y, z: DevCPL486.Item; uf, uy: SET; s: INTEGER; - BEGIN - r := n.right; f := r.typ.form; uf := {}; - IF (r.class IN {Nmop, Ndop}) THEN - IF (r.subcl = conv) & (f # Set) & -(* - (DevCPT.Includes(f, r.left.typ.form) OR DevCPT.Includes(f, n.left.typ.form)) THEN r := r.left; - IF ~(f IN realSet) & (r.typ.form IN realSet) & (r.typ # DevCPT.intrealtyp) THEN uf := {AX} END (* entier *) -*) - (DevCPT.Includes(f, r.left.typ.form) OR DevCPT.Includes(f, n.left.typ.form)) & - ((f IN realSet) OR ~(r.left.typ.form IN realSet)) THEN r := r.left - ELSIF (f IN {Char8..Int32, Set, Char16, String8, String16}) & SameExp(n.left, r.left) THEN - IF r.class = Ndop THEN - IF (r.subcl IN {slash, plus, minus, msk}) OR (r.subcl = times) & (f = Set) THEN - expr(r.right, y, {}, ux); expr(n.left, x, {}, {}); - DevCPC486.Load(y, {}, {}); DevCPC486.IntDOp(x, y, r.subcl, FALSE); - RETURN - ELSIF r.subcl IN {ash, lsh, rot} THEN - expr(r.right, y, wreg - {CX} + {high, mem}, ux); expr(n.left, x, {}, {}); - DevCPC486.Load(y, {}, wreg - {CX} + {high}); DevCPC486.Shift(x, y, r.subcl); - RETURN - END - ELSE - IF r.subcl IN {minus, abs, cap} THEN - expr(n.left, x, {}, {}); DevCPC486.IntMOp(x, r.subcl); RETURN - END - END - ELSIF f = Bool THEN - IF (r.subcl = not) & SameExp(n.left, r.left) THEN - expr(n.left, x, {}, {}); DevCPC486.IntMOp(x, not); RETURN - END - END - END; - IF (n.left.typ.sysflag = interface) & (n.left.typ.form = Pointer) THEN IPAssign(n.left, r, x, y, ux) - ELSE expr(r, y, {high}, ux); expr(n.left, x, {}, uf + {loaded}); (* high ??? *) - END; - DevCPC486.Assign(x, y) - END Assign; - - PROCEDURE stat (n: DevCPT.Node; VAR end: DevCPL486.Label); - VAR x, y, nofel: DevCPL486.Item; local, next, loop, prevExit: DevCPL486.Label; fact, sx, sz: INTEGER; ux, uz: SET; - BEGIN - sequential := TRUE; INC(nesting); - WHILE (n # NIL) & DevCPM.noerr DO - IF n.link = NIL THEN next := end ELSE next := DevCPL486.NewLbl END; - DevCPM.errpos := n.conval.intval; DevCPL486.BegStat; - CASE n.class OF - | Ninittd: - (* done at load-time *) - | Nassign: - Checkpc; - Check(n.left, ux, sx); - CASE n.subcl OF - assign: - IF n.left.typ.form = Comp THEN - IF (n.right.class = Ndop) & (n.right.typ.form IN {String8, String16}) THEN - StringCopy(n.left, n.right) - ELSE - StringOp(n.left, n.right, x, y, TRUE); - IF DevCPC486.ContainsIPtrs(n.left.typ) THEN IPStructAssign(n.left.typ) END; - DevCPC486.Copy(x, y, FALSE) - END - ELSE Assign(n, ux) - END - | getfn: - Mem(n.right, y, n.left.typ, {}, ux); - expr(n.left, x, {}, {loaded}); - DevCPC486.Assign(x, y) - | putfn: - expr(n.right, y, {}, ux); - Mem(n.left, x, n.right.typ, {}, {}); - DevCPC486.Assign(x, y) - | incfn, decfn: - expr(n.right, y, {}, ux); expr(n.left, x, {}, {}); - IF n.left.typ.form = Int64 THEN - DevCPC486.LargeInc(x, y, n.subcl = decfn) - ELSE - DevCPC486.Load(y, {}, {}); DevCPC486.IntDOp(x, y, SHORT(SHORT(plus - incfn + n.subcl)), FALSE) - END - | inclfn: - expr(n.right, y, {}, wreg - {CX} + {high, mem, stk}); DevCPC486.MakeSet(y, FALSE, FALSE, ux, {}); - DevCPC486.Assert(y, {}, ux); expr(n.left, x, {}, {}); - DevCPC486.Load(y, {}, {}); DevCPC486.IntDOp(x, y, plus, FALSE) - | exclfn: - expr(n.right, y, {}, wreg - {CX} + {high, mem, stk}); DevCPC486.MakeSet(y, FALSE, TRUE, ux, {}); - DevCPC486.Assert(y, {}, ux); expr(n.left, x, {}, {}); - DevCPC486.Load(y, {}, {}); DevCPC486.IntDOp(x, y, times, FALSE) - | getrfn: - expr(n.right, y, {}, {}); - IF y.offset < 8 THEN - DevCPL486.MakeReg(y, y.offset, n.left.typ.form); (* ??? *) - expr(n.left, x, {}, {loaded}); DevCPC486.Assign(x, y) - ELSE DevCPM.err(220) - END - | putrfn: - expr(n.left, x, {}, {}); - IF x.offset < 8 THEN - DevCPL486.MakeReg(x, x.offset, n.right.typ.form); (* ??? *) - expr(n.right, y, wreg - {x.reg}, {}); DevCPC486.Assign(x, y) - ELSE DevCPM.err(220) - END - | newfn: - y.typ := n.left.typ; - IF n.right # NIL THEN - IF y.typ.BaseTyp.comp = Record THEN - expr(n.right, nofel, {}, {AX, CX, DX, mem, stk}); - DevCPC486.New(y, nofel, 1); - ELSE (*open array*) - nofel.mode := Con; nofel.form := Int32; fact := 1; - Dim(n.right, y, nofel, fact, y.typ.BaseTyp) - END - ELSE - DevCPL486.MakeConst(nofel, 0, Int32); - DevCPC486.New(y, nofel, 1); - END; - DevCPC486.Assert(y, {}, ux); expr(n.left, x, {}, {loaded}); DevCPC486.Assign(x, y) - | sysnewfn: - expr(n.right, y, {}, {mem, short}); DevCPC486.SysNew(y); - DevCPC486.Assert(y, {}, ux); expr(n.left, x, {}, {}); DevCPC486.Assign(x, y) - | copyfn: - StringOp(n.left, n.right, x, y, TRUE); - DevCPC486.Copy(x, y, TRUE) - | movefn: - Check(n.right.link, uz, sz); - expr(n.right, y, {}, wreg - {SI} + {short} + ux + uz); - expr(n.left, x, {}, wreg - {DI} + {short} + uz); - expr(n.right.link, nofel, {}, wreg - {CX} + {mem, stk, short}); - DevCPC486.Load(x, {}, wreg - {DI} + {con}); - DevCPC486.Load(y, {}, wreg - {SI} + {con}); - DevCPC486.SysMove(nofel) - END; - sequential := TRUE - | Ncall: - Checkpc; - Call(n, x); sequential := TRUE - | Nifelse: - IF (n.subcl # assertfn) OR assert THEN IfStat(n, FALSE, next) END - | Ncase: - Checkpc; - CaseStat(n, next) - | Nwhile: - local := DevCPL486.NewLbl; - IF n.right # NIL THEN DevCPC486.Jump(local) END; - loop := DevCPL486.NewLbl; DevCPL486.SetLabel(loop); - stat(n.right, local); DevCPL486.SetLabel(local); - DevCPM.errpos := n.conval.intval; Checkpc; - condition(n.left, x, next, loop); DevCPC486.JumpT(x, loop); sequential := TRUE - | Nrepeat: - loop := DevCPL486.NewLbl; DevCPL486.SetLabel(loop); - local := DevCPL486.NewLbl; stat(n.left, local); DevCPL486.SetLabel(local); - DevCPM.errpos := n.conval.intval; Checkpc; - condition(n.right, x, loop, next); DevCPC486.JumpF(x, loop); sequential := TRUE - | Nloop: - prevExit := Exit; Exit := next; - loop := DevCPL486.NewLbl; DevCPL486.SetLabel(loop); stat(n.left, loop); - IF sequential THEN DevCPC486.Jump(loop) END; - next := Exit; Exit := prevExit; sequential := FALSE - | Nexit: - Checkpc; - DevCPC486.Jump(Exit); sequential := FALSE - | Nreturn: - IF n.left # NIL THEN - Checkpc; - IF (n.obj.typ.sysflag = interface) & (n.obj.typ.form = Pointer) - & (n.left.class # Nconst) & ~CountedPtr(n.left) THEN IPAssign(NIL, n.left, y, x, {}) - ELSE expr(n.left, x, wreg - {AX}, {}) - END; - DevCPC486.Result(n.obj, x) - END; - IF (nesting > 1) OR (n.link # NIL) THEN DevCPC486.Jump(Return) END; - sequential := FALSE - | Nwith: - IfStat(n, n.subcl = 0, next) - | Ntrap: - Checkpc; - DevCPC486.Trap(n.right.conval.intval); sequential := TRUE - | Ncomp: - CompStat(n.left); stat(n.right, next); x.mode := 0; CompRelease(n.left, x) - | Ndrop: - Checkpc; - expr(n.left, x, {}, {}); DevCPC486.Free(x) - | Ngoto: - IF n.left # NIL THEN - Checkpc; - condition(n.left, x, next, n.right.conval.intval2); - DevCPC486.JumpT(x, n.right.conval.intval2) - ELSE - DevCPC486.Jump(n.right.conval.intval2); - sequential := FALSE - END - | Njsr: - DevCPL486.GenJump(-3, n.right.conval.intval2, FALSE) (* call n.right *) - | Nret: - DevCPL486.GenReturn(0); sequential := FALSE (* ret 0 *) - | Nlabel: - DevCPL486.SetLabel(n.conval.intval2) - END; - DevCPC486.CheckReg; DevCPL486.EndStat; n := n.link; - IF n = NIL THEN end := next - ELSIF next # DevCPL486.NewLbl THEN DevCPL486.SetLabel(next) - END - END; - DEC(nesting) - END stat; - - PROCEDURE CheckFpu (n: DevCPT.Node; VAR useFpu: BOOLEAN); - BEGIN - WHILE n # NIL DO - IF n.typ.form IN {Real32, Real64} THEN useFpu := TRUE END; - CASE n.class OF - | Ncase: - CheckFpu(n.left, useFpu); CheckFpu(n.right.left, useFpu); CheckFpu(n.right.right, useFpu) - | Ncasedo: - CheckFpu(n.right, useFpu) - | Ngoto, Ndrop, Nloop, Nreturn, Nmop, Nfield, Nderef, Nguard: - CheckFpu(n.left, useFpu) - | Nassign, Ncall, Nifelse, Nif, Nwhile, Nrepeat, Nwith, Ncomp, Ndop, Nupto, Nindex: - CheckFpu(n.left, useFpu); CheckFpu(n.right, useFpu) - | Njsr, Nret, Nlabel, Ntrap, Nexit, Ninittd, Ntype, Nproc, Nconst, Nvar, Nvarpar: - END; - n := n.link - END - END CheckFpu; - - PROCEDURE procs(n: DevCPT.Node); - VAR proc, obj: DevCPT.Object; i, j: INTEGER; end: DevCPL486.Label; - ch: SHORTCHAR; name: DevCPT.Name; useFpu: BOOLEAN; - BEGIN - INC(DevCPL486.level); nesting := 0; - WHILE (n # NIL) & DevCPM.noerr DO - DevCPC486.imLevel[DevCPL486.level] := DevCPC486.imLevel[DevCPL486.level - 1]; proc := n.obj; - IF imVar IN proc.conval.setval THEN INC(DevCPC486.imLevel[DevCPL486.level]) END; - procs(n.left); - DevCPM.errpos := n.conval.intval; - useFpu := FALSE; CheckFpu(n.right, useFpu); - DevCPC486.Enter(proc, n.right = NIL, useFpu); - InitializeIPVars(proc); - end := DevCPL486.NewLbl; Return := DevCPL486.NewLbl; stat(n.right, end); - DevCPM.errpos := n.conval.intval2; Checkpc; - IF sequential OR (end # DevCPL486.NewLbl) THEN - DevCPL486.SetLabel(end); - IF (proc.typ # DevCPT.notyp) & (proc.sysflag # noframe) THEN DevCPC486.Trap(funcTrap) END - END; - DevCPL486.SetLabel(Return); - ReleaseIPVars(proc); - DevCPC486.Exit(proc, n.right = NIL); - IF proc.mode = TProc THEN - name := proc.link.typ.strobj.name^$; i := 0; - WHILE name[i] # 0X DO INC(i) END; - name[i] := "."; INC(i); j := 0; ch := proc.name[0]; - WHILE (ch # 0X) & (i < LEN(name)-1) DO name[i] := ch; INC(i); INC(j); ch := proc.name[j] END ; - name[i] := 0X; - ELSE name := proc.name^$ - END; - DevCPE.OutRefName(name); DevCPE.OutRefs(proc.scope.right); - n := n.link - END; - DEC(DevCPL486.level) - END procs; - - PROCEDURE Module*(prog: DevCPT.Node); - VAR end: DevCPL486.Label; name: DevCPT.Name; obj, p: DevCPT.Object; n: DevCPT.Node; - aAd, rAd: INTEGER; typ: DevCPT.Struct; useFpu: BOOLEAN; - BEGIN - DevCPH.UseReals(prog, {DevCPH.longDop, DevCPH.longMop}); - DevCPM.NewObj(DevCPT.SelfName); - IF DevCPM.noerr THEN - DevCPE.OutHeader; n := prog.right; - WHILE (n # NIL) & (n.class = Ninittd) DO n := n.link END; - useFpu := FALSE; CheckFpu(n, useFpu); - DevCPC486.Enter(NIL, n = NIL, useFpu); - end := DevCPL486.NewLbl; stat(n, end); DevCPL486.SetLabel(end); - DevCPM.errpos := prog.conval.intval2; Checkpc; - DevCPC486.Exit(NIL, n = NIL); - IF prog.link # NIL THEN (* close section *) - DevCPL486.SetLabel(DevCPE.closeLbl); - useFpu := FALSE; CheckFpu(prog.link, useFpu); - DevCPC486.Enter(NIL, FALSE, useFpu); - end := DevCPL486.NewLbl; stat(prog.link, end); DevCPL486.SetLabel(end); - DevCPM.errpos := SHORT(ENTIER(prog.conval.realval)); Checkpc; - DevCPC486.Exit(NIL, FALSE) - END; - name := "$$"; DevCPE.OutRefName(name); DevCPE.OutRefs(DevCPT.topScope.right); - DevCPM.errpos := prog.conval.intval; - WHILE query # NIL DO - typ := query.typ; query.typ := DevCPT.int32typ; - query.conval.intval := 20; (* parameters *) - query.conval.intval2 := -8; (* saved registers *) - DevCPC486.Enter(query, FALSE, FALSE); - InstallQueryInterface(typ, query); - DevCPC486.Exit(query, FALSE); - name := "QueryInterface"; DevCPE.OutRefName(name); - query := query.nlink - END; - procs(prog.left); - DevCPC486.InstallStackAlloc; - addRef := NIL; release := NIL; release2 := NIL; - DevCPC486.intHandler := NIL; - IF DevCPM.noerr THEN DevCPE.OutCode END; - IF ~DevCPM.noerr THEN DevCPM.DeleteObj END - END - END Module; - -END DevCPV486. diff --git a/new/Dev/Mod/Commanders.odc b/new/Dev/Mod/Commanders.odc new file mode 100644 index 0000000000000000000000000000000000000000..59aaf0a88d28ce053d691a726400e11aac27b894 GIT binary patch literal 13298 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 0C0X) & (ch # "×") & (ch # "÷") & (ch <= 0FFX) OR (ch = "_") THEN - REPEAT - ch := s[i]; INC(i) - UNTIL ~( ("0" <= ch) & (ch <= "9") OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z") - OR (ch >= 0C0X) & (ch # "×") & (ch # "÷") & (ch <= 0FFX) OR (ch = "_") ); - RETURN (ch = 0X) & (i <= LEN(Kernel.Name)) - ELSE - RETURN FALSE - END - END IsIdent; - - PROCEDURE Scan (VAR s: Scanner); - VAR done: BOOLEAN; - BEGIN - s.s.Scan; - IF (s.s.type = TextMappers.view) THEN - IF Properties.ThisType(s.s.view, "DevCommanders.View") # NIL THEN s.s.type := execMark END - ELSIF (s.s.type = TextMappers.string) & TextMappers.IsQualIdent(s.s.string) THEN - s.s.type := qualident; s.qualident := s.s.string$ - ELSIF (s.s.type = TextMappers.string) & IsIdent(s.s.string) THEN - s.ident := s.s.string$; - TextMappers.ScanQualIdent(s.s, s.qualident, done); - IF done THEN s.s.type := qualident ELSE s.s.type := ident END - END - END Scan; - - PROCEDURE GetParExtend (r: TextModels.Reader; VAR end: INTEGER); - VAR v, v1: Views.View; - BEGIN - REPEAT r.ReadView(v); - IF v # NIL THEN - v1 := v; - v := Properties.ThisType(v1, "DevCommanders.View") ; - IF v = NIL THEN v := Properties.ThisType(v1, "DevCommanders.EndView") END - END - UNTIL r.eot OR (v # NIL); - end := r.Pos(); IF ~r.eot THEN DEC(end) END - END GetParExtend; - - PROCEDURE Unload (cmd: Dialog.String); - VAR modname: Kernel.Name; str: Dialog.String; i: INTEGER; ch: CHAR; mod: Kernel.Module; - BEGIN - i := 0; ch := cmd[0]; - WHILE (ch # 0X) & (ch # ".") DO modname[i] := SHORT(ch); INC(i); ch := cmd[i] END; - modname[i] := 0X; - mod := Kernel.ThisLoadedMod(modname); - IF mod # NIL THEN - Kernel.UnloadMod(mod); - IF mod.refcnt < 0 THEN - str := modname$; - Dialog.MapParamString("#Dev:Unloaded", str, "", "", str); - StdLog.String(str); StdLog.Ln; - Controls.Relink - ELSE - str := modname$; - Dialog.ShowParamMsg("#Dev:UnloadingFailed", str, "", "") - END - END - END Unload; - - PROCEDURE Execute (t: TextModels.Model; pos: INTEGER; VAR end: INTEGER; unload: BOOLEAN); - VAR s: Scanner; beg, res: INTEGER; cmd: Dialog.String; - BEGIN - end := t.Length(); - s.s.ConnectTo(t); s.s.SetPos(pos); s.s.SetOpts({TextMappers.returnViews}); - Scan(s); ASSERT(s.s.type = execMark, 100); - Scan(s); - IF s.s.type IN {qualident, TextMappers.string} THEN - beg := s.s.Pos() - 1; GetParExtend(s.s.rider, end); - ASSERT(~cleanerInstalled, 101); - Kernel.PushTrapCleaner(cleaner); cleanerInstalled := TRUE; - NEW(par); par.text := t; par.beg := beg; par.end := end; - IF s.s.type = qualident THEN cmd := s.qualident$ ELSE cmd := s.s.string$ END; - IF unload (* & (s.s.type = qualident)*) THEN Unload(cmd) END; - Dialog.Call(cmd, " ", res); - par := NIL; - Kernel.PopTrapCleaner(cleaner); cleanerInstalled := FALSE; - END - END Execute; - - PROCEDURE Track (v: View; f: Views.Frame; x, y: INTEGER; buttons: SET); - VAR c: Models.Context; w, h, end: INTEGER; isDown, in, in0: BOOLEAN; m: SET; - BEGIN - c := v.context; c.GetSize(w, h); in0 := FALSE; in := TRUE; - REPEAT - IF in # in0 THEN - f.MarkRect(0, 0, w, h, Ports.fill, Ports.invert, Ports.show); in0 := in - END; - f.Input(x, y, m, isDown); - in := (0 <= x) & (x < w) & (0 <= y) & (y < h) - UNTIL ~isDown; - IF in0 THEN - f.MarkRect(0, 0, w, h, Ports.fill, Ports.invert, Ports.hide); - WITH c:TextModels.Context DO - Execute(c.ThisModel(), c.Pos(), end,Controllers.modify IN buttons) - ELSE Dialog.Beep - END - END - END Track; - - (* StdView *) - - PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer); - BEGIN - v.Externalize^(wr); - wr.WriteVersion(maxStdVersion) - END Externalize; - - PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader); - VAR thisVersion: INTEGER; - BEGIN - v.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStdVersion, thisVersion) - END Internalize; - - PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER); - CONST u = point; - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; color: Ports.Color; - size, d, w, asc, dsc, fw: INTEGER; s: ARRAY 2 OF CHAR; - BEGIN - ASSERT(v.context # NIL, 20); - c := v.context; - WITH c: TextModels.Context DO a := c.Attr(); font := a.font; color := a.color - ELSE font := Fonts.dir.Default(); color := Ports.defaultColor - END; - font.GetBounds(asc, dsc, fw); - size := asc + dsc; d := size DIV 2; - f.DrawOval(u, 0, u + size, size, Ports.fill, color); - s := "!"; - w := font.StringWidth(s); - f.DrawString(u + d - w DIV 2, size - dsc, Ports.background, s, font) - END Restore; - - PROCEDURE (v: StdView) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; - VAR focus: Views.View); - BEGIN - WITH msg: Controllers.TrackMsg DO - Track(v, f, msg.x, msg.y, msg.modifiers) - | msg: Controllers.PollCursorMsg DO - msg.cursor := Ports.refCursor - ELSE - END - END HandleCtrlMsg; - - PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message); - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, dsc, fw: INTEGER; - BEGIN - WITH msg: Properties.Preference DO - WITH msg: Properties.SizePref DO - c := v.context; - IF (c # NIL) & (c IS TextModels.Context) THEN - a := c(TextModels.Context).Attr(); font := a.font - ELSE font := Fonts.dir.Default() - END; - font.GetBounds(asc, dsc, fw); - msg.h := asc + dsc; msg.w := msg.h + 2 * point - | msg: Properties.ResizePref DO - msg.fixed := TRUE - | msg: Properties.FocusPref DO - msg.hotFocus := TRUE - | msg: TextSetters.Pref DO - c := v.context; - IF (c # NIL) & (c IS TextModels.Context) THEN - a := c(TextModels.Context).Attr(); font := a.font - ELSE font := Fonts.dir.Default() - END; - font.GetBounds(asc, msg.dsc, fw) - | msg: Properties.TypePref DO - IF Services.Is(v, msg.type) THEN msg.view := v END - ELSE - END - ELSE - END - END HandlePropMsg; - - - (* StdEndView *) - - PROCEDURE (v: StdEndView) Restore (f: Views.Frame; l, t, r, b: INTEGER); - CONST u = point; - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; color: Ports.Color; - size, w, asc, dsc, fw: INTEGER; s: ARRAY 2 OF CHAR; - points: ARRAY 3 OF Ports.Point; - BEGIN - ASSERT(v.context # NIL, 20); - c := v.context; - WITH c: TextModels.Context DO a := c.Attr(); font := a.font; color := a.color - ELSE font := Fonts.dir.Default(); color := Ports.defaultColor - END; - font.GetBounds(asc, dsc, fw); - size := asc + dsc; - points[0].x := 0; points[0].y := size; - points[1].x := u + (size DIV 2); points[1].y := size DIV 2; - points[2].x := u + (size DIV 2); points[2].y := size; - f.DrawPath(points, 3, Ports.fill, color, Ports.closedPoly) - END Restore; - - PROCEDURE (v: StdEndView) HandlePropMsg (VAR msg: Properties.Message); - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, dsc, fw: INTEGER; - BEGIN - WITH msg: Properties.Preference DO - WITH msg: Properties.SizePref DO - c := v.context; - IF (c # NIL) & (c IS TextModels.Context) THEN - a := c(TextModels.Context).Attr(); font := a.font - ELSE font := Fonts.dir.Default() - END; - font.GetBounds(asc, dsc, fw); - msg.h := asc + dsc; msg.w := (msg.h + 2 * point) DIV 2 - | msg: Properties.ResizePref DO - msg.fixed := TRUE - | msg: Properties.FocusPref DO - msg.hotFocus := TRUE - | msg: TextSetters.Pref DO - c := v.context; - IF (c # NIL) & (c IS TextModels.Context) THEN - a := c(TextModels.Context).Attr(); font := a.font - ELSE font := Fonts.dir.Default() - END; - font.GetBounds(asc, msg.dsc, fw) - | msg: Properties.TypePref DO - IF Services.Is(v, msg.type) THEN msg.view := v END - ELSE - END - ELSE - END - END HandlePropMsg; - - (* StdDirectory *) - - PROCEDURE (d: StdDirectory) New (): View; - VAR v: StdView; - BEGIN - NEW(v); RETURN v - END New; - - PROCEDURE (d: StdDirectory) NewEnd (): EndView; - VAR v: StdEndView; - BEGIN - NEW(v); RETURN v - END NewEnd; - - PROCEDURE Deposit*; - BEGIN - Views.Deposit(dir.New()) - END Deposit; - - PROCEDURE DepositEnd*; - BEGIN - Views.Deposit(dir.NewEnd()) - END DepositEnd; - - PROCEDURE SetDir* (d: Directory); - BEGIN - dir := d - END SetDir; - - PROCEDURE Init; - VAR d: StdDirectory; - BEGIN - NEW(d); dir := d; stdDir := d; - NEW(cleaner); cleanerInstalled := FALSE; - END Init; - -BEGIN - Init -END DevCommanders. diff --git a/new/Dev/Mod/Compiler.odc b/new/Dev/Mod/Compiler.odc new file mode 100644 index 0000000000000000000000000000000000000000..1e1bb534914f8a8296e5c5808ae95c8e341e3c5f GIT binary patch literal 13301 zcmd5@+ixV7_Kt<^w(OqS4N(y7?y}vP zc2%pYY|jkIYPHJ)LJ@)|h(H3wBjO=KLV1W#UXb!HM7$6o@w_oF2q7)M-}il|s@mQ5 zT$qQH)UH$K^4-sOIaOX=YsD2@AOCbM?w%ZnQI-aKSHlu&HNy>OtQO7Kg)(oBO=kD+J|!ed!@ z{&NDgQu*PnN~MbS_i>l&aX8{r!_HOh-AnZYzGn?v*Jv<}2U&7im=fOm4r1 zzNwGTXKa!Rw^Et3i1T$3g{45|PrkJG=hGkvT-^;jy%EKpUo)tCc7I3i5Ynra27U*4 z{NsP7%wDbZtZ!(2^SG1J0;wR(v9^EoITOR~$$(fvfV9*OC{`ONdUJaI6~L*Uf4~oy zs;7XnmpvM&;fdbz0pEMhwf_1%8vFL3da?PJ>BTRsv!VQ;vG~2;lY#fXJ5~7`>@N=R zH(mMY)^z2EkAIoZN7h;S_PAp{gSCEV5FggA?>$Ph@OWW2O}Y!q`|(M3z3#3{!>tTD-3Kf2!|QXE>B|k}GeM%( zMFP}Neg!RIF(>$(2FGhwZxzbVUsJ**pT_6^flYdW+&n9FzX%d8;pQ7g-KyTF8n~Bb zy^_RdX_(Zm(;Y6XtlZe_cf%+RDP}KV=ldXNZu(15O%z<$&;Q<1cWM7H z>SQNy@UGMAg*}(Wt`{D}!)&H19OoRIf5{NNhC9inzHrH`kEF>bx~@wWehWifc!;0B z#`)avLzU;^lhH!>41(Y}S)dCP7Ao+k;@Qrr0A7EBAKlH@_yAXRZbFbJ?wxm~MfLou zwfyZBHWVxxmpK@j^z;1tU-(V^I$J+s>o?i@C$_}m-T;x;p3Vli@CW3n@;d+gBgnia zF7r01x%LJ2{RMo)H8D8pQ367A&_DXA8Z|)wuS+k%is|=g$RBUwF@^umFm$Wo;{9);@p{8SYiQh-$=ZIS;SfWI zF@fCS1c2%94v*YY9-9m(_mNf zL^1`jm#in)Q;K9HOP0*?kl7{u=#ae!@k!KMax1OYW^;MFL59>~*24XhLwD9molJ2z z-f?T~RWdbG-PvueHrMX$HXRaXGE`HdCecK5SaN&KcEcep8kr&4cEf=!)lN>v94V9T zhgsc4;aNV?a6>Rbn{5Z%;2jfJn(u9FW4>B)uo3k$Bd1P`0&8R4xM<&PZo7@`)yw-Uh8 z_WF;*VqXSr*dDt`yDfwthZ9WWq%%jfN|n1eEFLoYHDQ4~V}!ZScp9tIYhaJzFH zx|iMTtcs-h0R#&QWd|AgwRu}LS&9N{?c{hE@J~AliC<+e`$u`WuWA+M%>f0=gF)Qw zWMRY8(|pLSR)dcen-MN@a<>9y<5gFqt5HqNC}k=hOlRyt`|n^RHREQFi) zHzSk!R=`KNliIACy(n>^S-e?}sj5LL*y;?`2i0a@2Hd4q6gKIg*C2{+7WQW0YO{p# zLuAFfszDKMpB(!QtVrr^aSkL&=`{viAfuEY2d%QUAZlK*W{9aH;)S#%rj$4D69wkI zN114q62;{0g0jn5X$He?-Mu*`>nASjrP%IV32MzYM^rV#Uh~upBZc>7bZ|8~+R0&q zw0QT5;{ePy^GWG=7{|)72697C$yE)xrGfP!L(@Fd9EGiip&n}h0fnS~b5B-H0FJzC z#0RCw-p~WUusr%>F%emv^pWc1!}F!#Y8vPu<0Vk zgJFz)js0DWYJ^smAs15^0#_NzIr7AoshL3RTrQsyoe-l41k$pMzynvI@h>&3`YG#o zE%uRFLgA#~yB{JZZ)~@l?=^RkG3BxPil98%R!XLF$u?Y-1Q8};o0|&I^tHV68cb!e zF@ja-H}@)OfV?+?YiP&jny`ytl3}(Jr!_DkIxqzg@cVZ+P}O)%y*y&5qDQ!Elk3Z7 zgmZ4KmD>RXN-$+}G*k7)Rzfy1?TRho*%j8V&t3-)7X)A%rWnYl(yCPNMw;b;^!C~e z5JNN(tikPM+)T>z+zzIs| z%=}-Gx%kj9MsDlDY{_qyWI7r_R|jDyIvFaFM$!nCTKvq@X1H~b@`@d3dJc()11mv_ zRJQP~CfaI7WpbU=dpKq4o}_%NdA>3vTOcfVcx!PDx+{qUajfPmCVf|@E>iVP346cfmMqDq3+q2S%-}!!$1++O(Xs>~nm94wo0O0=^79 z#`3AnGF~LOHXs4Qf>6Q5S4O$8GW;?$Iy@PZ7S2~9d(A?c6kQa%6xF4L8uSb5-W^}S z{7aBroclZDbH#_T&Y!s8mGK2uY*9<*S*xJ6*5`Wbc)|NqrJ&CCXK#15hA0vy_%?2E z?9dFiNzQFFk!am(PpIj=4`1HfYworMlsdFJPP7rQte^4Ry@P!^=Mbg&@RlRmB3NMl zO>qofGjxQQalsd2=_GH6oh!oE4SR(%6o}+o{qd+jq~^wb8)r`x-*VKu7Y*W0@0nr* zQKyM=𝔤|cROj$M6GnH)D7MXvtq=P z2v;{DbGyV_y{P2v%Iqztu}I%utOeup8)BWWGc;FX3T`;4jK>5{%#kq=-R zBT1l`0BW2lEbPEVa3)Jm-pK@XEIgV9ChgedsbY+`VAz`zBOSxHooHwMY=EN|e6W)| z@=p2A?Fl}4v{Yr~%EJ_rMGIVC#&##dylPFe4&EBPMQKP7oOm7qhk~td9~@j_3!0LYt>JPmo?s3iDlC(duX)tC`eiF2e>4}?Jixs8 zK?BtWbKm^@k}=F85M9~HKDGyBsHTUAhd_&{gYARRL%Y+cCQi~SXz^c|aKVpOtEWV% znN@2bUxC#w!l8yw#}-!K-)P_Erl$%O0RNI1L3|o8jR0lgpeE)*9bt!+4*?{cU#ws0 z0Mr30H$JMvU+3E44iZD~dVezTRlF69Gp1!kz#t7tT@5?8w#&)Zx8_R(xgBRuP4)%* zom2`xs~=MDVAeLeDa!@37{W7@%%U_Hz%vxhe#ujn&1Mv(f;}&sM|BGt%C4-OACf$M zi~Tg^^Ek#*9h^H7HK-A!Pb{K6;{}~pmC@s~pIAtbFS)vu9-lwrpM6}io%DQh&s!Yg zG~+PciT6ye$muX+tYM&8ir;#QxT^Ln9^40)C4?gHzoDNzu6pRt0^W!15qMR}A+BaY zHcKR`{BO2j=)R1qb9PgUgADKfM#WeR|J_+!dhx{}WH$#B(uN3J#S~flLFc z^yZyFUuH~~OvsUOx>-Iw@j!S7EZi>o`Lc`8c$O*t68<+WpHY@yFUZ+BAb})x`Y;3w zUQD&dlKoPow|vbjw#$?EJn{9`Cn;{}aH)*PVqIZt79J5gYNw?zTjwdT#@Z{6FUn`R zo#>I_965?*;yp1VNA$$E033eWqRbaJMg3JAyZR%E=cu>Js?oAb`G(lWR6)U`cXG`o zHo|ZULM7QjP{-Fba2g6WKV33o63=0W)06`bqC|If*A-D-2+d_n^NC4OO_`;S9~c#a zo~Q?AGPwrq+n4y*KIg)RX{d%hT~`TSJ__IgNU?T^wQAdmF{g`d5)>>ZcC}qsx%gYC<~;smte7LEJq+`o|PfjQD`>O1S7i zHDLO%Cq14#&@Vf*{(u!ZWoyQ$<_Jx{vSU4_vrkLw{+ouBK#+~9dy5tPjKDe>o@*i{&cGHCcfCl zx2^g2x#M5f%J;W9Mav1^WL5tCJ6z+xuJ?m4{Wm^y#;^WYU$4CMTa9 DTC *) - - PROCEDURE Module (source: TextModels.Reader; opt: SET; log: TextModels.Model; VAR error: BOOLEAN); - VAR ext, new: BOOLEAN; p: DevCPT.Node; - BEGIN - DevCPM.Init(source, log); - IF found THEN INCL(DevCPM.options, DevCPM.comAware) END; - IF errorTrap IN opt THEN INCL(DevCPM.options, DevCPM.trap) END; - IF oberon IN opt THEN INCL(DevCPM.options, DevCPM.oberon) END; - DevCPT.Init(opt); - DevCPB.typSize := DevCPV.TypeSize; - DevCPT.processor := DevCPV.processor; - DevCPP.Module(p); - IF DevCPM.noerr THEN - IF DevCPT.libName # "" THEN EXCL(opt, obj) END; -(* - IF errorTrap IN opt THEN DevCPDump.DumpTree(p) END; -*) - DevCPV.Init(opt); DevCPV.Allocate; DevCPT.Export(ext, new); - IF DevCPM.noerr & (obj IN opt) THEN - DevCPV.Module(p) - END; - DevCPV.Close - END; - IF DevCPM.noerr & (new OR ext) THEN DevCPM.RegisterNewSym - ELSE DevCPM.DeleteNewSym - END; - DevCPT.Close; - error := ~DevCPM.noerr; - DevCPM.Close; - p := NIL; - Kernel.FastCollect; - IF error THEN - DevCPM.InsertMarks(source.Base()); - DevCPM.LogWLn; DevCPM.LogWStr(" "); - IF DevCPM.errors = 1 THEN - Dialog.MapString("#Dev:OneErrorDetected", str) - ELSE - DevCPM.LogWNum(DevCPM.errors, 0); Dialog.MapString("#Dev:ErrorsDetected", str) - END; - StdLog.String(str) - ELSE - IF hint IN opt THEN DevCPM.InsertMarks(source.Base()) END; - DevCPM.LogWStr(" "); DevCPM.LogWNum(DevCPE.pc, 8); - DevCPM.LogWStr(" "); DevCPM.LogWNum(DevCPE.dsize, 8) - END; - DevCPM.LogWLn - END Module; - - PROCEDURE Scan (VAR s: TextMappers.Scanner); - BEGIN - s.Scan; - IF s.type = TextMappers.string THEN - IF s.string = "MODULE" THEN s.type := module END - ELSIF s.type = TextMappers.char THEN - IF s.char = "(" THEN - IF s.rider.char = "*" THEN - s.rider.Read; - REPEAT Scan(s) UNTIL (s.type = TextMappers.eot) OR (s.type = comEnd); - Scan(s) - END - ELSIF s.char = "*" THEN - IF s.rider.char = ")" THEN s.rider.Read; s.type := comEnd END - END - END - END Scan; - - PROCEDURE Do (source, log: TextModels.Model; beg: INTEGER; opt: SET; VAR error: BOOLEAN); - VAR s: TextMappers.Scanner; - BEGIN - Dialog.MapString("#Dev:Compiling", str); - StdLog.String(str); StdLog.Char(" "); - s.ConnectTo(source); s.SetPos(beg); - Scan(s); - WHILE (s.type # TextMappers.eot) & (s.type # module) DO Scan(s) END; - IF s.type = module THEN - Scan(s); - IF s.type = TextMappers.string THEN - StdLog.Char('"'); StdLog.String(s.string); StdLog.Char('"') - END - END; - sourceR := source.NewReader(NIL); sourceR.SetPos(beg); - Module(sourceR, opt, log, error) - END Do; - - - PROCEDURE Open; - BEGIN - Dialog.ShowStatus("#Dev:Compiling"); - StdLog.buf.Delete(0, StdLog.buf.Length()) - END Open; - - PROCEDURE Close; - BEGIN - StdLog.text.Append(StdLog.buf); - IF DevCPM.noerr THEN Dialog.ShowStatus("#Dev:Ok") - END; - sourceR := NIL; - Kernel.Cleanup - END Close; - - PROCEDURE Compile*; - VAR t: TextModels.Model; error: BOOLEAN; - BEGIN - Open; - t := TextViews.FocusText(); - IF t # NIL THEN - Do(t, StdLog.text, 0, defopt, error); - IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) END - ELSE Dialog.ShowMsg("#Dev:NoTextViewFound") - END; - Close - END Compile; - - PROCEDURE CompileOpt* (opt: ARRAY OF CHAR); - VAR t: TextModels.Model; error: BOOLEAN; i: INTEGER; opts: SET; - BEGIN - i := 0; opts := defopt; - WHILE opt[i] # 0X DO - IF opt[i] = "-" THEN - IF srcpos IN opts THEN EXCL(opts, srcpos) - ELSIF allref IN opts THEN EXCL(opts, allref) - ELSIF ref IN opts THEN EXCL(opts, ref) - ELSE EXCL(opts, obj) - END - ELSIF opt[i] = "!" THEN - IF assert IN opts THEN EXCL(opts, assert) - ELSE EXCL(opts, checks) - END - ELSIF opt[i] = "+" THEN INCL(opts, allchecks) - ELSIF opt[i] = "?" THEN INCL(opts, hint) - ELSIF opt[i] = "@" THEN INCL(opts, errorTrap) - ELSIF opt[i] = "$" THEN INCL(opts, oberon) - END; - INC(i) - END; - Open; - t := TextViews.FocusText(); - IF t # NIL THEN - Do(t, StdLog.text, 0, opts, error); - IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) END - ELSE Dialog.ShowMsg("#Dev:NoTextViewFound") - END; - Close - END CompileOpt; - - PROCEDURE CompileText* (text: TextModels.Model; beg: INTEGER; OUT error: BOOLEAN); - BEGIN - ASSERT(text # NIL, 20); ASSERT((beg >= 0) & (beg < text.Length()), 21); - Open; - Do(text, StdLog.text, beg, defopt, error); - IF error THEN DevMarkers.ShowFirstError(text, TextViews.focusOnly) END; - Close - END CompileText; - - PROCEDURE CompileAndUnload*; - VAR t: TextModels.Model; error: BOOLEAN; mod: Kernel.Module; n: ARRAY 256 OF CHAR; - BEGIN - Open; - t := TextViews.FocusText(); - IF t # NIL THEN - Do(t, StdLog.text, 0, defopt, error); - IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) - ELSE - mod := Kernel.ThisLoadedMod(DevCPT.SelfName); - IF mod # NIL THEN - Kernel.UnloadMod(mod); - n := DevCPT.SelfName$; - IF mod.refcnt < 0 THEN - Dialog.MapParamString("#Dev:Unloaded", n, "", "", str); - StdLog.String(str); StdLog.Ln; - Controls.Relink - ELSE - Dialog.MapParamString("#Dev:UnloadingFailed", n, "", "", str); - StdLog.String(str); StdLog.Ln - END - END - END - ELSE Dialog.ShowMsg("#Dev:NoTextViewFound") - END; - Close - END CompileAndUnload; - - PROCEDURE CompileSelection*; - VAR c: TextControllers.Controller; t: TextModels.Model; beg, end: INTEGER; error: BOOLEAN; - BEGIN - Open; - c := TextControllers.Focus(); - IF c # NIL THEN - t := c.text; - IF c.HasSelection() THEN - c.GetSelection(beg, end); Do(t, StdLog.text, beg, defopt, error); - IF error THEN DevMarkers.ShowFirstError(t, TextViews.focusOnly) END - ELSE Dialog.ShowMsg("#Dev:NoSelectionFound") - END - ELSE Dialog.ShowMsg("#Dev:NoTextViewFound") - END; - Close - END CompileSelection; - - PROCEDURE CompileList (beg, end: INTEGER; c: TextControllers.Controller); - VAR v: Views.View; i: INTEGER; error, one: BOOLEAN; name: Files.Name; loc: Files.Locator; - t: TextModels.Model; opts: SET; title, entry: ARRAY 64 OF CHAR; - BEGIN - s.SetPos(beg); s.Scan; one := FALSE; - WHILE (s.start < end) & (s.type = TextMappers.string) & (s.len < LEN(name)) DO - s.Scan; one := TRUE; - WHILE (s.start < end) & (s.type = TextMappers.char) & - ((s.char = "-") OR (s.char = "+") OR - (s.char = "!") OR (s.char = "*") OR (s.char = "?") OR (s.char = "^") OR (s.char = "(")) - DO - IF s.char = "(" THEN - WHILE (s.start < end) & ((s.type # TextMappers.char) OR (s.char # ")")) DO s.Scan END - END; - s.Scan - END - END; - IF one & (s.start >= end) THEN - s.SetPos(beg); s.Scan; error := FALSE; - WHILE (s.start < end) & (s.type = TextMappers.string) & ~error DO - i := 0; WHILE i < LEN(name) DO name[i] := 0X; INC(i) END; - StdDialog.GetSubLoc(s.string, "Mod", loc, name); - t := NIL; - IF loc # NIL THEN - v := Views.OldView(loc, name); - IF v # NIL THEN - WITH v: TextViews.View DO t := v.ThisModel() - ELSE Dialog.ShowParamMsg("#Dev:NoTextFileFound", name, "", ""); error := TRUE - END - ELSE Dialog.ShowParamMsg("#Dev:CannotOpenFile", name, "", ""); error := TRUE - END - ELSE Dialog.ShowParamMsg("#System:FileNotFound", name, "", ""); error := TRUE - END; - s.Scan; opts := defopt; - WHILE (s.start < end) & (s.type = TextMappers.char) DO - IF s.char = "-" THEN - IF srcpos IN opts THEN EXCL(opts, srcpos) - ELSIF allref IN opts THEN EXCL(opts, allref) - ELSIF ref IN opts THEN EXCL(opts, ref) - ELSE EXCL(opts, obj) - END - ELSIF s.char = "!" THEN - IF assert IN opts THEN EXCL(opts, assert) - ELSE EXCL(opts, checks) - END - ELSIF s.char = "+" THEN INCL(opts, allchecks) - ELSIF s.char = "?" THEN INCL(opts, hint) - ELSIF s.char = "@" THEN INCL(opts, errorTrap) - ELSIF s.char = "$" THEN INCL(opts, oberon) - ELSIF s.char = "(" THEN - s.Scan; - WHILE (s.start < end) & (s.type = TextMappers.string) DO - title := s.string$; s.Scan; - IF (s.start < end) & (s.type = TextMappers.char) & (s.char = ":") THEN - s.Scan; - IF (s.start < end) & (s.type = TextMappers.string) THEN - entry := s.string$; s.Scan; - IF t # NIL THEN DevSelectors.ChangeTo(t, title, entry) END - END - END; - IF (s.start < end) & (s.type = TextMappers.char) & (s.char = ",") THEN s.Scan END - END - END; - s.Scan - END; - IF t # NIL THEN - Do(t, StdLog.text, 0, opts, error) - END - END - ELSE Dialog.ShowMsg("#Dev:NotOnlyFileNames") - END; - s.ConnectTo(NIL); - IF error & (c # NIL) & c.HasSelection() & (s.start < end) THEN - c.SetSelection(s.start, end) - END; - IF error & (v # NIL) THEN - Views.Open(v, loc, name, NIL); - DevMarkers.ShowFirstError(t, TextViews.any) - END - END CompileList; - - PROCEDURE CompileModuleList*; - VAR c: TextControllers.Controller; beg, end: INTEGER; - BEGIN - Open; - c := TextControllers.Focus(); - IF c # NIL THEN - s.ConnectTo(c.text); - IF c.HasSelection() THEN c.GetSelection(beg, end) - ELSE beg := 0; end := c.text.Length() - END; - CompileList(beg, end, c) - ELSE Dialog.ShowMsg("#Dev:NoTextViewFound") - END; - Close - END CompileModuleList; - - PROCEDURE CompileThis*; - VAR p: DevCommanders.Par; beg, end: INTEGER; - BEGIN - Open; - p := DevCommanders.par; - IF p # NIL THEN - DevCommanders.par := NIL; - s.ConnectTo(p.text); beg := p.beg; end := p.end; - CompileList(beg, end, NIL) - ELSE Dialog.ShowMsg("#Dev:NoTextViewFound") - END; - Close - END CompileThis; - - PROCEDURE Init; - VAR loc: Files.Locator; f: Files.File; - BEGIN - loc := Files.dir.This("Dev"); loc := loc.This("Code"); - f := Files.dir.Old(loc, "ComDebug.ocf", TRUE); - found := f # NIL; - IF f # NIL THEN f.Close END - END Init; - -BEGIN - Init -END DevCompiler. diff --git a/new/Dev/Mod/Markers.odc b/new/Dev/Mod/Markers.odc new file mode 100644 index 0000000000000000000000000000000000000000..f3efde2ad69fcbc30530cc63ddeccc19e9ff5805 GIT binary patch literal 14881 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 U`{Nf%|M8>K(vQFW7p0~D2hKfuYybcN literal 0 HcmV?d00001 diff --git a/new/Dev/Mod/Markers.txt b/new/Dev/Mod/Markers.txt deleted file mode 100644 index b402b5b..0000000 --- a/new/Dev/Mod/Markers.txt +++ /dev/null @@ -1,442 +0,0 @@ -MODULE DevMarkers; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Dev/Mod/Markers.odc *) - (* DO NOT EDIT *) - - IMPORT - Kernel, Files, Stores, Fonts, Ports, Models, Views, Controllers, Properties, Dialog, - TextModels, TextSetters, TextViews, TextControllers, TextMappers; - - CONST - (** View.mode **) - undefined* = 0; mark* = 1; message* = 2; - firstMode = 1; lastMode = 2; - - (** View.err **) - noCode* = 9999; - - errFile = "Errors"; point = Ports.point; - - TYPE - View* = POINTER TO ABSTRACT RECORD (Views.View) - mode-: INTEGER; - err-: INTEGER; - msg-: POINTER TO ARRAY OF CHAR; - era: INTEGER - END; - - Directory* = POINTER TO ABSTRACT RECORD END; - - - StdView = POINTER TO RECORD (View) END; - - StdDirectory = POINTER TO RECORD (Directory) END; - - SetModeOp = POINTER TO RECORD (Stores.Operation) - view: View; - mode: INTEGER - END; - - - VAR - dir-, stdDir-: Directory; - - globR: TextModels.Reader; globW: TextModels.Writer; (* recycling done in Load, Insert *) - - thisEra: INTEGER; - - - (** View **) - - PROCEDURE (v: View) CopyFromSimpleView- (source: Views.View), EXTENSIBLE; - BEGIN - (* v.CopyFrom^(source); *) - WITH source: View DO - v.err := source.err; v.mode := source.mode; - IF source.msg # NIL THEN - NEW(v.msg, LEN(source.msg^)); v.msg^ := source.msg^$ - END - END - END CopyFromSimpleView; - -(* - PROCEDURE (v: View) InitContext* (context: Models.Context), EXTENSIBLE; - BEGIN - ASSERT(v.mode # undefined, 20); - v.InitContext^(context) - END InitContext; -*) - - PROCEDURE (v: View) InitErr* (err: INTEGER), NEW, EXTENSIBLE; - BEGIN - ASSERT(v.msg = NIL, 20); - IF v.err # err THEN v.err := err; v.mode := mark END; - IF v.mode = undefined THEN v.mode := mark END - END InitErr; - - PROCEDURE (v: View) InitMsg* (msg: ARRAY OF CHAR), NEW, EXTENSIBLE; - VAR i: INTEGER; str: ARRAY 1024 OF CHAR; - BEGIN - ASSERT(v.msg = NIL, 20); - Dialog.MapString(msg, str); - i := 0; WHILE str[i] # 0X DO INC(i) END; - NEW(v.msg, i + 1); v.msg^ := str$; - v.mode := mark - END InitMsg; - - PROCEDURE (v: View) SetMode* (mode: INTEGER), NEW, EXTENSIBLE; - VAR op: SetModeOp; - BEGIN - ASSERT((firstMode <= mode) & (mode <= lastMode), 20); - IF v.mode # mode THEN - NEW(op); op.view := v; op.mode := mode; - Views.Do(v, "#System:ViewSetting", op) - END - END SetMode; - - - (** Directory **) - - PROCEDURE (d: Directory) New* (type: INTEGER): View, NEW, ABSTRACT; - PROCEDURE (d: Directory) NewMsg* (msg: ARRAY OF CHAR): View, NEW, ABSTRACT; - - - (* SetModeOp *) - - PROCEDURE (op: SetModeOp) Do; - VAR v: View; mode: INTEGER; - BEGIN - v := op.view; - mode := v.mode; v.mode := op.mode; op.mode := mode; - Views.Update(v, Views.keepFrames); - IF v.context # NIL THEN v.context.SetSize(Views.undefined, Views.undefined) END - END Do; - - PROCEDURE ToggleMode (v: View); - VAR mode: INTEGER; - BEGIN - IF ABS(v.err) # noCode THEN - IF v.mode < lastMode THEN mode := v.mode + 1 ELSE mode := firstMode END - ELSE - IF v.mode < message THEN mode := v.mode + 1 ELSE mode := firstMode END - END; - v.SetMode(mode) - END ToggleMode; - - - (* primitives for StdView *) - - PROCEDURE NumToStr (x: INTEGER; VAR s: ARRAY OF CHAR; VAR i: INTEGER); - VAR j: INTEGER; m: ARRAY 32 OF CHAR; - BEGIN - ASSERT(x >= 0, 20); - j := 0; REPEAT m[j] := CHR(x MOD 10 + ORD("0")); x := x DIV 10; INC(j) UNTIL x = 0; - i := 0; REPEAT DEC(j); s[i] := m[j]; INC(i) UNTIL j = 0; - s[i] := 0X - END NumToStr; - - PROCEDURE Load (v: StdView); - VAR view: Views.View; t: TextModels.Model; s: TextMappers.Scanner; - err: INTEGER; i: INTEGER; ch: CHAR; loc: Files.Locator; - msg: ARRAY 1024 OF CHAR; - BEGIN - err := ABS(v.err); NumToStr(err, msg, i); - loc := Files.dir.This("Dev"); IF loc = NIL THEN RETURN END; - loc := loc.This("Rsrc"); IF loc = NIL THEN RETURN END; - view := Views.OldView(loc, errFile); - IF (view # NIL) & (view IS TextViews.View) THEN - t := view(TextViews.View).ThisModel(); - IF t # NIL THEN - s.ConnectTo(t); - REPEAT - s.Scan - UNTIL ((s.type = TextMappers.int) & (s.int = err)) OR (s.type = TextMappers.eot); - IF s.type = TextMappers.int THEN - s.Skip(ch); i := 0; - WHILE (ch >= " ") & (i < LEN(msg) - 1) DO - msg[i] := ch; INC(i); s.rider.ReadChar(ch) - END; - msg[i] := 0X - END - END - END; - NEW(v.msg, i + 1); v.msg^ := msg$ - END Load; - - PROCEDURE DrawMsg (v: StdView; f: Views.Frame; font: Fonts.Font; color: Ports.Color); - VAR w, h, asc, dsc: INTEGER; - BEGIN - CASE v.mode OF - mark: - v.context.GetSize(w, h); - f.DrawLine(point, 0, w - 2 * point, h, 0, color); - f.DrawLine(w - 2 * point, 0, point, h, 0, color) - | message: - font.GetBounds(asc, dsc, w); - f.DrawString(2 * point, asc, color, v.msg^, font) - END - END DrawMsg; - - PROCEDURE ShowMsg (v: StdView); - BEGIN - IF v.msg = NIL THEN Load(v) END; - Dialog.ShowStatus(v.msg^) - END ShowMsg; - - PROCEDURE Track (v: StdView; f: Views.Frame; x, y: INTEGER; buttons: SET); - VAR c: Models.Context; t: TextModels.Model; u, w, h: INTEGER; isDown, in, in0: BOOLEAN; m: SET; - BEGIN - v.context.GetSize(w, h); u := f.dot; in0 := FALSE; - in := (0 <= x) & (x < w) & (0 <= y) & (y < h); - REPEAT - IF in # in0 THEN - f.MarkRect(u, 0, w - u, h, Ports.fill, Ports.invert, Ports.show); in0 := in - END; - f.Input(x, y, m, isDown); - in := (0 <= x) & (x < w) & (0 <= y) & (y < h) - UNTIL ~isDown; - IF in0 THEN - f.MarkRect(u, 0, w - u, h, Ports.fill, Ports.invert, Ports.hide); - IF Dialog.showsStatus & ~(Controllers.modify IN buttons) & ~(Controllers.doubleClick IN buttons) THEN - ShowMsg(v) - ELSE - ToggleMode(v) - END; - c := v.context; - WITH c: TextModels.Context DO - t := c.ThisModel(); - TextControllers.SetCaret(t, c.Pos() + 1) - ELSE - END - END - END Track; - - PROCEDURE SizePref (v: StdView; VAR p: Properties.SizePref); - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, dsc, w: INTEGER; - BEGIN - c := v.context; - IF (c # NIL) & (c IS TextModels.Context) THEN a := c(TextModels.Context).Attr(); font := a.font - ELSE font := Fonts.dir.Default() - END; - font.GetBounds(asc, dsc, w); - p.h := asc + dsc; - CASE v.mode OF - mark: - p.w := p.h + 2 * point - | message: - IF v.msg = NIL THEN Load(v) END; - p.w := font.StringWidth(v.msg^) + 4 * point - END - END SizePref; - - - (* StdView *) - - PROCEDURE (v: StdView) ExternalizeAs (VAR s1: Stores.Store); - BEGIN - s1 := NIL - END ExternalizeAs; - - PROCEDURE (v: StdView) SetMode(mode: INTEGER); - BEGIN v.SetMode^(mode); ShowMsg(v) - END SetMode; - - PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER); - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; color: Ports.Color; - w, h: INTEGER; - BEGIN - c := v.context; c.GetSize(w, h); - WITH c: TextModels.Context DO a := c.Attr(); font := a.font ELSE font := Fonts.dir.Default() END; - IF TRUE (*f.colors >= 4*) THEN color := Ports.grey50 ELSE color := Ports.defaultColor END; - IF v.err >= 0 THEN - f.DrawRect(point, 0, w - point, h, Ports.fill, color); - DrawMsg(v, f, font, Ports.background) - ELSE - f.DrawRect(point, 0, w - point, h, 0, color); - DrawMsg(v, f, font, Ports.defaultColor) - END - END Restore; - - PROCEDURE (v: StdView) GetBackground (VAR color: Ports.Color); - BEGIN - color := Ports.background - END GetBackground; - - PROCEDURE (v: StdView) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; - VAR focus: Views.View); - BEGIN - WITH msg: Controllers.TrackMsg DO - Track(v, f, msg.x, msg.y, msg.modifiers) - ELSE - END - END HandleCtrlMsg; - - PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message); - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, w: INTEGER; - BEGIN - WITH msg: Properties.Preference DO - WITH msg: Properties.SizePref DO - SizePref(v, msg) - | msg: Properties.ResizePref DO - msg.fixed := TRUE - | msg: Properties.FocusPref DO - msg.hotFocus := TRUE -(* - | msg: Properties.StorePref DO - msg.view := NIL -*) - | msg: TextSetters.Pref DO - c := v.context; - IF (c # NIL) & (c IS TextModels.Context) THEN - a := c(TextModels.Context).Attr(); font := a.font - ELSE - font := Fonts.dir.Default() - END; - font.GetBounds(asc, msg.dsc, w) - ELSE - END - ELSE - END - END HandlePropMsg; - - - (* StdDirectory *) - - PROCEDURE (d: StdDirectory) New (err: INTEGER): View; - VAR v: StdView; - BEGIN - NEW(v); v.InitErr(err); RETURN v - END New; - - PROCEDURE (d: StdDirectory) NewMsg (msg: ARRAY OF CHAR): View; - VAR v: StdView; - BEGIN - NEW(v); v.InitErr(noCode); v.InitMsg(msg); RETURN v - END NewMsg; - - - (** Cleaner **) - - PROCEDURE Cleanup; - BEGIN - globR := NIL; globW := NIL - END Cleanup; - - - (** miscellaneous **) - - PROCEDURE Insert* (text: TextModels.Model; pos: INTEGER; v: View); - VAR w: TextModels.Writer; r: TextModels.Reader; - BEGIN - ASSERT(v.era = 0, 20); - Models.BeginModification(Models.clean, text); - v.era := thisEra; - IF pos > text.Length() THEN pos := text.Length() END; - globW := text.NewWriter(globW); w := globW; w.SetPos(pos); - IF pos > 0 THEN DEC(pos) END; - globR := text.NewReader(globR); r := globR; r.SetPos(pos); r.Read; - IF r.attr # NIL THEN w.SetAttr(r.attr) END; - w.WriteView(v, Views.undefined, Views.undefined); - Models.EndModification(Models.clean, text); - END Insert; - - PROCEDURE Unmark* (text: TextModels.Model); - VAR r: TextModels.Reader; v: Views.View; pos: INTEGER; - script: Stores.Operation; - BEGIN - Models.BeginModification(Models.clean, text); - Models.BeginScript(text, "#Dev:DeleteMarkers", script); - r := text.NewReader(NIL); r.ReadView(v); - WHILE ~r.eot DO - IF r.view IS View THEN - pos := r.Pos() - 1; text.Delete(pos, pos + 1); r.SetPos(pos) - END; - r.ReadView(v) - END; - INC(thisEra); - Models.EndScript(text, script); - Models.EndModification(Models.clean, text); - END Unmark; - - PROCEDURE ShowFirstError* (text: TextModels.Model; focusOnly: BOOLEAN); - VAR v1: Views.View; pos: INTEGER; - BEGIN - globR := text.NewReader(globR); globR.SetPos(0); - REPEAT globR.ReadView(v1) UNTIL globR.eot OR (v1 IS View); - IF ~globR.eot THEN - pos := globR.Pos(); - TextViews.ShowRange(text, pos, pos, focusOnly); - TextControllers.SetCaret(text, pos); - v1(View).SetMode(v1(View).mode) - END - END ShowFirstError; - - - (** commands **) - - PROCEDURE UnmarkErrors*; - VAR t: TextModels.Model; - BEGIN - t := TextViews.FocusText(); - IF t # NIL THEN Unmark(t) END - END UnmarkErrors; - - PROCEDURE NextError*; - VAR c: TextControllers.Controller; t: TextModels.Model; v1: Views.View; - beg, pos: INTEGER; - BEGIN - c := TextControllers.Focus(); - IF c # NIL THEN - t := c.text; - IF c.HasCaret() THEN pos := c.CaretPos() - ELSIF c.HasSelection() THEN c.GetSelection(beg, pos) - ELSE pos := 0 - END; - TextControllers.SetSelection(t, TextControllers.none, TextControllers.none); - globR := t.NewReader(globR); globR.SetPos(pos); - REPEAT globR.ReadView(v1) UNTIL globR.eot OR (v1 IS View); - IF ~globR.eot THEN - pos := globR.Pos(); v1(View).SetMode(v1(View).mode); - TextViews.ShowRange(t, pos, pos, TextViews.focusOnly) - ELSE - pos := 0; Dialog.Beep - END; - TextControllers.SetCaret(t, pos); - globR := NIL - END - END NextError; - - PROCEDURE ToggleCurrent*; - VAR c: TextControllers.Controller; t: TextModels.Model; v: Views.View; pos: INTEGER; - BEGIN - c := TextControllers.Focus(); - IF (c # NIL) & c.HasCaret() THEN - t := c.text; pos := c.CaretPos(); - globR := t.NewReader(globR); globR.SetPos(pos); globR.ReadPrev; - v := globR.view; - IF (v # NIL) & (v IS View) THEN ToggleMode(v(View)) END; - TextViews.ShowRange(t, pos, pos, TextViews.focusOnly); - TextControllers.SetCaret(t, pos); - globR := NIL - END - END ToggleCurrent; - - - PROCEDURE SetDir* (d: Directory); - BEGIN - dir := d - END SetDir; - - - PROCEDURE Init; - VAR d: StdDirectory; - BEGIN - thisEra := 1; - NEW(d); dir := d; stdDir := d - END Init; - -BEGIN - Init; Kernel.InstallCleaner(Cleanup) -CLOSE - Kernel.RemoveCleaner(Cleanup) -END DevMarkers. diff --git a/new/Dev/Mod/Selectors.odc b/new/Dev/Mod/Selectors.odc new file mode 100644 index 0000000000000000000000000000000000000000..93231d7b6674357b8ed04238f4076d68961e25af GIT binary patch literal 15614 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 0) DO - WITH v: Selector DO - IF v.position = left THEN DEC(nest); - IF nest = 0 THEN first := v END - ELSIF v.position = right THEN INC(nest) - ELSIF nest = 1 THEN INC(pos) - END - ELSE - END; - rd.ReadPrevView(v) - END - END - ELSE (* selector not embedded in a text *) - END; - ASSERT((first = NIL) OR (first.position = left), 100) - END GetFirst; - - PROCEDURE GetNext (rd: TextModels.Reader; OUT next: Selector); - VAR nest: INTEGER; v: Views.View; - BEGIN - nest := 1; next := NIL; rd.ReadView(v); - WHILE v # NIL DO - WITH v: Selector DO - IF v.position = left THEN INC(nest) - ELSIF nest = 1 THEN next := v; RETURN - ELSIF v.position = right THEN DEC(nest) - END - ELSE - END; - rd.ReadView(v) - END - END GetNext; - - PROCEDURE CalcSize (f: Selector; OUT w, h: INTEGER); - VAR c: Models.Context; a: TextModels.Attributes; font: Fonts.Font; asc, dsc, fw: INTEGER; - BEGIN - c := f.context; - IF (c # NIL) & (c IS TextModels.Context) THEN - a := c(TextModels.Context).Attr(); - font := a.font - ELSE font := Fonts.dir.Default(); - END; - font.GetBounds(asc, dsc, fw); - h := asc + dsc; w := 3 * h DIV 4 - END CalcSize; - - PROCEDURE GetSection (first: Selector; rd: TextModels.Reader; n: INTEGER; OUT name: ARRAY OF CHAR); - VAR i, p0, p1: INTEGER; ch: CHAR; sel: Selector; - BEGIN - sel := first; - IF first.leftHidden.Length() > 0 THEN - rd := first.leftHidden.NewReader(rd); rd.SetPos(0); - REPEAT p0 := rd.Pos(); GetNext(rd, sel); DEC(n) UNTIL (n < 0) OR (sel = NIL); - IF sel = NIL THEN INC(n) END; - p1 := rd.Pos() - 1 - END; - IF n >= 0 THEN - rd := first.context(TextModels.Context).ThisModel().NewReader(rd); - rd.SetPos(first.context(TextModels.Context).Pos() + 1); - REPEAT p0 := rd.Pos(); GetNext(rd, sel); DEC(n) UNTIL (n < 0) OR (sel = NIL) OR (sel.position = right); - p1 := rd.Pos() - 1 - END; - IF (n >= 0) & (first.rightHidden.Length() > 0) THEN - rd := first.rightHidden.NewReader(rd); rd.SetPos(1); - REPEAT p0 := rd.Pos(); GetNext(rd, sel); DEC(n) UNTIL (n < 0) OR (sel = NIL); - p1 := rd.Pos() - 1; - IF sel = NIL THEN p1 := first.rightHidden.Length() END - END; - IF n < 0 THEN - rd.SetPos(p0); rd.ReadChar(ch); i := 0; - WHILE (ch <= " ") & (rd.Pos() <= p1) DO rd.ReadChar(ch) END; - WHILE (i < LEN(name) - 1) & (rd.Pos() <= p1) & (ch # 0X) DO - IF ch >= " " THEN name[i] := ch; INC(i) END; - rd.ReadChar(ch) - END; - WHILE (i > 0) & (name[i - 1] = " ") DO DEC(i) END; - name[i] := 0X - ELSE - name := 7FX + "" - END - END GetSection; - - - PROCEDURE ChangeSelector (first: Selector; rd: TextModels.Reader; selection: INTEGER); - VAR pos, p0, len, s: INTEGER; text: TextModels.Model; sel: Selector; - BEGIN - text := rd.Base(); - pos := first.context(TextModels.Context).Pos() + 1; - (* expand *) - rd.SetPos(pos); - REPEAT GetNext(rd, sel) UNTIL (sel = NIL) OR (sel.position = right); - IF sel # NIL THEN - len := first.rightHidden.Length(); - IF len > 0 THEN text.Insert(rd.Pos() - 1, first.rightHidden, 0, len) END; - len := first.leftHidden.Length(); - IF len > 0 THEN text.Insert(pos, first.leftHidden, 0, len) END; - IF selection # 0 THEN (* collapse *) - rd.SetPos(pos); s := 0; - REPEAT GetNext(rd, sel); INC(s) UNTIL (s = selection) OR (sel = NIL) OR (sel.position = right); - IF (sel # NIL) & (sel.position = middle) THEN - first.leftHidden.Insert(0, text, pos, rd.Pos()); - rd.SetPos(pos); GetNext(rd, sel); - p0 := rd.Pos() - 1; - WHILE (sel # NIL) & (sel.position # right) DO GetNext(rd, sel) END; - IF sel # NIL THEN - first.rightHidden.Insert(0, text, p0, rd.Pos() - 1) - END - END - END - END; - rd.SetPos(pos) - END ChangeSelector; - - PROCEDURE ChangeThis ( - text: TextModels.Model; rd, rd1: TextModels.Reader; title: ARRAY OF CHAR; selection: INTEGER - ); - VAR v: Views.View; str: ARRAY 256 OF CHAR; - BEGIN - rd := text.NewReader(rd); - rd.SetPos(0); rd.ReadView(v); - WHILE v # NIL DO - WITH v: Selector DO - IF v.position = left THEN - GetSection(v, rd1, 0, str); - IF str = title THEN - ChangeSelector(v, rd, selection) - END; - IF v.leftHidden.Length() > 0 THEN ChangeThis(v.leftHidden, NIL, rd1, title, selection) END; - IF v.rightHidden.Length() > 0 THEN ChangeThis(v.rightHidden, NIL, rd1, title, selection) END - END - ELSE - END; - rd.ReadView(v) - END - END ChangeThis; - - PROCEDURE Change* (text: TextModels.Model; title: ARRAY OF CHAR; selection: INTEGER); - VAR rd, rd1: TextModels.Reader; script: Stores.Operation; - BEGIN - rd := text.NewReader(NIL); - rd1 := text.NewReader(NIL); - Models.BeginModification(Models.clean, text); - Models.BeginScript(text, changeSelectorsKey, script); - ChangeThis(text, rd, rd1, title, selection); - Models.EndScript(text, script); - Models.EndModification(Models.clean, text); - END Change; - - PROCEDURE ChangeTo* (text: TextModels.Model; title, entry: ARRAY OF CHAR); - VAR rd, rd1: TextModels.Reader; str: ARRAY 256 OF CHAR; v: Views.View; sel: INTEGER; - BEGIN - rd := text.NewReader(NIL); - rd1 := text.NewReader(NIL); - rd.SetPos(0); rd.ReadView(v); - WHILE v # NIL DO - WITH v: Selector DO - IF v.position = left THEN - GetSection(v, rd1, 0, str); - IF title = str THEN - sel := 0; - REPEAT - INC(sel); GetSection(v, rd1, sel, str) - UNTIL (str[0] = 7FX) OR (str = entry); - IF str[0] # 7FX THEN - Change(text, title, sel); - RETURN - END - END - END - ELSE - END; - rd.ReadView(v) - END - END ChangeTo; - - - PROCEDURE (selector: Selector) HandlePropMsg- (VAR msg: Properties.Message); - VAR c: Models.Context; a: TextModels.Attributes; asc, w: INTEGER; - BEGIN - WITH msg: Properties.SizePref DO CalcSize(selector, msg.w, msg.h) - | msg: Properties.ResizePref DO msg.fixed := TRUE; - | msg: Properties.FocusPref DO msg.hotFocus := TRUE; - | msg: TextSetters.Pref DO c := selector.context; - IF (c # NIL) & (c IS TextModels.Context) THEN - a := c(TextModels.Context).Attr(); - a.font.GetBounds(asc, msg.dsc, w) - END - ELSE (*selector.HandlePropMsg^(msg);*) - END - END HandlePropMsg; - - PROCEDURE Track (selector: Selector; f: Views.Frame; x, y: INTEGER; buttons: SET; VAR hit: BOOLEAN); - VAR a: TextModels.Attributes; font: Fonts.Font; c: Models.Context; - w, h, asc, dsc, fw: INTEGER; isDown, in, in0: BOOLEAN; modifiers: SET; - BEGIN - c := selector.context; hit := FALSE; - WITH c: TextModels.Context DO - a := c.Attr(); font := a.font; - c.GetSize(w, h); in0 := FALSE; - in := (0 <= x) & (x < w) & (0 <= y) & (y < h); - REPEAT - IF in # in0 THEN - f.MarkRect(0, 0, w, h, Ports.fill, Ports.hilite, FALSE); in0 := in - END; - f.Input(x, y, modifiers, isDown); - in := (0 <= x) & (x < w) & (0 <= y) & (y < h) - UNTIL ~isDown; - IF in0 THEN hit := TRUE; - font.GetBounds(asc, dsc, fw); - f.MarkRect(0, 0, w, asc + dsc, Ports.fill, Ports.hilite, FALSE); - END - ELSE - END - END Track; - - PROCEDURE (selector: Selector) HandleCtrlMsg* ( - f: Views.Frame; VAR msg: Views.CtrlMessage; VAR focus: Views.View - ); - VAR hit: BOOLEAN; sel, pos: INTEGER; text: TextModels.Model; title: ARRAY 256 OF CHAR; first: Selector; - BEGIN - WITH msg: Controllers.TrackMsg DO - IF selector.context IS TextModels.Context THEN - Track(selector, f, msg.x, msg.y, msg.modifiers, hit); - IF hit THEN - text := selector.context(TextModels.Context).ThisModel(); - GetFirst(selector, first, pos); - IF first # NIL THEN - GetSection(first, NIL, 0, title); - IF selector.position = middle THEN sel := pos ELSE sel := 0 END; - Change(text, title, sel); - text := selector.context(TextModels.Context).ThisModel(); - IF TextViews.FocusText() = text THEN - pos := selector.context(TextModels.Context).Pos(); - TextViews.ShowRange(text, pos, pos+1, TRUE) - END - END - END - END - | msg: Controllers.PollCursorMsg DO - msg.cursor := Ports.refCursor; - ELSE - END - END HandleCtrlMsg; - - PROCEDURE (selector: Selector) Restore* (f: Views.Frame; l, t, r, b: INTEGER); - VAR w, h, d: INTEGER; - BEGIN - selector.context.GetSize(w, h); -(* - GetFirst(selector, first, pos); -*) - w := w - w MOD f.unit; d := 2 * f.dot; - f.DrawLine(d, d, w - d, d, d, Ports.grey25); - f.DrawLine(d, h - d, w - d, h - d, d, Ports.grey25); - IF selector.position # right THEN f.DrawLine(d, d, d, h - d, d, Ports.grey25) END; - IF selector.position # left THEN f.DrawLine(w - d, d, w - d, h - d, d, Ports.grey25) END - END Restore; - - PROCEDURE (selector: Selector) CopyFromSimpleView- (source: Views.View); - BEGIN - (* selector.CopyFrom^(source); *) - WITH source: Selector DO - selector.position := source.position; - IF source.leftHidden # NIL THEN - selector.leftHidden := TextModels.CloneOf(source.leftHidden); - selector.leftHidden.InsertCopy(0, source.leftHidden, 0, source.leftHidden.Length()) - END; - IF source.rightHidden # NIL THEN - selector.rightHidden := TextModels.CloneOf(source.rightHidden); - selector.rightHidden.InsertCopy(0, source.rightHidden, 0, source.rightHidden.Length()) - END - END - END CopyFromSimpleView; - - PROCEDURE (selector: Selector) InitContext* (context: Models.Context); - BEGIN - selector.InitContext^(context); - IF selector.position = left THEN - WITH context: TextModels.Context DO - IF selector.leftHidden = NIL THEN - selector.leftHidden := TextModels.CloneOf(context.ThisModel()); - Stores.Join(selector, selector.leftHidden); - END; - IF selector.rightHidden = NIL THEN - selector.rightHidden := TextModels.CloneOf(context.ThisModel()); - Stores.Join(selector, selector.rightHidden) - END - ELSE - END - END - END InitContext; - - PROCEDURE (selector: Selector) Internalize- (VAR rd: Stores.Reader); - VAR version: INTEGER; store: Stores.Store; - BEGIN - selector.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, currentVersion, version); - IF rd.cancelled THEN RETURN END; - rd.ReadInt(selector.position); - rd.ReadStore(store); - IF store # NIL THEN selector.leftHidden := store(TextModels.Model) - ELSE selector.leftHidden := NIL - END; - rd.ReadStore(store); - IF store # NIL THEN selector.rightHidden := store(TextModels.Model) - ELSE selector.rightHidden := NIL - END - END Internalize; - - PROCEDURE (selector: Selector) Externalize- (VAR wr: Stores.Writer); - BEGIN - selector.Externalize^(wr); - wr.WriteVersion(currentVersion); - wr.WriteInt(selector.position); - wr.WriteStore(selector.leftHidden); - wr.WriteStore(selector.rightHidden) - END Externalize; - - - PROCEDURE (d: StdDirectory) New (position: INTEGER): Selector; - VAR selector: Selector; - BEGIN - NEW(selector); - selector.position := position; - RETURN selector - END New; - - PROCEDURE SetDir* (d: Directory); - BEGIN - ASSERT(d # NIL, 20); - dir := d - END SetDir; - - - PROCEDURE DepositLeft*; - BEGIN - Views.Deposit(dir.New(left)) - END DepositLeft; - - PROCEDURE DepositMiddle*; - BEGIN - Views.Deposit(dir.New(middle)) - END DepositMiddle; - - PROCEDURE DepositRight*; - BEGIN - Views.Deposit(dir.New(right)) - END DepositRight; - - - PROCEDURE InitMod; - VAR d: StdDirectory; - BEGIN - NEW(d); dir := d; stdDir := d; - END InitMod; - -BEGIN - InitMod -END DevSelectors. - - - "Insert Left" "*F5" "DevSelectors.DepositLeft; StdCmds.PasteView" "StdCmds.PasteViewGuard" - "Insert Middle" "*F6" "DevSelectors.DepositMiddle; StdCmds.PasteView" "StdCmds.PasteViewGuard" - "Insert Right" "*F7" "DevSelectors.DepositRight; StdCmds.PasteView" "StdCmds.PasteViewGuard" diff --git a/new/Dev0/Mod/CPB.odc b/new/Dev0/Mod/CPB.odc deleted file mode 100644 index 6446649418bc6996ae53ce968c8fcde11809d1b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85923 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 0) THEN node.obj.used := TRUE END - END MarkAsUsed; - - - PROCEDURE GetTempVar* (name: ARRAY OF SHORTCHAR; typ: DevCPT.Struct; VAR obj: DevCPT.Object); - VAR n: DevCPT.Name; o: DevCPT.Object; - BEGIN - n := "@@ "; DevCPT.Insert(n, obj); obj.name^ := name$; (* avoid err 1 *) - obj.mode := Var; obj.typ := typ; - o := DevCPT.topScope.scope; - IF o = NIL THEN DevCPT.topScope.scope := obj - ELSE - WHILE o.link # NIL DO o := o.link END; - o.link := obj - END - END GetTempVar; - - - (* ---------- constant operations ---------- *) - - PROCEDURE Log (x: DevCPT.Node): INTEGER; - VAR val, exp: INTEGER; - BEGIN - exp := 0; - IF x.typ.form = Int64 THEN - RETURN -1 - ELSE - val := x.conval.intval; - IF val > 0 THEN - WHILE ~ODD(val) DO val := val DIV 2; INC(exp) END - END; - IF val # 1 THEN exp := -1 END - END; - RETURN exp - END Log; - - PROCEDURE Floor (x: REAL): REAL; - VAR y: REAL; - BEGIN - IF ABS(x) > 9007199254740992.0 (* 2^53 *) THEN RETURN x - ELSIF (x >= MAX(INTEGER) + 1.0) OR (x < MIN(INTEGER)) THEN - y := Floor(x / (MAX(INTEGER) + 1.0)) * (MAX(INTEGER) + 1.0); - RETURN SHORT(ENTIER(x - y)) + y - ELSE RETURN SHORT(ENTIER(x)) - END - END Floor; - - PROCEDURE SetToInt (s: SET): INTEGER; - VAR x, i: INTEGER; - BEGIN - i := 31; x := 0; - IF 31 IN s THEN x := -1 END; - WHILE i > 0 DO - x := x * 2; DEC(i); - IF i IN s THEN INC(x) END - END; - RETURN x - END SetToInt; - - PROCEDURE IntToSet (x: INTEGER): SET; - VAR i: INTEGER; s: SET; - BEGIN - i := 0; s := {}; - WHILE i < 32 DO - IF ODD(x) THEN INCL(s, i) END; - x := x DIV 2; INC(i) - END; - RETURN s - END IntToSet; - - PROCEDURE GetConstType (x: DevCPT.Const; form: INTEGER; errno: SHORTINT; VAR typ: DevCPT.Struct); - CONST MAXL = 9223372036854775808.0; (* 2^63 *) - BEGIN - IF (form IN intSet + charSet) & (x.realval + x.intval >= MIN(INTEGER)) - & (x.realval + x.intval <= MAX(INTEGER)) THEN - x.intval := SHORT(ENTIER(x.realval + x.intval)); x.realval := 0 - END; - IF form IN intSet THEN - IF x.realval = 0 THEN typ := DevCPT.int32typ - ELSIF (x.intval >= -MAXL - x.realval) & (x.intval < MAXL - x.realval) THEN typ := DevCPT.int64typ - ELSE err(errno); x.intval := 1; x.realval := 0; typ := DevCPT.int32typ - END - ELSIF form IN realSet THEN (* SR *) - typ := DevCPT.real64typ - ELSIF form IN charSet THEN - IF x.intval <= 255 THEN typ := DevCPT.char8typ - ELSE typ := DevCPT.char16typ - END - ELSE typ := DevCPT.undftyp - END - END GetConstType; - - PROCEDURE CheckConstType (x: DevCPT.Const; form: INTEGER; errno: SHORTINT); - VAR type: DevCPT.Struct; - BEGIN - GetConstType(x, form, errno, type); - IF ~DevCPT.Includes(form, type.form) - & ((form # Int8) OR (x.realval # 0) OR (x.intval < -128) OR (x.intval > 127)) - & ((form # Int16) OR (x.realval # 0) OR (x.intval < -32768) OR (x.intval > 32767)) - & ((form # Real32) OR (ABS(x.realval) > DevCPM.MaxReal32) & (ABS(x.realval) # DevCPM.InfReal)) THEN - err(errno); x.intval := 1; x.realval := 0 - END -(* - IF (form IN intSet + charSet) & (x.realval + x.intval >= MIN(INTEGER)) - & (x.realval + x.intval <= MAX(INTEGER)) THEN - x.intval := SHORT(ENTIER(x.realval + x.intval)); x.realval := 0 - END; - IF (form = Int64) & ((x.intval < -MAXL - x.realval) OR (x.intval >= MAXL - x.realval)) - OR (form = Int32) & (x.realval # 0) - OR (form = Int16) & ((x.realval # 0) OR (x.intval < -32768) OR (x.intval > 32767)) - OR (form = Int8) & ((x.realval # 0) OR (x.intval < -128) OR (x.intval > 127)) - OR (form = Char16) & ((x.realval # 0) OR (x.intval < 0) OR (x.intval > 65535)) - OR (form = Char8) & ((x.realval # 0) OR (x.intval < 0) OR (x.intval > 255)) - OR (form = Real32) & (ABS(x.realval) > DevCPM.MaxReal32) & (ABS(x.realval) # DevCPM.InfReal) THEN - err(errno); x.intval := 1; x.realval := 0 - END -*) - END CheckConstType; - - PROCEDURE ConvConst (x: DevCPT.Const; from, to: INTEGER); - VAR sr: SHORTREAL; - BEGIN - IF from = Set THEN - x.intval := SetToInt(x.setval); x.realval := 0; x.setval := {}; - ELSIF from IN intSet + charSet THEN - IF to = Set THEN CheckConstType(x, Int32, 203); x.setval := IntToSet(x.intval) - ELSIF to IN intSet THEN CheckConstType(x, to, 203) - ELSIF to IN realSet THEN x.realval := x.realval + x.intval; x.intval := DevCPM.ConstNotAlloc - ELSE (*to IN charSet*) CheckConstType(x, to, 220) - END - ELSIF from IN realSet THEN - IF to IN realSet THEN CheckConstType(x, to, 203); - IF to = Real32 THEN sr := SHORT(x.realval); x.realval := sr END (* reduce precision *) - ELSE x.realval := Floor(x.realval); x.intval := 0; CheckConstType(x, to, 203) - END - END - END ConvConst; - - PROCEDURE Prepare (x: DevCPT.Const); - VAR r: REAL; - BEGIN - x.realval := x.realval + x.intval DIV 32768 * 32768; - x.intval := x.intval MOD 32768; - r := Floor(x.realval / 4096) * 4096; - x.intval := x.intval + SHORT(ENTIER(x.realval - r)); - x.realval := r - (* ABS(x.intval) < 2^15 & ABS(x.realval) MOD 2^12 = 0 *) - END Prepare; - - PROCEDURE AddConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x + y *) - BEGIN - IF type.form IN intSet THEN - Prepare(x); Prepare(y); - z.intval := x.intval + y.intval; z.realval := x.realval + y.realval - ELSIF type.form IN realSet THEN - IF (ABS(x.realval) = DevCPM.InfReal) & (x.realval = - y.realval) THEN err(212) - ELSE z.realval := x.realval + y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 206, type) - END AddConst; - - PROCEDURE NegateConst (y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := - y *) - BEGIN - IF type.form IN intSet THEN Prepare(y); z.intval := -y.intval; z.realval := -y.realval - ELSIF type.form IN realSet THEN z.realval := -y.realval - ELSE HALT(100) - END; - GetConstType(z, type.form, 207, type) - END NegateConst; - - PROCEDURE SubConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x - y *) - BEGIN - IF type.form IN intSet THEN - Prepare(x); Prepare(y); - z.intval := x.intval - y.intval; z.realval := x.realval - y.realval - ELSIF type.form IN realSet THEN - IF (ABS(x.realval) = DevCPM.InfReal) & (x.realval = y.realval) THEN err(212) - ELSE z.realval := x.realval - y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 207, type) - END SubConst; - - PROCEDURE MulConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x * y *) - BEGIN - IF type.form IN intSet THEN - Prepare(x); Prepare(y); - z.realval := x.realval * y.realval + x.intval * y.realval + x.realval * y.intval; - z.intval := x.intval * y.intval - ELSIF type.form IN realSet THEN - IF (ABS(x.realval) = DevCPM.InfReal) & ( y.realval = 0.0) THEN err(212) - ELSIF (ABS(y.realval) = DevCPM.InfReal) & (x.realval = 0.0) THEN err(212) - ELSE z.realval := x.realval * y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 204, type) - END MulConst; - - PROCEDURE DivConst (x, y, z: DevCPT.Const; VAR type: DevCPT.Struct); (* z := x / y *) - BEGIN - IF type.form IN realSet THEN - IF (x.realval = 0.0) & (y.realval = 0.0) THEN err(212) - ELSIF (ABS(x.realval) = DevCPM.InfReal) & (ABS(y.realval) = DevCPM.InfReal) THEN err(212) - ELSE z.realval := x.realval / y.realval - END - ELSE HALT(100) - END; - GetConstType(z, type.form, 204, type) - END DivConst; - - PROCEDURE DivModConst (x, y: DevCPT.Const; div: BOOLEAN; VAR type: DevCPT.Struct); - (* x := x DIV y | x MOD y *) - BEGIN - IF type.form IN intSet THEN - IF y.realval + y.intval # 0 THEN - Prepare(x); Prepare(y); - quot.realval := Floor((x.realval + x.intval) / (y.realval + y.intval)); - quot.intval := 0; Prepare(quot); - x.realval := x.realval - quot.realval * y.realval - quot.realval * y.intval - quot.intval * y.realval; - x.intval := x.intval - quot.intval * y.intval; - IF y.realval + y.intval > 0 THEN - WHILE x.realval + x.intval > 0 DO SubConst(x, y, x, type); INC(quot.intval) END; - WHILE x.realval + x.intval < 0 DO AddConst(x, y, x, type); DEC(quot.intval) END - ELSE - WHILE x.realval + x.intval < 0 DO SubConst(x, y, x, type); INC(quot.intval) END; - WHILE x.realval + x.intval > 0 DO AddConst(x, y, x, type); DEC(quot.intval) END - END; - IF div THEN x.realval := quot.realval; x.intval := quot.intval END; - GetConstType(x, type.form, 204, type) - ELSE err(205) - END - ELSE HALT(100) - END - END DivModConst; - - PROCEDURE EqualConst (x, y: DevCPT.Const; form: INTEGER): BOOLEAN; (* x = y *) - VAR res: BOOLEAN; - BEGIN - CASE form OF - | Undef: res := TRUE - | Bool, Byte, Char8..Int32, Char16: res := x.intval = y.intval - | Int64: Prepare(x); Prepare(y); res := (x.realval - y.realval) + (x.intval - y.intval) = 0 - | Real32, Real64: res := x.realval = y.realval - | Set: res := x.setval = y.setval - | String8, String16, Comp (* guid *): res := x.ext^ = y.ext^ - | NilTyp, Pointer, ProcTyp: res := x.intval = y.intval - END; - RETURN res - END EqualConst; - - PROCEDURE LessConst (x, y: DevCPT.Const; form: INTEGER): BOOLEAN; (* x < y *) - VAR res: BOOLEAN; - BEGIN - CASE form OF - | Undef: res := TRUE - | Byte, Char8..Int32, Char16: res := x.intval < y.intval - | Int64: Prepare(x); Prepare(y); res := (x.realval - y.realval) + (x.intval - y.intval) < 0 - | Real32, Real64: res := x.realval < y.realval - | String8, String16: res := x.ext^ < y.ext^ - | Bool, Set, NilTyp, Pointer, ProcTyp, Comp: err(108) - END; - RETURN res - END LessConst; - - PROCEDURE IsNegConst (x: DevCPT.Const; form: INTEGER): BOOLEAN; (* x < 0 OR x = (-0.0) *) - VAR res: BOOLEAN; - BEGIN - CASE form OF - | Int8..Int32: res := x.intval < 0 - | Int64: Prepare(x); res := x.realval + x.intval < 0 - | Real32, Real64: res := (x.realval <= 0.) & (1. / x.realval <= 0.) - END; - RETURN res - END IsNegConst; - - - PROCEDURE NewIntConst*(intval: INTEGER): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - x.conval.intval := intval; x.conval.realval := 0; x.typ := DevCPT.int32typ; RETURN x - END NewIntConst; - - PROCEDURE NewLargeIntConst* (intval: INTEGER; realval: REAL): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - x.conval.intval := intval; x.conval.realval := realval; x.typ := DevCPT.int64typ; RETURN x - END NewLargeIntConst; - - PROCEDURE NewRealConst*(realval: REAL; typ: DevCPT.Struct): DevCPT.Node; - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - x.conval.realval := realval; x.conval.intval := DevCPM.ConstNotAlloc; - IF typ = NIL THEN typ := DevCPT.real64typ END; - x.typ := typ; - RETURN x - END NewRealConst; - - PROCEDURE NewString*(str: DevCPT.String; lstr: POINTER TO ARRAY OF CHAR; len: INTEGER): DevCPT.Node; - VAR i, j, c: INTEGER; x: DevCPT.Node; ext: DevCPT.ConstExt; - BEGIN - x := DevCPT.NewNode(Nconst); x.conval := DevCPT.NewConst(); - IF lstr # NIL THEN - x.typ := DevCPT.string16typ; - NEW(ext, 3 * len); i := 0; j := 0; - REPEAT c := ORD(lstr[i]); INC(i); DevCPM.PutUtf8(ext^, c, j) UNTIL c = 0; - x.conval.ext := ext - ELSE - x.typ := DevCPT.string8typ; x.conval.ext := str - END; - x.conval.intval := DevCPM.ConstNotAlloc; x.conval.intval2 := len; - RETURN x - END NewString; - - PROCEDURE CharToString8(n: DevCPT.Node); - VAR ch: SHORTCHAR; - BEGIN - n.typ := DevCPT.string8typ; ch := SHORT(CHR(n.conval.intval)); NEW(n.conval.ext, 2); - IF ch = 0X THEN n.conval.intval2 := 1 ELSE n.conval.intval2 := 2; n.conval.ext[1] := 0X END ; - n.conval.ext[0] := ch; n.conval.intval := DevCPM.ConstNotAlloc; n.obj := NIL - END CharToString8; - - PROCEDURE CharToString16 (n: DevCPT.Node); - VAR ch, ch1: SHORTCHAR; i: INTEGER; - BEGIN - n.typ := DevCPT.string16typ; NEW(n.conval.ext, 4); - IF n.conval.intval = 0 THEN - n.conval.ext[0] := 0X; n.conval.intval2 := 1 - ELSE - i := 0; DevCPM.PutUtf8(n.conval.ext^, n.conval.intval, i); - n.conval.ext[i] := 0X; n.conval.intval2 := 2 - END; - n.conval.intval := DevCPM.ConstNotAlloc; n.obj := NIL - END CharToString16; - - PROCEDURE String8ToString16 (n: DevCPT.Node); - VAR i, j, x: INTEGER; ext, new: DevCPT.ConstExt; - BEGIN - n.typ := DevCPT.string16typ; ext := n.conval.ext; - NEW(new, 2 * n.conval.intval2); i := 0; j := 0; - REPEAT x := ORD(ext[i]); INC(i); DevCPM.PutUtf8(new^, x, j) UNTIL x = 0; - n.conval.ext := new; n.obj := NIL - END String8ToString16; - - PROCEDURE String16ToString8 (n: DevCPT.Node); - VAR i, j, x: INTEGER; ext, new: DevCPT.ConstExt; - BEGIN - n.typ := DevCPT.string8typ; ext := n.conval.ext; - NEW(new, n.conval.intval2); i := 0; j := 0; - REPEAT DevCPM.GetUtf8(ext^, x, i); new[j] := SHORT(CHR(x MOD 256)); INC(j) UNTIL x = 0; - n.conval.ext := new; n.obj := NIL - END String16ToString8; - - PROCEDURE StringToGuid (VAR n: DevCPT.Node); - BEGIN - ASSERT((n.class = Nconst) & (n.typ.form = String8)); - IF ~DevCPM.ValidGuid(n.conval.ext^) THEN err(165) END; - n.typ := DevCPT.guidtyp - END StringToGuid; - - PROCEDURE CheckString (n: DevCPT.Node; typ: DevCPT.Struct; e: SHORTINT); - VAR ntyp: DevCPT.Struct; - BEGIN - ntyp := n.typ; - IF (typ = DevCPT.guidtyp) & (n.class = Nconst) & (ntyp.form = String8) THEN StringToGuid(n) - ELSIF (typ.comp IN {Array, DynArr}) & (typ.BaseTyp.form = Char8) OR (typ.form = String8) THEN - IF (n.class = Nconst) & (ntyp.form = Char8) THEN CharToString8(n) - ELSIF (ntyp.comp IN {Array, DynArr}) & (ntyp.BaseTyp.form = Char8) OR (ntyp.form = String8) THEN (* ok *) - ELSE err(e) - END - ELSIF (typ.comp IN {Array, DynArr}) & (typ.BaseTyp.form = Char16) OR (typ.form = String16) THEN - IF (n.class = Nconst) & (ntyp.form IN charSet) THEN CharToString16(n) - ELSIF (n.class = Nconst) & (ntyp.form = String8) THEN String8ToString16(n) - ELSIF (ntyp.comp IN {Array, DynArr}) & (ntyp.BaseTyp.form = Char16) OR (ntyp.form = String16) THEN - (* ok *) - ELSE err(e) - END - ELSE err(e) - END - END CheckString; - - - PROCEDURE BindNodes(class: BYTE; typ: DevCPT.Struct; VAR x: DevCPT.Node; y: DevCPT.Node); - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(class); node.typ := typ; - node.left := x; node.right := y; x := node - END BindNodes; - - PROCEDURE NotVar(x: DevCPT.Node): BOOLEAN; - BEGIN - RETURN (x.class >= Nconst) & ((x.class # Nmop) OR (x.subcl # val) OR (x.left.class >= Nconst)) - OR (x.typ.form IN {String8, String16}) - END NotVar; - - - PROCEDURE Convert(VAR x: DevCPT.Node; typ: DevCPT.Struct); - VAR node: DevCPT.Node; f, g: SHORTINT; k: INTEGER; r: REAL; - BEGIN f := x.typ.form; g := typ.form; - IF x.class = Nconst THEN - IF g = String8 THEN - IF f = String16 THEN String16ToString8(x) - ELSIF f IN charSet THEN CharToString8(x) - ELSE typ := DevCPT.undftyp - END - ELSIF g = String16 THEN - IF f = String8 THEN String8ToString16(x) - ELSIF f IN charSet THEN CharToString16(x) - ELSE typ := DevCPT.undftyp - END - ELSE ConvConst(x.conval, f, g) - END; - x.obj := NIL - ELSIF (x.class = Nmop) & (x.subcl = conv) & (DevCPT.Includes(f, x.left.typ.form) OR DevCPT.Includes(f, g)) - THEN - (* don't create new node *) - IF x.left.typ.form = typ.form THEN (* and suppress existing node *) x := x.left END - ELSE - IF (x.class = Ndop) & (x.typ.form IN {String8, String16}) THEN (* propagate to leaf nodes *) - Convert(x.left, typ); Convert(x.right, typ) - ELSE - node := DevCPT.NewNode(Nmop); node.subcl := conv; node.left := x; x := node; - END - END; - x.typ := typ - END Convert; - - PROCEDURE Promote (VAR left, right: DevCPT.Node; op: INTEGER); (* check expression compatibility *) - VAR f, g: INTEGER; new: DevCPT.Struct; - BEGIN - f := left.typ.form; g := right.typ.form; new := left.typ; - IF f IN intSet + realSet THEN - IF g IN intSet + realSet THEN - IF (f = Real32) & (right.class = Nconst) & (g IN realSet) & (left.class # Nconst) - (* & ((ABS(right.conval.realval) <= DevCPM.MaxReal32) - OR (ABS(right.conval.realval) = DevCPM.InfReal)) *) - OR (g = Real32) & (left.class = Nconst) & (f IN realSet) & (right.class # Nconst) - (* & ((ABS(left.conval.realval) <= DevCPM.MaxReal32) - OR (ABS(left.conval.realval) = DevCPM.InfReal)) *) THEN - new := DevCPT.real32typ (* SR *) - ELSIF (f = Real64) OR (g = Real64) THEN new := DevCPT.real64typ - ELSIF (f = Real32) OR (g = Real32) THEN new := DevCPT.real32typ (* SR *) - ELSIF op = slash THEN new := DevCPT.real64typ - ELSIF (f = Int64) OR (g = Int64) THEN new := DevCPT.int64typ - ELSE new := DevCPT.int32typ - END - ELSE err(100) - END - ELSIF (left.typ = DevCPT.guidtyp) OR (right.typ = DevCPT.guidtyp) THEN - IF f = String8 THEN StringToGuid(left) END; - IF g = String8 THEN StringToGuid(right) END; - IF left.typ # right.typ THEN err(100) END; - f := Comp - ELSIF f IN charSet + {String8, String16} THEN - IF g IN charSet + {String8, String16} THEN - IF (f = String16) OR (g = String16) OR (f = Char16) & (g = String8) OR (f = String8) & (g = Char16) THEN - new := DevCPT.string16typ - ELSIF (f = Char16) OR (g = Char16) THEN new := DevCPT.char16typ - ELSIF (f = String8) OR (g = String8) THEN new := DevCPT.string8typ - ELSIF op = plus THEN - IF (f = Char16) OR (g = Char16) THEN new := DevCPT.string16typ - ELSE new := DevCPT.string8typ - END - END; - IF (new.form IN {String8, String16}) - & ((f IN charSet) & (left.class # Nconst) OR (g IN charSet) & (right.class # Nconst)) - THEN - err(100) - END - ELSE err(100) - END - ELSIF (f IN {NilTyp, Pointer, ProcTyp}) & (g IN {NilTyp, Pointer, ProcTyp}) THEN - IF ~DevCPT.SameType(left.typ, right.typ) & (f # NilTyp) & (g # NilTyp) - & ~((f = Pointer) & (g = Pointer) - & (DevCPT.Extends(left.typ, right.typ) OR DevCPT.Extends(right.typ, left.typ))) THEN err(100) END - ELSIF f # g THEN err(100) - END; - IF ~(f IN {NilTyp, Pointer, ProcTyp, Comp}) THEN - IF g # new.form THEN Convert(right, new) END; - IF f # new.form THEN Convert(left, new) END - END - END Promote; - - PROCEDURE CheckParameters* (fp, ap: DevCPT.Object; checkNames: BOOLEAN); (* checks par list match *) - VAR ft, at: DevCPT.Struct; - BEGIN - WHILE fp # NIL DO - IF ap # NIL THEN - ft := fp.typ; at := ap.typ; - IF fp.ptyp # NIL THEN ft := fp.ptyp END; (* get original formal type *) - IF ap.ptyp # NIL THEN at := ap.ptyp END; (* get original formal type *) - IF ~DevCPT.EqualType(ft, at) - OR (fp.mode # ap.mode) OR (fp.sysflag # ap.sysflag) OR (fp.vis # ap.vis) - OR checkNames & (fp.name^ # ap.name^) THEN err(115) END ; - ap := ap.link - ELSE err(116) - END; - fp := fp.link - END; - IF ap # NIL THEN err(116) END - END CheckParameters; - - PROCEDURE CheckNewParamPair* (newPar, iidPar: DevCPT.Node); - VAR ityp, ntyp: DevCPT.Struct; - BEGIN - ntyp := newPar.typ.BaseTyp; - IF (newPar.class = Nvarpar) & ODD(newPar.obj.sysflag DIV newBit) THEN - IF (iidPar.class = Nvarpar) & ODD(iidPar.obj.sysflag DIV iidBit) & (iidPar.obj.mnolev = newPar.obj.mnolev) - THEN (* ok *) - ELSE err(168) - END - ELSIF ntyp.extlev = 0 THEN (* ok *) - ELSIF (iidPar.class = Nconst) & (iidPar.obj # NIL) & (iidPar.obj.mode = Typ) THEN - IF ~DevCPT.Extends(iidPar.obj.typ, ntyp) THEN err(168) END - ELSE err(168) - END - END CheckNewParamPair; - - - PROCEDURE DeRef*(VAR x: DevCPT.Node); - VAR strobj, bstrobj: DevCPT.Object; typ, btyp: DevCPT.Struct; - BEGIN - typ := x.typ; - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(78) - ELSIF typ.form = Pointer THEN - btyp := typ.BaseTyp; strobj := typ.strobj; bstrobj := btyp.strobj; - IF (strobj # NIL) & (strobj.name # DevCPT.null) & (bstrobj # NIL) & (bstrobj.name # DevCPT.null) THEN - btyp.pbused := TRUE - END ; - BindNodes(Nderef, btyp, x, NIL); x.subcl := 0 - ELSE err(84) - END - END DeRef; - - PROCEDURE StrDeref*(VAR x: DevCPT.Node); - VAR typ, btyp: DevCPT.Struct; - BEGIN - typ := x.typ; - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(78) - ELSIF ((typ.comp IN {Array, DynArr}) & (typ.BaseTyp.form IN charSet)) OR (typ.sysflag = jstr) THEN - IF (typ.BaseTyp # NIL) & (typ.BaseTyp.form = Char8) THEN btyp := DevCPT.string8typ - ELSE btyp := DevCPT.string16typ - END; - BindNodes(Nderef, btyp, x, NIL); x.subcl := 1 - ELSE err(90) - END - END StrDeref; - - PROCEDURE Index*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR f: SHORTINT; typ: DevCPT.Struct; - BEGIN - f := y.typ.form; - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(79) - ELSIF ~(f IN intSet) OR (y.class IN {Nproc, Ntype}) THEN err(80); y.typ := DevCPT.int32typ END ; - IF f = Int64 THEN Convert(y, DevCPT.int32typ) END; - IF x.typ.comp = Array THEN typ := x.typ.BaseTyp; - IF (y.class = Nconst) & ((y.conval.intval < 0) OR (y.conval.intval >= x.typ.n)) THEN err(81) END - ELSIF x.typ.comp = DynArr THEN typ := x.typ.BaseTyp; - IF (y.class = Nconst) & (y.conval.intval < 0) THEN err(81) END - ELSE err(82); typ := DevCPT.undftyp - END ; - BindNodes(Nindex, typ, x, y); x.readonly := x.left.readonly - END Index; - - PROCEDURE Field*(VAR x: DevCPT.Node; y: DevCPT.Object); - BEGIN (*x.typ.comp = Record*) - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(77) END ; - IF (y # NIL) & (y.mode IN {Fld, TProc}) THEN - BindNodes(Nfield, y.typ, x, NIL); x.obj := y; - x.readonly := x.left.readonly OR ((y.vis = externalR) & (y.mnolev < 0)) - ELSE err(83); x.typ := DevCPT.undftyp - END - END Field; - - PROCEDURE TypTest*(VAR x: DevCPT.Node; obj: DevCPT.Object; guard: BOOLEAN); - - PROCEDURE GTT(t0, t1: DevCPT.Struct); - VAR node: DevCPT.Node; - BEGIN - IF (t0 # NIL) & DevCPT.SameType(t0, t1) & (guard OR (x.class # Nguard)) THEN - IF ~guard THEN x := NewBoolConst(TRUE) END - ELSIF (t0 = NIL) OR DevCPT.Extends(t1, t0) OR (t0.sysflag = jint) OR (t1.sysflag = jint) - OR (t1.comp = DynArr) & (DevCPM.java IN DevCPM.options) THEN - IF guard THEN BindNodes(Nguard, NIL, x, NIL); x.readonly := x.left.readonly - ELSE node := DevCPT.NewNode(Nmop); node.subcl := is; node.left := x; node.obj := obj; x := node - END - ELSE err(85) - END - END GTT; - - BEGIN - IF (x.class = Nconst) OR (x.class = Ntype) OR (x.class = Nproc) THEN err(112) - ELSIF x.typ.form = Pointer THEN - IF x.typ = DevCPT.sysptrtyp THEN - IF obj.typ.form = Pointer THEN GTT(NIL, obj.typ.BaseTyp) - ELSE err(86) - END - ELSIF x.typ.BaseTyp.comp # Record THEN err(85) - ELSIF obj.typ.form = Pointer THEN GTT(x.typ.BaseTyp, obj.typ.BaseTyp) - ELSE err(86) - END - ELSIF (x.typ.comp = Record) & (x.class = Nvarpar) & (x.obj.vis # outPar) & (obj.typ.comp = Record) THEN - GTT(x.typ, obj.typ) - ELSE err(87) - END ; - IF guard THEN x.typ := obj.typ ELSE x.typ := DevCPT.booltyp END - END TypTest; - - PROCEDURE In*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR f: SHORTINT; k: INTEGER; - BEGIN f := x.typ.form; - IF (x.class = Ntype) OR (x.class = Nproc) OR (y.class = Ntype) OR (y.class = Nproc) THEN err(126) - ELSIF (f IN intSet) & (y.typ.form = Set) THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF x.class = Nconst THEN - k := x.conval.intval; - IF (k < 0) OR (k > DevCPM.MaxSet) THEN err(202) - ELSIF y.class = Nconst THEN x.conval.intval := BoolToInt(k IN y.conval.setval); x.obj := NIL - ELSE BindNodes(Ndop, DevCPT.booltyp, x, y); x.subcl := in - END - ELSE BindNodes(Ndop, DevCPT.booltyp, x, y); x.subcl := in - END - ELSE err(92) - END ; - x.typ := DevCPT.booltyp - END In; - - PROCEDURE MOp*(op: BYTE; VAR x: DevCPT.Node); - VAR f: SHORTINT; typ: DevCPT.Struct; z: DevCPT.Node; - - PROCEDURE NewOp(op: BYTE; typ: DevCPT.Struct; z: DevCPT.Node): DevCPT.Node; - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(Nmop); node.subcl := op; node.typ := typ; - node.left := z; RETURN node - END NewOp; - - BEGIN z := x; - IF ((z.class = Ntype) OR (z.class = Nproc)) & (op # adr) & (op # typfn) & (op # size) THEN err(126) (* !!! *) - ELSE - typ := z.typ; f := typ.form; - CASE op OF - | not: - IF f = Bool THEN - IF z.class = Nconst THEN - z.conval.intval := BoolToInt(~IntToBool(z.conval.intval)); z.obj := NIL - ELSE z := NewOp(op, typ, z) - END - ELSE err(98) - END - | plus: - IF ~(f IN intSet + realSet) THEN err(96) END - | minus: - IF f IN intSet + realSet + {Set} THEN - IF z.class = Nconst THEN - IF f = Set THEN z.conval.setval := -z.conval.setval - ELSE NegateConst(z.conval, z.conval, z.typ) - END; - z.obj := NIL - ELSE - IF f < Int32 THEN Convert(z, DevCPT.int32typ) END; - z := NewOp(op, z.typ, z) - END - ELSE err(97) - END - | abs: - IF f IN intSet + realSet THEN - IF z.class = Nconst THEN - IF IsNegConst(z.conval, f) THEN NegateConst(z.conval, z.conval, z.typ) END; - z.obj := NIL - ELSE - IF f < Int32 THEN Convert(z, DevCPT.int32typ) END; - z := NewOp(op, z.typ, z) - END - ELSE err(111) - END - | cap: - IF f IN charSet THEN - IF z.class = Nconst THEN - IF ODD(z.conval.intval DIV 32) THEN DEC(z.conval.intval, 32) END; - z.obj := NIL - ELSE z := NewOp(op, typ, z) - END - ELSE err(111); z.typ := DevCPT.char8typ - END - | odd: - IF f IN intSet THEN - IF z.class = Nconst THEN - DivModConst(z.conval, two, FALSE, z.typ); (* z MOD 2 *) - z.obj := NIL - ELSE z := NewOp(op, typ, z) - END - ELSE err(111) - END ; - z.typ := DevCPT.booltyp - | adr: (*ADR*) - IF z.class = Nproc THEN - IF z.obj.mnolev > 0 THEN err(73) - ELSIF z.obj.mode = LProc THEN z.obj.mode := XProc - END; - z := NewOp(op, typ, z) - ELSIF z.class = Ntype THEN - IF z.obj.typ.untagged THEN err(111) END; - z := NewOp(op, typ, z) - ELSIF (z.class < Nconst) OR (z.class = Nconst) & (f IN {String8, String16}) THEN - z := NewOp(op, typ, z) - ELSE err(127) - END ; - z.typ := DevCPT.int32typ - | typfn, size: (*TYP, SIZE*) - z := NewOp(op, typ, z); - z.typ := DevCPT.int32typ - | cc: (*SYSTEM.CC*) - IF (f IN intSet) & (z.class = Nconst) THEN - IF (0 <= z.conval.intval) & (z.conval.intval <= DevCPM.MaxCC) & (z.conval.realval = 0) THEN - z := NewOp(op, typ, z) - ELSE err(219) - END - ELSE err(69) - END; - z.typ := DevCPT.booltyp - END - END; - x := z - END MOp; - - PROCEDURE ConstOp(op: SHORTINT; x, y: DevCPT.Node); - VAR f: SHORTINT; i, j: INTEGER; xval, yval: DevCPT.Const; ext: DevCPT.ConstExt; t: DevCPT.Struct; - BEGIN - f := x.typ.form; - IF f = y.typ.form THEN - xval := x.conval; yval := y.conval; - CASE op OF - | times: - IF f IN intSet + realSet THEN MulConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval * yval.setval - ELSIF f # Undef THEN err(101) - END - | slash: - IF f IN realSet THEN DivConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval / yval.setval - ELSIF f # Undef THEN err(102) - END - | div: - IF f IN intSet THEN DivModConst(xval, yval, TRUE, x.typ) - ELSIF f # Undef THEN err(103) - END - | mod: - IF f IN intSet THEN DivModConst(xval, yval, FALSE, x.typ) - ELSIF f # Undef THEN err(104) - END - | and: - IF f = Bool THEN xval.intval := BoolToInt(IntToBool(xval.intval) & IntToBool(yval.intval)) - ELSE err(94) - END - | plus: - IF f IN intSet + realSet THEN AddConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval + yval.setval - ELSIF (f IN {String8, String16}) & (xval.ext # NIL) & (yval.ext # NIL) THEN - NEW(ext, LEN(xval.ext^) + LEN(yval.ext^)); - i := 0; WHILE xval.ext[i] # 0X DO ext[i] := xval.ext[i]; INC(i) END; - j := 0; WHILE yval.ext[j] # 0X DO ext[i] := yval.ext[j]; INC(i); INC(j) END; - ext[i] := 0X; xval.ext := ext; INC(xval.intval2, yval.intval2 - 1) - ELSIF f # Undef THEN err(105) - END - | minus: - IF f IN intSet + realSet THEN SubConst(xval, yval, xval, x.typ) - ELSIF f = Set THEN xval.setval := xval.setval - yval.setval - ELSIF f # Undef THEN err(106) - END - | min: - IF f IN intSet + realSet THEN - IF LessConst(yval, xval, f) THEN xval^ := yval^ END - ELSIF f # Undef THEN err(111) - END - | max: - IF f IN intSet + realSet THEN - IF LessConst(xval, yval, f) THEN xval^ := yval^ END - ELSIF f # Undef THEN err(111) - END - | or: - IF f = Bool THEN xval.intval := BoolToInt(IntToBool(xval.intval) OR IntToBool(yval.intval)) - ELSE err(95) - END - | eql: xval.intval := BoolToInt(EqualConst(xval, yval, f)); x.typ := DevCPT.booltyp - | neq: xval.intval := BoolToInt(~EqualConst(xval, yval, f)); x.typ := DevCPT.booltyp - | lss: xval.intval := BoolToInt(LessConst(xval, yval, f)); x.typ := DevCPT.booltyp - | leq: xval.intval := BoolToInt(~LessConst(yval, xval, f)); x.typ := DevCPT.booltyp - | gtr: xval.intval := BoolToInt(LessConst(yval, xval, f)); x.typ := DevCPT.booltyp - | geq: xval.intval := BoolToInt(~LessConst(xval, yval, f)); x.typ := DevCPT.booltyp - END - ELSE err(100) - END; - x.obj := NIL - END ConstOp; - - PROCEDURE Op*(op: BYTE; VAR x: DevCPT.Node; y: DevCPT.Node); - VAR f, g: SHORTINT; t, z: DevCPT.Node; typ: DevCPT.Struct; do: BOOLEAN; val: INTEGER; - - PROCEDURE NewOp(op: BYTE; typ: DevCPT.Struct; VAR x: DevCPT.Node; y: DevCPT.Node); - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(Ndop); node.subcl := op; node.typ := typ; - node.left := x; node.right := y; x := node - END NewOp; - - BEGIN z := x; - IF (z.class = Ntype) OR (z.class = Nproc) OR (y.class = Ntype) OR (y.class = Nproc) THEN err(126) - ELSE - Promote(z, y, op); - IF (z.class = Nconst) & (y.class = Nconst) THEN ConstOp(op, z, y) - ELSE - typ := z.typ; f := typ.form; g := y.typ.form; - CASE op OF - | times: - do := TRUE; - IF f IN intSet THEN - IF z.class = Nconst THEN - IF EqualConst(z.conval, one, f) THEN do := FALSE; z := y - ELSIF EqualConst(z.conval, zero, f) THEN do := FALSE - ELSE val := Log(z); - IF val >= 0 THEN - t := y; y := z; z := t; - op := ash; y.typ := DevCPT.int32typ; y.conval.intval := val; y.obj := NIL - END - END - ELSIF y.class = Nconst THEN - IF EqualConst(y.conval, one, f) THEN do := FALSE - ELSIF EqualConst(y.conval, zero, f) THEN do := FALSE; z := y - ELSE val := Log(y); - IF val >= 0 THEN - op := ash; y.typ := DevCPT.int32typ; y.conval.intval := val; y.obj := NIL - END - END - END - ELSIF ~(f IN {Undef, Real32..Set}) THEN err(105); typ := DevCPT.undftyp - END ; - IF do THEN NewOp(op, typ, z, y) END; - | slash: - IF f IN realSet THEN (* OK *) - ELSIF (f # Set) & (f # Undef) THEN err(102); typ := DevCPT.undftyp - END ; - NewOp(op, typ, z, y) - | div: - do := TRUE; - IF f IN intSet THEN - IF y.class = Nconst THEN - IF EqualConst(y.conval, zero, f) THEN err(205) - ELSIF EqualConst(y.conval, one, f) THEN do := FALSE - ELSE val := Log(y); - IF val >= 0 THEN - op := ash; y.typ := DevCPT.int32typ; y.conval.intval := -val; y.obj := NIL - END - END - END - ELSIF f # Undef THEN err(103); typ := DevCPT.undftyp - END ; - IF do THEN NewOp(op, typ, z, y) END; - | mod: - IF f IN intSet THEN - IF y.class = Nconst THEN - IF EqualConst(y.conval, zero, f) THEN err(205) - ELSE val := Log(y); - IF val >= 0 THEN - op := msk; y.conval.intval := ASH(-1, val); y.obj := NIL - END - END - END - ELSIF f # Undef THEN err(104); typ := DevCPT.undftyp - END ; - NewOp(op, typ, z, y); - | and: - IF f = Bool THEN - IF z.class = Nconst THEN - IF IntToBool(z.conval.intval) THEN z := y END - ELSIF (y.class = Nconst) & IntToBool(y.conval.intval) THEN (* optimize z & TRUE -> z *) - ELSE NewOp(op, typ, z, y) - END - ELSIF f # Undef THEN err(94); z.typ := DevCPT.undftyp - END - | plus: - IF ~(f IN {Undef, Int8..Set, Int64, String8, String16}) THEN err(105); typ := DevCPT.undftyp END; - do := TRUE; - IF f IN intSet THEN - IF (z.class = Nconst) & EqualConst(z.conval, zero, f) THEN do := FALSE; z := y END ; - IF (y.class = Nconst) & EqualConst(y.conval, zero, f) THEN do := FALSE END - ELSIF f IN {String8, String16} THEN - IF (z.class = Nconst) & (z.conval.intval2 = 1) THEN do := FALSE; z := y END ; - IF (y.class = Nconst) & (y.conval.intval2 = 1) THEN do := FALSE END; - IF do THEN - IF z.class = Ndop THEN - t := z; WHILE t.right.class = Ndop DO t := t.right END; - IF (t.right.class = Nconst) & (y.class = Nconst) THEN - ConstOp(op, t.right, y); do := FALSE - ELSIF (t.right.class = Nconst) & (y.class = Ndop) & (y.left.class = Nconst) THEN - ConstOp(op, t.right, y.left); y.left := t.right; t.right := y; do := FALSE - ELSE - NewOp(op, typ, t.right, y); do := FALSE - END - ELSE - IF (z.class = Nconst) & (y.class = Ndop) & (y.left.class = Nconst) THEN - ConstOp(op, z, y.left); y.left := z; z := y; do := FALSE - END - END - END - END ; - IF do THEN NewOp(op, typ, z, y) END; - | minus: - IF ~(f IN {Undef, Int8..Set, Int64}) THEN err(106); typ := DevCPT.undftyp END; - IF ~(f IN intSet) OR (y.class # Nconst) OR ~EqualConst(y.conval, zero, f) THEN NewOp(op, typ, z, y) - END; - | min, max: - IF ~(f IN {Undef} + intSet + realSet + charSet) THEN err(111); typ := DevCPT.undftyp END; - NewOp(op, typ, z, y); - | or: - IF f = Bool THEN - IF z.class = Nconst THEN - IF ~IntToBool(z.conval.intval) THEN z := y END - ELSIF (y.class = Nconst) & ~IntToBool(y.conval.intval) THEN (* optimize z OR FALSE -> z *) - ELSE NewOp(op, typ, z, y) - END - ELSIF f # Undef THEN err(95); z.typ := DevCPT.undftyp - END - | eql, neq, lss, leq, gtr, geq: - IF f IN {String8, String16} THEN - IF (f = String16) & (z.class = Nmop) & (z.subcl = conv) & (y.class = Nmop) & (y.subcl = conv) THEN - z := z.left; y := y.left (* remove LONG on both sides *) - ELSIF (z.class = Nconst) & (z.conval.intval2 = 1) & (y.class = Nderef) THEN (* y$ = "" -> y[0] = 0X *) - y := y.left; Index(y, NewIntConst(0)); z.typ := y.typ; z.conval.intval := 0 - ELSIF (y.class = Nconst) & (y.conval.intval2 = 1) & (z.class = Nderef) THEN (* z$ = "" -> z[0] = 0X *) - z := z.left; Index(z, NewIntConst(0)); y.typ := z.typ; y.conval.intval := 0 - END; - typ := DevCPT.booltyp - ELSIF (f IN {Undef, Char8..Real64, Char16, Int64}) - OR (op <= neq) & ((f IN {Bool, Set, NilTyp, Pointer, ProcTyp}) OR (typ = DevCPT.guidtyp)) THEN - typ := DevCPT.booltyp - ELSE err(107); typ := DevCPT.undftyp - END; - NewOp(op, typ, z, y) - END - END - END; - x := z - END Op; - - PROCEDURE SetRange*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR k, l: INTEGER; - BEGIN - IF (x.class = Ntype) OR (x.class = Nproc) OR (y.class = Ntype) OR (y.class = Nproc) THEN err(126) - ELSIF (x.typ.form IN intSet) & (y.typ.form IN intSet) THEN - IF x.typ.form = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF y.typ.form = Int64 THEN Convert(y, DevCPT.int32typ) END; - IF x.class = Nconst THEN - k := x.conval.intval; - IF (0 > k) OR (k > DevCPM.MaxSet) OR (x.conval.realval # 0) THEN err(202) END - END ; - IF y.class = Nconst THEN - l := y.conval.intval; - IF (0 > l) OR (l > DevCPM.MaxSet) OR (y.conval.realval # 0) THEN err(202) END - END ; - IF (x.class = Nconst) & (y.class = Nconst) THEN - IF k <= l THEN - x.conval.setval := {k..l} - ELSE err(201); x.conval.setval := {l..k} - END ; - x.obj := NIL - ELSE BindNodes(Nupto, DevCPT.settyp, x, y) - END - ELSE err(93) - END ; - x.typ := DevCPT.settyp - END SetRange; - - PROCEDURE SetElem*(VAR x: DevCPT.Node); - VAR k: INTEGER; - BEGIN - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) END; - IF x.typ.form IN intSet THEN - IF x.typ.form = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF x.class = Nconst THEN - k := x.conval.intval; - IF (0 <= k) & (k <= DevCPM.MaxSet) & (x.conval.realval = 0) THEN x.conval.setval := {k} - ELSE err(202) - END ; - x.obj := NIL - ELSE BindNodes(Nmop, DevCPT.settyp, x, NIL); x.subcl := bit - END ; - ELSE err(93) - END; - x.typ := DevCPT.settyp - END SetElem; - - PROCEDURE CheckAssign* (x: DevCPT.Struct; VAR ynode: DevCPT.Node); - (* x := y, checks assignment compatibility *) - VAR f, g: SHORTINT; y, b: DevCPT.Struct; - BEGIN - y := ynode.typ; f := x.form; g := y.form; - IF (ynode.class = Ntype) OR (ynode.class = Nproc) & (f # ProcTyp) THEN err(126) END ; - CASE f OF - | Undef, String8, String16, Byte: - | Bool, Set: - IF g # f THEN err(113) END - | Int8, Int16, Int32, Int64, Real32, Real64: (* SR *) - IF (g IN intSet) OR (g IN realSet) & (f IN realSet) THEN - IF ynode.class = Nconst THEN Convert(ynode, x) - ELSIF ~DevCPT.Includes(f, g) THEN err(113) - END - ELSE err(113) - END -(* - IF ~(g IN intSet + realSet) OR ~DevCPT.Includes(f, g) & (~(g IN intSet) OR (ynode.class # Nconst)) THEN - err(113) - ELSIF ynode.class = Nconst THEN Convert(ynode, x) - END -*) - | Char8, Char16: - IF ~(g IN charSet) OR ~DevCPT.Includes(f, g) THEN err(113) - ELSIF ynode.class = Nconst THEN Convert(ynode, x) - END - | Pointer: - b := x.BaseTyp; - IF DevCPT.Extends(y, x) - OR (g = NilTyp) - OR (g = Pointer) - & ((x = DevCPT.sysptrtyp) OR (DevCPM.java IN DevCPM.options) & (x = DevCPT.anyptrtyp)) - THEN (* ok *) - ELSIF (b.comp = DynArr) & b.untagged THEN (* pointer to untagged open array *) - IF ynode.class = Nconst THEN CheckString(ynode, b, 113) - ELSIF ~(y.comp IN {Array, DynArr}) OR ~DevCPT.EqualType(b.BaseTyp, y.BaseTyp) THEN err(113) - END - ELSIF b.untagged & (ynode.class = Nmop) & (ynode.subcl = adr) THEN (* p := ADR(r) *) - IF (b.comp = DynArr) & (ynode.left.class = Nconst) THEN CheckString(ynode.left, b, 113) - ELSIF ~DevCPT.Extends(ynode.left.typ, b) THEN err(113) - END - ELSIF (b.sysflag = jstr) & ((g = String16) OR (ynode.class = Nconst) & (g IN {Char8, Char16, String8})) - THEN - IF g # String16 THEN Convert(ynode, DevCPT.string16typ) END - ELSE err(113) - END - | ProcTyp: - IF DevCPT.EqualType(x, y) OR (g = NilTyp) THEN (* ok *) - ELSIF (ynode.class = Nproc) & (ynode.obj.mode IN {XProc, IProc, LProc}) THEN - IF ynode.obj.mode = LProc THEN - IF ynode.obj.mnolev = 0 THEN ynode.obj.mode := XProc ELSE err(73) END - END; - IF (x.sysflag = 0) & (ynode.obj.sysflag >= 0) OR (x.sysflag = ynode.obj.sysflag) THEN - IF DevCPT.EqualType(x.BaseTyp, ynode.obj.typ) THEN CheckParameters(x.link, ynode.obj.link, FALSE) - ELSE err(117) - END - ELSE err(113) - END - ELSE err(113) - END - | NoTyp, NilTyp: err(113) - | Comp: - x.pvused := TRUE; (* idfp of y guarantees assignment compatibility with x *) - IF x.comp = Record THEN - IF ~DevCPT.EqualType(x, y) OR (x.attribute # 0) THEN err(113) END - ELSIF g IN {Char8, Char16, String8, String16} THEN - IF (x.BaseTyp.form = Char16) & (g = String8) THEN Convert(ynode, DevCPT.string16typ) - ELSE CheckString(ynode, x, 113); - END; - IF (x # DevCPT.guidtyp) & (x.comp = Array) & (ynode.class = Nconst) & (ynode.conval.intval2 > x.n) THEN - err(114) - END - ELSIF (x.comp = Array) & DevCPT.EqualType(x, y) THEN (* ok *) - ELSE err(113) - END - END - END CheckAssign; - - PROCEDURE AssignString (VAR x: DevCPT.Node; str: DevCPT.Node); (* x := str or x[0] := 0X *) - BEGIN - ASSERT((str.class = Nconst) & (str.typ.form IN {String8, String16})); - IF (x.typ.comp IN {Array, DynArr}) & (str.conval.intval2 = 1) THEN (* x := "" -> x[0] := 0X *) - Index(x, NewIntConst(0)); - str.typ := x.typ; str.conval.intval := 0; - END; - BindNodes(Nassign, DevCPT.notyp, x, str); x.subcl := assign - END AssignString; - - PROCEDURE CheckLeaf(x: DevCPT.Node; dynArrToo: BOOLEAN); - BEGIN - IF (x.class = Nmop) & (x.subcl = val) THEN x := x.left END ; - IF x.class = Nguard THEN x := x.left END ; (* skip last (and unique) guard *) - IF (x.class = Nvar) & (dynArrToo OR (x.typ.comp # DynArr)) THEN x.obj.leaf := FALSE END - END CheckLeaf; - - PROCEDURE CheckOldType (x: DevCPT.Node); - BEGIN - IF ~(DevCPM.oberon IN DevCPM.options) - & ((x.typ = DevCPT.lreal64typ) OR (x.typ = DevCPT.lint64typ) OR (x.typ = DevCPT.lchar16typ)) THEN - err(198) - END - END CheckOldType; - - PROCEDURE StPar0*(VAR par0: DevCPT.Node; fctno: SHORTINT); (* par0: first param of standard proc *) - VAR f: SHORTINT; typ: DevCPT.Struct; x, t: DevCPT.Node; - BEGIN x := par0; f := x.typ.form; - CASE fctno OF - haltfn: (*HALT*) - IF (f IN intSet - {Int64}) & (x.class = Nconst) THEN - IF (DevCPM.MinHaltNr <= x.conval.intval) & (x.conval.intval <= DevCPM.MaxHaltNr) THEN - BindNodes(Ntrap, DevCPT.notyp, x, x) - ELSE err(218) - END - ELSIF (DevCPM.java IN DevCPM.options) - & ((x.class = Ntype) OR (x.class = Nvar)) - & (x.typ.form = Pointer) - THEN - BindNodes(Ntrap, DevCPT.notyp, x, x) - ELSE err(69) - END ; - x.typ := DevCPT.notyp - | newfn: (*NEW*) - typ := DevCPT.notyp; - IF NotVar(x) THEN err(112) - ELSIF f = Pointer THEN - IF DevCPM.NEWusingAdr THEN CheckLeaf(x, TRUE) END ; - IF x.readonly THEN err(76) - ELSIF (x.typ.BaseTyp.attribute = absAttr) - OR (x.typ.BaseTyp.attribute = limAttr) & (x.typ.BaseTyp.mno # 0) THEN err(193) - ELSIF (x.obj # NIL) & ODD(x.obj.sysflag DIV newBit) THEN err(167) - END ; - MarkAsUsed(x); - f := x.typ.BaseTyp.comp; - IF f IN {Record, DynArr, Array} THEN - IF f = DynArr THEN typ := x.typ.BaseTyp END ; - BindNodes(Nassign, DevCPT.notyp, x, NIL); x.subcl := newfn - ELSE err(111) - END - ELSE err(111) - END ; - x.typ := typ - | absfn: (*ABS*) - MOp(abs, x) - | capfn: (*CAP*) - MOp(cap, x) - | ordfn: (*ORD*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f = Char8 THEN Convert(x, DevCPT.int16typ) - ELSIF f = Char16 THEN Convert(x, DevCPT.int32typ) - ELSIF f = Set THEN Convert(x, DevCPT.int32typ) - ELSE err(111) - END - | bitsfn: (*BITS*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Int8, Int16, Int32} THEN Convert(x, DevCPT.settyp) - ELSE err(111) - END - | entierfn: (*ENTIER*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN realSet THEN Convert(x, DevCPT.int64typ) - ELSE err(111) - END ; - x.typ := DevCPT.int64typ - | lentierfcn: (* LENTIER *) - IF ~(DevCPM.oberon IN DevCPM.options) THEN err(199) END; - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN realSet THEN Convert(x, DevCPT.int64typ) - ELSE err(111) - END ; - x.typ := DevCPT.int64typ - | oddfn: (*ODD*) - MOp(odd, x) - | minfn: (*MIN*) - IF x.class = Ntype THEN - CheckOldType(x); - CASE f OF - Bool: x := NewBoolConst(FALSE) - | Char8: x := NewIntConst(0); x.typ := DevCPT.char8typ - | Char16: x := NewIntConst(0); x.typ := DevCPT.char8typ - | Int8: x := NewIntConst(-128) - | Int16: x := NewIntConst(-32768) - | Int32: x := NewIntConst(-2147483648) - | Int64: x := NewLargeIntConst(0, -9223372036854775808.0E0) (* -2^63 *) - | Set: x := NewIntConst(0) (*; x.typ := DevCPT.int16typ *) - | Real32: x := NewRealConst(DevCPM.MinReal32, DevCPT.real64typ) - | Real64: x := NewRealConst(DevCPM.MinReal64, DevCPT.real64typ) - ELSE err(111) - END; - x.hint := 1 - ELSIF ~(f IN intSet + realSet + charSet) THEN err(111) - END - | maxfn: (*MAX*) - IF x.class = Ntype THEN - CheckOldType(x); - CASE f OF - Bool: x := NewBoolConst(TRUE) - | Char8: x := NewIntConst(0FFH); x.typ := DevCPT.char8typ - | Char16: x := NewIntConst(0FFFFH); x.typ := DevCPT.char16typ - | Int8: x := NewIntConst(127) - | Int16: x := NewIntConst(32767) - | Int32: x := NewIntConst(2147483647) - | Int64: x := NewLargeIntConst(-1, 9223372036854775808.0E0) (* 2^63 - 1 *) - | Set: x := NewIntConst(31) (*; x.typ := DevCPT.int16typ *) - | Real32: x := NewRealConst(DevCPM.MaxReal32, DevCPT.real64typ) - | Real64: x := NewRealConst(DevCPM.MaxReal64, DevCPT.real64typ) - ELSE err(111) - END; - x.hint := 1 - ELSIF ~(f IN intSet + realSet + charSet) THEN err(111) - END - | chrfn: (*CHR*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Undef, Int8..Int32, Int64} THEN Convert(x, DevCPT.char16typ) - ELSE err(111); x.typ := DevCPT.char16typ - END - | lchrfn: (* LCHR *) - IF ~(DevCPM.oberon IN DevCPM.options) THEN err(199) END; - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Undef, Int8..Int32, Int64} THEN Convert(x, DevCPT.char16typ) - ELSE err(111); x.typ := DevCPT.char16typ - END - | shortfn: (*SHORT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSE - IF (x.typ.comp IN {Array, DynArr}) & (x.typ.BaseTyp.form IN charSet) THEN StrDeref(x); f := x.typ.form - END; - IF f = Int16 THEN Convert(x, DevCPT.int8typ) - ELSIF f = Int32 THEN Convert(x, DevCPT.int16typ) - ELSIF f = Int64 THEN Convert(x, DevCPT.int32typ) - ELSIF f = Real64 THEN Convert(x, DevCPT.real32typ) - ELSIF f = Char16 THEN Convert(x, DevCPT.char8typ) - ELSIF f = String16 THEN Convert(x, DevCPT.string8typ) - ELSE err(111) - END - END - | longfn: (*LONG*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSE - IF (x.typ.comp IN {Array, DynArr}) & (x.typ.BaseTyp.form IN charSet) THEN StrDeref(x); f := x.typ.form - END; - IF f = Int8 THEN Convert(x, DevCPT.int16typ) - ELSIF f = Int16 THEN Convert(x, DevCPT.int32typ) - ELSIF f = Int32 THEN Convert(x, DevCPT.int64typ) - ELSIF f = Real32 THEN Convert(x, DevCPT.real64typ) - ELSIF f = Char8 THEN Convert(x, DevCPT.char16typ) - ELSIF f = String8 THEN Convert(x, DevCPT.string16typ) - ELSE err(111) - END - END - | incfn, decfn: (*INC, DEC*) - IF NotVar(x) THEN err(112) - ELSIF ~(f IN intSet) THEN err(111) - ELSIF x.readonly THEN err(76) - END; - MarkAsUsed(x) - | inclfn, exclfn: (*INCL, EXCL*) - IF NotVar(x) THEN err(112) - ELSIF f # Set THEN err(111); x.typ := DevCPT.settyp - ELSIF x.readonly THEN err(76) - END; - MarkAsUsed(x) - | lenfn: (*LEN*) - IF (* (x.class = Ntype) OR *) (x.class = Nproc) THEN err(126) (* !!! *) - (* ELSIF x.typ.sysflag = jstr THEN StrDeref(x) *) - ELSE - IF x.typ.form = Pointer THEN DeRef(x) END; - IF x.class = Nconst THEN - IF x.typ.form = Char8 THEN CharToString8(x) - ELSIF x.typ.form = Char16 THEN CharToString16(x) - END - END; - IF ~(x.typ.comp IN {DynArr, Array}) & ~(x.typ.form IN {String8, String16}) THEN err(131) END - END - | copyfn: (*COPY*) - IF ~(DevCPM.oberon IN DevCPM.options) THEN err(199) END; - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) END - | ashfn: (*ASH*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - IF f < Int32 THEN Convert(x, DevCPT.int32typ) END - ELSE err(111); x.typ := DevCPT.int32typ - END - | adrfn: (*ADR*) - IF x.class = Ntype THEN CheckOldType(x) END; - CheckLeaf(x, FALSE); MOp(adr, x) - | typfn: (*TYP*) - CheckLeaf(x, FALSE); - IF x.class = Ntype THEN - CheckOldType(x); - IF x.typ.form = Pointer THEN x := NewLeaf(x.typ.BaseTyp.strobj) END; - IF x.typ.comp # Record THEN err(111) END; - MOp(adr, x) - ELSE - IF x.typ.form = Pointer THEN DeRef(x) END; - IF x.typ.comp # Record THEN err(111) END; - MOp(typfn, x) - END - | sizefn: (*SIZE*) - IF x.class # Ntype THEN err(110); x := NewIntConst(1) - ELSIF (f IN {Byte..Set, Pointer, ProcTyp, Char16, Int64}) OR (x.typ.comp IN {Array, Record}) THEN - CheckOldType(x); x.typ.pvused := TRUE; - IF typSize # NIL THEN - typSize(x.typ); x := NewIntConst(x.typ.size) - ELSE - MOp(size, x) - END - ELSE err(111); x := NewIntConst(1) - END - | thisrecfn, (*THISRECORD*) - thisarrfn: (*THISARRAY*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Int8, Int16} THEN Convert(x, DevCPT.int32typ) - ELSIF f # Int32 THEN err(111) - END - | ccfn: (*SYSTEM.CC*) - MOp(cc, x) - | lshfn, rotfn: (*SYSTEM.LSH, SYSTEM.ROT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF ~(f IN intSet + charSet + {Byte, Set}) THEN err(111) - END - | getfn, putfn, bitfn, movefn: (*SYSTEM.GET, SYSTEM.PUT, SYSTEM.BIT, SYSTEM.MOVE*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF (x.class = Nconst) & (f IN {Int8, Int16}) THEN Convert(x, DevCPT.int32typ) - ELSIF ~(f IN {Int32, Pointer}) THEN err(111); x.typ := DevCPT.int32typ - END - | getrfn, putrfn: (*SYSTEM.GETREG, SYSTEM.PUTREG*) - IF (f IN intSet) & (x.class = Nconst) THEN - IF (x.conval.intval < DevCPM.MinRegNr) OR (x.conval.intval > DevCPM.MaxRegNr) THEN err(220) - END - ELSE err(69) - END - | valfn: (*SYSTEM.VAL*) - IF x.class # Ntype THEN err(110) - ELSIF (f IN {Undef, String8, String16, NoTyp, NilTyp}) (* OR (x.typ.comp = DynArr) *) THEN err(111) - ELSE CheckOldType(x) - END - | assertfn: (*ASSERT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126); x := NewBoolConst(FALSE) - ELSIF f # Bool THEN err(120); x := NewBoolConst(FALSE) - ELSE MOp(not, x) - END - | validfn: (* VALID *) - IF (x.class = Nvarpar) & ODD(x.obj.sysflag DIV nilBit) THEN - MOp(adr, x); x.typ := DevCPT.sysptrtyp; Op(neq, x, Nil()) - ELSE err(111) - END; - x.typ := DevCPT.booltyp - | iidfn: (* COM.IID *) - IF (x.class = Nconst) & (f = String8) THEN StringToGuid(x) - ELSE - typ := x.typ; - IF typ.form = Pointer THEN typ := typ.BaseTyp END; - IF (typ.sysflag = interface) & (typ.ext # NIL) & (typ.strobj # NIL) THEN - IF x.obj # typ.strobj THEN x := NewLeaf(typ.strobj) END - ELSE err(111) - END; - x.class := Nconst; x.typ := DevCPT.guidtyp - END - | queryfn: (* COM.QUERY *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f # Pointer THEN err(111) - END - END ; - par0 := x - END StPar0; - - PROCEDURE StPar1*(VAR par0: DevCPT.Node; x: DevCPT.Node; fctno: BYTE); - (* x: second parameter of standard proc *) - VAR f, n, L, i: INTEGER; typ, tp1: DevCPT.Struct; p, t: DevCPT.Node; - - PROCEDURE NewOp(class, subcl: BYTE; left, right: DevCPT.Node): DevCPT.Node; - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(class); node.subcl := subcl; - node.left := left; node.right := right; RETURN node - END NewOp; - - BEGIN p := par0; f := x.typ.form; - CASE fctno OF - incfn, decfn: (*INC DEC*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126); p.typ := DevCPT.notyp - ELSE - IF f # p.typ.form THEN - IF f IN intSet THEN Convert(x, p.typ) - ELSE err(111) - END - END ; - p := NewOp(Nassign, fctno, p, x); - p.typ := DevCPT.notyp - END - | inclfn, exclfn: (*INCL, EXCL*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF (x.class = Nconst) & ((0 > x.conval.intval) OR (x.conval.intval > DevCPM.MaxSet)) THEN err(202) - END ; - p := NewOp(Nassign, fctno, p, x) - ELSE err(111) - END ; - p.typ := DevCPT.notyp - | lenfn: (*LEN*) - IF ~(f IN intSet) OR (x.class # Nconst) THEN err(69) - ELSE - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - L := SHORT(x.conval.intval); typ := p.typ; - WHILE (L > 0) & (typ.comp IN {DynArr, Array}) DO typ := typ.BaseTyp; DEC(L) END ; - IF (L # 0) OR ~(typ.comp IN {DynArr, Array}) THEN err(132) - ELSE x.obj := NIL; - IF typ.comp = DynArr THEN - WHILE p.class = Nindex DO - p := p.left; INC(x.conval.intval) (* possible side effect ignored *) - END; - p := NewOp(Ndop, len, p, x); p.typ := DevCPT.int32typ - ELSE p := x; p.conval.intval := typ.n; p.typ := DevCPT.int32typ - END - END - END - | copyfn: (*COPY*) - IF NotVar(x) THEN err(112) - ELSIF x.readonly THEN err(76) - ELSE - CheckString(p, x.typ, 111); t := x; x := p; p := t; - IF (x.class = Nconst) & (x.typ.form IN {String8, String16}) THEN AssignString(p, x) - ELSE p := NewOp(Nassign, copyfn, p, x) - END - END ; - p.typ := DevCPT.notyp; MarkAsUsed(x) - | ashfn: (*ASH*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - IF (x.class = Nconst) & ((x.conval.intval > 64) OR (x.conval.intval < -64)) THEN err(208) - ELSIF (p.class = Nconst) & (x.class = Nconst) THEN - n := x.conval.intval; - IF n > 0 THEN - WHILE n > 0 DO MulConst(p.conval, two, p.conval, p.typ); DEC(n) END - ELSE - WHILE n < 0 DO DivModConst(p.conval, two, TRUE, p.typ); INC(n) END - END; - p.obj := NIL - ELSE - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - typ := p.typ; p := NewOp(Ndop, ash, p, x); p.typ := typ - END - ELSE err(111) - END - | minfn: (*MIN*) - IF p.class # Ntype THEN Op(min, p, x) ELSE err(64) END - | maxfn: (*MAX*) - IF p.class # Ntype THEN Op(max, p, x) ELSE err(64) END - | newfn: (*NEW(p, x...)*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF p.typ.comp = DynArr THEN - IF f IN intSet THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF (x.class = Nconst) & (x.conval.intval <= 0) - & (~(DevCPM.java IN DevCPM.options) OR (x.conval.intval < 0))THEN err(63) END - ELSE err(111) - END ; - p.right := x; p.typ := p.typ.BaseTyp - ELSIF (p.left # NIL) & (p.left.typ.form = Pointer) THEN - typ := p.left.typ; - WHILE (typ # DevCPT.undftyp) & (typ.BaseTyp # NIL) DO typ := typ.BaseTyp END; - IF typ.sysflag = interface THEN - typ := x.typ; - WHILE (typ # DevCPT.undftyp) & (typ.BaseTyp # NIL) DO typ := typ.BaseTyp END; - IF (f = Pointer) & (typ.sysflag = interface) THEN - p.right := x - ELSE err(169) - END - ELSE err(64) - END - ELSE err(111) - END - | thisrecfn, (*THISRECORD*) - thisarrfn: (*THISARRAY*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Int8, Int16, Int32} THEN - IF f < Int32 THEN Convert(x, DevCPT.int32typ) END; - p := NewOp(Ndop, fctno, p, x); p.typ := DevCPT.undftyp - ELSE err(111) - END - | lshfn, rotfn: (*SYSTEM.LSH, SYSTEM.ROT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF ~(f IN intSet) THEN err(111) - ELSE - IF fctno = lshfn THEN p := NewOp(Ndop, lsh, p, x) ELSE p := NewOp(Ndop, rot, p, x) END ; - p.typ := p.left.typ - END - | getfn, putfn, getrfn, putrfn: (*SYSTEM.GET, SYSTEM.PUT, SYSTEM.GETREG, SYSTEM.PUTREG*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN {Undef..Set, NilTyp, Pointer, ProcTyp, Char16, Int64} THEN - IF (fctno = getfn) OR (fctno = getrfn) THEN - IF NotVar(x) THEN err(112) END ; - t := x; x := p; p := t - END ; - p := NewOp(Nassign, fctno, p, x) - ELSE err(111) - END ; - p.typ := DevCPT.notyp - | bitfn: (*SYSTEM.BIT*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - p := NewOp(Ndop, bit, p, x) - ELSE err(111) - END ; - p.typ := DevCPT.booltyp - | valfn: (*SYSTEM.VAL*) (* type is changed without considering the byte ordering on the target machine *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF x.typ.comp = DynArr THEN - IF x.typ.untagged & ((p.typ.comp # DynArr) OR p.typ.untagged) THEN (* ok *) - ELSIF (p.typ.comp = DynArr) & (x.typ.n = p.typ.n) THEN - typ := x.typ; - WHILE typ.comp = DynArr DO typ := typ.BaseTyp END; - tp1 := p.typ; - WHILE tp1.comp = DynArr DO tp1 := tp1.BaseTyp END; - IF typ.size # tp1.size THEN err(115) END - ELSE err(115) - END - ELSIF p.typ.comp = DynArr THEN err(115) - ELSIF (x.class = Nconst) & (f = String8) & (p.typ.form = Int32) & (x.conval.intval2 <= 5) THEN - i := 0; n := 0; - WHILE i < x.conval.intval2 - 1 DO n := 256 * n + ORD(x.conval.ext[i]); INC(i) END; - x := NewIntConst(n) - ELSIF (f IN {Undef, NoTyp, NilTyp}) OR (f IN {String8, String16}) & ~(DevCPM.java IN DevCPM.options) THEN err(111) - END ; - IF (x.class = Nconst) & (x.typ = p.typ) THEN (* ok *) - ELSIF (x.class >= Nconst) OR ((f IN realSet) # (p.typ.form IN realSet)) - OR (DevCPM.options * {DevCPM.java, DevCPM.allSysVal} # {}) THEN - t := DevCPT.NewNode(Nmop); t.subcl := val; t.left := x; x := t - ELSE x.readonly := FALSE - END ; - x.typ := p.typ; p := x - | movefn: (*SYSTEM.MOVE*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF (x.class = Nconst) & (f IN {Int8, Int16}) THEN Convert(x, DevCPT.int32typ) - ELSIF ~(f IN {Int32, Pointer}) THEN err(111); x.typ := DevCPT.int32typ - END ; - p.link := x - | assertfn: (*ASSERT*) - IF (f IN intSet - {Int64}) & (x.class = Nconst) THEN - IF (DevCPM.MinHaltNr <= x.conval.intval) & (x.conval.intval <= DevCPM.MaxHaltNr) THEN - BindNodes(Ntrap, DevCPT.notyp, x, x); - Construct(Nif, p, x); Construct(Nifelse, p, NIL); OptIf(p); - ELSE err(218) - END - ELSIF - (DevCPM.java IN DevCPM.options) & ((x.class = Ntype) OR (x.class = Nvar)) & (x.typ.form = Pointer) - THEN - BindNodes(Ntrap, DevCPT.notyp, x, x); - Construct(Nif, p, x); Construct(Nifelse, p, NIL); OptIf(p); - ELSE err(69) - END; - IF p = NIL THEN (* ASSERT(TRUE) *) - ELSIF p.class = Ntrap THEN err(99) - ELSE p.subcl := assertfn - END - | queryfn: (* COM.QUERY *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF x.typ # DevCPT.guidtyp THEN err(111); x.typ := DevCPT.guidtyp - END; - p.link := x - ELSE err(64) - END ; - par0 := p - END StPar1; - - PROCEDURE StParN*(VAR par0: DevCPT.Node; x: DevCPT.Node; fctno, n: SHORTINT); - (* x: n+1-th param of standard proc *) - VAR node: DevCPT.Node; f: SHORTINT; p: DevCPT.Node; typ: DevCPT.Struct; - BEGIN p := par0; f := x.typ.form; - IF fctno = newfn THEN (*NEW(p, ..., x...*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF p.typ.comp # DynArr THEN err(64) - ELSIF f IN intSet THEN - IF f = Int64 THEN Convert(x, DevCPT.int32typ) END; - IF (x.class = Nconst) & (x.conval.intval <= 0) THEN err(63) END; - node := p.right; WHILE node.link # NIL DO node := node.link END; - node.link := x; p.typ := p.typ.BaseTyp - ELSE err(111) - END - ELSIF (fctno = movefn) & (n = 2) THEN (*SYSTEM.MOVE*) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF f IN intSet THEN - node := DevCPT.NewNode(Nassign); node.subcl := movefn; node.right := p; - node.left := p.link; p.link := x; p := node - ELSE err(111) - END ; - p.typ := DevCPT.notyp - ELSIF (fctno = queryfn) & (n = 2) THEN (* COM.QUERY *) - IF (x.class = Ntype) OR (x.class = Nproc) THEN err(126) - ELSIF (x.class < Nconst) & (f = Pointer) & (x.typ.sysflag = interface) THEN - IF ~DevCPT.Extends(p.typ, x.typ) THEN err(164) END; - IF x.readonly THEN err(76) END; - CheckNewParamPair(x, p.link); - MarkAsUsed(x); - node := DevCPT.NewNode(Ndop); node.subcl := queryfn; - node.left := p; node.right := p.link; p.link := NIL; node.right.link := x; p := node - ELSE err(111) - END; - p.typ := DevCPT.booltyp - ELSE err(64) - END ; - par0 := p - END StParN; - - PROCEDURE StFct*(VAR par0: DevCPT.Node; fctno: BYTE; parno: SHORTINT); - VAR dim: SHORTINT; x, p: DevCPT.Node; - BEGIN p := par0; - IF fctno <= ashfn THEN - IF (fctno = newfn) & (p.typ # DevCPT.notyp) THEN - IF p.typ.comp = DynArr THEN err(65) END ; - p.typ := DevCPT.notyp - ELSIF (fctno = minfn) OR (fctno = maxfn) THEN - IF (parno < 1) OR (parno = 1) & (p.hint # 1) THEN err(65) END; - p.hint := 0 - ELSIF fctno <= sizefn THEN (* 1 param *) - IF parno < 1 THEN err(65) END - ELSE (* more than 1 param *) - IF ((fctno = incfn) OR (fctno = decfn)) & (parno = 1) THEN (*INC, DEC*) - BindNodes(Nassign, DevCPT.notyp, p, NewIntConst(1)); p.subcl := fctno; p.right.typ := p.left.typ - ELSIF (fctno = lenfn) & (parno = 1) THEN (*LEN*) - IF p.typ.form IN {String8, String16} THEN - IF p.class = Nconst THEN p := NewIntConst(p.conval.intval2 - 1) - ELSIF (p.class = Ndop) & (p.subcl = plus) THEN (* propagate to leaf nodes *) - StFct(p.left, lenfn, 1); StFct(p.right, lenfn, 1); p.typ := DevCPT.int32typ - ELSE - WHILE (p.class = Nmop) & (p.subcl = conv) DO p := p.left END; - IF DevCPM.errors = 0 THEN ASSERT(p.class = Nderef) END; - BindNodes(Ndop, DevCPT.int32typ, p, NewIntConst(0)); p.subcl := len - END - ELSIF p.typ.comp = DynArr THEN dim := 0; - WHILE p.class = Nindex DO p := p.left; INC(dim) END ; (* possible side effect ignored *) - BindNodes(Ndop, DevCPT.int32typ, p, NewIntConst(dim)); p.subcl := len - ELSE - p := NewIntConst(p.typ.n) - END - ELSIF parno < 2 THEN err(65) - END - END - ELSIF fctno = assertfn THEN - IF parno = 1 THEN x := NIL; - BindNodes(Ntrap, DevCPT.notyp, x, NewIntConst(AssertTrap)); - Construct(Nif, p, x); Construct(Nifelse, p, NIL); OptIf(p); - IF p = NIL THEN (* ASSERT(TRUE) *) - ELSIF p.class = Ntrap THEN err(99) - ELSE p.subcl := assertfn - END - ELSIF parno < 1 THEN err(65) - END - ELSIF (fctno >= lchrfn) & (fctno <= bytesfn) THEN - IF parno < 1 THEN err(65) END - ELSIF fctno < validfn THEN (*SYSTEM*) - IF (parno < 1) OR - (fctno > ccfn) & (parno < 2) OR - (fctno = movefn) & (parno < 3) THEN err(65) - END - ELSIF (fctno = thisrecfn) OR (fctno = thisarrfn) THEN - IF parno < 2 THEN err(65) END - ELSE (* COM *) - IF fctno = queryfn THEN - IF parno < 3 THEN err(65) END - ELSE - IF parno < 1 THEN err(65) END - END - END ; - par0 := p - END StFct; - - PROCEDURE DynArrParCheck (ftyp: DevCPT.Struct; VAR ap: DevCPT.Node; fvarpar: BOOLEAN); - (* check array compatibility *) - VAR atyp: DevCPT.Struct; - BEGIN (* ftyp.comp = DynArr *) - atyp := ap.typ; - IF atyp.form IN {Char8, Char16, String8, String16} THEN - IF ~fvarpar & (ftyp.BaseTyp.form = Char16) & (atyp.form = String8) THEN Convert(ap, DevCPT.string16typ) - ELSE CheckString(ap, ftyp, 67) - END - ELSE - WHILE (ftyp.comp = DynArr) & ((atyp.comp IN {Array, DynArr}) OR (atyp.form IN {String8, String16})) DO - ftyp := ftyp.BaseTyp; atyp := atyp.BaseTyp - END; - IF ftyp.comp = DynArr THEN err(67) - ELSIF ~fvarpar & (ftyp.form = Pointer) & DevCPT.Extends(atyp, ftyp) THEN (* ok *) - ELSIF ~DevCPT.EqualType(ftyp, atyp) THEN err(66) - END - END - END DynArrParCheck; - - PROCEDURE PrepCall*(VAR x: DevCPT.Node; VAR fpar: DevCPT.Object); - BEGIN - IF (x.obj # NIL) & (x.obj.mode IN {LProc, XProc, TProc, CProc}) THEN - fpar := x.obj.link; - IF x.obj.mode = TProc THEN - IF fpar.typ.form = Pointer THEN - IF x.left.class = Nderef THEN x.left := x.left.left (*undo DeRef*) ELSE err(71) END - END; - fpar := fpar.link - END - ELSIF (x.class # Ntype) & (x.typ # NIL) & (x.typ.form = ProcTyp) THEN - fpar := x.typ.link - ELSE err(121); fpar := NIL; x.typ := DevCPT.undftyp - END - END PrepCall; - - PROCEDURE Param* (VAR ap: DevCPT.Node; fp: DevCPT.Object); (* checks parameter compatibilty *) - VAR at, ft: DevCPT.Struct; - BEGIN - at := ap.typ; ft := fp.typ; - IF fp.ptyp # NIL THEN ft := fp.ptyp END; (* get original formal type *) - IF ft.form # Undef THEN - IF (ap.class = Ntype) OR (ap.class = Nproc) & (ft.form # ProcTyp) THEN err(126) END; - IF fp.mode = VarPar THEN - IF ODD(fp.sysflag DIV nilBit) & (at = DevCPT.niltyp) THEN (* ok *) - ELSIF (ft.comp = Record) & ~ft.untagged & (ap.class = Ndop) & (ap.subcl = thisrecfn) THEN (* ok *) - ELSIF (ft.comp = DynArr) & ~ft.untagged & (ft.n = 0) & (ap.class = Ndop) & (ap.subcl = thisarrfn) THEN - (* ok *) - ELSE - IF fp.vis = inPar THEN - IF (ft = DevCPT.guidtyp) & (ap.class = Nconst) & (at.form = String8) THEN - StringToGuid(ap); at := ap.typ -(* - ELSIF ((at.form IN charSet + {String8, String16}) OR (at = DevCPT.guidtyp)) - & ((ap.class = Nderef) OR (ap.class = Nconst)) THEN (* ok *) - ELSIF NotVar(ap) THEN err(122) -*) - END; - IF ~NotVar(ap) THEN CheckLeaf(ap, FALSE) END - ELSE - IF NotVar(ap) THEN err(122) - ELSIF ap.readonly THEN err(76) - ELSIF (ap.obj # NIL) & ODD(ap.obj.sysflag DIV newBit) & ~ODD(fp.sysflag DIV newBit) THEN - err(167) - ELSE MarkAsUsed(ap); CheckLeaf(ap, FALSE) - END - END; - IF ft.comp = DynArr THEN DynArrParCheck(ft, ap, fp.vis # inPar) - ELSIF ODD(fp.sysflag DIV newBit) THEN - IF ~DevCPT.Extends(at, ft) THEN err(123) END - ELSIF (ft = DevCPT.sysptrtyp) & (at.form = Pointer) THEN (* ok *) - ELSIF (fp.vis # outPar) & (ft.comp = Record) & DevCPT.Extends(at, ft) THEN (* ok *) - ELSIF covarOut & (fp.vis = outPar) & (ft.form = Pointer) & DevCPT.Extends(ft, at) THEN (* ok *) - ELSIF fp.vis = inPar THEN CheckAssign(ft, ap) - ELSIF ~DevCPT.EqualType(ft, at) THEN err(123) - END - END - ELSIF ft.comp = DynArr THEN DynArrParCheck(ft, ap, FALSE) - ELSE CheckAssign(ft, ap) - END - END - END Param; - - PROCEDURE StaticLink*(dlev: BYTE; var: BOOLEAN); - VAR scope: DevCPT.Object; - BEGIN - scope := DevCPT.topScope; - WHILE dlev > 0 DO DEC(dlev); - INCL(scope.link.conval.setval, slNeeded); - scope := scope.left - END; - IF var THEN INCL(scope.link.conval.setval, imVar) END (* !!! *) - END StaticLink; - - PROCEDURE Call*(VAR x: DevCPT.Node; apar: DevCPT.Node; fp: DevCPT.Object); - VAR typ: DevCPT.Struct; p: DevCPT.Node; lev: BYTE; - BEGIN - IF x.class = Nproc THEN typ := x.typ; - lev := x.obj.mnolev; - IF lev > 0 THEN StaticLink(SHORT(SHORT(DevCPT.topScope.mnolev-lev)), FALSE) END ; (* !!! *) - IF x.obj.mode = IProc THEN err(121) END - ELSIF (x.class = Nfield) & (x.obj.mode = TProc) THEN typ := x.typ; - x.class := Nproc; p := x.left; x.left := NIL; p.link := apar; apar := p; fp := x.obj.link - ELSE typ := x.typ.BaseTyp - END ; - BindNodes(Ncall, typ, x, apar); x.obj := fp - END Call; - - PROCEDURE Enter*(VAR procdec: DevCPT.Node; stat: DevCPT.Node; proc: DevCPT.Object); - VAR x: DevCPT.Node; - BEGIN - x := DevCPT.NewNode(Nenter); x.typ := DevCPT.notyp; x.obj := proc; - x.left := procdec; x.right := stat; procdec := x - END Enter; - - PROCEDURE Return*(VAR x: DevCPT.Node; proc: DevCPT.Object); - VAR node: DevCPT.Node; - BEGIN - IF proc = NIL THEN (* return from module *) - IF x # NIL THEN err(124) END - ELSE - IF x # NIL THEN CheckAssign(proc.typ, x) - ELSIF proc.typ # DevCPT.notyp THEN err(124) - END - END ; - node := DevCPT.NewNode(Nreturn); node.typ := DevCPT.notyp; node.obj := proc; node.left := x; x := node - END Return; - - PROCEDURE Assign*(VAR x: DevCPT.Node; y: DevCPT.Node); - VAR z: DevCPT.Node; - BEGIN - IF (x.class >= Nconst) OR (x.typ.form IN {String8, String16}) THEN err(56) END ; - CheckAssign(x.typ, y); - IF x.readonly THEN err(76) - ELSIF (x.obj # NIL) & ODD(x.obj.sysflag DIV newBit) THEN err(167) - END ; - MarkAsUsed(x); - IF (y.class = Nconst) & (y.typ.form IN {String8, String16}) & (x.typ.form # Pointer) THEN AssignString(x, y) - ELSE BindNodes(Nassign, DevCPT.notyp, x, y); x.subcl := assign - END - END Assign; - - PROCEDURE Inittd*(VAR inittd, last: DevCPT.Node; typ: DevCPT.Struct); - VAR node: DevCPT.Node; - BEGIN - node := DevCPT.NewNode(Ninittd); node.typ := typ; - node.conval := DevCPT.NewConst(); node.conval.intval := typ.txtpos; - IF inittd = NIL THEN inittd := node ELSE last.link := node END ; - last := node - END Inittd; - - (* handling of temporary variables for string operations *) - - PROCEDURE Overlap (left, right: DevCPT.Node): BOOLEAN; - BEGIN - IF right.class = Nconst THEN - RETURN FALSE - ELSIF (right.class = Ndop) & (right.subcl = plus) THEN - RETURN Overlap(left, right.left) OR Overlap(left, right.right) - ELSE - WHILE right.class = Nmop DO right := right.left END; - IF right.class = Nderef THEN right := right.left END; - IF left.typ.BaseTyp # right.typ.BaseTyp THEN RETURN FALSE END; - LOOP - IF left.class = Nvarpar THEN - WHILE (right.class = Nindex) OR (right.class = Nfield) OR (right.class = Nguard) DO - right := right.left - END; - RETURN (right.class # Nvar) OR (right.obj.mnolev < left.obj.mnolev) - ELSIF right.class = Nvarpar THEN - WHILE (left.class = Nindex) OR (left.class = Nfield) OR (left.class = Nguard) DO left := left.left END; - RETURN (left.class # Nvar) OR (left.obj.mnolev < right.obj.mnolev) - ELSIF (left.class = Nvar) & (right.class = Nvar) THEN - RETURN left.obj = right.obj - ELSIF (left.class = Nderef) & (right.class = Nderef) THEN - RETURN TRUE - ELSIF (left.class = Nindex) & (right.class = Nindex) THEN - IF (left.right.class = Nconst) & (right.right.class = Nconst) - & (left.right.conval.intval # right.right.conval.intval) THEN RETURN FALSE END; - left := left.left; right := right.left - ELSIF (left.class = Nfield) & (right.class = Nfield) THEN - IF left.obj # right.obj THEN RETURN FALSE END; - left := left.left; right := right.left; - WHILE left.class = Nguard DO left := left.left END; - WHILE right.class = Nguard DO right := right.left END - ELSE - RETURN FALSE - END - END - END - END Overlap; - - PROCEDURE GetStaticLength (n: DevCPT.Node; OUT length: INTEGER); - VAR x: INTEGER; - BEGIN - IF n.class = Nconst THEN - length := n.conval.intval2 - 1 - ELSIF (n.class = Ndop) & (n.subcl = plus) THEN - GetStaticLength(n.left, length); GetStaticLength(n.right, x); - IF (length >= 0) & (x >= 0) THEN length := length + x ELSE length := -1 END - ELSE - WHILE (n.class = Nmop) & (n.subcl = conv) DO n := n.left END; - IF (n.class = Nderef) & (n.subcl = 1) THEN n := n.left END; - IF n.typ.comp = Array THEN - length := n.typ.n - 1 - ELSIF n.typ.comp = DynArr THEN - length := -1 - ELSE (* error case *) - length := 4 - END - END - END GetStaticLength; - - PROCEDURE GetMaxLength (n: DevCPT.Node; VAR stat, last: DevCPT.Node; OUT length: DevCPT.Node); - VAR x: DevCPT.Node; d: INTEGER; obj: DevCPT.Object; - BEGIN - IF n.class = Nconst THEN - length := NewIntConst(n.conval.intval2 - 1) - ELSIF (n.class = Ndop) & (n.subcl = plus) THEN - GetMaxLength(n.left, stat, last, length); GetMaxLength(n.right, stat, last, x); - IF (length.class = Nconst) & (x.class = Nconst) THEN ConstOp(plus, length, x) - ELSE BindNodes(Ndop, length.typ, length, x); length.subcl := plus - END - ELSE - WHILE (n.class = Nmop) & (n.subcl = conv) DO n := n.left END; - IF (n.class = Nderef) & (n.subcl = 1) THEN n := n.left END; - IF n.typ.comp = Array THEN - length := NewIntConst(n.typ.n - 1) - ELSIF n.typ.comp = DynArr THEN - d := 0; - WHILE n.class = Nindex DO n := n.left; INC(d) END; - ASSERT((n.class = Nderef) OR (n.class = Nvar) OR (n.class = Nvarpar)); - IF (n.class = Nderef) & (n.left.class # Nvar) & (n.left.class # Nvarpar) THEN - GetTempVar("@tmp", n.left.typ, obj); - x := NewLeaf(obj); Assign(x, n.left); Link(stat, last, x); - n.left := NewLeaf(obj); (* tree is manipulated here *) - n := NewLeaf(obj); DeRef(n) - END; - IF n.typ.untagged & (n.typ.comp = DynArr) & (n.typ.BaseTyp.form IN {Char8, Char16}) THEN - StrDeref(n); - BindNodes(Ndop, DevCPT.int32typ, n, NewIntConst(d)); n.subcl := len; - BindNodes(Ndop, DevCPT.int32typ, n, NewIntConst(1)); n.subcl := plus - ELSE - BindNodes(Ndop, DevCPT.int32typ, n, NewIntConst(d)); n.subcl := len; - END; - length := n - ELSE (* error case *) - length := NewIntConst(4) - END - END - END GetMaxLength; - - PROCEDURE CheckBuffering* ( - VAR n: DevCPT.Node; left: DevCPT.Node; par: DevCPT.Object; VAR stat, last: DevCPT.Node - ); - VAR length, x: DevCPT.Node; obj: DevCPT.Object; typ: DevCPT.Struct; len, xlen: INTEGER; - BEGIN - IF (n.typ.form IN {String8, String16}) & ~(DevCPM.java IN DevCPM.options) - & ((n.class = Ndop) & (n.subcl = plus) & ((left = NIL) OR Overlap(left, n.right)) - OR (n.class = Nmop) & (n.subcl = conv) & (left = NIL) - OR (par # NIL) & (par.vis = inPar) & (par.typ.comp = Array)) THEN - IF (par # NIL) & (par.typ.comp = Array) THEN - len := par.typ.n - 1 - ELSE - IF left # NIL THEN GetStaticLength(left, len) ELSE len := -1 END; - GetStaticLength(n, xlen); - IF (len = -1) OR (xlen # -1) & (xlen < len) THEN len := xlen END - END; - IF len # -1 THEN - typ := DevCPT.NewStr(Comp, Array); typ.n := len + 1; typ.BaseTyp := n.typ.BaseTyp; - GetTempVar("@str", typ, obj); - x := NewLeaf(obj); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj) - ELSE - IF left # NIL THEN GetMaxLength(left, stat, last, length) - ELSE GetMaxLength(n, stat, last, length) - END; - typ := DevCPT.NewStr(Pointer, Basic); - typ.BaseTyp := DevCPT.NewStr(Comp, DynArr); typ.BaseTyp.BaseTyp := n.typ.BaseTyp; - GetTempVar("@ptr", typ, obj); - x := NewLeaf(obj); Construct(Nassign, x, length); x.subcl := newfn; Link(stat, last, x); - x := NewLeaf(obj); DeRef(x); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj); DeRef(n) - END; - StrDeref(n) - ELSIF (n.typ.form = Pointer) & (n.typ.sysflag = interface) & (left = NIL) - & ((par # NIL) OR (n.class = Ncall)) - & ((n.class # Nvar) OR (n.obj.mnolev <= 0)) THEN - GetTempVar("@cip", DevCPT.punktyp, obj); - x := NewLeaf(obj); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj) - END - END CheckBuffering; - - PROCEDURE CheckVarParBuffering* (VAR n: DevCPT.Node; VAR stat, last: DevCPT.Node); - VAR x: DevCPT.Node; obj: DevCPT.Object; - BEGIN - IF (n.class # Nvar) OR (n.obj.mnolev <= 0) THEN - GetTempVar("@ptr", n.typ, obj); - x := NewLeaf(obj); Assign(x, n); Link(stat, last, x); - n := NewLeaf(obj) - END - END CheckVarParBuffering; - - - (* case optimization *) - - PROCEDURE Evaluate (n: DevCPT.Node; VAR min, max, num, dist: INTEGER; VAR head: DevCPT.Node); - VAR a: INTEGER; - BEGIN - IF n.left # NIL THEN - a := MIN(INTEGER); Evaluate(n.left, min, a, num, dist, head); - IF n.conval.intval - a > dist THEN dist := n.conval.intval - a; head := n END - ELSIF n.conval.intval < min THEN - min := n.conval.intval - END; - IF n.right # NIL THEN - a := MAX(INTEGER); Evaluate(n.right, a, max, num, dist, head); - IF a - n.conval.intval2 > dist THEN dist := a - n.conval.intval2; head := n END - ELSIF n.conval.intval2 > max THEN - max := n.conval.intval2 - END; - INC(num); - IF n.conval.intval < n.conval.intval2 THEN - INC(num); - IF n.conval.intval2 - n.conval.intval > dist THEN dist := n.conval.intval2 - n.conval.intval; head := n END - END - END Evaluate; - - PROCEDURE Rebuild (VAR root: DevCPT.Node; head: DevCPT.Node); - VAR n: DevCPT.Node; - BEGIN - IF root # head THEN - IF head.conval.intval2 < root.conval.intval THEN - Rebuild(root.left, head); - root.left := head.right; head.right := root; root := head - ELSE - Rebuild(root.right, head); - root.right := head.left; head.left := root; root := head - END - END - END Rebuild; - - PROCEDURE OptimizeCase* (VAR n: DevCPT.Node); - VAR min, max, num, dist, limit: INTEGER; head: DevCPT.Node; - BEGIN - IF n # NIL THEN - min := MAX(INTEGER); max := MIN(INTEGER); num := 0; dist := 0; head := n; - Evaluate(n, min, max, num, dist, head); - limit := 6 * num; - IF limit < 100 THEN limit := 100 END; - IF (num > 4) & ((min > MAX(INTEGER) - limit) OR (max < min + limit)) THEN - INCL(n.conval.setval, useTable) - ELSE - IF num > 4 THEN Rebuild(n, head) END; - INCL(n.conval.setval, useTree); - OptimizeCase(n.left); - OptimizeCase(n.right) - END - END - END OptimizeCase; -(* - PROCEDURE ShowTree (n: DevCPT.Node; opts: SET); - BEGIN - IF n # NIL THEN - IF opts = {} THEN opts := n.conval.setval END; - IF useTable IN opts THEN - IF n.left # NIL THEN ShowTree(n.left, opts); DevCPM.LogW(",") END; - DevCPM.LogWNum(n.conval.intval, 1); - IF n.conval.intval2 > n.conval.intval THEN DevCPM.LogW("-"); DevCPM.LogWNum(n.conval.intval2, 1) - END; - IF n.right # NIL THEN DevCPM.LogW(","); ShowTree(n.right, opts) END - ELSIF useTree IN opts THEN - DevCPM.LogW("("); ShowTree(n.left, {}); DevCPM.LogW("|"); DevCPM.LogWNum(n.conval.intval, 1); - IF n.conval.intval2 > n.conval.intval THEN DevCPM.LogW("-"); DevCPM.LogWNum(n.conval.intval2, 1) - END; - DevCPM.LogW("|"); ShowTree(n.right, {}); DevCPM.LogW(")") - ELSE - ShowTree(n.left, opts); DevCPM.LogW(" "); DevCPM.LogWNum(n.conval.intval, 1); - IF n.conval.intval2 > n.conval.intval THEN DevCPM.LogW("-"); DevCPM.LogWNum(n.conval.intval2, 1) - END; - DevCPM.LogW(" "); ShowTree(n.right, opts) - END - END - END ShowTree; -*) -BEGIN - zero := DevCPT.NewConst(); zero.intval := 0; zero.realval := 0; - one := DevCPT.NewConst(); one.intval := 1; one.realval := 0; - two := DevCPT.NewConst(); two.intval := 2; two.realval := 0; - dummy := DevCPT.NewConst(); - quot := DevCPT.NewConst() -END Dev0CPB. diff --git a/new/Dev0/Mod/CPC486.odc b/new/Dev0/Mod/CPC486.odc deleted file mode 100644 index 4c058872e69cbb85a899fcb5af675ce471c6504e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85407 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 8 THEN DevCPM.err(-779); FReg := 8 - END - END CheckReg; - - PROCEDURE CheckAv* (reg: INTEGER); - BEGIN - ASSERT(reg IN WReg) - END CheckAv; - - PROCEDURE GetReg (VAR x: DevCPL486.Item; f: BYTE; hint, stop: SET); - VAR n: INTEGER; s, s1: SET; - BEGIN - CASE f OF - | Byte, Bool, Char8, Int8: - s := BReg * {0..3} - stop; - IF (high IN stop) OR (high IN hint) & (s - hint # {}) THEN n := 0; - IF s = {} THEN DevCPM.err(215); WReg := wreg; BReg := {0..7}; s := {0..7} END; - IF s - hint # {} THEN s := s - hint END; - WHILE ~(n IN s) DO INC(n) END - ELSE - s := BReg - (stop * {0..3}) - SYSTEM.LSH(stop * {0..3}, 4); n := 0; - IF s = {} THEN DevCPM.err(215); WReg := wreg; BReg := {0..7}; s := {0..7} END; - s1 := s - (hint * {0..3}) - SYSTEM.LSH(hint * {0..3}, 4); - IF s1 # {} THEN s := s1 END; - WHILE ~(n IN s) & ~(n + 4 IN s) DO INC(n) END; - IF ~(n IN s) THEN n := n + 4 END - END; - EXCL(BReg, n); EXCL(WReg, n MOD 4) - | Int16, Int32, Set, String8, NilTyp, Pointer, ProcTyp, Comp, Char16, String16: - s := WReg - stop; - IF high IN stop THEN s := s * {0..3} END; - IF s = {} THEN DevCPM.err(215); WReg := wreg; BReg := {0..7}; s := wreg END; - s1 := s - hint; - IF high IN hint THEN s1 := s1 * {0..3} END; - IF s1 # {} THEN s := s1 END; - IF 0 IN s THEN n := 0 - ELSIF 2 IN s THEN n := 2 - ELSIF 6 IN s THEN n := 6 - ELSIF 7 IN s THEN n := 7 - ELSIF 1 IN s THEN n := 1 - ELSE n := 3 - END; - EXCL(WReg, n); - IF n < 4 THEN EXCL(BReg, n); EXCL(BReg, n + 4) END - | Real32, Real64: - IF (FReg = 0) OR (float IN stop) THEN DevCPM.err(216); FReg := 99 END; - DEC(FReg); n := 0 - END; - DevCPL486.MakeReg(x, n, f); - END GetReg; - - PROCEDURE FreeReg (n, f: INTEGER); - BEGIN - IF f <= Int8 THEN - INCL(BReg, n); - IF (n + 4) MOD 8 IN BReg THEN INCL(WReg, n MOD 4) END - ELSIF f IN realSet THEN - INC(FReg) - ELSIF n IN AllReg THEN - INCL(WReg, n); - IF n < 4 THEN INCL(BReg, n); INCL(BReg, n + 4) END - END - END FreeReg; - - PROCEDURE FreeWReg (n: INTEGER); - BEGIN - IF n IN AllReg THEN - INCL(WReg, n); - IF n < 4 THEN INCL(BReg, n); INCL(BReg, n + 4) END - END - END FreeWReg; - - PROCEDURE Free* (VAR x: DevCPL486.Item); - BEGIN - CASE x.mode OF - | Var, VarPar, Abs: IF x.scale # 0 THEN FreeWReg(x.index) END - | Ind: FreeWReg(x.reg); - IF x.scale # 0 THEN FreeWReg(x.index) END - | Reg: FreeReg(x.reg, x.form); - IF x.form = Int64 THEN FreeWReg(x.index) END - ELSE - END - END Free; - - PROCEDURE FreeHi (VAR x: DevCPL486.Item); (* free hi byte of word reg *) - BEGIN - IF x.mode = Reg THEN - IF x.form = Int64 THEN FreeWReg(x.index) - ELSIF x.reg < 4 THEN INCL(BReg, x.reg + 4) - END - END - END FreeHi; - - PROCEDURE Fits* (VAR x: DevCPL486.Item; stop: SET): BOOLEAN; (* x.mode = Reg *) - BEGIN - IF (short IN stop) & (x.form <= Int8) THEN RETURN FALSE END; - IF x.form <= Int8 THEN RETURN ~(x.reg MOD 4 IN stop) & ((x.reg < 4) OR ~(high IN stop)) - ELSIF x.form IN realSet THEN RETURN ~(float IN stop) - ELSIF x.form = Int64 THEN RETURN ~(x.reg IN stop) & ~(x.index IN stop) - ELSE RETURN ~(x.reg IN stop) & ((x.reg < 4) OR ~(high IN stop)) - END - END Fits; - - PROCEDURE Pop* (VAR r: DevCPL486.Item; f: BYTE; hint, stop: SET); - VAR rh: DevCPL486.Item; - BEGIN - IF f = Int64 THEN - GetReg(r, Int32, hint, stop); DevCPL486.GenPop(r); - GetReg(rh, Int32, hint, stop); DevCPL486.GenPop(rh); - r.form := Int64; r.index := rh.reg - ELSE - IF f < Int16 THEN INCL(stop, high) END; - GetReg(r, f, hint, stop); DevCPL486.GenPop(r) - END - END Pop; - - PROCEDURE^ LoadLong (VAR x: DevCPL486.Item; hint, stop: SET); - - PROCEDURE Load* (VAR x: DevCPL486.Item; hint, stop: SET); (* = Assert(x, hint, stop + {mem, stk}) *) - VAR r: DevCPL486.Item; f: BYTE; - BEGIN - f := x.typ.form; - IF x.mode = Con THEN - IF (short IN stop) & (x.form IN {Int8, Int16, Bool, Char8, Char16}) THEN f := Int32; x.form := Int32 END; - IF con IN stop THEN - IF f = Int64 THEN LoadLong(x, hint, stop) - ELSE - GetReg(r, f, hint, stop); DevCPL486.GenMove(x, r); - x.mode := Reg; x.reg := r.reg; x.form := f - END - END - ELSIF x.mode = Stk THEN - IF f IN realSet THEN - GetReg(r, f, hint, stop); DevCPL486.GenFLoad(x); IncStack(x.form) - ELSE - Pop(r, f, hint, stop) - END; - x.mode := Reg; x.reg := r.reg; x.index := r.index; x.form := f - ELSIF (short IN stop) & (x.form IN {Int8, Int16, Bool, Char8, Char16}) THEN - Free(x); GetReg(r, Int32, hint, stop); DevCPL486.GenExtMove(x, r); - x.mode := Reg; x.reg := r.reg; x.form := Int32 - ELSIF (x.mode # Reg) OR ~Fits(x, stop) THEN - IF f = Int64 THEN LoadLong(x, hint, stop) - ELSE - Free(x); GetReg(r, f, hint, stop); - IF f IN realSet THEN DevCPL486.GenFLoad(x) ELSE DevCPL486.GenMove(x, r) END; - x.mode := Reg; x.reg := r.reg; x.form := f - END - END - END Load; - - PROCEDURE Push* (VAR x: DevCPL486.Item); - VAR y: DevCPL486.Item; - BEGIN - IF x.form IN realSet THEN - Load(x, {}, {}); DecStack(x.form); - Free(x); x.mode := Stk; - IF x.typ = DevCPT.intrealtyp THEN x.form := Int64 END; - DevCPL486.GenFStore(x, TRUE) - ELSIF x.form = Int64 THEN - Free(x); x.form := Int32; y := x; - IF x.mode = Reg THEN y.reg := x.index ELSE INC(y.offset, 4) END; - DevCPL486.GenPush(y); DevCPL486.GenPush(x); - x.mode := Stk; x.form := Int64 - ELSE - IF x.form < Int16 THEN Load(x, {}, {high}) - ELSIF x.form = Int16 THEN Load(x, {}, {}) - END; - Free(x); DevCPL486.GenPush(x); x.mode := Stk - END - END Push; - - PROCEDURE Assert* (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF (short IN stop) & (x.form IN {Int8, Int16, Bool, Char8, Char16}) & (x.mode # Con) THEN - IF (wreg - stop = {}) & ~(stk IN stop) THEN Load(x, {}, {short}); Push(x) - ELSE Load(x, hint, stop); - END - ELSE - CASE x.mode OF - | Var, VarPar: IF ~(mem IN stop) THEN RETURN END - | Con: IF ~(con IN stop) THEN RETURN END - | Ind: IF ~(mem IN stop) & ~(x.reg IN stop) & ((x.scale = 0) OR ~(x.index IN stop)) THEN RETURN END - | Abs: IF ~(mem IN stop) & ((x.scale = 0) OR ~(x.index IN stop)) THEN RETURN END - | Stk: IF ~(stk IN stop) THEN RETURN END - | Reg: IF Fits(x, stop) THEN RETURN END - ELSE RETURN - END; - IF ((float IN stop) OR ~(x.typ.form IN realSet) & (wreg - stop = {})) & ~(stk IN stop) THEN Push(x) - ELSE Load(x, hint, stop) - END - END - END Assert; - - (*------------------------------------------------*) - - PROCEDURE LoadR (VAR x: DevCPL486.Item); - BEGIN - IF x.mode # Reg THEN - Free(x); DevCPL486.GenFLoad(x); - IF x.mode = Stk THEN IncStack(x.form) END; - GetReg(x, Real32, {}, {}) - END - END LoadR; - - PROCEDURE PushR (VAR x: DevCPL486.Item); - BEGIN - IF x.mode # Reg THEN LoadR(x) END; - DecStack(x.form); - Free(x); x.mode := Stk; DevCPL486.GenFStore(x, TRUE) - END PushR; - - PROCEDURE LoadW (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF x.mode = Stk THEN - Pop(x, x.form, hint, stop) - ELSE - Free(x); GetReg(r, x.form, hint, stop); - DevCPL486.GenMove(x, r); - x.mode := Reg; x.reg := r.reg - END - END LoadW; - - PROCEDURE LoadL (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF x.mode = Stk THEN - Pop(x, x.form, hint, stop); - IF (x.form < Int32) OR (x.form = Char16) THEN - r := x; x.form := Int32; DevCPL486.GenExtMove(r, x) - END - ELSE - Free(x); - IF (x.form < Int32) OR (x.form = Char16) THEN GetReg(r, Int32, hint, stop) ELSE GetReg(r, x.form, hint, stop) END; - IF x.mode = Con THEN x.form := r.form END; - IF x.form # r.form THEN DevCPL486.GenExtMove(x, r) ELSE DevCPL486.GenMove(x, r) END; - x.mode := Reg; x.reg := r.reg; x.form := r.form - END - END LoadL; - - PROCEDURE LoadLong (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r, rh, c: DevCPL486.Item; offs: INTEGER; - BEGIN - IF x.form = Int64 THEN - IF x.mode = Stk THEN - Pop(x, x.form, hint, stop) - ELSIF x.mode = Reg THEN - FreeReg(x.reg, Int32); GetReg(r, Int32, hint, stop); - FreeReg(x.index, Int32); GetReg(rh, Int32, hint, stop); - x.form := Int32; DevCPL486.GenMove(x, r); - x.reg := x.index; DevCPL486.GenMove(x, rh); - x.reg := r.reg; x.index := rh.reg - ELSE - GetReg(rh, Int32, hint, stop + {AX}); - Free(x); - GetReg(r, Int32, hint, stop); - x.form := Int32; offs := x.offset; - IF x.mode = Con THEN x.offset := x.scale ELSE INC(x.offset, 4) END; - DevCPL486.GenMove(x, rh); - x.offset := offs; - DevCPL486.GenMove(x, r); - x.mode := Reg; x.reg := r.reg; x.index := rh.reg - END - ELSE - LoadL(x, hint, stop); GetReg(rh, Int32, hint, stop); DevCPL486.GenSignExt(x, rh); - x.index := rh.reg - END; - x.form := Int64 - END LoadLong; - - (*------------------------------------------------*) - - PROCEDURE CopyReg* (VAR x, y: DevCPL486.Item; hint, stop: SET); - BEGIN - ASSERT(x.mode = Reg); - GetReg(y, x.form, hint, stop); - DevCPL486.GenMove(x, y) - END CopyReg; - - PROCEDURE GetAdr* (VAR x: DevCPL486.Item; hint, stop: SET); - VAR r: DevCPL486.Item; - BEGIN - IF x.mode = DInd THEN - x.mode := Ind - ELSIF (x.mode = Ind) & (x.offset = 0) & (x.scale = 0) & (x.reg IN wreg) THEN - x.mode := Reg - ELSE - Free(x); GetReg(r, Pointer, hint, stop); - IF x.mode = Con THEN DevCPL486.GenMove(x, r) ELSE DevCPL486.GenLoadAdr(x, r) END; - x.mode := Reg; x.reg := r.reg; x.form := Pointer - END; - x.form := Pointer; x.typ := DevCPT.anyptrtyp; - Assert(x, hint, stop) - END GetAdr; - - PROCEDURE PushAdr (VAR x: DevCPL486.Item; niltest: BOOLEAN); - VAR r, v: DevCPL486.Item; - BEGIN - IF (x.mode = Abs) & (x.scale = 0) THEN x.mode := Con; x.form := Pointer - ELSIF niltest THEN - GetAdr(x, {}, {mem, stk}); - DevCPL486.MakeReg(r, AX, Int32); - v.mode := Ind; v.form := Int32; v.offset := 0; v.scale := 0; v.reg := x.reg; - DevCPL486.GenTest(r, v) - ELSIF x.mode = DInd THEN x.mode := Ind; x.form := Pointer - ELSE GetAdr(x, {}, {}) - END; - Free(x); DevCPL486.GenPush(x) - END PushAdr; - - PROCEDURE LevelBase (VAR a: DevCPL486.Item; lev: INTEGER; hint, stop: SET); - VAR n: BYTE; - BEGIN - a.mode := Ind; a.scale := 0; a.form := Int32; a.typ := DevCPT.int32typ; - IF lev = DevCPL486.level THEN a.reg := BP - ELSE - a.reg := BX; n := SHORT(SHORT(imLevel[DevCPL486.level] - imLevel[lev])); - WHILE n > 0 DO - a.offset := -4; LoadL(a, hint, stop); a.mode := Ind; DEC(n) - END - END - END LevelBase; - - PROCEDURE LenDesc (VAR x, len: DevCPL486.Item; typ: DevCPT.Struct); (* set len to LEN(x, -typ.n) *) - BEGIN - IF x.tmode = VarPar THEN - LevelBase(len, x.obj.mnolev, {}, {}); len.offset := x.obj.adr; - ELSE ASSERT((x.tmode = Ind) & (x.mode = Ind)); - len := x; len.offset := ArrDOffs; len.scale := 0; len.form := Int32 - END; - INC(len.offset, typ.n * 4 + 4); - IF typ.sysflag = stackArray THEN len.offset := -4 END - END LenDesc; - - PROCEDURE Tag* (VAR x, tag: DevCPL486.Item); - VAR typ: DevCPT.Struct; - BEGIN - typ := x.typ; - IF typ.form = Pointer THEN typ := typ.BaseTyp END; - IF (x.typ # DevCPT.sysptrtyp) & (typ.attribute = 0) & ~(DevCPM.oberon IN DevCPM.options) THEN (* final type *) - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(typ) - ELSIF x.typ.form = Pointer THEN - ASSERT(x.mode = Reg); - tag.mode := Ind; tag.reg := x.reg; tag.offset := -4; - IF x.typ.sysflag = interface THEN tag.offset := 0 END - ELSIF x.tmode = VarPar THEN - LevelBase(tag, x.obj.mnolev, {}, {}); tag.offset := x.obj.adr + 4; - Free(tag) (* ??? *) - ELSIF x.tmode = Ind THEN - ASSERT(x.mode = Ind); - tag := x; tag.offset := -4 - ELSE - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(x.typ) - END; - tag.scale := 0; tag.form := Pointer; tag.typ := DevCPT.sysptrtyp - END Tag; - - PROCEDURE NumOfIntProc (typ: DevCPT.Struct): INTEGER; - BEGIN - WHILE (typ # NIL) & (typ.sysflag # interface) DO typ := typ.BaseTyp END; - IF typ # NIL THEN RETURN typ.n - ELSE RETURN 0 - END - END NumOfIntProc; - - PROCEDURE ContainsIPtrs* (typ: DevCPT.Struct): BOOLEAN; - VAR fld: DevCPT.Object; - BEGIN - WHILE typ.comp IN {DynArr, Array} DO typ := typ.BaseTyp END; - IF (typ.form = Pointer) & (typ.sysflag = interface) THEN RETURN TRUE - ELSIF (typ.comp = Record) & (typ.sysflag # union) THEN - REPEAT - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF (fld.sysflag = interface) & (fld.name^ = DevCPM.HdUtPtrName) - OR ContainsIPtrs(fld.typ) THEN RETURN TRUE END; - fld := fld.link - END; - typ := typ.BaseTyp - UNTIL typ = NIL - END; - RETURN FALSE - END ContainsIPtrs; - - PROCEDURE GuidFromString* (str: DevCPT.ConstExt; VAR x: DevCPL486.Item); - VAR cv: DevCPT.Const; - BEGIN - IF ~DevCPM.ValidGuid(str^) THEN DevCPM.err(165) END; - cv := DevCPT.NewConst(); - cv.intval := DevCPM.ConstNotAlloc; cv.intval2 := 16; cv.ext := str; - DevCPL486.AllocConst(x, cv, Guid); x.typ := DevCPT.guidtyp - END GuidFromString; - - PROCEDURE IPAddRef* (VAR x: DevCPL486.Item; offset: INTEGER; nilTest: BOOLEAN); - VAR r, p, c: DevCPL486.Item; lbl: DevCPL486.Label; - BEGIN - ASSERT(x.mode IN {Reg, Ind, Abs}); - ASSERT({AX, CX, DX} - WReg = {}); - IF hints THEN - IF nilTest THEN DevCPM.err(-701) ELSE DevCPM.err(-700) END - END; - IF x.mode # Reg THEN - GetReg(r, Pointer, {}, {}); - p := x; INC(p.offset, offset); p.form := Pointer; DevCPL486.GenMove(p, r); - ELSE r := x - END; - IF nilTest THEN - DevCPL486.MakeConst(c, 0, Pointer); DevCPL486.GenComp(c, r); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE) - END; - DevCPL486.GenPush(r); p := r; - IF x.mode # Reg THEN Free(r) END; - GetReg(r, Pointer, {}, {}); - p.mode := Ind; p.offset := 0; p.scale := 0; p.form := Pointer; DevCPL486.GenMove(p, r); - p.offset := 4; p.reg := r.reg; Free(r); DevCPL486.GenCall(p); - IF nilTest THEN DevCPL486.SetLabel(lbl) END; - END IPAddRef; - - PROCEDURE IPRelease* (VAR x: DevCPL486.Item; offset: INTEGER; nilTest, nilSet: BOOLEAN); - VAR r, p, c: DevCPL486.Item; lbl: DevCPL486.Label; - BEGIN - ASSERT(x.mode IN {Ind, Abs}); - ASSERT({AX, CX, DX} - WReg = {}); - IF hints THEN - IF nilTest THEN DevCPM.err(-703) ELSE DevCPM.err(-702) END - END; - GetReg(r, Pointer, {}, {}); - p := x; INC(p.offset, offset); p.form := Pointer; DevCPL486.GenMove(p, r); - DevCPL486.MakeConst(c, 0, Pointer); - IF nilTest THEN - DevCPL486.GenComp(c, r); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE) - END; - IF nilSet THEN DevCPL486.GenMove(c, p) END; - DevCPL486.GenPush(r); - p.mode := Ind; p.reg := r.reg; p.offset := 0; p.scale := 0; DevCPL486.GenMove(p, r); - p.offset := 8; Free(r); DevCPL486.GenCall(p); - IF nilTest THEN DevCPL486.SetLabel(lbl) END; - END IPRelease; - - PROCEDURE Prepare* (VAR x: DevCPL486.Item; hint, stop: SET); - VAR n, i, lev: INTEGER; len, y: DevCPL486.Item; typ: DevCPT.Struct; - BEGIN - IF (x.mode IN {Var, VarPar, Ind, Abs}) & (x.scale # 0) THEN - DevCPL486.MakeReg(y, x.index, Int32); typ := x.typ; - WHILE typ.comp = DynArr DO (* complete dynamic array iterations *) - LenDesc(x, len, typ); DevCPL486.GenMul(len, y, FALSE); typ := typ.BaseTyp; - IF x.tmode = VarPar THEN Free(len) END; (* ??? *) - END; - n := x.scale; i := 0; - WHILE (n MOD 2 = 0) & (i < 3) DO n := n DIV 2; INC(i) END; - IF n > 1 THEN (* assure scale factor in {1, 2, 4, 8} *) - DevCPL486.MakeConst(len, n, Int32); DevCPL486.GenMul(len, y, FALSE); x.scale := x.scale DIV n - END - END; - CASE x.mode OF - Var, VarPar: - lev := x.obj.mnolev; - IF lev <= 0 THEN - x.mode := Abs - ELSE - LevelBase(y, lev, hint, stop); - IF x.mode # VarPar THEN - x.mode := Ind - ELSIF (deref IN hint) & (x.offset = 0) & (x.scale = 0) THEN - x.mode := DInd; x.offset := x.obj.adr - ELSE - y.offset := x.obj.adr; Load(y, hint, stop); x.mode := Ind - END; - x.reg := y.reg - END; - x.form := x.typ.form - | LProc, XProc, IProc: - x.mode := Con; x.offset := 0; x.form := ProcTyp - | TProc, CProc: - x.form := ProcTyp - | Ind, Abs, Stk, Reg: - IF ~(x.typ.form IN {String8, String16}) THEN x.form := x.typ.form END - END - END Prepare; - - PROCEDURE Field* (VAR x: DevCPL486.Item; field: DevCPT.Object); - BEGIN - INC(x.offset, field.adr); x.tmode := Con - END Field; - - PROCEDURE DeRef* (VAR x: DevCPL486.Item); - VAR btyp: DevCPT.Struct; - BEGIN - x.mode := Ind; x.tmode := Ind; x.scale := 0; - btyp := x.typ.BaseTyp; - IF btyp.untagged OR (btyp.sysflag = stackArray) THEN x.offset := 0 - ELSIF btyp.comp = DynArr THEN x.offset := ArrDOffs + btyp.size - ELSIF btyp.comp = Array THEN x.offset := ArrDOffs + 4 - ELSE x.offset := 0 - END - END DeRef; - - PROCEDURE Index* (VAR x, y: DevCPL486.Item; hint, stop: SET); (* x[y] *) - VAR idx, len: DevCPL486.Item; btyp: DevCPT.Struct; elsize: INTEGER; - BEGIN - btyp := x.typ.BaseTyp; elsize := btyp.size; - IF elsize = 0 THEN Free(y) - ELSIF x.typ.comp = Array THEN - len.mode := Con; len.obj := NIL; - IF y.mode = Con THEN - INC(x.offset, y.offset * elsize) - ELSE - Load(y, hint, stop + {mem, stk, short}); - IF inxchk THEN - DevCPL486.MakeConst(len, x.typ.n, Int32); - DevCPL486.GenComp(len, y); DevCPL486.GenAssert(ccB, inxTrap) - END; - IF x.scale = 0 THEN x.index := y.reg - ELSE - IF x.scale MOD elsize # 0 THEN - IF (x.scale MOD 4 = 0) & (elsize MOD 4 = 0) THEN elsize := 4 - ELSIF (x.scale MOD 2 = 0) & (elsize MOD 2 = 0) THEN elsize := 2 - ELSE elsize := 1 - END; - DevCPL486.MakeConst(len, btyp.size DIV elsize, Int32); - DevCPL486.GenMul(len, y, FALSE) - END; - DevCPL486.MakeConst(len, x.scale DIV elsize, Int32); - DevCPL486.MakeReg(idx, x.index, Int32); - DevCPL486.GenMul(len, idx, FALSE); DevCPL486.GenAdd(y, idx, FALSE); Free(y) - END; - x.scale := elsize - END; - x.tmode := Con - ELSE (* x.typ.comp = DynArr *) - IF (btyp.comp = DynArr) & x.typ.untagged THEN DevCPM.err(137) END; - LenDesc(x, len, x.typ); - IF x.scale # 0 THEN - DevCPL486.MakeReg(idx, x.index, Int32); - DevCPL486.GenMul(len, idx, FALSE) - END; - IF (y.mode # Con) OR (y.offset # 0) THEN - IF (y.mode # Con) OR (btyp.comp = DynArr) & (x.scale = 0) THEN - Load(y, hint, stop + {mem, stk, con, short}) - ELSE y.form := Int32 - END; - IF inxchk & ~x.typ.untagged THEN - DevCPL486.GenComp(y, len); DevCPL486.GenAssert(ccA, inxTrap) - END; - IF (y.mode = Con) & (btyp.comp # DynArr) THEN - INC(x.offset, y.offset * elsize) - ELSIF x.scale = 0 THEN - WHILE btyp.comp = DynArr DO btyp := btyp.BaseTyp END; - x.index := y.reg; x.scale := btyp.size - ELSE - DevCPL486.GenAdd(y, idx, FALSE); Free(y) - END - END; - IF x.tmode = VarPar THEN Free(len) END; (* ??? *) - IF x.typ.BaseTyp.comp # DynArr THEN x.tmode := Con END - END - END Index; - - PROCEDURE TypTest* (VAR x: DevCPL486.Item; testtyp: DevCPT.Struct; guard, equal: BOOLEAN); - VAR tag, tdes, r: DevCPL486.Item; typ: DevCPT.Struct; - BEGIN - typ := x.typ; - IF typ.form = Pointer THEN testtyp := testtyp.BaseTyp; typ := typ.BaseTyp END; - IF ~guard & typ.untagged THEN DevCPM.err(139) - ELSIF ~guard OR typchk & ~typ.untagged THEN - IF testtyp.untagged THEN DevCPM.err(139) - ELSE - IF (x.typ.form = Pointer) & (x.mode # Reg) THEN - GetReg(r, Pointer, {}, {}); DevCPL486.GenMove(x, r); Free(r); r.typ := x.typ; Tag(r, tag) - ELSE Tag(x, tag) - END; - IF ~guard THEN Free(x) END; - IF ~equal THEN - GetReg(r, Pointer, {}, {}); DevCPL486.GenMove(tag, r); Free(r); - tag.mode := Ind; tag.reg := r.reg; tag.scale := 0; tag.offset := Tag0Offset + 4 * testtyp.extlev - END; - DevCPL486.MakeConst(tdes, 0, Pointer); tdes.obj := DevCPE.TypeObj(testtyp); - DevCPL486.GenComp(tdes, tag); - IF guard THEN - IF equal THEN DevCPL486.GenAssert(ccE, recTrap) ELSE DevCPL486.GenAssert(ccE, typTrap) END - ELSE setCC(x, eql, FALSE, FALSE) - END - END - END - END TypTest; - - PROCEDURE ShortTypTest* (VAR x: DevCPL486.Item; testtyp: DevCPT.Struct); - VAR tag, tdes: DevCPL486.Item; - BEGIN - (* tag must be in AX ! *) - IF testtyp.form = Pointer THEN testtyp := testtyp.BaseTyp END; - IF testtyp.untagged THEN DevCPM.err(139) - ELSE - tag.mode := Ind; tag.reg := AX; tag.scale := 0; tag.offset := Tag0Offset + 4 * testtyp.extlev; tag.form := Pointer; - DevCPL486.MakeConst(tdes, 0, Pointer); tdes.obj := DevCPE.TypeObj(testtyp); - DevCPL486.GenComp(tdes, tag); - setCC(x, eql, FALSE, FALSE) - END - END ShortTypTest; - - PROCEDURE Check (VAR x: DevCPL486.Item; min, max: INTEGER); - VAR c: DevCPL486.Item; - BEGIN - ASSERT((x.mode # Reg) OR (max > 255) OR (max = 31) OR (x.reg < 4)); - IF ranchk & (x.mode # Con) THEN - DevCPL486.MakeConst(c, max, x.form); DevCPL486.GenComp(c, x); - IF min # 0 THEN - DevCPL486.GenAssert(ccLE, ranTrap); - c.offset := min; DevCPL486.GenComp(c, x); - DevCPL486.GenAssert(ccGE, ranTrap) - ELSIF max # 0 THEN - DevCPL486.GenAssert(ccBE, ranTrap) - ELSE - DevCPL486.GenAssert(ccNS, ranTrap) - END - END - END Check; - - PROCEDURE Floor (VAR x: DevCPL486.Item; useSt1: BOOLEAN); - VAR c: DevCPL486.Item; local: DevCPL486.Label; - BEGIN - IF useSt1 THEN DevCPL486.GenFMOp(5D1H); (* FST ST1 *) - ELSE DevCPL486.GenFMOp(1C0H); (* FLD ST0 *) - END; - DevCPL486.GenFMOp(1FCH); (* FRNDINT *) - DevCPL486.GenFMOp(0D1H); (* FCOM *) - CheckAv(AX); - DevCPL486.GenFMOp(FSTSW); - DevCPL486.GenFMOp(5D9H); (* FSTP ST1 *) - (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; DevCPL486.GenJump(ccBE, local, TRUE); - DevCPL486.AllocConst(c, DevCPL486.one, Real32); - DevCPL486.GenFDOp(FSUB, c); - DevCPL486.SetLabel(local); - END Floor; - - PROCEDURE Entier(VAR x: DevCPL486.Item; typ: DevCPT.Struct; hint, stop: SET); - BEGIN - IF typ # DevCPT.intrealtyp THEN Floor(x, FALSE) END; - DevCPL486.GenFStore(x, TRUE); - IF (x.mode = Stk) & (stk IN stop) THEN Pop(x, x.form, hint, stop) END - END Entier; - - PROCEDURE ConvMove (VAR x, y: DevCPL486.Item; sysval: BOOLEAN; hint, stop: SET); (* x := y *) - (* scalar values only, y.mode # Con, all kinds of conversions, x.mode = Undef => convert y only *) - VAR f, m: BYTE; s: INTEGER; z: DevCPL486.Item; - BEGIN - f := x.form; m := x.mode; ASSERT(m IN {Undef, Reg, Abs, Ind, Stk}); - IF y.form IN {Real32, Real64} THEN - IF f IN {Real32, Real64} THEN - IF m = Undef THEN - IF (y.form = Real64) & (f = Real32) THEN - IF y.mode # Reg THEN LoadR(y) END; - Free(y); DecStack(Real32); y.mode := Stk; y.form := Real32; DevCPL486.GenFStore(y, TRUE) - END - ELSE - IF y.mode # Reg THEN LoadR(y) END; - IF m = Stk THEN DecStack(f) END; - IF m # Reg THEN Free(y); DevCPL486.GenFStore(x, TRUE) END; - END - ELSE (* x not real *) - IF sysval THEN - IF y.mode = Reg THEN Free(y); - IF (m # Stk) & (m # Undef) & (m # Reg) & (f >= Int32) THEN - x.form := y.form; DevCPL486.GenFStore(x, TRUE); x.form := f - ELSE - ASSERT(y.form # Real64); - DecStack(y.form); y.mode := Stk; DevCPL486.GenFStore(y, TRUE); y.form := Int32; - IF m # Stk THEN - Pop(y, y.form, hint, stop); - IF f < Int16 THEN ASSERT(y.reg < 4) END; - y.form := f; - IF m # Undef THEN Free(y); DevCPL486.GenMove(y, x) END - END - END - ELSE (* y.mode # Reg *) - y.form := f; - IF m # Undef THEN LoadW(y, hint, stop); Free(y); - IF m = Stk THEN DevCPL486.GenPush(y) ELSE DevCPL486.GenMove(y, x) END - END - END - ELSE (* not sysval *) - IF y.mode # Reg THEN LoadR(y) END; - Free(y); - IF (m # Stk) & (m # Undef) & (m # Reg) & (f >= Int16) & (f # Char16) THEN - Entier(x, y.typ, hint, stop); - ELSE - DecStack(f); y.mode := Stk; - IF (f < Int16) OR (f = Char16) THEN y.form := Int32 ELSE y.form := f END; - IF m = Stk THEN Entier(y, y.typ, {}, {}) - ELSIF m = Undef THEN Entier(y, y.typ, hint, stop) - ELSE Entier(y, y.typ, hint, stop + {stk}) - END; - IF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Char16 THEN Check(y, 0, 65536); FreeHi(y) - END; - y.form := f; - IF (m # Undef) & (m # Stk) THEN - IF f = Int64 THEN - Free(y); y.form := Int32; z := x; z.form := Int32; DevCPL486.GenMove(y, z); - IF z.mode = Reg THEN z.reg := z.index ELSE INC(z.offset, 4) END; - y.reg := y.index; DevCPL486.GenMove(y, z); - ELSE - Free(y); DevCPL486.GenMove(y, x); - END - END - END - END - END - ELSE (* y not real *) - IF sysval THEN - IF (y.form < Int16) & (f >= Int16) OR (y.form IN {Int16, Char16}) & (f >= Int32) & (f < Char16) THEN LoadL(y, hint, stop) END; - IF (y.form >= Int16) & (f < Int16) THEN FreeHi(y) END - ELSE - CASE y.form OF - | Byte, Bool: - IF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int16 THEN LoadL(y, hint, stop) - END - | Char8: - IF f = Int8 THEN Check(y, 0, 0) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int16 THEN LoadL(y, hint, stop) - END - | Char16: - IF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Int16 THEN Check(y, 0, 0) - ELSIF f = Char16 THEN (* ok *) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int32 THEN LoadL(y, hint, stop) - END - | Int8: - IF f = Char8 THEN Check(y, 0, 0) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF f >= Int16 THEN LoadL(y, hint, stop) - END - | Int16: - IF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Char16 THEN Check(y, 0, 0) - ELSIF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - ELSIF (f = Int32) OR (f = Set) THEN LoadL(y, hint, stop) - END - | Int32, Set, Pointer, ProcTyp: - IF f = Char8 THEN Check(y, 0, 255); FreeHi(y) - ELSIF f = Char16 THEN Check(y, 0, 65536) - ELSIF f = Int8 THEN Check(y, -128, 127); FreeHi(y) - ELSIF f = Int16 THEN Check(y, -32768, 32767) - ELSIF f = Int64 THEN LoadLong(y, hint, stop) - END - | Int64: - IF f IN {Bool..Int32, Char16} THEN - (* make range checks !!! *) - FreeHi(y) - END - END - END; - IF f IN {Real32, Real64} THEN - IF sysval THEN - IF (m # Undef) & (m # Reg) THEN - IF y.mode # Reg THEN LoadW(y, hint, stop) END; - Free(y); - IF m = Stk THEN DevCPL486.GenPush(y) - ELSE x.form := Int32; DevCPL486.GenMove(y, x); x.form := f - END - ELSE - IF y.mode = Reg THEN Push(y) END; - y.form := f; - IF m = Reg THEN LoadR(y) END - END - ELSE (* not sysval *) (* int -> float *) - IF y.mode = Reg THEN Push(y) END; - IF m = Stk THEN - Free(y); DevCPL486.GenFLoad(y); s := -4; - IF f = Real64 THEN DEC(s, 4) END; - IF y.mode = Stk THEN - IF y.form = Int64 THEN INC(s, 8) ELSE INC(s, 4) END - END; - IF s # 0 THEN AdjustStack(s) END; - GetReg(y, Real32, {}, {}); - Free(y); DevCPL486.GenFStore(x, TRUE) - ELSIF m = Reg THEN - LoadR(y) - ELSIF m # Undef THEN - LoadR(y); Free(y); DevCPL486.GenFStore(x, TRUE) - END - END - ELSE - y.form := f; - IF m = Stk THEN - IF ((f < Int32) OR (f = Char16)) & (y.mode # Reg) THEN LoadW(y, hint, stop) END; - Push(y) - ELSIF m # Undef THEN - IF f = Int64 THEN - IF y.mode # Reg THEN LoadLong(y, hint, stop) END; - Free(y); y.form := Int32; z := x; z.form := Int32; DevCPL486.GenMove(y, z); - IF z.mode = Reg THEN ASSERT(z.reg # y.index); z.reg := z.index ELSE INC(z.offset, 4) END; - y.reg := y.index; DevCPL486.GenMove(y, z); - ELSE - IF y.mode # Reg THEN LoadW(y, hint, stop) END; - Free(y); DevCPL486.GenMove(y, x) - END - END - END - END - END ConvMove; - - PROCEDURE Convert* (VAR x: DevCPL486.Item; f: BYTE; size: INTEGER; hint, stop: SET); (* size >= 0: sysval *) - VAR y: DevCPL486.Item; - BEGIN - ASSERT(x.mode # Con); - IF (size >= 0) - & ((size # x.typ.size) & ((size > 4) OR (x.typ.size > 4)) - OR (f IN {Comp, Real64, Int64}) & (x.mode IN {Reg, Stk})) THEN DevCPM.err(220) END; -(* - IF sysval & ((x.form = Real64) & ~(f IN {Comp, Int64}) OR (f = Real64) & ~(x.form IN {Comp, Int64})) THEN DevCPM.err(220) END; -*) - y.mode := Undef; y.form := f; ConvMove(y, x, size >= 0, hint, stop) - END Convert; - - PROCEDURE LoadCond* (VAR x, y: DevCPL486.Item; F, T: DevCPL486.Label; hint, stop: SET); - VAR end, T1: DevCPL486.Label; c, r: DevCPL486.Item; - BEGIN - IF mem IN stop THEN GetReg(x, Bool, hint, stop) END; - IF (F = DevCPL486.NewLbl) & (T = DevCPL486.NewLbl) THEN (* no label used *) - DevCPL486.GenSetCC(y.offset, x) - ELSE - end := DevCPL486.NewLbl; T1 := DevCPL486.NewLbl; - DevCPL486.GenJump(y.offset, T1, TRUE); (* T1 to enable short jump *) - DevCPL486.SetLabel(F); - DevCPL486.MakeConst(c, 0, Bool); DevCPL486.GenMove(c, x); - DevCPL486.GenJump(ccAlways, end, TRUE); - DevCPL486.SetLabel(T); DevCPL486.SetLabel(T1); - DevCPL486.MakeConst(c, 1, Bool); DevCPL486.GenMove(c, x); - DevCPL486.SetLabel(end) - END; - IF x.mode # Reg THEN Free(x) END - END LoadCond; - - PROCEDURE IntDOp* (VAR x, y: DevCPL486.Item; subcl: BYTE; rev: BOOLEAN); - VAR local: DevCPL486.Label; - BEGIN - ASSERT((x.mode = Reg) OR (y.mode = Reg) OR (y.mode = Con)); - CASE subcl OF - | eql..geq: - DevCPL486.GenComp(y, x); Free(x); - setCC(x, subcl, rev, x.typ.form IN {Int8..Int32}) - | times: - IF x.form = Set THEN DevCPL486.GenAnd(y, x) ELSE DevCPL486.GenMul(y, x, ovflchk) END - | slash: - DevCPL486.GenXor(y, x) - | plus: - IF x.form = Set THEN DevCPL486.GenOr(y, x) ELSE DevCPL486.GenAdd(y, x, ovflchk) END - | minus, msk: - IF (x.form = Set) OR (subcl = msk) THEN (* and not *) - IF rev THEN DevCPL486.GenNot(x); DevCPL486.GenAnd(y, x) (* y and not x *) - ELSIF y.mode = Con THEN y.offset := -1 - y.offset; DevCPL486.GenAnd(y, x) (* x and y' *) - ELSIF y.mode = Reg THEN DevCPL486.GenNot(y); DevCPL486.GenAnd(y, x) (* x and not y *) - ELSE DevCPL486.GenNot(x); DevCPL486.GenOr(y, x); DevCPL486.GenNot(x) (* not (not x or y) *) - END - ELSE (* minus *) - IF rev THEN (* y - x *) - IF (y.mode = Con) & (y.offset = -1) THEN DevCPL486.GenNot(x) - ELSE DevCPL486.GenNeg(x, ovflchk); DevCPL486.GenAdd(y, x, ovflchk) (* ??? *) - END - ELSE (* x - y *) - DevCPL486.GenSub(y, x, ovflchk) - END - END - | min, max: - local := DevCPL486.NewLbl; - DevCPL486.GenComp(y, x); - IF subcl = min THEN - IF x.typ.form IN {Char8, Char16} THEN DevCPL486.GenJump(ccBE, local, TRUE) - ELSE DevCPL486.GenJump(ccLE, local, TRUE) - END - ELSE - IF x.typ.form IN {Char8, Char16} THEN DevCPL486.GenJump(ccAE, local, TRUE) - ELSE DevCPL486.GenJump(ccGE, local, TRUE) - END - END; - DevCPL486.GenMove(y, x); - DevCPL486.SetLabel(local) - END; - Free(y); - IF x.mode # Reg THEN Free(x) END - END IntDOp; - - PROCEDURE LargeInc* (VAR x, y: DevCPL486.Item; dec: BOOLEAN); (* INC(x, y) or DEC(x, y) *) - BEGIN - ASSERT(x.form = Int64); - IF ~(y.mode IN {Reg, Con}) THEN LoadLong(y, {}, {}) END; - Free(x); Free(y); x.form := Int32; y.form := Int32; - IF dec THEN DevCPL486.GenSubC(y, x, TRUE, FALSE) ELSE DevCPL486.GenAddC(y, x, TRUE, FALSE) END; - INC(x.offset, 4); - IF y.mode = Reg THEN y.reg := y.index ELSE y.offset := y.scale END; - IF dec THEN DevCPL486.GenSubC(y, x, FALSE, ovflchk) ELSE DevCPL486.GenAddC(y, x, FALSE, ovflchk) END; - END LargeInc; - - PROCEDURE FloatDOp* (VAR x, y: DevCPL486.Item; subcl: BYTE; rev: BOOLEAN); - VAR local: DevCPL486.Label; a, b: DevCPL486.Item; - BEGIN - ASSERT(x.mode = Reg); - IF y.form = Int64 THEN LoadR(y) END; - IF y.mode = Reg THEN rev := ~rev END; - CASE subcl OF - | eql..geq: DevCPL486.GenFDOp(FCOMP, y) - | times: DevCPL486.GenFDOp(FMUL, y) - | slash: IF rev THEN DevCPL486.GenFDOp(FDIVR, y) ELSE DevCPL486.GenFDOp(FDIV, y) END - | plus: DevCPL486.GenFDOp(FADD, y) - | minus: IF rev THEN DevCPL486.GenFDOp(FSUBR, y) ELSE DevCPL486.GenFDOp(FSUB, y) END - | min, max: - IF y.mode = Reg THEN - DevCPL486.GenFMOp(0D1H); (* FCOM ST1 *) - CheckAv(AX); DevCPL486.GenFMOp(FSTSW); (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; - IF subcl = min THEN DevCPL486.GenJump(ccAE, local, TRUE) ELSE DevCPL486.GenJump(ccBE, local, TRUE) END; - DevCPL486.GenFMOp(5D1H); (* FST ST1 *) - DevCPL486.SetLabel(local); - DevCPL486.GenFMOp(5D8H) (* FSTP ST0 *) - ELSE - DevCPL486.GenFDOp(FCOM, y); - CheckAv(AX); DevCPL486.GenFMOp(FSTSW); (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; - IF subcl = min THEN DevCPL486.GenJump(ccBE, local, TRUE) ELSE DevCPL486.GenJump(ccAE, local, TRUE) END; - DevCPL486.GenFMOp(5D8H); (* FSTP ST0 *) - DevCPL486.GenFLoad(y); - DevCPL486.SetLabel(local) - END - (* largeint support *) - | div: - IF rev THEN DevCPL486.GenFDOp(FDIVR, y) ELSE DevCPL486.GenFDOp(FDIV, y) END; - Floor(y, FALSE) - | mod: - IF y.mode # Reg THEN LoadR(y); rev := ~rev END; - IF rev THEN DevCPL486.GenFMOp(1C9H); (* FXCH ST1 *) END; - DevCPL486.GenFMOp(1F8H); (* FPREM *) - DevCPL486.GenFMOp(1E4H); (* FTST *) - CheckAv(AX); - DevCPL486.GenFMOp(FSTSW); - DevCPL486.MakeReg(a, AX, Int32); GetReg(b, Int32, {}, {AX}); - DevCPL486.GenMove(a, b); - DevCPL486.GenFMOp(0D1H); (* FCOM *) - DevCPL486.GenFMOp(FSTSW); - DevCPL486.GenXor(b, a); Free(b); - (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - local := DevCPL486.NewLbl; DevCPL486.GenJump(ccBE, local, TRUE); - DevCPL486.GenFMOp(0C1H); (* FADD ST1 *) - DevCPL486.SetLabel(local); - DevCPL486.GenFMOp(5D9H); (* FSTP ST1 *) - | ash: - IF y.mode # Reg THEN LoadR(y); rev := ~rev END; - IF rev THEN DevCPL486.GenFMOp(1C9H); (* FXCH ST1 *) END; - DevCPL486.GenFMOp(1FDH); (* FSCALE *) - Floor(y, TRUE) - END; - IF y.mode = Stk THEN IncStack(y.form) END; - Free(y); - IF (subcl >= eql) & (subcl <= geq) THEN - Free(x); CheckAv(AX); - DevCPL486.GenFMOp(FSTSW); - (* DevCPL486.GenCode(WAIT); *) DevCPL486.GenCode(SAHF); - setCC(x, subcl, rev, FALSE) - END - END FloatDOp; - - PROCEDURE IntMOp* (VAR x: DevCPL486.Item; subcl: BYTE); - VAR L: DevCPL486.Label; c: DevCPL486.Item; - BEGIN - CASE subcl OF - | minus: - IF x.form = Set THEN DevCPL486.GenNot(x) ELSE DevCPL486.GenNeg(x, ovflchk) END - | abs: - L := DevCPL486.NewLbl; DevCPL486.MakeConst(c, 0, x.form); - DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccNS, L, TRUE); - DevCPL486.GenNeg(x, ovflchk); - DevCPL486.SetLabel(L) - | cap: - DevCPL486.MakeConst(c, -1 - 20H, x.form); - DevCPL486.GenAnd(c, x) - | not: - DevCPL486.MakeConst(c, 1, x.form); - DevCPL486.GenXor(c, x) - END; - IF x.mode # Reg THEN Free(x) END - END IntMOp; - - PROCEDURE FloatMOp* (VAR x: DevCPL486.Item; subcl: BYTE); - BEGIN - ASSERT(x.mode = Reg); - IF subcl = minus THEN DevCPL486.GenFMOp(FCHS) - ELSE ASSERT(subcl = abs); DevCPL486.GenFMOp(FABS) - END - END FloatMOp; - - PROCEDURE MakeSet* (VAR x: DevCPL486.Item; range, neg: BOOLEAN; hint, stop: SET); - (* range neg result - F F {x} - F T -{x} - T F {x..31} - T T -{0..x} *) - VAR c, r: DevCPL486.Item; val: INTEGER; - BEGIN - IF x.mode = Con THEN - IF range THEN - IF neg THEN val := -2 ELSE val := -1 END; - x.offset := SYSTEM.LSH(val, x.offset) - ELSE - val := 1; x.offset := SYSTEM.LSH(val, x.offset); - IF neg THEN x.offset := -1 - x.offset END - END - ELSE - Check(x, 0, 31); - IF neg THEN val := -2 - ELSIF range THEN val := -1 - ELSE val := 1 - END; - DevCPL486.MakeConst(c, val, Set); GetReg(r, Set, hint, stop); DevCPL486.GenMove(c, r); - IF range THEN DevCPL486.GenShiftOp(SHL, x, r) ELSE DevCPL486.GenShiftOp(ROL, x, r) END; - Free(x); x.reg := r.reg - END; - x.typ := DevCPT.settyp; x.form := Set - END MakeSet; - - PROCEDURE MakeCond* (VAR x: DevCPL486.Item); - VAR c: DevCPL486.Item; - BEGIN - IF x.mode = Con THEN - setCC(x, SHORT(SHORT(x.offset)), FALSE, FALSE) - ELSE - DevCPL486.MakeConst(c, 0, x.form); - DevCPL486.GenComp(c, x); Free(x); - setCC(x, neq, FALSE, FALSE) - END - END MakeCond; - - PROCEDURE Not* (VAR x: DevCPL486.Item); - VAR a: INTEGER; - BEGIN - x.offset := Inverted(x.offset); (* invert cc *) - END Not; - - PROCEDURE Odd* (VAR x: DevCPL486.Item); - VAR c: DevCPL486.Item; - BEGIN - IF x.mode = Stk THEN Pop(x, x.form, {}, {}) END; - Free(x); DevCPL486.MakeConst(c, 1, x.form); - IF x.mode = Reg THEN - IF x.form IN {Int16, Int64} THEN x.form := Int32; c.form := Int32 END; - DevCPL486.GenAnd(c, x) - ELSE - c.form := Int8; x.form := Int8; DevCPL486.GenTest(c, x) - END; - setCC(x, neq, FALSE, FALSE) - END Odd; - - PROCEDURE In* (VAR x, y: DevCPL486.Item); - BEGIN - IF y.form = Set THEN Check(x, 0, 31) END; - DevCPL486.GenBitOp(BT, x, y); Free(x); Free(y); - setCC(x, lss, FALSE, FALSE); (* carry set *) - END In; - - PROCEDURE Shift* (VAR x, y: DevCPL486.Item; subcl: BYTE); (* ASH, LSH, ROT *) - VAR L1, L2: DevCPL486.Label; c: DevCPL486.Item; opl, opr: INTEGER; - BEGIN - IF subcl = ash THEN opl := SHL; opr := SAR - ELSIF subcl = lsh THEN opl := SHL; opr := SHR - ELSE opl := ROL; opr := ROR - END; - IF y.mode = Con THEN - IF y.offset > 0 THEN - DevCPL486.GenShiftOp(opl, y, x) - ELSIF y.offset < 0 THEN - y.offset := -y.offset; - DevCPL486.GenShiftOp(opr, y, x) - END - ELSE - ASSERT(y.mode = Reg); - Check(y, -31, 31); - L1 := DevCPL486.NewLbl; L2 := DevCPL486.NewLbl; - DevCPL486.MakeConst(c, 0, y.form); DevCPL486.GenComp(c, y); - DevCPL486.GenJump(ccNS, L1, TRUE); - DevCPL486.GenNeg(y, FALSE); - DevCPL486.GenShiftOp(opr, y, x); - DevCPL486.GenJump(ccAlways, L2, TRUE); - DevCPL486.SetLabel(L1); - DevCPL486.GenShiftOp(opl, y, x); - DevCPL486.SetLabel(L2); - Free(y) - END; - IF x.mode # Reg THEN Free(x) END - END Shift; - - PROCEDURE DivMod* (VAR x, y: DevCPL486.Item; mod: BOOLEAN); - VAR s: SET; r: DevCPL486.Item; pos: BOOLEAN; - BEGIN - ASSERT((x.mode = Reg) & (x.reg = AX)); pos := FALSE; - IF y.mode = Con THEN pos := (y.offset > 0) & (y.obj = NIL); Load(y, {}, {AX, DX, con}) END; - DevCPL486.GenDiv(y, mod, pos); Free(y); - IF mod THEN - r := x; GetReg(x, x.form, {}, wreg - {AX, DX}); Free(r) (* ax -> dx; al -> ah *) (* ??? *) - END - END DivMod; - - PROCEDURE Mem* (VAR x: DevCPL486.Item; offset: INTEGER; typ: DevCPT.Struct); (* x := Mem[x+offset] *) - BEGIN - IF x.mode = Con THEN x.mode := Abs; x.obj := NIL; INC(x.offset, offset) - ELSE ASSERT(x.mode = Reg); x.mode := Ind; x.offset := offset - END; - x.scale := 0; x.typ := typ; x.form := typ.form - END Mem; - - PROCEDURE SysMove* (VAR len: DevCPL486.Item); (* implementation of SYSTEM.MOVE *) - BEGIN - IF len.mode = Con THEN - IF len.offset > 0 THEN DevCPL486.GenBlockMove(1, len.offset) END - ELSE - Load(len, {}, wreg - {CX} + {short, mem, stk}); DevCPL486.GenBlockMove(1, 0); Free(len) - END; - FreeWReg(SI); FreeWReg(DI) - END SysMove; - - PROCEDURE Len* (VAR x, y: DevCPL486.Item); - VAR typ: DevCPT.Struct; dim: INTEGER; - BEGIN - dim := y.offset; typ := x.typ; - IF typ.untagged THEN DevCPM.err(136) END; - WHILE dim > 0 DO typ := typ.BaseTyp; DEC(dim) END; - LenDesc(x, x, typ); - END Len; - - PROCEDURE StringWSize (VAR x: DevCPL486.Item): INTEGER; - BEGIN - CASE x.form OF - | String8, VString8: RETURN 1 - | String16, VString16: RETURN 2 - | VString16to8: RETURN 0 - | Comp: RETURN x.typ.BaseTyp.size - END - END StringWSize; - - PROCEDURE CmpString* (VAR x, y: DevCPL486.Item; rel: BYTE; rev: BOOLEAN); - VAR sw, dw: INTEGER; - BEGIN - CheckAv(CX); - IF (x.typ = DevCPT.guidtyp) OR (y.typ = DevCPT.guidtyp) THEN - DevCPL486.GenBlockComp(4, 4) - ELSIF x.form = String8 THEN DevCPL486.GenBlockComp(1, x.index) - ELSIF y.form = String8 THEN DevCPL486.GenBlockComp(1, y.index) - ELSIF x.form = String16 THEN DevCPL486.GenBlockComp(2, x.index) - ELSIF y.form = String16 THEN DevCPL486.GenBlockComp(2, y.index) - ELSE DevCPL486.GenStringComp(StringWSize(y), StringWSize(x)) - END; - FreeWReg(SI); FreeWReg(DI); setCC(x, rel, ~rev, FALSE); - END CmpString; - - PROCEDURE VarParDynArr (ftyp: DevCPT.Struct; VAR y: DevCPL486.Item); - VAR len, z: DevCPL486.Item; atyp: DevCPT.Struct; - BEGIN - atyp := y.typ; - WHILE ftyp.comp = DynArr DO - IF ftyp.BaseTyp = DevCPT.bytetyp THEN - IF atyp.comp = DynArr THEN - IF atyp.untagged THEN DevCPM.err(137) END; - LenDesc(y, len, atyp); - IF y.tmode = VarPar THEN Free(len) END; (* ??? *) - GetReg(z, Int32, {}, {}); DevCPL486.GenMove(len, z); - len.mode := Reg; len.reg := z.reg; atyp := atyp.BaseTyp; - WHILE atyp.comp = DynArr DO - LenDesc(y, z, atyp); DevCPL486.GenMul(z, len, FALSE); - IF y.tmode = VarPar THEN Free(z) END; (* ??? *) - atyp := atyp.BaseTyp - END; - DevCPL486.MakeConst(z, atyp.size, Int32); DevCPL486.GenMul(z, len, FALSE); - Free(len) - ELSE - DevCPL486.MakeConst(len, atyp.size, Int32) - END - ELSE - IF atyp.comp = DynArr THEN LenDesc(y, len, atyp); - IF atyp.untagged THEN DevCPM.err(137) END; - IF y.tmode = VarPar THEN Free(len) END; (* ??? *) - ELSE DevCPL486.MakeConst(len, atyp.n, Int32) - END - END; - DevCPL486.GenPush(len); - ftyp := ftyp.BaseTyp; atyp := atyp.BaseTyp - END - END VarParDynArr; - - PROCEDURE Assign* (VAR x, y: DevCPL486.Item); (* x := y *) - BEGIN - IF y.mode = Con THEN - IF y.form IN {Real32, Real64} THEN - DevCPL486.GenFLoad(y); GetReg(y, Real32, {}, {}); - IF x.mode # Reg THEN Free(y); DevCPL486.GenFStore(x, TRUE) END (* ??? move const *) - ELSIF x.form = Int64 THEN - ASSERT(x.mode IN {Ind, Abs}); - y.form := Int32; x.form := Int32; DevCPL486.GenMove(y, x); - y.offset := y.scale; INC(x.offset, 4); DevCPL486.GenMove(y, x); - DEC(x.offset, 4); x.form := Int64 - ELSE - DevCPL486.GenMove(y, x) - END - ELSE - IF y.form IN {Comp, String8, String16, VString8, VString16} THEN (* convert to pointer *) - ASSERT(x.form = Pointer); - GetAdr(y, {}, {}); y.typ := x.typ; y.form := Pointer - END; - IF ~(x.form IN realSet) OR ~(y.form IN intSet) THEN Assert(y, {}, {stk}) END; - ConvMove(x, y, FALSE, {}, {}) - END; - Free(x) - END Assign; - - PROCEDURE ArrayLen* (VAR x, len: DevCPL486.Item; hint, stop: SET); - VAR c: DevCPL486.Item; - BEGIN - IF x.typ.comp = Array THEN DevCPL486.MakeConst(c, x.typ.n, Int32); GetReg(len, Int32, hint, stop); DevCPL486.GenMove(c, len) - ELSIF ~x.typ.untagged THEN LenDesc(x, c, x.typ); GetReg(len, Int32, hint, stop); DevCPL486.GenMove(c, len) - ELSE len.mode := Con - END; - len.typ := DevCPT.int32typ - END ArrayLen; - -(* - src dest zero -sx = sy x b y b -SHORT(lx) = sy x b+ x w y b -SHORT(lx) = SHORT(ly) x b+ x w y b+ - -lx = ly x w y w -LONG(sx) = ly x b y w * -LONG(SHORT(lx)) = ly x b+ x w* y w * - -sx := sy y b x b -sx := SHORT(ly) y b+ y w x b - -lx := ly y w x w -lx := LONG(sy) y b x w * -lx := LONG(SHORT(ly)) y b+ y w* x w * -*) - - PROCEDURE AddCopy* (VAR x, y: DevCPL486.Item; last: BOOLEAN); (* x := .. + y + .. *) - BEGIN - IF (x.typ.comp = DynArr) & x.typ.untagged THEN - DevCPL486.GenStringMove(~last, StringWSize(y), StringWSize(x), -1) - ELSE - DevCPL486.GenStringMove(~last, StringWSize(y), StringWSize(x), 0) - END; - FreeWReg(SI); FreeWReg(DI) - END AddCopy; - - PROCEDURE Copy* (VAR x, y: DevCPL486.Item; short: BOOLEAN); (* x := y *) - VAR sx, sy, sy2, sy4: INTEGER; c, r: DevCPL486.Item; - BEGIN - sx := x.typ.size; CheckAv(CX); - IF y.form IN {String8, String16} THEN - sy := y.index * y.typ.BaseTyp.size; - IF x.typ.comp = Array THEN (* adjust size for optimal performance *) - sy2 := sy + sy MOD 2; sy4 := sy2 + sy2 MOD 4; - IF sy4 <= sx THEN sy := sy4 - ELSIF sy2 <= sx THEN sy := sy2 - ELSIF sy > sx THEN DevCPM.err(114); sy := 1 - END - ELSIF inxchk & ~x.typ.untagged THEN (* check array length *) - Free(x); LenDesc(x, c, x.typ); - DevCPL486.MakeConst(y, y.index, Int32); - DevCPL486.GenComp(y, c); DevCPL486.GenAssert(ccAE, copyTrap); - Free(c) - END; - DevCPL486.GenBlockMove(1, sy) - ELSIF x.typ.comp = DynArr THEN - IF x.typ.untagged THEN - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), -1) - ELSE - Free(x); LenDesc(x, c, x.typ); DevCPL486.MakeReg(r, CX, Int32); DevCPL486.GenMove(c, r); Free(c); - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), 0) - END - ELSIF y.form IN {VString16to8, VString8, VString16} THEN - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), x.typ.n); - ASSERT(y.mode # Stk) - ELSIF short THEN (* COPY *) - sy := y.typ.size; - IF (y.typ.comp # DynArr) & (sy < sx) THEN sx := sy END; - DevCPL486.GenStringMove(FALSE, StringWSize(y), StringWSize(x), x.typ.n); - IF y.mode = Stk THEN AdjustStack(sy) END - ELSE (* := *) - IF sx > 0 THEN DevCPL486.GenBlockMove(1, sx) END; - IF y.mode = Stk THEN AdjustStack(sy) END - END; - FreeWReg(SI); FreeWReg(DI) - END Copy; - - PROCEDURE StrLen* (VAR x: DevCPL486.Item; typ: DevCPT.Struct; incl0x: BOOLEAN); - VAR c: DevCPL486.Item; - BEGIN - CheckAv(AX); CheckAv(CX); - DevCPL486.GenStringLength(typ.BaseTyp.size, -1); - Free(x); GetReg(x, Int32, {}, wreg - {CX}); - DevCPL486.GenNot(x); - IF ~incl0x THEN DevCPL486.MakeConst(c, 1, Int32); DevCPL486.GenSub(c, x, FALSE) END; - FreeWReg(DI) - END StrLen; - - PROCEDURE MulDim* (VAR y, z: DevCPL486.Item; VAR fact: INTEGER; dimtyp: DevCPT.Struct); (* z := z * y *) - VAR c: DevCPL486.Item; - BEGIN - IF y.mode = Con THEN fact := fact * y.offset - ELSE - IF ranchk OR inxchk THEN - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenComp(c, y); DevCPL486.GenAssert(ccG, ranTrap) - END; - DevCPL486.GenPush(y); - IF z.mode = Con THEN z := y - ELSE DevCPL486.GenMul(y, z, ovflchk OR inxchk); Free(y) - END - END - END MulDim; - - PROCEDURE SetDim* (VAR x, y: DevCPL486.Item; dimtyp: DevCPT.Struct); (* set LEN(x^, -dimtyp.n) *) - (* y const or on stack *) - VAR z: DevCPL486.Item; end: DevCPL486.Label; - BEGIN - ASSERT((x.mode = Reg) & (x.form = Pointer)); - z.mode := Ind; z.reg := x.reg; z.offset := ArrDOffs + 4 + dimtyp.n * 4; z.scale := 0; z.form := Int32; - IF y.mode = Con THEN y.form := Int32 - ELSE Pop(y, Int32, {}, {}) - END; - end := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, end, TRUE); (* flags set in New *) - DevCPL486.GenMove(y, z); - DevCPL486.SetLabel(end); - IF y.mode = Reg THEN Free(y) END - END SetDim; - - PROCEDURE SysNew* (VAR x: DevCPL486.Item); - BEGIN - DevCPM.err(141) - END SysNew; - - PROCEDURE New* (VAR x, nofel: DevCPL486.Item; fact: INTEGER); - (* x.typ.BaseTyp.comp IN {Record, Array, DynArr} *) - VAR p, tag, c: DevCPL486.Item; nofdim, dlen, n: INTEGER; typ, eltyp: DevCPT.Struct; lbl: DevCPL486.Label; - BEGIN - typ := x.typ.BaseTyp; - IF typ.untagged THEN DevCPM.err(138) END; - IF typ.comp = Record THEN (* call to Kernel.NewRec(tag: Tag): ADDRESS *) - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(typ); - IF ContainsIPtrs(typ) THEN INC(tag.offset) END; - DevCPL486.GenPush(tag); - p.mode := XProc; p.obj := DevCPE.KNewRec; - ELSE eltyp := typ.BaseTyp; - IF typ.comp = Array THEN - nofdim := 0; nofel.mode := Con; nofel.form := Int32; fact := typ.n - ELSE (* DynArr *) - nofdim := typ.n+1; - WHILE eltyp.comp = DynArr DO eltyp := eltyp.BaseTyp END - END ; - WHILE eltyp.comp = Array DO fact := fact * eltyp.n; eltyp := eltyp.BaseTyp END; - IF eltyp.comp = Record THEN - IF eltyp.untagged THEN DevCPM.err(138) END; - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(eltyp); - IF ContainsIPtrs(eltyp) THEN INC(tag.offset) END; - ELSIF eltyp.form = Pointer THEN - IF ~eltyp.untagged THEN - DevCPL486.MakeConst(tag, 0, Pointer) (* special TDesc in Kernel for ARRAY OF pointer *) - ELSIF eltyp.sysflag = interface THEN - DevCPL486.MakeConst(tag, -1, Pointer) (* special TDesc in Kernel for ARRAY OF interface pointer *) - ELSE - DevCPL486.MakeConst(tag, 12, Pointer) - END - ELSE (* eltyp is pointerless basic type *) - CASE eltyp.form OF - | Undef, Byte, Char8: n := 1; - | Int16: n := 2; - | Int8: n := 3; - | Int32: n := 4; - | Bool: n := 5; - | Set: n := 6; - | Real32: n := 7; - | Real64: n := 8; - | Char16: n := 9; - | Int64: n := 10; - | ProcTyp: n := 11; - END; - DevCPL486.MakeConst(tag, n, Pointer) -(* - DevCPL486.MakeConst(tag, eltyp.size, Pointer) -*) - END; - IF nofel.mode = Con THEN nofel.offset := fact; nofel.obj := NIL - ELSE DevCPL486.MakeConst(p, fact, Int32); DevCPL486.GenMul(p, nofel, ovflchk OR inxchk) - END; - DevCPL486.MakeConst(p, nofdim, Int32); DevCPL486.GenPush(p); - DevCPL486.GenPush(nofel); Free(nofel); DevCPL486.GenPush(tag); - p.mode := XProc; p.obj := DevCPE.KNewArr; - END; - DevCPL486.GenCall(p); GetReg(x, Pointer, {}, wreg - {AX}); - IF typ.comp = DynArr THEN (* set flags for nil test *) - DevCPL486.MakeConst(c, 0, Pointer); DevCPL486.GenComp(c, x) - ELSIF typ.comp = Record THEN - n := NumOfIntProc(typ); - IF n > 0 THEN (* interface method table pointer setup *) - DevCPL486.MakeConst(c, 0, Pointer); DevCPL486.GenComp(c, x); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE); - tag.offset := - 4 * (n + numPreIntProc); - p.mode := Ind; p.reg := AX; p.offset := 0; p.scale := 0; p.form := Pointer; - DevCPL486.GenMove(tag, p); - IF nofel.mode # Con THEN (* unk pointer setup *) - p.offset := 8; - DevCPL486.GenMove(nofel, p); - Free(nofel) - END; - DevCPL486.SetLabel(lbl); - END - END - END New; - - PROCEDURE Param* (fp: DevCPT.Object; rec, niltest: BOOLEAN; VAR ap, tag: DevCPL486.Item); (* returns tag if rec *) - VAR f: BYTE; s, ss: INTEGER; par, a, c: DevCPL486.Item; recTyp: DevCPT.Struct; - BEGIN - par.mode := Stk; par.typ := fp.typ; par.form := par.typ.form; - IF ODD(fp.sysflag DIV nilBit) THEN niltest := FALSE END; - IF ap.typ = DevCPT.niltyp THEN - IF ((par.typ.comp = Record) OR (par.typ.comp = DynArr)) & ~par.typ.untagged THEN - DevCPM.err(142) - END; - DevCPL486.GenPush(ap) - ELSIF par.typ.comp = DynArr THEN - IF ap.form IN {String8, String16} THEN - IF ~par.typ.untagged THEN - DevCPL486.MakeConst(c, ap.index (* * ap.typ.BaseTyp.size *), Int32); DevCPL486.GenPush(c) - END; - ap.mode := Con; DevCPL486.GenPush(ap); - ELSIF ap.form IN {VString8, VString16} THEN - DevCPL486.MakeReg(a, DX, Pointer); DevCPL486.GenLoadAdr(ap, a); - IF ~par.typ.untagged THEN - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenMove(a, c); - Free(ap); StrLen(c, ap.typ, TRUE); - DevCPL486.GenPush(c); Free(c) - END; - DevCPL486.GenPush(a) - ELSE - IF ~par.typ.untagged THEN - IF ap.typ.comp = DynArr THEN niltest := FALSE END; (* ap dereferenced for length descriptor *) - VarParDynArr(par.typ, ap) - END; - PushAdr(ap, niltest) - END - ELSIF fp.mode = VarPar THEN - recTyp := ap.typ; - IF recTyp.form = Pointer THEN recTyp := recTyp.BaseTyp END; - IF (par.typ.comp = Record) & (~fp.typ.untagged) THEN - Tag(ap, tag); - IF rec & (tag.mode # Con) THEN - GetReg(c, Pointer, {}, {}); DevCPL486.GenMove(tag, c); tag := c - END; - DevCPL486.GenPush(tag); - IF tag.mode # Con THEN niltest := FALSE END; - PushAdr(ap, niltest); - IF rec THEN Free(tag) END - ELSE PushAdr(ap, niltest) - END; - tag.typ := recTyp - ELSIF par.form = Comp THEN - s := par.typ.size; - IF initializeStr & (ap.form IN {String8, String16, VString8, VString16, VString16to8}) THEN - s := (s + 3) DIV 4 * 4; AdjustStack(-s); - IF ap.form IN {String8, String16} THEN - IF ap.index > 1 THEN (* nonempty string *) - ss := (ap.index * ap.typ.BaseTyp.size + 3) DIV 4 * 4; - DevCPL486.MakeReg(c, SI, Pointer); DevCPL486.GenLoadAdr(ap, c); Free(ap); - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c); - DevCPL486.GenBlockMove(1, ss); - ELSE - ss := 0; - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c) - END; - IF s > ss THEN - DevCPL486.MakeReg(a, AX, Int32); DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenMove(c, a); - DevCPL486.GenBlockStore(1, s - ss) - END; - ELSE - DevCPL486.MakeReg(c, SI, Pointer); DevCPL486.GenLoadAdr(ap, c); Free(ap); - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c); - DevCPL486.GenStringMove(TRUE, StringWSize(ap), StringWSize(par), par.typ.n); - DevCPL486.MakeReg(a, AX, Int32); DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenMove(c, a); - DevCPL486.GenBlockStore(StringWSize(par), 0) - END - ELSE - IF (ap.form IN {String8, String16}) & (ap.index = 1) THEN (* empty string *) - AdjustStack((4 - s) DIV 4 * 4); - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenPush(c) - ELSE - AdjustStack((-s) DIV 4 * 4); - DevCPL486.MakeReg(c, SI, Pointer); DevCPL486.GenLoadAdr(ap, c); Free(ap); - DevCPL486.MakeReg(c, DI, Pointer); DevCPL486.GenLoadAdr(par, c); - IF ap.form IN {String8, String16} THEN - DevCPL486.GenBlockMove(1, (ap.index * ap.typ.BaseTyp.size + 3) DIV 4 * 4) - ELSIF ap.form IN {VString8, VString16, VString16to8} THEN - DevCPL486.GenStringMove(FALSE, StringWSize(ap), StringWSize(par), par.typ.n) - ELSE - DevCPL486.GenBlockMove(1, (s + 3) DIV 4 * 4) - END - END - END - ELSIF ap.mode = Con THEN - IF ap.form IN {Real32, Real64} THEN (* ??? push const *) - DevCPL486.GenFLoad(ap); DecStack(par.typ.form); DevCPL486.GenFStore(par, TRUE) - ELSE - ap.form := Int32; - IF par.form = Int64 THEN DevCPL486.MakeConst(c, ap.scale, Int32); DevCPL486.GenPush(c) END; - DevCPL486.GenPush(ap) - END - ELSIF ap.typ.form = Pointer THEN - recTyp := ap.typ.BaseTyp; - IF rec THEN - Load(ap, {}, {}); Tag(ap, tag); - IF tag.mode = Con THEN (* explicit nil test needed *) - DevCPL486.MakeReg(a, AX, Int32); - c.mode := Ind; c.form := Int32; c.offset := 0; c.scale := 0; c.reg := ap.reg; - DevCPL486.GenTest(a, c) - END - END; - DevCPL486.GenPush(ap); Free(ap); - tag.typ := recTyp - ELSIF ap.form IN {Comp, String8, String16, VString8, VString16} THEN (* convert to pointer *) - ASSERT(par.form = Pointer); - PushAdr(ap, FALSE) - ELSE - ConvMove(par, ap, FALSE, {}, {high}); - END - END Param; - - PROCEDURE Result* (proc: DevCPT.Object; VAR res: DevCPL486.Item); - VAR r: DevCPL486.Item; - BEGIN - DevCPL486.MakeReg(r, AX, proc.typ.form); (* don't allocate AX ! *) - IF res.mode = Con THEN - IF r.form IN {Real32, Real64} THEN DevCPL486.GenFLoad(res); - ELSIF r.form = Int64 THEN - r.form := Int32; res.form := Int32; DevCPL486.GenMove(res, r); - r.reg := DX; res.offset := res.scale; DevCPL486.GenMove(res, r) - ELSE DevCPL486.GenMove(res, r); - END - ELSIF res.form IN {Comp, String8, String16, VString8, VString16} THEN (* convert to pointer *) - ASSERT(r.form = Pointer); - GetAdr(res, {}, wreg - {AX}) - ELSE - r.index := DX; (* for int64 *) - ConvMove(r, res, FALSE, wreg - {AX} + {high}, {}); - END; - Free(res) - END Result; - - PROCEDURE InitFpu; - VAR x: DevCPL486.Item; - BEGIN - DevCPL486.MakeConst(x, FpuControlRegister, Int32); DevCPL486.GenPush(x); - DevCPL486.GenFMOp(12CH); DevCPL486.GenCode(24H); (* FLDCW 0(SP) *) - DevCPL486.MakeReg(x, CX, Int32); DevCPL486.GenPop(x); (* reset stack *) - END InitFpu; - - PROCEDURE PrepCall* (proc: DevCPT.Object); - VAR lev: BYTE; r: DevCPL486.Item; - BEGIN - lev := proc.mnolev; - IF (slNeeded IN proc.conval.setval) & (imLevel[lev] > 0) & (imLevel[DevCPL486.level] > imLevel[lev]) THEN - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenPush(r) - END - END PrepCall; - - PROCEDURE Call* (VAR x, tag: DevCPL486.Item); (* TProc: tag.typ = actual receiver type *) - VAR i, n: INTEGER; r, y: DevCPL486.Item; typ: DevCPT.Struct; lev: BYTE; saved: BOOLEAN; p: DevCPT.Object; - BEGIN - IF x.mode IN {LProc, XProc, IProc} THEN - lev := x.obj.mnolev; saved := FALSE; - IF (slNeeded IN x.obj.conval.setval) & (imLevel[lev] > 0) THEN (* pass static link *) - n := imLevel[DevCPL486.level] - imLevel[lev]; - IF n > 0 THEN - saved := TRUE; - y.mode := Ind; y.scale := 0; y.form := Pointer; y.reg := BX; y.offset := -4; - DevCPL486.MakeReg(r, BX, Pointer); - WHILE n > 0 DO DevCPL486.GenMove(y, r); DEC(n) END - END - END; - DevCPL486.GenCall(x); - IF x.obj.sysflag = ccall THEN (* remove parameters *) - p := x.obj.link; n := 0; - WHILE p # NIL DO - IF p.mode = VarPar THEN INC(n, 4) - ELSE INC(n, (p.typ.size + 3) DIV 4 * 4) - END; - p := p.link - END; - AdjustStack(n) - END; - IF saved THEN DevCPL486.GenPop(r) END; - ELSIF x.mode = TProc THEN - IF x.scale = 1 THEN (* super *) - DevCPL486.MakeConst(tag, 0, Pointer); tag.obj := DevCPE.TypeObj(tag.typ.BaseTyp) - ELSIF x.scale = 2 THEN (* static call *) - DevCPL486.MakeConst(tag, 0, Pointer); typ := x.obj.link.typ; - IF typ.form = Pointer THEN typ := typ.BaseTyp END; - tag.obj := DevCPE.TypeObj(typ) - ELSIF x.scale = 3 THEN (* interface method call *) - DevCPM.err(200) - END; - IF tag.mode = Con THEN - y.mode := Abs; y.offset := tag.offset; y.obj := tag.obj; y.scale := 0 - ELSIF (x.obj.conval.setval * {absAttr, empAttr, extAttr} = {}) & ~(DevCPM.oberon IN DevCPM.options) THEN (* final method *) - y.mode := Abs; y.offset := 0; y.obj := DevCPE.TypeObj(tag.typ); y.scale := 0; - IF tag.mode = Ind THEN (* nil test *) - DevCPL486.MakeReg(r, AX, Int32); tag.offset := 0; DevCPL486.GenTest(r, tag) - END - ELSE - IF tag.mode = Reg THEN y.reg := tag.reg - ELSE GetReg(y, Pointer, {}, {}); DevCPL486.GenMove(tag, y) - END; - y.mode := Ind; y.offset := 0; y.scale := 0 - END; - IF (tag.typ.sysflag = interface) & (y.mode = Ind) THEN y.offset := 4 * x.offset - ELSIF tag.typ.untagged THEN DevCPM.err(140) - ELSE - IF x.obj.link.typ.sysflag = interface THEN (* correct method number *) - x.offset := numPreIntProc + NumOfIntProc(tag.typ) - 1 - x.offset - END; - INC(y.offset, Mth0Offset - 4 * x.offset) - END; - DevCPL486.GenCall(y); Free(y) - ELSIF x.mode = CProc THEN - IF x.obj.link # NIL THEN (* tag = first param *) - IF x.obj.link.mode = VarPar THEN - GetAdr(tag, {}, wreg - {AX} + {stk, mem, con}); Free(tag) - ELSE - (* Load(tag, {}, wreg - {AX} + {con}); Free(tag) *) - Result(x.obj.link, tag) (* use result load for first parameter *) - END - END; - i := 1; n := ORD(x.obj.conval.ext^[0]); - WHILE i <= n DO DevCPL486.GenCode(ORD(x.obj.conval.ext^[i])); INC(i) END - ELSE (* proc var *) - DevCPL486.GenCall(x); Free(x); - IF x.typ.sysflag = ccall THEN (* remove parameters *) - p := x.typ.link; n := 0; - WHILE p # NIL DO - IF p.mode = VarPar THEN INC(n, 4) - ELSE INC(n, (p.typ.size + 3) DIV 4 * 4) - END; - p := p.link - END; - AdjustStack(n) - END; - x.typ := x.typ.BaseTyp - END; - IF procedureUsesFpu & (x.mode = XProc) & (x.obj.mnolev < 0) & (x.obj.mnolev > -128) - & ((x.obj.library # NIL) OR (DevCPT.GlbMod[-x.obj.mnolev].library # NIL)) THEN (* restore fpu *) - InitFpu - END; - CheckReg; - IF x.typ.form = Int64 THEN - GetReg(x, Int32, {}, wreg - {AX}); GetReg(y, Int32, {}, wreg - {DX}); - x.index := y.reg; x.form := Int64 - ELSIF x.typ.form # NoTyp THEN GetReg(x, x.typ.form, {}, wreg - {AX} + {high}) - END - END Call; - - PROCEDURE CopyDynArray* (adr: INTEGER; typ: DevCPT.Struct); (* needs CX, SI, DI *) - VAR len, ptr, c, sp, src, dst: DevCPL486.Item; bt: DevCPT.Struct; - BEGIN - IF typ.untagged THEN DevCPM.err(-137) END; - ptr.mode := Ind; ptr.reg := BP; ptr.offset := adr+4; ptr.scale := 0; ptr.form := Pointer; - DevCPL486.MakeReg(len, CX, Int32); DevCPL486.MakeReg(sp, SP, Int32); - DevCPL486.MakeReg(src, SI, Int32); DevCPL486.MakeReg(dst, DI, Int32); - DevCPL486.GenMove(ptr, len); bt := typ.BaseTyp; - WHILE bt.comp = DynArr DO - INC(ptr.offset, 4); DevCPL486.GenMul(ptr, len, FALSE); bt := bt.BaseTyp - END; - ptr.offset := adr; DevCPL486.GenMove(ptr, src); - DevCPL486.MakeConst(c, bt.size, Int32); DevCPL486.GenMul(c, len, FALSE); - (* CX = length in bytes *) - StackAlloc; - (* CX = length in 32bit words *) - DevCPL486.GenMove(sp, dst); DevCPL486.GenMove(dst, ptr); - DevCPL486.GenBlockMove(4, 0) (* 32bit moves *) - END CopyDynArray; - - PROCEDURE Sort (VAR tab: ARRAY OF INTEGER; VAR n: INTEGER); - VAR i, j, x: INTEGER; - BEGIN - (* align *) - i := 1; - WHILE i < n DO - x := tab[i]; j := i-1; - WHILE (j >= 0) & (tab[j] < x) DO tab[j+1] := tab[j]; DEC(j) END; - tab[j+1] := x; INC(i) - END; - (* eliminate equals *) - i := 1; j := 1; - WHILE i < n DO - IF tab[i] # tab[i-1] THEN tab[j] := tab[i]; INC(j) END; - INC(i) - END; - n := j - END Sort; - - PROCEDURE FindPtrs (typ: DevCPT.Struct; adr: INTEGER; VAR num: INTEGER); - VAR fld: DevCPT.Object; btyp: DevCPT.Struct; i, n: INTEGER; - BEGIN - IF typ.form IN {Pointer, ProcTyp} THEN - IF num < MaxPtrs THEN ptrTab[num] := adr DIV 4 * 4 END; - INC(num); - IF adr MOD 4 # 0 THEN - IF num < MaxPtrs THEN ptrTab[num] := adr DIV 4 * 4 + 4 END; - INC(num) - END - ELSIF typ.comp = Record THEN - btyp := typ.BaseTyp; - IF btyp # NIL THEN FindPtrs(btyp, adr, num) END ; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF (fld.name^ = DevCPM.HdPtrName) OR - (fld.name^ = DevCPM.HdUtPtrName) OR - (fld.name^ = DevCPM.HdProcName) THEN - FindPtrs(DevCPT.sysptrtyp, fld.adr + adr, num) - ELSE FindPtrs(fld.typ, fld.adr + adr, num) - END; - fld := fld.link - END - ELSIF typ.comp = Array THEN - btyp := typ.BaseTyp; n := typ.n; - WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ; - IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN - i := num; FindPtrs(btyp, adr, num); - IF num # i THEN i := 1; - WHILE (i < n) & (num <= MaxPtrs) DO - INC(adr, btyp.size); FindPtrs(btyp, adr, num); INC(i) - END - END - END - END - END FindPtrs; - - PROCEDURE InitOutPar (par: DevCPT.Object; VAR zreg: DevCPL486.Item); - VAR x, y, c, len: DevCPL486.Item; lbl: DevCPL486.Label; size, s: INTEGER; bt: DevCPT.Struct; - BEGIN - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; x.offset := par.adr; - DevCPL486.MakeReg(y, DI, Int32); - IF par.typ.comp # DynArr THEN - DevCPL486.GenMove(x, y); - lbl := DevCPL486.NewLbl; - IF ODD(par.sysflag DIV nilBit) THEN - DevCPL486.GenComp(zreg, y); - DevCPL486.GenJump(ccE, lbl, TRUE) - END; - size := par.typ.size; - IF size <= 16 THEN - x.mode := Ind; x.reg := DI; x.form := Int32; x.offset := 0; - WHILE size > 0 DO - IF size = 1 THEN x.form := Int8; s := 1 - ELSIF size = 2 THEN x.form := Int16; s := 2 - ELSE x.form := Int32; s := 4 - END; - zreg.form := x.form; DevCPL486.GenMove(zreg, x); INC(x.offset, s); DEC(size, s) - END; - zreg.form := Int32 - ELSE - DevCPL486.GenBlockStore(1, size) - END; - DevCPL486.SetLabel(lbl) - ELSIF initializeDyn & ~par.typ.untagged THEN (* untagged open arrays not initialized !!! *) - DevCPL486.GenMove(x, y); - DevCPL486.MakeReg(len, CX, Int32); - INC(x.offset, 4); DevCPL486.GenMove(x, len); (* first len *) - bt := par.typ.BaseTyp; - WHILE bt.comp = DynArr DO - INC(x.offset, 4); DevCPL486.GenMul(x, len, FALSE); bt := bt.BaseTyp - END; - size := bt.size; - IF size MOD 4 = 0 THEN size := size DIV 4; s := 4 - ELSIF size MOD 2 = 0 THEN size := size DIV 2; s := 2 - ELSE s := 1 - END; - DevCPL486.MakeConst(c, size, Int32); DevCPL486.GenMul(c, len, FALSE); - DevCPL486.GenBlockStore(s, 0) - END - END InitOutPar; - - PROCEDURE AllocAndInitAll (proc: DevCPT.Object; adr, size: INTEGER; VAR nofptrs: INTEGER); - VAR x, y, z, zero: DevCPL486.Item; par: DevCPT.Object; op: INTEGER; - BEGIN - op := 0; par := proc.link; - WHILE par # NIL DO (* count out parameters [with COM pointers] *) - IF (par.mode = VarPar) & (par.vis = outPar) & (initializeOut OR ContainsIPtrs(par.typ)) THEN INC(op) END; - par := par.link - END; - DevCPL486.MakeConst(zero, 0, Int32); - IF (op = 0) & (size <= 8) THEN (* use PUSH 0 *) - WHILE size > 0 DO DevCPL486.GenPush(zero); DEC(size, 4) END - ELSE - DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(zero, z); - IF size <= 32 THEN (* use PUSH reg *) - WHILE size > 0 DO DevCPL486.GenPush(z); DEC(size, 4) END - ELSE (* use string store *) - AdjustStack(-size); - DevCPL486.MakeReg(x, SP, Int32); DevCPL486.MakeReg(y, DI, Int32); DevCPL486.GenMove(x, y); - DevCPL486.GenBlockStore(1, size) - END; - IF op > 0 THEN - par := proc.link; - WHILE par # NIL DO (* init out parameters [with COM pointers] *) - IF (par.mode = VarPar) & (par.vis = outPar) & (initializeOut OR ContainsIPtrs(par.typ)) THEN InitOutPar(par, z) END; - par := par.link - END - END - END - END AllocAndInitAll; - - PROCEDURE AllocAndInitPtrs1 (proc: DevCPT.Object; adr, size: INTEGER; VAR nofptrs: INTEGER); (* needs AX *) - VAR i, base, a, gaps: INTEGER; x, z: DevCPL486.Item; obj: DevCPT.Object; - BEGIN - IF ptrinit & (proc.scope # NIL) THEN - nofptrs := 0; obj := proc.scope.scope; (* local variables *) - WHILE (obj # NIL) & (nofptrs <= MaxPtrs) DO - FindPtrs(obj.typ, obj.adr, nofptrs); - obj := obj.link - END; - IF (nofptrs > 0) & (nofptrs <= MaxPtrs) THEN - base := proc.conval.intval2; - Sort(ptrTab, nofptrs); i := 0; a := size + base; gaps := 0; - WHILE i < nofptrs DO - DEC(a, 4); - IF a # ptrTab[i] THEN a := ptrTab[i]; INC(gaps) END; - INC(i) - END; - IF a # base THEN INC(gaps) END; - IF (gaps <= (nofptrs + 1) DIV 2) & (size < stackAllocLimit) THEN - DevCPL486.MakeConst(z, 0, Pointer); - IF (nofptrs > 4) THEN x := z; DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(x, z) END; - i := 0; a := size + base; - WHILE i < nofptrs DO - DEC(a, 4); - IF a # ptrTab[i] THEN AdjustStack(ptrTab[i] - a); a := ptrTab[i] END; - DevCPL486.GenPush(z); INC(i) - END; - IF a # base THEN AdjustStack(base - a) END - ELSE - AdjustStack(-size); - DevCPL486.MakeConst(x, 0, Pointer); DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(x, z); - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; i := 0; - WHILE i < nofptrs DO - x.offset := ptrTab[i]; DevCPL486.GenMove(z, x); INC(i) - END - END - ELSE - AdjustStack(-size) - END - ELSE - nofptrs := 0; - AdjustStack(-size) - END - END AllocAndInitPtrs1; - - PROCEDURE InitPtrs2 (proc: DevCPT.Object; adr, size, nofptrs: INTEGER); (* needs AX, CX, DI *) - VAR x, y, z, zero: DevCPL486.Item; obj: DevCPT.Object; zeroed: BOOLEAN; i: INTEGER; lbl: DevCPL486.Label; - BEGIN - IF ptrinit THEN - zeroed := FALSE; DevCPL486.MakeConst(zero, 0, Pointer); - IF nofptrs > MaxPtrs THEN - DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(zero, z); zeroed := TRUE; - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; x.offset := adr; - DevCPL486.MakeReg(y, DI, Int32); DevCPL486.GenLoadAdr(x, y); - DevCPL486.GenStrStore(size) - END; - obj := proc.link; (* parameters *) - WHILE obj # NIL DO - IF (obj.mode = VarPar) & (obj.vis = outPar) THEN - nofptrs := 0; - IF obj.typ.comp = DynArr THEN (* currently not initialized *) - ELSE FindPtrs(obj.typ, 0, nofptrs) - END; - IF nofptrs > 0 THEN - IF ~zeroed THEN - DevCPL486.MakeReg(z, AX, Int32); DevCPL486.GenMove(zero, z); zeroed := TRUE - END; - x.mode := Ind; x.reg := BP; x.scale := 0; x.form := Pointer; x.offset := obj.adr; - DevCPL486.MakeReg(y, DI, Int32); DevCPL486.GenMove(x, y); - IF ODD(obj.sysflag DIV nilBit) THEN - DevCPL486.GenComp(zero, y); - lbl := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, lbl, TRUE) - END; - IF nofptrs > MaxPtrs THEN - DevCPL486.GenStrStore(obj.typ.size) - ELSE - Sort(ptrTab, nofptrs); - x.reg := DI; i := 0; - WHILE i < nofptrs DO - x.offset := ptrTab[i]; DevCPL486.GenMove(z, x); INC(i) - END - END; - IF ODD(obj.sysflag DIV nilBit) THEN DevCPL486.SetLabel(lbl) END - END - END; - obj := obj.link - END - END - END InitPtrs2; - - PROCEDURE NeedOutPtrInit (proc: DevCPT.Object): BOOLEAN; - VAR obj: DevCPT.Object; nofptrs: INTEGER; - BEGIN - IF ptrinit THEN - obj := proc.link; - WHILE obj # NIL DO - IF (obj.mode = VarPar) & (obj.vis = outPar) THEN - nofptrs := 0; - IF obj.typ.comp = DynArr THEN (* currently not initialized *) - ELSE FindPtrs(obj.typ, 0, nofptrs) - END; - IF nofptrs > 0 THEN RETURN TRUE END - END; - obj := obj.link - END - END; - RETURN FALSE - END NeedOutPtrInit; - - PROCEDURE Enter* (proc: DevCPT.Object; empty, useFpu: BOOLEAN); - VAR sp, fp, r, r1: DevCPL486.Item; par: DevCPT.Object; adr, size, np: INTEGER; - BEGIN - procedureUsesFpu := useFpu; - SetReg({AX, CX, DX, SI, DI}); - DevCPL486.MakeReg(fp, BP, Pointer); DevCPL486.MakeReg(sp, SP, Pointer); - IF proc # NIL THEN (* enter proc *) - DevCPL486.SetLabel(proc.adr); - IF (~empty OR NeedOutPtrInit(proc)) & (proc.sysflag # noframe) THEN - DevCPL486.GenPush(fp); - DevCPL486.GenMove(sp, fp); - adr := proc.conval.intval2; size := -adr; - IF isGuarded IN proc.conval.setval THEN - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, DI, Pointer); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, SI, Pointer); DevCPL486.GenPush(r); - r1.mode := Con; r1.form := Int32; r1.offset := proc.conval.intval - 8; r1.obj := NIL; - DevCPL486.GenPush(r1); - intHandler.used := TRUE; - r1.mode := Con; r1.form := Int32; r1.offset := 0; r1.obj := intHandler; - DevCPL486.GenPush(r1); - r1.mode := Abs; r1.form := Int32; r1.offset := 0; r1.scale := 0; r1.obj := NIL; - DevCPL486.GenCode(64H); DevCPL486.GenPush(r1); - DevCPL486.GenCode(64H); DevCPL486.GenMove(sp, r1); - DEC(size, 24) - ELSE - IF imVar IN proc.conval.setval THEN (* set down pointer *) - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenPush(r); DEC(size, 4) - END; - IF isCallback IN proc.conval.setval THEN - DevCPL486.MakeReg(r, DI, Pointer); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, SI, Pointer); DevCPL486.GenPush(r); DEC(size, 8) - END - END; - ASSERT(size >= 0); - IF initializeAll THEN - AllocAndInitAll(proc, adr, size, np) - ELSE - AllocAndInitPtrs1(proc, adr, size, np); (* needs AX *) - InitPtrs2(proc, adr, size, np); (* needs AX, CX, DI *) - END; - par := proc.link; (* parameters *) - WHILE par # NIL DO - IF (par.mode = Var) & (par.typ.comp = DynArr) THEN - CopyDynArray(par.adr, par.typ) - END; - par := par.link - END; - IF imVar IN proc.conval.setval THEN - DevCPL486.MakeReg(r, BX, Pointer); DevCPL486.GenMove(fp, r) - END - END - ELSIF ~empty THEN (* enter module *) - DevCPL486.GenPush(fp); - DevCPL486.GenMove(sp, fp); - DevCPL486.MakeReg(r, DI, Int32); DevCPL486.GenPush(r); - DevCPL486.MakeReg(r, SI, Int32); DevCPL486.GenPush(r) - END; - IF useFpu THEN InitFpu END - END Enter; - - PROCEDURE Exit* (proc: DevCPT.Object; empty: BOOLEAN); - VAR sp, fp, r, x: DevCPL486.Item; mode: SHORTINT; size: INTEGER; - BEGIN - DevCPL486.MakeReg(sp, SP, Pointer); DevCPL486.MakeReg(fp, BP, Pointer); - IF proc # NIL THEN (* exit proc *) - IF proc.sysflag # noframe THEN - IF ~empty OR NeedOutPtrInit(proc) THEN - IF isGuarded IN proc.conval.setval THEN (* remove exception frame *) - x.mode := Ind; x.reg := BP; x.offset := -24; x.scale := 0; x.form := Int32; - DevCPL486.MakeReg(r, CX, Int32); DevCPL486.GenMove(x, r); - x.mode := Abs; x.offset := 0; x.scale := 0; x.form := Int32; x.obj := NIL; - DevCPL486.GenCode(64H); DevCPL486.GenMove(r, x); - size := 12 - ELSE - size := 0; - IF imVar IN proc.conval.setval THEN INC(size, 4) END; - IF isCallback IN proc.conval.setval THEN INC(size, 8) END - END; - IF size > 0 THEN - x.mode := Ind; x.reg := BP; x.offset := -size; x.scale := 0; x.form := Int32; - DevCPL486.GenLoadAdr(x, sp); - IF size > 4 THEN - DevCPL486.MakeReg(r, SI, Int32); DevCPL486.GenPop(r); - DevCPL486.MakeReg(r, DI, Int32); DevCPL486.GenPop(r) - END; - IF size # 8 THEN - DevCPL486.MakeReg(r, BX, Int32); DevCPL486.GenPop(r) - END - ELSE - DevCPL486.GenMove(fp, sp) - END; - DevCPL486.GenPop(fp) - END; - IF proc.sysflag = ccall THEN DevCPL486.GenReturn(0) - ELSE DevCPL486.GenReturn(proc.conval.intval - 8) - END - END - ELSE (* exit module *) - IF ~empty THEN - DevCPL486.MakeReg(r, SI, Int32); DevCPL486.GenPop(r); - DevCPL486.MakeReg(r, DI, Int32); DevCPL486.GenPop(r); - DevCPL486.GenMove(fp, sp); DevCPL486.GenPop(fp) - END; - DevCPL486.GenReturn(0) - END - END Exit; - - PROCEDURE InstallStackAlloc*; - VAR name: ARRAY 32 OF SHORTCHAR; ax, cx, sp, c, x: DevCPL486.Item; l1, l2: DevCPL486.Label; - BEGIN - IF stkAllocLbl # DevCPL486.NewLbl THEN - DevCPL486.SetLabel(stkAllocLbl); - DevCPL486.MakeReg(ax, AX, Int32); - DevCPL486.MakeReg(cx, CX, Int32); - DevCPL486.MakeReg(sp, SP, Int32); - DevCPL486.GenPush(ax); - DevCPL486.MakeConst(c, -5, Int32); DevCPL486.GenAdd(c, cx, FALSE); - l1 := DevCPL486.NewLbl; DevCPL486.GenJump(ccNS, l1, TRUE); - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenMove(c, cx); - DevCPL486.SetLabel(l1); - DevCPL486.MakeConst(c, -4, Int32); DevCPL486.GenAnd(c, cx); - DevCPL486.GenMove(cx, ax); - DevCPL486.MakeConst(c, 4095, Int32); DevCPL486.GenAnd(c, ax); - DevCPL486.GenSub(ax, sp, FALSE); - DevCPL486.GenMove(cx, ax); - DevCPL486.MakeConst(c, 12, Int32); DevCPL486.GenShiftOp(SHR, c, ax); - l2 := DevCPL486.NewLbl; DevCPL486.GenJump(ccE, l2, TRUE); - l1 := DevCPL486.NewLbl; DevCPL486.SetLabel(l1); - DevCPL486.MakeConst(c, 0, Int32); DevCPL486.GenPush(c); - DevCPL486.MakeConst(c, 4092, Int32); DevCPL486.GenSub(c, sp, FALSE); - DevCPL486.MakeConst(c, -1, Int32); DevCPL486.GenAdd(c, ax, FALSE); - DevCPL486.GenJump(ccNE, l1, TRUE); - DevCPL486.SetLabel(l2); - DevCPL486.MakeConst(c, 8, Int32); DevCPL486.GenAdd(c, cx, FALSE); - x.mode := Ind; x.form := Int32; x.offset := -4; x.index := CX; x.reg := SP; x.scale := 1; - DevCPL486.GenMove(x, ax); - DevCPL486.GenPush(ax); - DevCPL486.GenMove(x, ax); - DevCPL486.MakeConst(c, 2, Int32); DevCPL486.GenShiftOp(SHR, c, cx); - DevCPL486.GenReturn(0); - name := "$StackAlloc"; DevCPE.OutRefName(name); - END - END InstallStackAlloc; - - PROCEDURE Trap* (n: INTEGER); - BEGIN - DevCPL486.GenAssert(ccNever, n) - END Trap; - - PROCEDURE Jump* (VAR L: DevCPL486.Label); - BEGIN - DevCPL486.GenJump(ccAlways, L, FALSE) - END Jump; - - PROCEDURE JumpT* (VAR x: DevCPL486.Item; VAR L: DevCPL486.Label); - BEGIN - DevCPL486.GenJump(x.offset, L, FALSE); - END JumpT; - - PROCEDURE JumpF* (VAR x: DevCPL486.Item; VAR L: DevCPL486.Label); - BEGIN - DevCPL486.GenJump(Inverted(x.offset), L, FALSE); - END JumpF; - - PROCEDURE CaseTableJump* (VAR x: DevCPL486.Item; low, high: INTEGER; VAR else: DevCPL486.Label); - VAR c: DevCPL486.Item; n: INTEGER; - BEGIN - n := high - low + 1; - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenSub(c, x, FALSE); - DevCPL486.MakeConst(c, n, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccAE, else, FALSE); - DevCPL486.GenCaseJump(x) - END CaseTableJump; - - PROCEDURE CaseJump* (VAR x: DevCPL486.Item; low, high: INTEGER; VAR this, else: DevCPL486.Label; tree, first: BOOLEAN); - VAR c: DevCPL486.Item; - BEGIN - IF high = low THEN - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenComp(c, x); - IF tree THEN DevCPL486.GenJump(ccG, else, FALSE) END; - DevCPL486.GenJump(ccE, this, FALSE) - ELSIF first THEN - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccL, else, FALSE); - DevCPL486.MakeConst(c, high, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccLE, this, FALSE); - ELSE - DevCPL486.MakeConst(c, high, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccG, else, FALSE); - DevCPL486.MakeConst(c, low, Int32); DevCPL486.GenComp(c, x); - DevCPL486.GenJump(ccGE, this, FALSE); - END - END CaseJump; - -BEGIN - imLevel[0] := 0 -END Dev0CPC486. diff --git a/new/Dev0/Mod/CPE.odc b/new/Dev0/Mod/CPE.odc deleted file mode 100644 index 3d1952b6aab2d4fc9a4d71aebc0c8c436c12007d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40043 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 W{P2JMg8u)-$?43W{k=b!nfc#hk#a=< diff --git a/new/Dev0/Mod/CPE.txt b/new/Dev0/Mod/CPE.txt deleted file mode 100644 index 798b19e..0000000 --- a/new/Dev0/Mod/CPE.txt +++ /dev/null @@ -1,1120 +0,0 @@ -MODULE Dev0CPE; - - (* THIS IS TEXT COPY OF CPE.odc *) - (* DO NOT EDIT *) - -(** - project = "BlackBox" - organization = "www.oberon.ch" - contributors = "Oberon microsystems, Robert Campbell" - version = "System/Rsrc/About" - copyright = "System/Rsrc/About" - license = "Docu/BB-License" - references = "ftp://ftp.inf.ethz.ch/pub/software/Oberon/OberonV4/Docu/OP2.Paper.ps" - changes = "" - issues = "" - -**) - - IMPORT SYSTEM, (* Dates, *) DevCPM := Dev0CPM, DevCPT := Dev0CPT; - - - CONST - (* item base modes (=object modes) *) - Var = 1; VarPar = 2; Con = 3; LProc = 6; XProc = 7; CProc = 9; IProc = 10; TProc = 13; - - (* structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - Char16 = 16; String16 = 17; Int64 = 18; Guid = 23; - - (* composite structure forms *) - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - (* object modes *) - Fld = 4; Typ = 5; Head = 12; - - (* module visibility of objects *) - internal = 0; external = 1; externalR = 2; inPar = 3; outPar = 4; - - (* history of imported objects *) - inserted = 0; same = 1; pbmodified = 2; pvmodified = 3; removed = 4; inconsistent = 5; - - (* attribute flags (attr.adr, struct.attribute, proc.conval.setval)*) - newAttr = 16; absAttr = 17; limAttr = 18; empAttr = 19; extAttr = 20; - - (* meta interface consts *) - mConst = 1; mTyp = 2; mVar = 3; mProc = 4; mField = 5; - mBool = 1; mChar8 = 2; mChar16 = 3; mInt8 = 4; mInt16 = 5; mInt32 = 6; - mReal32 = 7; mReal64 = 8; mSet = 9; mInt64 = 10; mAnyRec = 11; mAnyPtr = 12; mSysPtr = 13; - mProctyp = 0; mRecord = 1; mArray = 2; mPointer = 3; - mInternal = 1; mReadonly = 2; mPrivate = 3; mExported = 4; - mValue = 10; mInPar = 11; mOutPar = 12; mVarPar = 13; - mInterface = 32; mGuid = 33; mResult = 34; - - (* sysflag *) - untagged = 1; noAlign = 3; union = 7; interface = 10; - - (* fixup types *) - absolute = 100; relative = 101; copy = 102; table = 103; tableend = 104; short = 105; - - (* kernel flags *) - iptrs = 30; - - expAllFields = TRUE; - - (* implementation restrictions *) - CodeBlocks = 512; - CodeLength = 16384; - MaxNameTab = 800000H; - - useAllRef = FALSE; - outSignatures = TRUE; - - TYPE - CodeBlock = POINTER TO ARRAY CodeLength OF SHORTCHAR; - - VAR - pc*: INTEGER; - dsize*: INTEGER; (* global data size *) - KNewRec*, KNewArr*: DevCPT.Object; - closeLbl*: INTEGER; - CaseLinks*: DevCPT.LinkList; - - processor: INTEGER; - bigEndian: BOOLEAN; - procVarIndirect: BOOLEAN; - idx8, idx16, idx32, idx64, namex, nofptrs, headSize: INTEGER; - Const8, Const16, Const32, Const64, Code, Data, Meta, Mod, Proc, nameList, descList, untgd: DevCPT.Object; - outRef, outAllRef, outURef, outSrc, outObj: BOOLEAN; - codePos, srcPos: INTEGER; - options: SET; - code: ARRAY CodeBlocks OF CodeBlock; - actual: CodeBlock; - actIdx, blkIdx: INTEGER; - CodeOvF: BOOLEAN; - zero: ARRAY 16 OF SHORTCHAR; (* all 0X *) - imports: INTEGER; - dllList, dllLast: DevCPT.Object; - - - PROCEDURE GetLongWords* (con: DevCPT.Const; OUT hi, low: INTEGER); - CONST N = 4294967296.0; (* 2^32 *) - VAR rh, rl: REAL; - BEGIN - rl := con.intval; rh := con.realval / N; - IF rh >= MAX(INTEGER) + 1.0 THEN rh := rh - 1; rl := rl + N - ELSIF rh < MIN(INTEGER) THEN rh := rh + 1; rl := rl - N - END; - hi := SHORT(ENTIER(rh)); - rl := rl + (rh - hi) * N; - IF rl < 0 THEN hi := hi - 1; rl := rl + N - ELSIF rl >= N THEN hi := hi + 1; rl := rl - N - END; - IF rl >= MAX(INTEGER) + 1.0 THEN rl := rl - N END; - low := SHORT(ENTIER(rl)) -(* - hi := SHORT(ENTIER((con.realval + con.intval) / 4294967296.0)); - r := con.realval + con.intval - hi * 4294967296.0; - IF r > MAX(INTEGER) THEN r := r - 4294967296.0 END; - low := SHORT(ENTIER(r)) -*) - END GetLongWords; - - PROCEDURE GetRealWord* (con: DevCPT.Const; OUT x: INTEGER); - VAR r: SHORTREAL; - BEGIN - r := SHORT(con.realval); x := SYSTEM.VAL(INTEGER, r) - END GetRealWord; - - PROCEDURE GetRealWords* (con: DevCPT.Const; OUT hi, low: INTEGER); - TYPE A = ARRAY 2 OF INTEGER; - VAR a: A; - BEGIN - a := SYSTEM.VAL(A, con.realval); - IF DevCPM.LEHost THEN hi := a[1]; low := a[0] ELSE hi := a[0]; low := a[1] END - END GetRealWords; - - PROCEDURE IsSame (x, y: REAL): BOOLEAN; - BEGIN - RETURN (x = y) & ((x # 0.) OR (1. / x = 1. / y)) - END IsSame; - - PROCEDURE AllocConst* (con: DevCPT.Const; form: BYTE; VAR obj: DevCPT.Object; VAR adr: INTEGER); - VAR c: DevCPT.Const; - BEGIN - INCL(con.setval, form); - CASE form OF - | String8: - obj := Const8; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval2 # c.intval2) OR (con.ext^ # c.ext^)) DO c := c.link END; - IF c = NIL THEN adr := idx8; INC(idx8, (con.intval2 + 3) DIV 4 * 4) END - | String16: - obj := Const16; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval2 # c.intval2) OR (con.ext^ # c.ext^)) DO c := c.link END; - IF c = NIL THEN adr := idx16; INC(idx16, (con.intval2 + 1) DIV 2 * 4) END - | Int64: - obj := Const64; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval # c.intval2) OR (con.realval # c.realval)) DO - c := c.link - END; - IF c = NIL THEN con.intval2 := con.intval; adr := idx64; INC(idx64, 8) END - | Real32: - obj := Const32; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR ~IsSame(con.realval, c.realval)) DO c := c.link END; - IF c = NIL THEN adr := idx32; INC(idx32, 4) END - | Real64: - obj := Const64; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR ~IsSame(con.realval, c.realval)) DO c := c.link END; - IF c = NIL THEN adr := idx64; INC(idx64, 8) END - | Guid: - obj := Const32; c := obj.conval; - WHILE (c # NIL) & ((con.setval # c.setval) OR (con.intval2 # c.intval2) OR (con.ext^ # c.ext^)) DO c := c.link END; - IF c = NIL THEN adr := idx32; INC(idx32, 16) END - END; - IF c = NIL THEN con.link := obj.conval; obj.conval := con ELSE adr := c.intval END; - con.intval := adr - END AllocConst; - - - PROCEDURE AllocTypDesc* (typ: DevCPT.Struct); (* typ.comp = Record *) - VAR obj: DevCPT.Object; name: DevCPT.Name; - BEGIN - IF typ.strobj = NIL THEN - name := "@"; DevCPT.Insert(name, obj); obj.name := DevCPT.null; (* avoid err 1 *) - obj.mode := Typ; obj.typ := typ; typ.strobj := obj - END - END AllocTypDesc; - - - PROCEDURE PutByte* (a, x: INTEGER); - BEGIN - code[a DIV CodeLength]^[a MOD CodeLength] := SHORT(CHR(x MOD 256)) - END PutByte; - - PROCEDURE PutShort* (a, x: INTEGER); - BEGIN - IF bigEndian THEN - PutByte(a, x DIV 256); PutByte(a + 1, x) - ELSE - PutByte(a, x); PutByte(a + 1, x DIV 256) - END - END PutShort; - - PROCEDURE PutWord* (a, x: INTEGER); - BEGIN - IF bigEndian THEN - PutByte(a, x DIV 1000000H); PutByte(a + 1, x DIV 10000H); - PutByte(a + 2, x DIV 256); PutByte(a + 3, x) - ELSE - PutByte(a, x); PutByte(a + 1, x DIV 256); - PutByte(a + 2, x DIV 10000H); PutByte(a + 3, x DIV 1000000H) - END - END PutWord; - - PROCEDURE ThisByte* (a: INTEGER): INTEGER; - BEGIN - RETURN ORD(code[a DIV CodeLength]^[a MOD CodeLength]) - END ThisByte; - - PROCEDURE ThisShort* (a: INTEGER): INTEGER; - BEGIN - IF bigEndian THEN - RETURN ThisByte(a) * 256 + ThisByte(a+1) - ELSE - RETURN ThisByte(a+1) * 256 + ThisByte(a) - END - END ThisShort; - - PROCEDURE ThisWord* (a: INTEGER): INTEGER; - BEGIN - IF bigEndian THEN - RETURN ((ThisByte(a) * 256 + ThisByte(a+1)) * 256 + ThisByte(a+2)) * 256 + ThisByte(a+3) - ELSE - RETURN ((ThisByte(a+3) * 256 + ThisByte(a+2)) * 256 + ThisByte(a+1)) * 256 + ThisByte(a) - END - END ThisWord; - - PROCEDURE GenByte* (x: INTEGER); - BEGIN - IF actIdx >= CodeLength THEN - IF blkIdx < CodeBlocks THEN - NEW(actual); code[blkIdx] := actual; INC(blkIdx); actIdx := 0 - ELSE - IF ~CodeOvF THEN DevCPM.err(210); CodeOvF := TRUE END; - actIdx := 0; pc := 0 - END - END; - actual^[actIdx] := SHORT(CHR(x MOD 256)); INC(actIdx); INC(pc) - END GenByte; - - PROCEDURE GenShort* (x: INTEGER); - BEGIN - IF bigEndian THEN - GenByte(x DIV 256); GenByte(x) - ELSE - GenByte(x); GenByte(x DIV 256) - END - END GenShort; - - PROCEDURE GenWord* (x: INTEGER); - BEGIN - IF bigEndian THEN - GenByte(x DIV 1000000H); GenByte(x DIV 10000H); GenByte(x DIV 256); GenByte(x) - ELSE - GenByte(x); GenByte(x DIV 256); GenByte(x DIV 10000H); GenByte(x DIV 1000000H) - END - END GenWord; - - PROCEDURE WriteCode; - VAR i, j, k, n: INTEGER; b: CodeBlock; - BEGIN - j := 0; k := 0; - WHILE j < pc DO - n := pc - j; i := 0; b := code[k]; - IF n > CodeLength THEN n := CodeLength END; - WHILE i < n DO DevCPM.ObjW(b^[i]); INC(i) END; - INC(j, n); INC(k) - END - END WriteCode; - - - PROCEDURE OffsetLink* (obj: DevCPT.Object; offs: INTEGER): DevCPT.LinkList; - VAR link: DevCPT.LinkList; m: DevCPT.Object; - BEGIN - ASSERT((obj.mode # Typ) OR (obj.typ # DevCPT.int32typ)); - ASSERT((obj.mode # Typ) OR (obj.typ # DevCPT.iunktyp) & (obj.typ # DevCPT.guidtyp)); - IF obj.mnolev >= 0 THEN (* not imported *) - CASE obj.mode OF - | Typ: IF obj.links = NIL THEN obj.link := descList; descList := obj END - | TProc: IF obj.adr = -1 THEN obj := obj.nlink ELSE offs := offs + obj.adr; obj := Code END - | Var: offs := offs + dsize; obj := Data - | Con, IProc, XProc, LProc: - END - ELSIF obj.mode = Typ THEN - IF obj.typ.untagged THEN (* add desc for imported untagged types *) - IF obj.links = NIL THEN obj.link := descList; descList := obj END - ELSE - m := DevCPT.GlbMod[-obj.mnolev]; - IF m.library # NIL THEN RETURN NIL END (* type import from dll *) - END - END; - link := obj.links; - WHILE (link # NIL) & (link.offset # offs) DO link := link.next END; - IF link = NIL THEN - NEW(link); link.offset := offs; link.linkadr := 0; - link.next := obj.links; obj.links := link - END; - RETURN link - END OffsetLink; - - - PROCEDURE TypeObj* (typ: DevCPT.Struct): DevCPT.Object; - VAR obj: DevCPT.Object; - BEGIN - obj := typ.strobj; - IF obj = NIL THEN - obj := DevCPT.NewObj(); obj.leaf := TRUE; obj.mnolev := 0; - obj.name := DevCPT.null; obj.mode := Typ; obj.typ := typ; typ.strobj := obj - END; - RETURN obj - END TypeObj; - - - PROCEDURE Align (n: INTEGER); - VAR p: INTEGER; - BEGIN - p := DevCPM.ObjLen(); - DevCPM.ObjWBytes(zero, (-p) MOD n) - END Align; - - PROCEDURE OutName (VAR name: ARRAY OF SHORTCHAR); - VAR ch: SHORTCHAR; i: SHORTINT; - BEGIN i := 0; - REPEAT ch := name[i]; DevCPM.ObjW(ch); INC(i) UNTIL ch = 0X - END OutName; - - PROCEDURE Out2 (x: INTEGER); (* byte ordering must correspond to target machine *) - BEGIN - IF bigEndian THEN - DevCPM.ObjW(SHORT(CHR(x DIV 256))); DevCPM.ObjW(SHORT(CHR(x))) - ELSE - DevCPM.ObjW(SHORT(CHR(x))); DevCPM.ObjW(SHORT(CHR(x DIV 256))) - END - END Out2; - - PROCEDURE Out4 (x: INTEGER); (* byte ordering must correspond to target machine *) - BEGIN - IF bigEndian THEN - DevCPM.ObjW(SHORT(CHR(x DIV 1000000H))); DevCPM.ObjW(SHORT(CHR(x DIV 10000H))); - DevCPM.ObjW(SHORT(CHR(x DIV 256))); DevCPM.ObjW(SHORT(CHR(x))) - ELSE - DevCPM.ObjWLInt(x) - END - END Out4; - - PROCEDURE OutReference (obj: DevCPT.Object; offs, typ: INTEGER); - VAR link: DevCPT.LinkList; - BEGIN - link := OffsetLink(obj, offs); - IF link # NIL THEN - Out4(typ * 1000000H + link.linkadr MOD 1000000H); - link.linkadr := -(DevCPM.ObjLen() - headSize - 4) - ELSE Out4(0) - END - END OutReference; - - PROCEDURE FindPtrs (typ: DevCPT.Struct; adr: INTEGER; ip: BOOLEAN; VAR num: INTEGER); - VAR fld: DevCPT.Object; btyp: DevCPT.Struct; i, n: INTEGER; - BEGIN - IF typ.form = Pointer THEN - IF ip & (typ.sysflag = interface) - OR ~ip & ~typ.untagged THEN Out4(adr); INC(num) END - ELSIF (typ.comp = Record) & (typ.sysflag # union) THEN - btyp := typ.BaseTyp; - IF btyp # NIL THEN FindPtrs(btyp, adr, ip, num) END ; - fld := typ.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF ip & (fld.name^ = DevCPM.HdUtPtrName) & (fld.sysflag = interface) - OR ~ip & (fld.name^ = DevCPM.HdPtrName) THEN Out4(fld.adr + adr); INC(num) - ELSE FindPtrs(fld.typ, fld.adr + adr, ip, num) - END; - fld := fld.link - END - ELSIF typ.comp = Array THEN - btyp := typ.BaseTyp; n := typ.n; - WHILE btyp.comp = Array DO n := btyp.n * n; btyp := btyp.BaseTyp END ; - IF (btyp.form = Pointer) OR (btyp.comp = Record) THEN - i := num; FindPtrs(btyp, adr, ip, num); - IF num # i THEN i := 1; - WHILE i < n DO - INC(adr, btyp.size); FindPtrs(btyp, adr, ip, num); INC(i) - END - END - END - END - END FindPtrs; - - - PROCEDURE OutRefName* (VAR name: ARRAY OF SHORTCHAR); - BEGIN - DevCPM.ObjW(0FCX); DevCPM.ObjWNum(pc); OutName(name) - END OutRefName; - - PROCEDURE OutRefs* (obj: DevCPT.Object); - VAR f: BYTE; - BEGIN - IF outRef & (obj # NIL) THEN - OutRefs(obj.left); - IF ((obj.mode = Var) OR (obj.mode = VarPar)) & (obj.history # removed) & (obj.name[0] # "@") THEN - f := obj.typ.form; - IF (f IN {Byte .. Set, Pointer, ProcTyp, Char16, Int64}) - OR outURef & (obj.typ.comp # DynArr) - OR outAllRef & ~obj.typ.untagged - OR (obj.typ.comp = Array) & (obj.typ.BaseTyp.form = Char8) THEN - IF obj.mode = Var THEN DevCPM.ObjW(0FDX) ELSE DevCPM.ObjW(0FFX) END; - IF obj.typ = DevCPT.anyptrtyp THEN DevCPM.ObjW(SHORT(CHR(mAnyPtr))) - ELSIF obj.typ = DevCPT.anytyp THEN DevCPM.ObjW(SHORT(CHR(mAnyRec))) - ELSIF obj.typ = DevCPT.sysptrtyp THEN DevCPM.ObjW(SHORT(CHR(mSysPtr))) - ELSIF f = Char16 THEN DevCPM.ObjW(SHORT(CHR(mChar16))) - ELSIF f = Int64 THEN DevCPM.ObjW(SHORT(CHR(mInt64))) - ELSIF obj.typ = DevCPT.guidtyp THEN DevCPM.ObjW(SHORT(CHR(mGuid))) - ELSIF obj.typ = DevCPT.restyp THEN DevCPM.ObjW(SHORT(CHR(mResult))) - ELSIF f = Pointer THEN - IF obj.typ.sysflag = interface THEN DevCPM.ObjW(SHORT(CHR(mInterface))) - ELSIF obj.typ.untagged THEN DevCPM.ObjW(SHORT(CHR(mSysPtr))) - ELSE DevCPM.ObjW(10X); OutReference(TypeObj(obj.typ), 0, absolute) - END - ELSIF (f = Comp) & outAllRef & (~obj.typ.untagged OR outURef & (obj.typ.comp # DynArr)) THEN - DevCPM.ObjW(10X); OutReference(TypeObj(obj.typ), 0, absolute) - ELSIF f < Int8 THEN DevCPM.ObjW(SHORT(CHR(f - 1))) - ELSE DevCPM.ObjW(SHORT(CHR(f))) - END; - IF obj.mnolev = 0 THEN DevCPM.ObjWNum(obj.adr + dsize) ELSE DevCPM.ObjWNum(obj.adr) END; - OutName(obj.name^) - END - END ; - OutRefs(obj.right) - END - END OutRefs; - - PROCEDURE OutSourceRef* (pos: INTEGER); - BEGIN - IF outSrc & (pos # 0) & (pos # srcPos) & (pc > codePos) THEN - WHILE pc > codePos + 250 DO - DevCPM.ObjW(SHORT(CHR(250))); - INC(codePos, 250); - DevCPM.ObjWNum(0) - END; - DevCPM.ObjW(SHORT(CHR(pc - codePos))); - codePos := pc; - DevCPM.ObjWNum(pos - srcPos); - srcPos := pos - END - END OutSourceRef; - - - PROCEDURE OutPLink (link: DevCPT.LinkList; adr: INTEGER); - BEGIN - WHILE link # NIL DO - ASSERT(link.linkadr # 0); - DevCPM.ObjWNum(link.linkadr); - DevCPM.ObjWNum(adr + link.offset); - link := link.next - END - END OutPLink; - - PROCEDURE OutLink (link: DevCPT.LinkList); - BEGIN - OutPLink(link, 0); DevCPM.ObjW(0X) - END OutLink; - - PROCEDURE OutNames; - VAR a, b, c: DevCPT.Object; - BEGIN - a := nameList; b := NIL; - WHILE a # NIL DO c := a; a := c.nlink; c.nlink := b; b := c END; - DevCPM.ObjW(0X); (* names[0] = 0X *) - WHILE b # NIL DO - OutName(b.name^); - b := b.nlink - END; - END OutNames; - - PROCEDURE OutGuid* (VAR str: ARRAY OF SHORTCHAR); - - PROCEDURE Copy (n: INTEGER); - VAR x, y: INTEGER; - BEGIN - x := ORD(str[n]); y := ORD(str[n + 1]); - IF x >= ORD("a") THEN DEC(x, ORD("a") - 10) - ELSIF x >= ORD("A") THEN DEC(x, ORD("A") - 10) - ELSE DEC(x, ORD("0")) - END; - IF y >= ORD("a") THEN DEC(y, ORD("a") - 10) - ELSIF y >= ORD("A") THEN DEC(y, ORD("A") - 10) - ELSE DEC(y, ORD("0")) - END; - DevCPM.ObjW(SHORT(CHR(x * 16 + y))) - END Copy; - - BEGIN - IF bigEndian THEN - Copy(1); Copy(3); Copy(5); Copy(7); Copy(10); Copy(12); Copy(15); Copy(17) - ELSE - Copy(7); Copy(5); Copy(3); Copy(1); Copy(12); Copy(10); Copy(17); Copy(15) - END; - Copy(20); Copy(22); Copy(25); Copy(27); Copy(29); Copy(31); Copy(33); Copy(35) - END OutGuid; - - PROCEDURE OutConst (obj: DevCPT.Object); - TYPE A4 = ARRAY 4 OF SHORTCHAR; A8 = ARRAY 8 OF SHORTCHAR; - VAR a, b, c: DevCPT.Const; r: SHORTREAL; lr: REAL; a4: A4; a8: A8; ch: SHORTCHAR; i, x, hi, low: INTEGER; - BEGIN - a := obj.conval; b := NIL; - WHILE a # NIL DO c := a; a := c.link; c.link := b; b := c END; - WHILE b # NIL DO - IF String8 IN b.setval THEN - DevCPM.ObjWBytes(b.ext^, b.intval2); - Align(4) - ELSIF String16 IN b.setval THEN - i := 0; REPEAT DevCPM.GetUtf8(b.ext^, x, i); Out2(x) UNTIL x = 0; - Align(4) - ELSIF Real32 IN b.setval THEN - r := SHORT(b.realval); a4 := SYSTEM.VAL(A4, r); - IF DevCPM.LEHost = bigEndian THEN - ch := a4[0]; a4[0] := a4[3]; a4[3] := ch; - ch := a4[1]; a4[1] := a4[2]; a4[2] := ch - END; - DevCPM.ObjWBytes(a4, 4) - ELSIF Real64 IN b.setval THEN - a8 := SYSTEM.VAL(A8, b.realval); - IF DevCPM.LEHost = bigEndian THEN - ch := a8[0]; a8[0] := a8[7]; a8[7] := ch; - ch := a8[1]; a8[1] := a8[6]; a8[6] := ch; - ch := a8[2]; a8[2] := a8[5]; a8[5] := ch; - ch := a8[3]; a8[3] := a8[4]; a8[4] := ch - END; - DevCPM.ObjWBytes(a8, 8) - ELSIF Int64 IN b.setval THEN - (* intval moved to intval2 by AllocConst *) - x := b.intval; b.intval := b.intval2; GetLongWords(b, hi, low); b.intval := x; - IF bigEndian THEN Out4(hi); Out4(low) ELSE Out4(low); Out4(hi) END - ELSIF Guid IN b.setval THEN - OutGuid(b.ext^) - END; - b := b.link - END - END OutConst; - - PROCEDURE OutStruct (typ: DevCPT.Struct; unt: BOOLEAN); - BEGIN - IF typ = NIL THEN Out4(0) - ELSIF typ = DevCPT.sysptrtyp THEN Out4(mSysPtr) - ELSIF typ = DevCPT.anytyp THEN Out4(mAnyRec) - ELSIF typ = DevCPT.anyptrtyp THEN Out4(mAnyPtr) - ELSIF typ = DevCPT.guidtyp THEN Out4(mGuid) - ELSIF typ = DevCPT.restyp THEN Out4(mResult) - ELSE - CASE typ.form OF - | Undef, Byte, String8, NilTyp, NoTyp, String16: Out4(0) - | Bool, Char8: Out4(typ.form - 1) - | Int8..Set: Out4(typ.form) - | Char16: Out4(mChar16) - | Int64: Out4(mInt64) - | ProcTyp: OutReference(TypeObj(typ), 0, absolute) - | Pointer: - IF typ.sysflag = interface THEN Out4(mInterface) - ELSIF typ.untagged THEN Out4(mSysPtr) - ELSE OutReference(TypeObj(typ), 0, absolute) - END - | Comp: - IF ~typ.untagged OR (outURef & unt) THEN OutReference(TypeObj(typ), 0, absolute) - ELSE Out4(0) - END - END - END - END OutStruct; - - PROCEDURE NameIdx (obj: DevCPT.Object): INTEGER; - VAR n: INTEGER; - BEGIN - n := 0; - IF obj.name # DevCPT.null THEN - IF obj.num = 0 THEN - obj.num := namex; - WHILE obj.name[n] # 0X DO INC(n) END; - INC(namex, n + 1); - obj.nlink := nameList; nameList := obj - END; - n := obj.num; - END; - RETURN n - END NameIdx; - - PROCEDURE OutSignature (par: DevCPT.Object; retTyp: DevCPT.Struct; OUT pos: INTEGER); - VAR p: DevCPT.Object; n, m: INTEGER; - BEGIN - pos := DevCPM.ObjLen() - headSize; - OutStruct(retTyp, TRUE); - p := par; n := 0; - WHILE p # NIL DO INC(n); p := p.link END; - Out4(n); p := par; - WHILE p # NIL DO - IF p.mode # VarPar THEN m := mValue - ELSIF p.vis = inPar THEN m := mInPar - ELSIF p.vis = outPar THEN m := mOutPar - ELSE m := mVarPar - END; - Out4(NameIdx(p) * 256 + m); - OutStruct(p.typ, TRUE); - p := p.link - END - END OutSignature; - - PROCEDURE PrepObject (obj: DevCPT.Object); - BEGIN - IF (obj.mode IN {LProc, XProc, IProc}) & outSignatures THEN (* write param list *) - OutSignature(obj.link, obj.typ, obj.conval.intval) - END - END PrepObject; - - PROCEDURE OutObject (mode, fprint, offs: INTEGER; typ: DevCPT.Struct; obj: DevCPT.Object); - VAR vis: INTEGER; - BEGIN - Out4(fprint); - Out4(offs); - IF obj.vis = internal THEN vis := mInternal - ELSIF obj.vis = externalR THEN vis := mReadonly - ELSIF obj.vis = external THEN vis := mExported - END; - Out4(mode + vis * 16 + NameIdx(obj) * 256); - IF (mode = mProc) & outSignatures THEN OutReference(Meta, obj.conval.intval, absolute) (* ref to par list *) - ELSE OutStruct(typ, mode = mField) - END - END OutObject; - - PROCEDURE PrepDesc (desc: DevCPT.Struct); - VAR fld: DevCPT.Object; n: INTEGER; l: DevCPT.LinkList; b: DevCPT.Struct; - BEGIN - IF desc.comp = Record THEN (* write field list *) - desc.strobj.adr := DevCPM.ObjLen() - headSize; - n := 0; fld := desc.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF expAllFields OR (fld.vis # internal) THEN INC(n) END; - fld := fld.link - END; - Out4(n); fld := desc.link; - WHILE (fld # NIL) & (fld.mode = Fld) DO - IF expAllFields OR (fld.vis # internal) THEN - OutObject(mField, 0, fld.adr, fld.typ, fld) - END; - fld := fld.link - END - ELSIF (desc.form = ProcTyp) & outSignatures THEN (* write param list *) - OutSignature(desc.link, desc.BaseTyp, desc.n) - END; - (* assert name and base type are included *) - IF desc.untagged THEN n := NameIdx(untgd) - ELSE n := NameIdx(desc.strobj) - END; - IF desc.form # ProcTyp THEN b := desc.BaseTyp; - IF (b # NIL) & (b # DevCPT.anytyp) & (b # DevCPT.anyptrtyp) & (b.form IN {Pointer, Comp, ProcTyp}) - & (b.sysflag # interface) & (b # DevCPT.guidtyp) - & (~b.untagged OR outURef & (b.form = Comp)) THEN - l := OffsetLink(TypeObj(b), 0) - END - END - END PrepDesc; - - PROCEDURE NumMeth (root: DevCPT.Object; num: INTEGER): DevCPT.Object; - VAR obj: DevCPT.Object; - BEGIN - IF (root = NIL) OR (root.mode = TProc) & (root.num = num) THEN RETURN root END; - obj := NumMeth(root.left, num); - IF obj = NIL THEN obj := NumMeth(root.right, num) END; - RETURN obj - END NumMeth; - - PROCEDURE OutDesc (desc: DevCPT.Struct); - VAR m: DevCPT.Object; i, nofptr, flddir, size: INTEGER; t, xb: DevCPT.Struct; form, lev, attr: BYTE; - name: DevCPT.Name; - BEGIN - ASSERT(~desc.untagged); - IF desc.comp = Record THEN - xb := desc; flddir := desc.strobj.adr; - REPEAT xb := xb.BaseTyp UNTIL (xb = NIL) OR (xb.mno # 0) OR xb.untagged; - Out4(-1); i := desc.n; - WHILE i > 0 DO DEC(i); t := desc; - REPEAT - m := NumMeth(t.link, i); t := t.BaseTyp - UNTIL (m # NIL) OR (t = xb); - IF m # NIL THEN - IF absAttr IN m.conval.setval THEN Out4(0) - ELSE OutReference(m, 0, absolute) - END - ELSIF (xb = NIL) OR xb.untagged THEN Out4(0) (* unimplemented ANYREC method *) - ELSE OutReference(xb.strobj, -4 - 4 * i, copy) - END - END; - desc.strobj.adr := DevCPM.ObjLen() - headSize; (* desc adr *) - Out4(desc.size); - OutReference(Mod, 0, absolute); - IF desc.untagged THEN m := untgd ELSE m := desc.strobj END; - IF desc.attribute = extAttr THEN attr := 1 - ELSIF desc.attribute = limAttr THEN attr := 2 - ELSIF desc.attribute = absAttr THEN attr := 3 - ELSE attr := 0 - END; - Out4(mRecord + attr * 4 + desc.extlev * 16 + NameIdx(m) * 256); i := 0; - WHILE i <= desc.extlev DO - t := desc; - WHILE t.extlev > i DO t := t.BaseTyp END; - IF t.sysflag = interface THEN Out4(0) - ELSIF t.untagged THEN OutReference(TypeObj(t), 0, absolute) - ELSIF (t.mno = 0) THEN OutReference(t.strobj, 0, absolute) - ELSIF t = xb THEN OutReference(xb.strobj, 0, absolute) - ELSE OutReference(xb.strobj, 12 + 4 * i, copy) - END; - INC(i) - END; - WHILE i <= DevCPM.MaxExts DO Out4(0); INC(i) END; - OutReference(Meta, flddir, absolute); (* ref to field list *) - nofptr := 0; FindPtrs(desc, 0, FALSE, nofptr); - Out4(-(4 * nofptr + 4)); - nofptr := 0; FindPtrs(desc, 0, TRUE, nofptr); - Out4(-1) - ELSE - desc.strobj.adr := DevCPM.ObjLen() - headSize; - lev := 0; size := 0; - IF desc.comp = Array THEN - size := desc.n; form := mArray - ELSIF desc.comp = DynArr THEN - form := mArray; lev := SHORT(SHORT(desc.n + 1)) - ELSIF desc.form = Pointer THEN - form := mPointer - ELSE ASSERT(desc.form = ProcTyp); - DevCPM.FPrint(size, XProc); DevCPT.FPrintSign(size, desc.BaseTyp, desc.link); form := mProctyp; - END; - Out4(size); - OutReference(Mod, 0, absolute); - IF desc.untagged THEN m := untgd ELSE m := desc.strobj END; - Out4(form + lev * 16 + NameIdx(m) * 256); - IF desc.form # ProcTyp THEN OutStruct(desc.BaseTyp, TRUE) - ELSIF outSignatures THEN OutReference(Meta, desc.n, absolute) (* ref to par list *) - END - END - END OutDesc; - - PROCEDURE OutModDesc (nofptr, refSize, namePos, ptrPos, expPos, impPos: INTEGER); - VAR i: INTEGER; (* t: Dates.Time; d: Dates.Date; *) - BEGIN - Out4(0); (* link *) - Out4(ORD(options)); (* opts *) - Out4(0); (* refcnt *) - (* Dates.GetDate(d); Dates.GetTime(t); (* compile time *) - Out2(d.year); Out2(d.month); Out2(d.day); - Out2(t.hour); Out2(t.minute); Out2(t.second); *) - Out2(2007); Out2(5); Out2(25); - Out2(0); Out2(0); Out2(0); - Out4(0); Out4(0); Out4(0); (* load time *) - Out4(0); (* ext *) - IF closeLbl # 0 THEN OutReference(Code, closeLbl, absolute); (* terminator *) - ELSE Out4(0) - END; - Out4(imports); (* nofimps *) - Out4(nofptr); (* nofptrs *) - Out4(pc); (* csize *) - Out4(dsize); (* dsize *) - Out4(refSize); (* rsize *) - OutReference(Code, 0, absolute); (* code *) - OutReference(Data, 0, absolute); (* data *) - OutReference(Meta, 0, absolute); (* refs *) - IF procVarIndirect THEN - OutReference(Proc, 0, absolute); (* procBase *) - ELSE - OutReference(Code, 0, absolute); (* procBase *) - END; - OutReference(Data, 0, absolute); (* varBase *) - OutReference(Meta, namePos, absolute); (* names *) - OutReference(Meta, ptrPos, absolute); (* ptrs *) - OutReference(Meta, impPos, absolute); (* imports *) - OutReference(Meta, expPos, absolute); (* export *) - i := 0; (* name *) - WHILE DevCPT.SelfName[i] # 0X DO DevCPM.ObjW(DevCPT.SelfName[i]); INC(i) END; - DevCPM.ObjW(0X); - Align(4) - END OutModDesc; - - PROCEDURE OutProcTable (obj: DevCPT.Object); (* 68000 *) - BEGIN - IF obj # NIL THEN - OutProcTable(obj.left); - IF obj.mode IN {XProc, IProc} THEN - Out2(4EF9H); OutReference(Code, obj.adr, absolute); Out2(0); - END; - OutProcTable(obj.right); - END; - END OutProcTable; - - PROCEDURE PrepExport (obj: DevCPT.Object); - BEGIN - IF obj # NIL THEN - PrepExport(obj.left); - IF (obj.mode IN {LProc, XProc, IProc}) & (obj.history # removed) & (obj.vis # internal) THEN - PrepObject(obj) - END; - PrepExport(obj.right) - END - END PrepExport; - - PROCEDURE OutExport (obj: DevCPT.Object); - VAR num: INTEGER; - BEGIN - IF obj # NIL THEN - OutExport(obj.left); - IF (obj.history # removed) & ((obj.vis # internal) OR - (obj.mode = Typ) & (obj.typ.strobj = obj) & (obj.typ.form = Comp)) THEN - DevCPT.FPrintObj(obj); - IF obj.mode IN {LProc, XProc, IProc} THEN - IF procVarIndirect THEN - ASSERT(obj.nlink = NIL); - num := obj.num; obj.num := 0; - OutObject(mProc, obj.fprint, num, NIL, obj); - obj.num := num - ELSE - OutObject(mProc, obj.fprint, obj.adr, NIL, obj) - END - ELSIF obj.mode = Var THEN - OutObject(mVar, obj.fprint, dsize + obj.adr, obj.typ, obj) - ELSIF obj.mode = Typ THEN - OutObject(mTyp, obj.typ.pbfp, obj.typ.pvfp, obj.typ, obj) - ELSE ASSERT(obj.mode IN {Con, CProc}); - OutObject(mConst, obj.fprint, 0, NIL, obj) - END - END; - OutExport(obj.right) - END - END OutExport; - - PROCEDURE OutCLinks (obj: DevCPT.Object); - BEGIN - IF obj # NIL THEN - OutCLinks(obj.left); - IF obj.mode IN {LProc, XProc, IProc} THEN OutPLink(obj.links, obj.adr) END; - OutCLinks(obj.right) - END - END OutCLinks; - - PROCEDURE OutCPLinks (obj: DevCPT.Object; base: INTEGER); - BEGIN - IF obj # NIL THEN - OutCPLinks(obj.left, base); - IF obj.mode IN {LProc, XProc, IProc} THEN OutPLink(obj.links, obj.num + base) END; - OutCPLinks(obj.right, base) - END - END OutCPLinks; - - PROCEDURE OutImport (obj: DevCPT.Object); - VAR typ: DevCPT.Struct; strobj: DevCPT.Object; opt: INTEGER; - BEGIN - IF obj # NIL THEN - OutImport(obj.left); - IF obj.mode = Typ THEN typ := obj.typ; - IF obj.used OR - (typ.form IN {Pointer, Comp}) & (typ.strobj = obj) & - ((obj.links # NIL) OR (obj.name # DevCPT.null) & (typ.pvused OR typ.pbused)) THEN - DevCPT.FPrintStr(typ); - DevCPM.ObjW(SHORT(CHR(mTyp))); OutName(obj.name^); - IF obj.used THEN opt := 2 ELSE opt := 0 END; - IF (typ.form = Comp) & ((typ.pvused) OR (obj.name = DevCPT.null)) THEN - DevCPM.ObjWNum(typ.pvfp); DevCPM.ObjW(SHORT(CHR(opt + 1))); - IF obj.history = inconsistent THEN DevCPT.FPrintErr(obj, 249) END - ELSE DevCPM.ObjWNum(typ.pbfp); DevCPM.ObjW(SHORT(CHR(opt))) - END; - OutLink(obj.links) - END - ELSIF obj.used THEN - DevCPT.FPrintObj(obj); - IF obj.mode = Var THEN - DevCPM.ObjW(SHORT(CHR(mVar))); OutName(obj.name^); - DevCPM.ObjWNum(obj.fprint); OutLink(obj.links) - ELSIF obj.mode IN {XProc, IProc} THEN - DevCPM.ObjW(SHORT(CHR(mProc))); OutName(obj.name^); - DevCPM.ObjWNum(obj.fprint); OutLink(obj.links) - ELSE ASSERT(obj.mode IN {Con, CProc}); - DevCPM.ObjW(SHORT(CHR(mConst))); OutName(obj.name^); DevCPM.ObjWNum(obj.fprint) - END - END; - OutImport(obj.right) - END - END OutImport; - - PROCEDURE OutUseBlock; - VAR m, obj: DevCPT.Object; i: INTEGER; - BEGIN - m := dllList; - WHILE m # NIL DO - obj := m.nlink; - WHILE obj # NIL DO - IF obj.mode = Var THEN DevCPM.ObjW(SHORT(CHR(mVar))) - ELSE DevCPM.ObjW(SHORT(CHR(mProc))) - END; - IF obj.entry # NIL THEN OutName(obj.entry^) - ELSE OutName(obj.name^); - END; - DevCPT.FPrintObj(obj); DevCPM.ObjWNum(obj.fprint); OutLink(obj.links); - obj := obj.nlink - END; - DevCPM.ObjW(0X); m := m.link - END; - i := 1; - WHILE i < DevCPT.nofGmod DO - obj := DevCPT.GlbMod[i]; - IF obj.library = NIL THEN OutImport(obj.right); DevCPM.ObjW(0X) END; - INC(i) - END; - END OutUseBlock; - - PROCEDURE CollectDll (obj: DevCPT.Object; mod: DevCPT.String); - VAR name: DevCPT.String; dll: DevCPT.Object; - BEGIN - IF obj # NIL THEN - CollectDll(obj.left, mod); - IF obj.used & (obj.mode IN {Var, XProc, IProc}) THEN - IF obj.library # NIL THEN name := obj.library - ELSE name := mod - END; - dll := dllList; - WHILE (dll # NIL) & (dll.library^ # name^) DO dll := dll.link END; - IF dll = NIL THEN - NEW(dll); dll.library := name; INC(imports); - IF dllList = NIL THEN dllList := dll ELSE dllLast.link := dll END; - dllLast := dll; dll.left := dll; - END; - dll.left.nlink := obj; dll.left := obj - END; - CollectDll(obj.right, mod) - END - END CollectDll; - - PROCEDURE EnumXProc(obj: DevCPT.Object; VAR num: INTEGER); - BEGIN - IF obj # NIL THEN - EnumXProc(obj.left, num); - IF obj.mode IN {XProc, IProc} THEN - obj.num := num; INC(num, 8); - END; - EnumXProc(obj.right, num) - END; - END EnumXProc; - - PROCEDURE OutHeader*; - VAR i: INTEGER; m: DevCPT.Object; - BEGIN - DevCPM.ObjWLInt(processor); (* processor type *) - DevCPM.ObjWLInt(0); DevCPM.ObjWLInt(0); DevCPM.ObjWLInt(0); - DevCPM.ObjWLInt(0); DevCPM.ObjWLInt(0); (* sizes *) - imports := 0; i := 1; - WHILE i < DevCPT.nofGmod DO - m := DevCPT.GlbMod[i]; - IF m.library # NIL THEN (* dll import *) - CollectDll(m.right, m.library); - ELSE INC(imports) (* module import *) - END; - INC(i) - END; - DevCPM.ObjWNum(imports); (* num of import *) - OutName(DevCPT.SelfName); - m := dllList; - WHILE m # NIL DO DevCPM.ObjW("$"); OutName(m.library^); m := m.link END; - i := 1; - WHILE i < DevCPT.nofGmod DO - m := DevCPT.GlbMod[i]; - IF m.library = NIL THEN OutName(m.name^) END; - INC(i) - END; - Align(16); headSize := DevCPM.ObjLen(); - IF procVarIndirect THEN - i := 0; EnumXProc(DevCPT.topScope.right, i) - END - END OutHeader; - - PROCEDURE OutCode*; - VAR i, j, refSize, expPos, ptrPos, impPos, namePos, procPos, - con8Pos, con16Pos, con32Pos, con64Pos, modPos, codePos: INTEGER; - m, obj, dlist: DevCPT.Object; - BEGIN - (* Ref *) - DevCPM.ObjW(0X); (* end mark *) - refSize := DevCPM.ObjLen() - headSize; - (* Export *) - Align(4); - IF outSignatures THEN PrepExport(DevCPT.topScope.right) END; (* procedure signatures *) - Align(8); expPos := DevCPM.ObjLen(); - Out4(0); - OutExport(DevCPT.topScope.right); (* export objects *) - i := DevCPM.ObjLen(); DevCPM.ObjSet(expPos); Out4((i - expPos - 4) DIV 16); DevCPM.ObjSet(i); - (* Pointers *) - ptrPos := DevCPM.ObjLen(); - obj := DevCPT.topScope.scope; nofptrs := 0; - WHILE obj # NIL DO FindPtrs(obj.typ, dsize + obj.adr, FALSE, nofptrs); obj := obj.link END; - obj := DevCPT.topScope.scope; i := 0; - WHILE obj # NIL DO FindPtrs(obj.typ, dsize + obj.adr, TRUE, i); obj := obj.link END; - IF i > 0 THEN Out4(-1); INCL(options, iptrs) END; - (* Prepare Type Descriptors *) - dlist := NIL; - WHILE descList # NIL DO - obj := descList; descList := descList.link; - PrepDesc(obj.typ); - obj.link := dlist; dlist := obj - END; - (* Import List *) - impPos := DevCPM.ObjLen(); i := 0; - WHILE i < imports DO Out4(0); INC(i) END; - (* Names *) - namePos := DevCPM.ObjLen(); OutNames; - (* Const *) - Align(4); con8Pos := DevCPM.ObjLen(); - OutConst(Const8); con16Pos := DevCPM.ObjLen(); - ASSERT(con16Pos MOD 4 = 0); ASSERT(con16Pos - con8Pos = idx8); - OutConst(Const16); con32Pos := DevCPM.ObjLen(); - ASSERT(con32Pos MOD 4 = 0); ASSERT(con32Pos - con16Pos = idx16); - OutConst(Const32); con64Pos := DevCPM.ObjLen(); - ASSERT(con64Pos MOD 4 = 0); ASSERT(con64Pos - con32Pos = idx32); - IF ODD(con64Pos DIV 4) THEN Out4(0); INC(con64Pos, 4) END; - OutConst(Const64); ASSERT(DevCPM.ObjLen() - con64Pos = idx64); - (* Module Descriptor *) - Align(16); modPos := DevCPM.ObjLen(); - OutModDesc(nofptrs, refSize, namePos - headSize, ptrPos - headSize, expPos - headSize, impPos - headSize); - (* Procedure Table *) - procPos := DevCPM.ObjLen(); - OutProcTable(DevCPT.topScope.right); - Out4(0); Out4(0); (* at least one entry in ProcTable *) - Out4(0); (* sentinel *) - (* Type Descriptors *) - obj := dlist; - WHILE obj # NIL DO OutDesc(obj.typ); obj := obj.link END; - (* Code *) - codePos := DevCPM.ObjLen(); WriteCode; - WHILE pc MOD 4 # 0 DO DevCPM.ObjW(90X); INC(pc) END; - (* Fixups *) - OutLink(KNewRec.links); OutLink(KNewArr.links); - (* metalink *) - OutPLink(Const8.links, con8Pos - headSize); - OutPLink(Const16.links, con16Pos - headSize); - OutPLink(Const32.links, con32Pos - headSize); - OutPLink(Const64.links, con64Pos - headSize); - OutLink(Meta.links); - (* desclink *) - obj := dlist; i := modPos - headSize; - WHILE obj # NIL DO OutPLink(obj.links, obj.adr - i); obj.links := NIL; obj := obj.link END; - IF procVarIndirect THEN - OutPLink(Proc.links, procPos - modPos); - OutCPLinks(DevCPT.topScope.right, procPos - modPos) - END; - OutLink(Mod.links); - (* codelink *) - IF ~procVarIndirect THEN OutCLinks(DevCPT.topScope.right) END; - OutPLink(CaseLinks, 0); OutLink(Code.links); - (* datalink *) - OutLink(Data.links); - (* Use *) - OutUseBlock; - (* Header Fixups *) - DevCPM.ObjSet(8); - DevCPM.ObjWLInt(headSize); - DevCPM.ObjWLInt(modPos - headSize); - DevCPM.ObjWLInt(codePos - modPos); - DevCPM.ObjWLInt(pc); - DevCPM.ObjWLInt(dsize); - IF namex > MaxNameTab THEN DevCPM.err(242) END; - IF DevCPM.noerr & outObj THEN DevCPM.RegisterObj END - END OutCode; - - PROCEDURE Init* (proc: INTEGER; opt: SET); - CONST obj = 3; ref = 4; allref = 5; srcpos = 6; bigEnd = 15; pVarInd = 14; - BEGIN - processor := proc; - bigEndian := bigEnd IN opt; procVarIndirect := pVarInd IN opt; - outRef := ref IN opt; outAllRef := allref IN opt; outObj := obj IN opt; - outURef := useAllRef & outAllRef & (DevCPM.comAware IN DevCPM.options); - outSrc := srcpos IN opt; - pc := 0; actIdx := CodeLength; blkIdx := 0; - idx8 := 0; idx16 := 0; idx32 := 0; idx64 := 0; namex := 1; - options := opt * {0..15}; CodeOvF := FALSE; - KNewRec.links := NIL; KNewArr.links := NIL; CaseLinks := NIL; - Const8.links := NIL; Const8.conval := NIL; Const16.links := NIL; Const16.conval := NIL; - Const32.links := NIL; Const32.conval := NIL; Const64.links := NIL; Const64.conval := NIL; - Code.links := NIL; Data.links := NIL; Mod.links := NIL; Proc.links := NIL; Meta.links := NIL; - nameList := NIL; descList := NIL; dllList := NIL; dllLast := NIL; - codePos := 0; srcPos := 0; - NEW(untgd); untgd.name := DevCPT.NewName("!"); - closeLbl := 0 - END Init; - - PROCEDURE Close*; - BEGIN - KNewRec.links := NIL; KNewArr.links := NIL; CaseLinks := NIL; - Const8.links := NIL; Const8.conval := NIL; Const16.links := NIL; Const16.conval := NIL; - Const32.links := NIL; Const32.conval := NIL; Const64.links := NIL; Const64.conval := NIL; - Code.links := NIL; Data.links := NIL; Mod.links := NIL; Proc.links := NIL; Meta.links := NIL; - nameList := NIL; descList := NIL; dllList := NIL; dllLast := NIL; - WHILE blkIdx > 0 DO DEC(blkIdx); code[blkIdx] := NIL END; - actual := NIL; untgd := NIL; - END Close; - -BEGIN - NEW(KNewRec); KNewRec.mnolev := -128; - NEW(KNewArr); KNewArr.mnolev := -128; - NEW(Const8); Const8.mode := Con; Const8.mnolev := 0; - NEW(Const16); Const16.mode := Con; Const16.mnolev := 0; - NEW(Const32); Const32.mode := Con; Const32.mnolev := 0; - NEW(Const64); Const64.mode := Con; Const64.mnolev := 0; - NEW(Code); Code.mode := Con; Code.mnolev := 0; - NEW(Data); Data.mode := Con; Data.mnolev := 0; - NEW(Mod); Mod.mode := Con; Mod.mnolev := 0; - NEW(Proc); Proc.mode := Con; Proc.mnolev := 0; - NEW(Meta); Meta.mode := Con; Mod.mnolev := 0; -END Dev0CPE. diff --git a/new/Dev0/Mod/CPH.odc b/new/Dev0/Mod/CPH.odc deleted file mode 100644 index 4dcb3836956215d62a4e8af4900da3e72e62858c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12920 zcmc&*OK&7s74C6Dh)K*t5I{siB`0Lsj;B3-%p|cj5I=e{mh5ih?wKecBFf#>-8EBP z)v2oXBQq04$p#@7u;U@YB1=};AQlMNL_#e20SF0!SQ1M}Ss;b)JNMpt^uu;uqNVnI zpYxq_&pG$ht@g%dH7MZo#=DzAqu+J>I4afRrfFNN>t}HxxP^cCP z8z4W4`l@0>G3(AztRO0AD5-$O`)MtfJg=isSLq8c}SKO3Z3~v z;d7{eAEo*{K(Y#xUbYs;p}XIYohUEKMZMx{x-48^Wwvnd_fjeRSPGK6@W#oMo;0UR zv*>+k4=xgAeF{Sp>B^;nm05P=q}Xw#QqpYyvD!~2APV$x!?Bw=lQ?-mQ>*Fnn^I!s zQ-xK0TWJ2^Hzf2_p{e_Nx^EUGWlWihpb6LdpB~Z*-0OSf3II}57Q_wF18Hx9=N%BI z%6^S6K5AoAI<@%NQzk1ro(!1Y6RtI%hf&$r4Yi|s{y0RI2tIza9kMrfYjayLhp79K}v|elH3e^K1J-KVDzIIA>jysP5ut$KDPin{n&#)1_%gP<#0Jr8B}j{I@-3-xA85DP&y#GN8BI88f+4@a^%vv> z5RdyZ`+kn^gb@BSD5=^X*!MU`x3QTIp3eX{{dXdx`1W5A4jz=+JK(Ljb};<@PIdF< zcG=o=4lZx(-dLR~&dyFvOicE|;I`9;^uE4i67Y!M+m) zeyP#Hcmqj^9HBuNal9&HR@ZHWK_uZV!mIeja~IuHPy-apzS)p6~Vd=cAw%AKIZauh8n^*7Cg2tnMzB zcI}=MmU_hA=-7T+QJf$XH;Vdcb7E?Cc4lg7a%*R|x>u)CH+JjR$~CRt`s&o=)Z|9B zQmao*P8Mgan~}3&dtPJ(J*qUauzGUR3;gy@(3`ccS(jHWwl-C3LA8*Y9dK|_HLJ}g zTT37gnQc!meRkDiOD}y+wan6m%be}{@lGG-k5F4!U{@;$8xE)~TwS#~Zd0ny2yEi@ zksn4@!?U9ZrGTv**r5W-T2C6lS!ubB*Hj=YNJ*TQK(s2Z-*k>pU&fqv-wrwF3hIt& zTqTSOEGddH^bCgL;~sH9pbE^gfhwe_^m}oDDkQNg-Jr)R`8HJ*x~VjvT6T+Oz}Ssr za$6v4mv|P)xM4?*7a5tQ*%ZQLjhx(}cnf3>sol2E)^mc&QGzSv4j!zMc|+)25#CUEakka>8#F@8?|0$0vbl-G zVBkB4EfIdza{Y#?f@agv^<_$d5l;<4wa$@gK%z#_J60nQgZ2}~(p*~Py0)WQ)Jw0g z>mY&tP^M8S7|;!91>wXXf-AJpD0VAMpA(8V6buV_|JFlQhyYwPq0Un;} z!*;Y|u_y3ot3ItaE`h+VtN;&%X#p&{(H#zgiRYx&2L~Zm+Md17MYOzzG8C{0nnX>L z^8@brk~o3gBy%dcK{r|i!+m9g;OHqWfMY02Xm3y*=ZRd9nuM^pYtw_5uo|wZv@Tv7 zcibq{_OQ%RwCzys*|N-tI%1*#9d*PisT*Ad>LXDnOcgPd@g|DHegkgdScpqqy>&Mc zLFm08vVI(kU0Os{@a!Q%N()l6esvim zkh><1f-qCVdFHoCMFNfM)sK@<6X?2F@NR%;s$vB=?;=j=QE=Z-PK*78Si~n-7-AK9 z)dU1!69m|7%)Dhr~ zCe>AI^Vmm=B&dW&ATb$ci3RxX?o~I+n>Y8$Jgw^3QJz><(O=QWTd9IW0njU!Z+D#) zYi)0D?Io*v-KyQd8Mtv{ZEr?|S=*ymA^Ggiv0|s|v5X$Ke|yftpQOLK&kO`k8TcT( zUafAI*D4^jUVdS#0&H8?fuaNpEYUasUv1!wRo&x&=d|KcqxBo*iugB<qLIO#1QD&g`TzDXdWMaWpa&#kfm7@NB!($JO-AAfq zbdhx%tjanRvoV~5u-3%rl{0}t(t{v?7%1Rw!H00@B|~a*xMJ;<*S0}B;~7So)TN|S zv@Gtm2AxF>*S!m~T3Vb_0qFjW^^{cv2AGLfl#9F`u7bW9We=g!EKecZD{+iR#nVuh z?!pT6P))QQMweu0?CiuKv8@A?v1cK-B1fGVE+Ljl6kr4R*wVWP6DRweRVH3;J;B*b zwzu&f&|V_m@Sl1~Voz1E%DOzYsAyXu7h*Ib<_&3h0LIoTiN9(tx!# zl?87oI~}lI{qS-<2<3bmFyiqBo7(AENudUerQoFoyy#0L(85p??AMr6dtF*Y7e_P4 zRuMDjtZCw%&bYf#5J{yB1~x$X5qCjN(Wc0?=}c%Uii?`GKpnPN31zu4;}9T~85}E- z4k|o{wenBd8DxnAJA>q~7e^~rtz1twsWoS{S8#^c%P*AoB&|z=jEX2arlQUiRZUx6w)&^J#3P%6|)YZp`Ks=L{|?0 z^t^kJBq~Wv!RY}#XOopQ+~b1jjF@6V#l~8VcB4+E>UB`OryibHxQTG@B7L6pbWD)U zLj+YxeHs`;<%6&5yC?w5;9_bF- zG>lrPtPJe{ZdcU?-&40t!!vOCYGwe!spEK*8y?>Yu*ZaT&*J^m@PsuQftn!KR>L!D z{e3e7mrlduYf;CHgTnCmj_W7m_R)xO`^b#rmaJ65y_ZZ%VokSK^aY}}zw~SvG(+q^ z%y3*(I&g-~5J%QvCUa)`lcqY7+@!{!(;LuK*$&hSi*DgjqMaly#>BH{nMAc>KBUv6 zbLWw0AT{+->y3HK4TnDdt}f4H!d-HlsRNfjD+zF->%7B{*YpnVQ^$M!nz{);J+U;0 z05oEbfNQ+@Nfq{2z73Tt;Ca&K85&j zq}!wMs%%c4qL>?yy9i+0xz?e4Jgwo==z>dUZP>TWdr;*Bl5!t)haYqQE-Poun2 z?wr-?Wk8B$_&QnVT?&TT!X)0MfWnAVKwyp*BAOkBe{QTgq^c)yNfQvx_(&_~l@Wyx z+DhYcUP;oN*bhQTdX8~*^PHsEKk(krbEN|``perBwU|h8D zS*0is85Y3vJ~C-Bgj8|j0eSVSw^`?6glAag9>Y*0rx^^<7@;w~?wZ4%<8>GczGFin zZy?#rw~r|01>+F4j74en%R4{JSFiV^fKXONvG8CH&r zdMfZD1e_lJ44YFFpz)b-s7@tD8r(ag_~_yB92kZ-L50h4%KYTQC+u6y!#qeT@6Y7h zLxDp)SY1lKR+Qh;Y=zEK+pOjOwCYM*b-#&OpcCca^62$-L98 zhcmAoIuo(@LHZ3{0^%^%HEkMjQs7`C<4*9P0lp;P1k- zgK1rU9s4fZw))S8QA392z*zEs2j-{E{F!LxgP-P`pLp8n{#btEX}vZ22jgUW_OCSm z_9OLMQS~Ej1NG7O@Do~m=YH|s!Xxh$p3nYs$e_qyHH&m9zwcySWbZVh!n2RRRe1fs RpONpsTAjjgzy8xg;eTT8ee?hT diff --git a/new/Dev0/Mod/CPH.txt b/new/Dev0/Mod/CPH.txt deleted file mode 100644 index 3d57237..0000000 --- a/new/Dev0/Mod/CPH.txt +++ /dev/null @@ -1,304 +0,0 @@ -MODULE Dev0CPH; - - (* THIS IS TEXT COPY OF CPH.odc *) - (* DO NOT EDIT *) - -(** - project = "BlackBox" - organization = "www.oberon.ch" - contributors = "Oberon microsystems" - version = "System/Rsrc/AboutBB" - copyright = "System/Rsrc/AboutBB" - license = "Docu/BB-License" - references = "ftp://ftp.inf.ethz.ch/pub/software/Oberon/OberonV4/Docu/OP2.Paper.ps" - changes = "" - issues = "" - -**) - - IMPORT DevCPT := Dev0CPT; - - CONST - (* UseCalls options *) - longMop* = 0; longDop* = 1; longConv* = 2; longOdd* = 3; - realMop* = 8; realDop* = 9; realConv* = 10; - intMulDiv* = 11; - force = 16; hide = 17; - - (* nodes classes *) - Nvar = 0; Nvarpar = 1; Nfield = 2; Nderef = 3; Nindex = 4; Nguard = 5; Neguard = 6; - Nconst = 7; Ntype = 8; Nproc = 9; Nupto = 10; Nmop = 11; Ndop = 12; Ncall = 13; - Ninittd = 14; Nif = 15; Ncaselse = 16; Ncasedo = 17; Nenter = 18; Nassign = 19; - Nifelse =20; Ncase = 21; Nwhile = 22; Nrepeat = 23; Nloop = 24; Nexit = 25; - Nreturn = 26; Nwith = 27; Ntrap = 28; Ncomp = 30; - Ndrop = 50; Nlabel = 51; Ngoto = 52; Njsr = 53; Nret = 54; Ncmp = 55; - - (*function number*) - assign = 0; newfn = 1; incfn = 13; decfn = 14; - inclfn = 15; exclfn = 16; copyfn = 18; assertfn = 32; - getfn = 24; putfn = 25; getrfn = 26; putrfn = 27; sysnewfn = 30; movefn = 31; - - (* symbol values and ops *) - times = 1; slash = 2; div = 3; mod = 4; - and = 5; plus = 6; minus = 7; or = 8; eql = 9; - neq = 10; lss = 11; leq = 12; gtr = 13; geq = 14; - in = 15; is = 16; ash = 17; msk = 18; len = 19; - conv = 20; abs = 21; cap = 22; odd = 23; not = 33; - adr = 24; cc = 25; bit = 26; lsh = 27; rot = 28; val = 29; - min = 34; max = 35; typfn = 36; - thisrecfn = 45; thisarrfn = 46; - shl = 50; shr = 51; lshr = 52; xor = 53; - - (* structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - Char16 = 16; String16 = 17; Int64 = 18; - VString16to8 = 29; VString8 = 30; VString16 = 31; - realSet = {Real32, Real64}; - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - - - PROCEDURE UseThisCall (n: DevCPT.Node; IN name: ARRAY OF SHORTCHAR); - VAR mod, nm, moda: DevCPT.Name; mobj, obj: DevCPT.Object; done: BOOLEAN; - BEGIN - IF (n.typ.form = Real64) OR (n.left.typ.form = Real64) THEN mod := "Real" - ELSIF (n.typ.form = Real32) OR (n.left.typ.form = Real32) THEN mod := "SReal" - ELSIF (n.typ.form = Int64) OR (n.left.typ.form = Int64) THEN mod := "Long" - ELSE mod := "Int" - END; - moda := mod + "%"; - DevCPT.Find(moda, mobj); - IF mobj = NIL THEN - DevCPT.Import(moda, mod, done); - IF done THEN DevCPT.Find(moda, mobj) END - END; - nm := name$; DevCPT.FindImport(nm, mobj, obj); - n.class := Ncall; n.subcl := 0; n.obj := obj.link; - n.left.link := n.right; n.right := n.left; - n.left := DevCPT.NewNode(Nproc); - n.left.obj := obj; n.left.typ := obj.typ; - ASSERT(n.typ.form = obj.typ.form) - END UseThisCall; - - PROCEDURE Convert (n: DevCPT.Node; typ: DevCPT.Struct); - VAR new: DevCPT.Node; r: REAL; - BEGIN - IF n.class = Nconst THEN - ASSERT((n.typ.form IN {Int32, Int64}) & (typ = DevCPT.intrealtyp)); - r := n.conval.realval + n.conval.intval; - IF r = n.conval.realval + n.conval.intval THEN - n.conval.realval := r; n.conval.intval := -1; n.typ := typ; n.obj := NIL - END - END; - IF (n.typ # typ) - & ((n.class # Nmop) OR (n.subcl # conv) - OR ~DevCPT.Includes(n.typ.form, n.left.typ.form) & ~DevCPT.Includes(n.typ.form, typ.form)) THEN - new := DevCPT.NewNode(0); new^ := n^; - n.class := Nmop; n.subcl := conv; n.left := new; n.right := NIL; n.obj := NIL - END; - n.typ := typ - END Convert; - - PROCEDURE UseCallForComp (n: DevCPT.Node); - VAR new: DevCPT.Node; - BEGIN - new := DevCPT.NewNode(0); - new.left := n.left; new.right := n.right; - new.typ := DevCPT.int32typ; - UseThisCall(new, "Comp"); - n.left := new; - n.right := DevCPT.NewNode(Nconst); n.right.conval := DevCPT.NewConst(); - n.right.conval.intval := 0; n.right.conval.realval := 0; n.right.typ := DevCPT.int32typ; - END UseCallForComp; - - PROCEDURE UseCallForConv (n: DevCPT.Node; opts: SET); - VAR f, g: INTEGER; typ: DevCPT.Struct; - BEGIN - typ := n.typ; f := typ.form; g := n.left.typ.form; - IF realConv IN opts THEN - IF f IN realSet THEN - IF g = Real32 THEN UseThisCall(n, "Long") - ELSIF g = Real64 THEN UseThisCall(n, "Short") - ELSIF g = Int64 THEN UseThisCall(n, "LFloat") - ELSIF g = Int32 THEN UseThisCall(n, "Float") - ELSE Convert(n.left, DevCPT.int32typ); UseThisCall(n, "Float") - END - ELSIF g IN realSet THEN - IF f = Int64 THEN UseThisCall(n, "LFloor") - ELSIF f = Int32 THEN UseThisCall(n, "Floor") - ELSE n.typ := DevCPT.int32typ; UseThisCall(n, "Floor"); Convert(n, typ) - END - END - END; - IF longConv IN opts THEN - IF f = Int64 THEN - IF g = Int32 THEN UseThisCall(n, "Long") - ELSIF ~(g IN realSet) THEN Convert(n.left, DevCPT.int32typ); UseThisCall(n, "IntToLong") - END - ELSIF g = Int64 THEN - IF f = Int32 THEN UseThisCall(n, "Short") - ELSIF ~(f IN realSet) THEN n.typ := DevCPT.int32typ; UseThisCall(n, "LongToInt"); Convert(n, typ) - END - END - END - END UseCallForConv; - - PROCEDURE UseCallForMop (n: DevCPT.Node; opts: SET); - BEGIN - CASE n.subcl OF - | minus: - IF (realMop IN opts) & (n.typ.form IN realSet) OR (longMop IN opts) & (n.typ.form = Int64) THEN - UseThisCall(n, "Neg") - END - | abs: - IF (realMop IN opts) & (n.typ.form IN realSet) OR (longMop IN opts) & (n.typ.form = Int64) THEN - UseThisCall(n, "Abs") - END - | odd: - IF (longOdd IN opts) & (n.left.typ.form = Int64) THEN UseThisCall(n, "Odd") END - | conv: - UseCallForConv(n, opts) - ELSE - END - END UseCallForMop; - - PROCEDURE UseCallForDop (n: DevCPT.Node; opts: SET); - BEGIN - IF (realDop IN opts) & (n.left.typ.form IN realSet) - OR (longDop IN opts) & (n.left.typ.form = Int64) - OR (intMulDiv IN opts) & (n.subcl IN {times, div, mod}) & (n.typ.form = Int32) THEN - CASE n.subcl OF - | times: UseThisCall(n, "Mul") - | slash: UseThisCall(n, "Div") - | div: UseThisCall(n, "Div") - | mod: UseThisCall(n, "Mod") - | plus: UseThisCall(n, "Add") - | minus: UseThisCall(n, "Sub") - | ash: UseThisCall(n, "Ash") - | min: UseThisCall(n, "Min") - | max: UseThisCall(n, "Max") - | eql..geq: UseCallForComp(n) - ELSE - END - END - END UseCallForDop; - - PROCEDURE UseCallForMove (n: DevCPT.Node; typ: DevCPT.Struct; opts: SET); - VAR f, g: INTEGER; - BEGIN - f := n.typ.form; g := typ.form; - IF f # g THEN - IF (realConv IN opts) & ((f IN realSet) OR (g IN realSet)) - OR (longConv IN opts) & ((f = Int64) OR (g = Int64)) THEN - Convert(n, typ); - UseCallForConv(n, opts) - END - END - END UseCallForMove; - - PROCEDURE UseCallForAssign (n: DevCPT.Node; opts: SET); - BEGIN - IF n.subcl = assign THEN UseCallForMove(n.right, n.left.typ, opts) END - END UseCallForAssign; - - PROCEDURE UseCallForReturn (n: DevCPT.Node; opts: SET); - BEGIN - IF (n.left # NIL) & (n.obj # NIL) THEN UseCallForMove(n.left, n.obj.typ, opts) END - END UseCallForReturn; - - PROCEDURE UseCallForParam (n: DevCPT.Node; fp: DevCPT.Object; opts: SET); - BEGIN - WHILE n # NIL DO - UseCallForMove(n, fp.typ, opts); - n := n.link; fp := fp.link - END - END UseCallForParam; - - PROCEDURE UseCalls* (n: DevCPT.Node; opts: SET); - BEGIN - WHILE n # NIL DO - CASE n.class OF - | Nmop: - UseCalls(n.left, opts); UseCallForMop(n, opts) - | Ndop: - UseCalls(n.left, opts); UseCalls(n.right, opts); UseCallForDop(n, opts) - | Ncase: - UseCalls(n.left, opts); UseCalls(n.right.left, opts); UseCalls(n.right.right, opts) - | Nassign: - UseCalls(n.left, opts); UseCalls(n.right, opts); UseCallForAssign(n, opts) - | Ncall: - UseCalls(n.left, opts); UseCalls(n.right, opts); UseCallForParam(n.right, n.obj, opts) - | Nreturn: - UseCalls(n.left, opts); UseCallForReturn(n, opts) - | Ncasedo: - UseCalls(n.right, opts) - | Ngoto, Ndrop, Nloop, Nfield, Nderef, Nguard: - UseCalls(n.left, opts) - | Nenter, Nifelse, Nif, Nwhile, Nrepeat, Nwith, Ncomp, Nupto, Nindex: - UseCalls(n.left, opts); UseCalls(n.right, opts) - | Njsr, Nret, Nlabel, Ntrap, Nexit, Ninittd, Ntype, Nproc, Nconst, Nvar, Nvarpar: - END; - n := n.link - END - END UseCalls; - - - PROCEDURE UseReals* (n: DevCPT.Node; opts: SET); - BEGIN - WHILE n # NIL DO - CASE n.class OF - | Nmop: - IF (longMop IN opts) & (n.typ.form = Int64) & ((n.subcl = abs) OR (n.subcl = minus)) THEN - UseReals(n.left, opts - {hide} + {force}); n.typ := DevCPT.intrealtyp - ELSIF n.subcl = conv THEN UseReals(n.left, opts - {force} + {hide}) - ELSE UseReals(n.left, opts - {force, hide}) - END - | Ndop: - IF (longDop IN opts) & (n.left.typ.form = Int64) THEN - UseReals(n.left, opts - {hide} + {force}); UseReals(n.right, opts - {hide} + {force}); - IF n.typ.form = Int64 THEN n.typ := DevCPT.intrealtyp END - ELSE UseReals(n.left, opts - {force, hide}); UseReals(n.right, opts - {force, hide}) - END - | Ncase: - UseReals(n.left, opts - {force, hide}); UseReals(n.right.left, opts - {force, hide}); - UseReals(n.right.right, opts - {force, hide}) - | Ncasedo: - UseReals(n.right, opts - {force, hide}) - | Ngoto, Ndrop, Nloop, Nreturn, Nfield, Nderef, Nguard: - UseReals(n.left, opts - {force, hide}) - | Nenter, Nassign, Ncall, Nifelse, Nif, Nwhile, Nrepeat, Nwith, Ncomp, Nupto, Nindex: - UseReals(n.left, opts - {force, hide}); UseReals(n.right, opts - {force, hide}) - | Njsr, Nret, Nlabel, Ntrap, Nexit, Ninittd, Ntype, Nproc, Nconst, Nvar, Nvarpar: - END; - IF force IN opts THEN Convert(n, DevCPT.intrealtyp) - ELSIF ~(hide IN opts) & (n.typ = DevCPT.intrealtyp) THEN Convert(n, DevCPT.int64typ) - END; - n := n.link - END - END UseReals; - -END Dev0CPH. - - - - - PROCEDURE Traverse (n: DevCPT.Node; opts: SET); - BEGIN - WHILE n # NIL DO - CASE n.class OF - | Ncase: - Traverse(n.left, opts); Traverse(n.right.left, opts); Traverse(n.right.right, opts) - | Ncasedo: - Traverse(n.right, opts) - | Ngoto, Ndrop, Nloop, Nreturn, Nmop, Nfield, Nderef, Nguard: - Traverse(n.left, opts) - | Nenter, Nassign, Ncall, Nifelse, Nif, Nwhile, Nrepeat, Nwith, Ncomp, Ndop, Nupto, Nindex: - Traverse(n.left, opts); Traverse(n.right, opts) - | Njsr, Nret, Nlabel, Ntrap, Nexit, Ninittd, Ntype, Nproc, Nconst, Nvar, Nvarpar: - END; - n := n.link - END - END Traverse; - diff --git a/new/Dev0/Mod/CPL486.odc b/new/Dev0/Mod/CPL486.odc deleted file mode 100644 index b96a99c8d324498938e51cc5d8f8b74b53a24f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37044 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 diff --git a/new/Dev0/Mod/CPL486.txt b/new/Dev0/Mod/CPL486.txt deleted file mode 100644 index 0c2987a..0000000 --- a/new/Dev0/Mod/CPL486.txt +++ /dev/null @@ -1,1070 +0,0 @@ -MODULE Dev0CPL486; - - (* THIS IS TEXT COPY OF CPL486.odc *) - (* DO NOT EDIT *) - -(** - project = "BlackBox" - organization = "www.oberon.ch" - contributors = "Oberon microsystems" - version = "System/Rsrc/AboutBB" - copyright = "System/Rsrc/AboutBB" - license = "Docu/BB-License" - references = "ftp://ftp.inf.ethz.ch/pub/software/Oberon/OberonV4/Docu/OP2.Paper.ps" - changes = "" - issues = "" - -**) - - IMPORT DevCPM := Dev0CPM, DevCPT := Dev0CPT, DevCPE := Dev0CPE; - - TYPE - Item* = RECORD - mode*, tmode*, form*: BYTE; - offset*, index*, reg*, scale*: INTEGER; (* adr = offset + index * scale *) - typ*: DevCPT.Struct; - obj*: DevCPT.Object - END ; - -(* Items: - - mode | offset index scale reg obj ------------------------------------------------- - 1 Var | adr xreg scale obj (ea = FP + adr + xreg * scale) - 2 VarPar| off xreg scale obj (ea = [FP + obj.adr] + off + xreg * scale) - 3 Con | val (val2) NIL - Con | off obj (val = adr(obj) + off) - Con | id NIL (for predefined reals) - 6 LProc | obj - 7 XProc | obj - 9 CProc | obj -10 IProc | obj -13 TProc | mthno 0/1 obj (0 = normal / 1 = super call) -14 Ind | off xreg scale Reg (ea = Reg + off + xreg * scale) -15 Abs | adr xreg scale NIL (ea = adr + xreg * scale) - Abs | off xreg scale obj (ea = adr(obj) + off + xreg * scale) - Abs | off len 0 obj (for constant strings and reals) -16 Stk | (ea = ESP) -17 Cond | CC -18 Reg | (Reg2) Reg -19 DInd | off xreg scale Reg (ea = [Reg + off + xreg * scale]) - - tmode | record tag array desc -------------------------------------- - VarPar | [FP + obj.adr + 4] [FP + obj.adr] - Ind | [Reg - 4] [Reg + 8] - Con | Adr(typ.strobj) - -*) - - CONST - processor* = 10; (* for i386 *) - NewLbl* = 0; - - TYPE - Label* = INTEGER; (* 0: unassigned, > 0: address, < 0: - (linkadr + linktype * 2^24) *) - - VAR - level*: BYTE; - one*: DevCPT.Const; - - CONST - (* item base modes (=object modes) *) - Var = 1; VarPar = 2; Con = 3; LProc = 6; XProc = 7; CProc = 9; IProc = 10; TProc = 13; - - (* item modes for i386 (must not overlap item basemodes, > 13) *) - Ind = 14; Abs = 15; Stk = 16; Cond = 17; Reg = 18; DInd = 19; - - (* structure forms *) - Undef = 0; Byte = 1; Bool = 2; Char8 = 3; Int8 = 4; Int16 = 5; Int32 = 6; - Real32 = 7; Real64 = 8; Set = 9; String8 = 10; NilTyp = 11; NoTyp = 12; - Pointer = 13; ProcTyp = 14; Comp = 15; - Char16 = 16; String16 = 17; Int64 = 18; Guid = 23; - - (* composite structure forms *) - Basic = 1; Array = 2; DynArr = 3; Record = 4; - - (* condition codes *) - ccB = 2; ccAE = 3; ccBE = 6; ccA = 7; (* unsigned *) - ccL = 12; ccGE = 13; ccLE = 14; ccG = 15; (* signed *) - ccE = 4; ccNE = 5; ccS = 8; ccNS = 9; ccO = 0; ccNO = 1; - ccAlways = -1; ccNever = -2; ccCall = -3; - - (* registers *) - AX = 0; CX = 1; DX = 2; BX = 3; SP = 4; BP = 5; SI = 6; DI = 7; AH = 4; CH = 5; DH = 6; BH = 7; - - (* fixup types *) - absolute = 100; relative = 101; copy = 102; table = 103; tableend = 104; short = 105; - - (* system trap numbers *) - withTrap = -1; caseTrap = -2; funcTrap = -3; typTrap = -4; - recTrap = -5; ranTrap = -6; inxTrap = -7; copyTrap = -8; - - - VAR - Size: ARRAY 32 OF INTEGER; (* Size[typ.form] == +/- typ.size *) - a1, a2: Item; - - - PROCEDURE MakeReg* (VAR x: Item; reg: INTEGER; form: BYTE); - BEGIN - ASSERT((reg >= 0) & (reg < 8)); - x.mode := Reg; x.reg := reg; x.form := form - END MakeReg; - - PROCEDURE MakeConst* (VAR x: Item; val: INTEGER; form: BYTE); - BEGIN - x.mode := Con; x.offset := val; x.form := form; x.obj := NIL; - END MakeConst; - - PROCEDURE AllocConst* (VAR x: Item; con: DevCPT.Const; form: BYTE); - VAR r: REAL; short: SHORTREAL; c: DevCPT.Const; i: INTEGER; - BEGIN - IF form IN {Real32, Real64} THEN - r := con.realval; - IF ABS(r) <= MAX(SHORTREAL) THEN - short := SHORT(r); - IF short = r THEN form := Real32 (* a shortreal can represent the exact value *) - ELSE form := Real64 (* use a real *) - END - ELSE form := Real64 (* use a real *) - END - ELSIF form IN {String8, String16, Guid} THEN - x.index := con.intval2 (* string length *) - END; - DevCPE.AllocConst(con, form, x.obj, x.offset); - x.form := form; x.mode := Abs; x.scale := 0 - END AllocConst; - - (*******************************************************) - - PROCEDURE BegStat*; (* general-purpose procedure which is called before each statement *) - BEGIN - END BegStat; - - PROCEDURE EndStat*; (* general-purpose procedure which is called after each statement *) - BEGIN - END EndStat; - - (*******************************************************) - - PROCEDURE SetLabel* (VAR L: Label); - VAR link, typ, disp, x: INTEGER; c: SHORTCHAR; - BEGIN - ASSERT(L <= 0); link := -L; - WHILE link # 0 DO - typ := link DIV 1000000H; link := link MOD 1000000H; - IF typ = short THEN - disp := DevCPE.pc - link - 1; ASSERT(disp < 128); - DevCPE.PutByte(link, disp); link := 0 - ELSIF typ = relative THEN - x := DevCPE.ThisWord(link); DevCPE.PutWord(link, DevCPE.pc - link - 4); link := x - ELSE - x := DevCPE.ThisWord(link); DevCPE.PutWord(link, DevCPE.pc + typ * 1000000H); link := x - END - END; - L := DevCPE.pc; - a1.mode := 0; a2.mode := 0 - END SetLabel; - - - (*******************************************************) - - PROCEDURE GenWord (x: INTEGER); - BEGIN - DevCPE.GenByte(x); DevCPE.GenByte(x DIV 256) - END GenWord; - - PROCEDURE GenDbl (x: INTEGER); - BEGIN - DevCPE.GenByte(x); DevCPE.GenByte(x DIV 256); DevCPE.GenByte(x DIV 10000H); DevCPE.GenByte(x DIV 1000000H) - END GenDbl; - - PROCEDURE CaseEntry* (tab, from, to: INTEGER); - VAR a, e: INTEGER; - BEGIN - a := tab + 4 * from; e := tab + 4 * to; - WHILE a <= e DO - DevCPE.PutByte(a, DevCPE.pc); - DevCPE.PutByte(a + 1, DevCPE.pc DIV 256); - DevCPE.PutByte(a + 2, DevCPE.pc DIV 65536); - INC(a, 4) - END; - a1.mode := 0; a2.mode := 0 - END CaseEntry; - - PROCEDURE GenLinked (VAR x: Item; type: BYTE); - VAR link: DevCPT.LinkList; - BEGIN - IF x.obj = NIL THEN GenDbl(x.offset) - ELSE - link := DevCPE.OffsetLink(x.obj, x.offset); - IF link # NIL THEN - GenDbl(type * 1000000H + link.linkadr MOD 1000000H); - link.linkadr := DevCPE.pc - 4 - ELSE GenDbl(0) - END - END - END GenLinked; - - PROCEDURE CheckSize (form: BYTE; VAR w: INTEGER); - BEGIN - IF form IN {Int16, Char16} THEN DevCPE.GenByte(66H); w := 1 - ELSIF form >= Int32 THEN ASSERT(form IN {Int32, Set, NilTyp, Pointer, ProcTyp}); w := 1 - ELSE w := 0 - END - END CheckSize; - - PROCEDURE CheckForm (form: BYTE; VAR mf: INTEGER); - BEGIN - IF form = Real32 THEN mf := 0 - ELSIF form = Real64 THEN mf := 4 - ELSIF form = Int32 THEN mf := 2 - ELSE ASSERT(form = Int16); mf := 6 - END - END CheckForm; - - PROCEDURE CheckConst (VAR x: Item; VAR s: INTEGER); - BEGIN - IF (x.form > Int8) & (x.offset >= -128) & (x.offset < 128) & (x.obj = NIL) THEN s := 2 - ELSE s := 0 - END - END CheckConst; - - PROCEDURE GenConst (VAR x: Item; short: BOOLEAN); - BEGIN - IF x.obj # NIL THEN GenLinked(x, absolute) - ELSIF x.form <= Int8 THEN DevCPE.GenByte(x.offset) - ELSIF short & (x.offset >= -128) & (x.offset < 128) THEN DevCPE.GenByte(x.offset) - ELSIF x.form IN {Int16, Char16} THEN GenWord(x.offset) - ELSE GenDbl(x.offset) - END - END GenConst; - - PROCEDURE GenCExt (code: INTEGER; VAR x: Item); - VAR disp, mod, base, scale: INTEGER; - BEGIN - ASSERT(x.mode IN {Reg, Ind, Abs, Stk}); - ASSERT((code MOD 8 = 0) & (code < 64)); - disp := x.offset; base := x.reg; scale := x.scale; - IF x.mode = Reg THEN mod := 0C0H; scale := 0 - ELSIF x.mode = Stk THEN base := SP; mod := 0; disp := 0; scale := 0 - ELSIF x.mode = Abs THEN - IF scale = 1 THEN base := x.index; mod := 80H; scale := 0 - ELSE base := BP; mod := 0 - END - ELSIF (disp = 0) & (base # BP) THEN mod := 0 - ELSIF (disp >= -128) & (disp < 128) THEN mod := 40H - ELSE mod := 80H - END; - IF scale # 0 THEN - DevCPE.GenByte(mod + code + 4); base := base + x.index * 8; - IF scale = 8 THEN DevCPE.GenByte(0C0H + base); - ELSIF scale = 4 THEN DevCPE.GenByte(80H + base); - ELSIF scale = 2 THEN DevCPE.GenByte(40H + base); - ELSE ASSERT(scale = 1); DevCPE.GenByte(base); - END; - ELSE - DevCPE.GenByte(mod + code + base); - IF (base = SP) & (mod <= 80H) THEN DevCPE.GenByte(24H) END - END; - IF x.mode = Abs THEN GenLinked(x, absolute) - ELSIF mod = 80H THEN GenDbl(disp) - ELSIF mod = 40H THEN DevCPE.GenByte(disp) - END - END GenCExt; - - PROCEDURE GenDExt (VAR r, x: Item); - BEGIN - ASSERT(r.mode = Reg); - GenCExt(r.reg * 8, x) - END GenDExt; - - (*******************************************************) - - PROCEDURE GenMove* (VAR from, to: Item); - VAR w: INTEGER; - BEGIN - ASSERT(Size[from.form] = Size[to.form]); - IF to.mode = Reg THEN - IF from.mode = Con THEN - IF to.reg = AX THEN - - IF (a1.mode = Con) & (from.offset = a1.offset) & (from.obj = a1.obj) & (from.form = a1.form) THEN - RETURN - END; - - a1 := from; a2.mode := 0 - END; - CheckSize(from.form, w); - IF (from.offset = 0) & (from.obj = NIL) THEN - DevCPE.GenByte(30H + w); DevCPE.GenByte(0C0H + 9 * to.reg) (* XOR r,r *) - ELSE - DevCPE.GenByte(0B0H + w * 8 + to.reg); GenConst(from, FALSE) - END; - ELSIF (to.reg = AX) & (from.mode = Abs) & (from.scale = 0) THEN - - IF (a1.mode = Abs) & (from.offset = a1.offset) & (from.obj = a1.obj) & (from.form = a1.form) - OR (a2.mode = Abs) & (from.offset = a2.offset) & (from.obj = a2.obj) & (from.form = a2.form) THEN - RETURN - END; - - a1 := from; a2.mode := 0; - CheckSize(from.form, w); - DevCPE.GenByte(0A0H + w); GenLinked(from, absolute); - ELSIF (from.mode # Reg) OR (from.reg # to.reg) THEN - IF to.reg = AX THEN - IF (from.mode = Ind) & (from.scale = 0) & ((from.reg = BP) OR (from.reg = BX)) THEN - - IF (a1.mode = Ind) & (from.offset = a1.offset) & (from.reg = a1.reg) & (from.form = a1.form) - OR (a2.mode = Ind) & (from.offset = a2.offset) & (from.reg = a2.reg) & (from.form = a2.form) THEN - RETURN - END; - - a1 := from - ELSE a1.mode := 0 - END; - a2.mode := 0 - END; - CheckSize(from.form, w); - DevCPE.GenByte(8AH + w); GenDExt(to, from) - END - ELSE - CheckSize(from.form, w); - IF from.mode = Con THEN - DevCPE.GenByte(0C6H + w); GenCExt(0, to); GenConst(from, FALSE); - a1.mode := 0; a2.mode := 0 - ELSIF (from.reg = AX) & (to.mode = Abs) & (to.scale = 0) THEN - DevCPE.GenByte(0A2H + w); GenLinked(to, absolute); - a2 := to - ELSE - DevCPE.GenByte(88H + w); GenDExt(from, to); - IF from.reg = AX THEN - IF (to.mode = Ind) & (to.scale = 0) & ((to.reg = BP) OR (to.reg = BX)) THEN a2 := to END - ELSE a1.mode := 0; a2.mode := 0 - END - END - END - END GenMove; - - PROCEDURE GenExtMove* (VAR from, to: Item); - VAR w, op: INTEGER; - BEGIN - ASSERT(from.mode # Con); - IF from.form IN {Byte, Char8, Char16} THEN op := 0B6H (* MOVZX *) - ELSE op := 0BEH (* MOVSX *) - END; - IF from.form IN {Int16, Char16} THEN INC(op) END; - DevCPE.GenByte(0FH); DevCPE.GenByte(op); GenDExt(to, from); - IF to.reg = AX THEN a1.mode := 0; a2.mode := 0 END - END GenExtMove; - - PROCEDURE GenSignExt* (VAR from, to: Item); - BEGIN - ASSERT(to.mode = Reg); - IF (from.mode = Reg) & (from.reg = AX) & (to.reg = DX) THEN - DevCPE.GenByte(99H) (* cdq *) - ELSE - GenMove(from, to); (* mov to, from *) - DevCPE.GenByte(0C1H); GenCExt(38H, to); DevCPE.GenByte(31) (* sar to, 31 *) - END - END GenSignExt; - - PROCEDURE GenLoadAdr* (VAR from, to: Item); - BEGIN - ASSERT(to.form IN {Int32, Pointer, ProcTyp}); - IF (from.mode = Abs) & (from.scale = 0) THEN - DevCPE.GenByte(0B8H + to.reg); GenLinked(from, absolute) - ELSIF from.mode = Stk THEN - DevCPE.GenByte(89H); GenCExt(SP * 8, to) - ELSIF (from.mode # Ind) OR (from.offset # 0) OR (from.scale # 0) THEN - DevCPE.GenByte(8DH); GenDExt(to, from) - ELSIF from.reg # to.reg THEN - DevCPE.GenByte(89H); GenCExt(from.reg * 8, to) - ELSE RETURN - END; - IF to.reg = AX THEN a1.mode := 0; a2.mode := 0 END - END GenLoadAdr; - - PROCEDURE GenPush* (VAR src: Item); - VAR s: INTEGER; - BEGIN - IF src.mode = Con THEN - ASSERT(src.form >= Int32); - CheckConst(src, s); DevCPE.GenByte(68H + s); GenConst(src, TRUE) - ELSIF src.mode = Reg THEN - ASSERT((src.form >= Int16) OR (src.reg < 4)); - DevCPE.GenByte(50H + src.reg) - ELSE - ASSERT(src.form >= Int32); - DevCPE.GenByte(0FFH); GenCExt(30H, src) - END - END GenPush; - - PROCEDURE GenPop* (VAR dst: Item); - BEGIN - IF dst.mode = Reg THEN - ASSERT((dst.form >= Int16) OR (dst.reg < 4)); - DevCPE.GenByte(58H + dst.reg); - IF dst.reg = AX THEN a1.mode := 0; a2.mode := 0 END - ELSE - DevCPE.GenByte(08FH); GenCExt(0, dst) - END - END GenPop; - - PROCEDURE GenConOp (op: INTEGER; VAR src, dst: Item); - VAR w, s: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - CheckSize(src.form, w); - CheckConst(src, s); - IF (dst.mode = Reg) & (dst.reg = AX) & (s = 0) THEN - DevCPE.GenByte(op + 4 + w); GenConst(src, FALSE) - ELSE - DevCPE.GenByte(80H + s + w); GenCExt(op, dst); GenConst(src, TRUE) - END - END GenConOp; - - PROCEDURE GenDirOp (op: INTEGER; VAR src, dst: Item); - VAR w: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - CheckSize(src.form, w); - IF dst.mode = Reg THEN - DevCPE.GenByte(op + 2 + w); GenDExt(dst, src) - ELSE - DevCPE.GenByte(op + w); GenDExt(src, dst) - END - END GenDirOp; - - PROCEDURE GenAdd* (VAR src, dst: Item; ovflchk: BOOLEAN); - VAR w: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF src.mode = Con THEN - IF src.obj = NIL THEN - IF src.offset = 1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(40H + dst.reg) (* inc *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(0, dst) - END - ELSIF src.offset = -1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(48H + dst.reg) (* dec *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(8, dst) - END - ELSIF src.offset # 0 THEN - GenConOp(0, src, dst) - ELSE RETURN - END - ELSE - GenConOp(0, src, dst) - END - ELSE - GenDirOp(0, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenAdd; - - PROCEDURE GenAddC* (VAR src, dst: Item; first, ovflchk: BOOLEAN); - VAR op: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF first THEN op := 0 ELSE op := 10H END; - IF src.mode = Con THEN GenConOp(op, src, dst) - ELSE GenDirOp(op, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenAddC; - - PROCEDURE GenSub* (VAR src, dst: Item; ovflchk: BOOLEAN); - VAR w: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF src.mode = Con THEN - IF src.obj = NIL THEN - IF src.offset = 1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(48H + dst.reg) (* dec *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(8, dst) - END - ELSIF src.offset = -1 THEN - IF (dst.mode = Reg) & (dst.form >= Int32) THEN DevCPE.GenByte(40H + dst.reg) (* inc *) - ELSE CheckSize(dst.form, w); DevCPE.GenByte(0FEH + w); GenCExt(0, dst) - END - ELSIF src.offset # 0 THEN - GenConOp(28H, src, dst) - ELSE RETURN - END - ELSE - GenConOp(28H, src, dst) - END - ELSE - GenDirOp(28H, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenSub; - - PROCEDURE GenSubC* (VAR src, dst: Item; first, ovflchk: BOOLEAN); - VAR op: INTEGER; - BEGIN - ASSERT(Size[src.form] = Size[dst.form]); - IF first THEN op := 28H ELSE op := 18H END; - IF src.mode = Con THEN GenConOp(op, src, dst) - ELSE GenDirOp(op, src, dst) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenSubC; - - PROCEDURE GenComp* (VAR src, dst: Item); - VAR w: INTEGER; - BEGIN - IF src.mode = Con THEN - IF (src.offset = 0) & (src.obj = NIL) & (dst.mode = Reg) THEN - CheckSize(dst.form, w); DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * dst.reg) (* or r,r *) - ELSE GenConOp(38H, src, dst) - END - ELSE - GenDirOp(38H, src, dst) - END - END GenComp; - - PROCEDURE GenAnd* (VAR src, dst: Item); - BEGIN - IF src.mode = Con THEN - IF (src.obj # NIL) OR (src.offset # -1) THEN GenConOp(20H, src, dst) END - ELSE GenDirOp(20H, src, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenAnd; - - PROCEDURE GenOr* (VAR src, dst: Item); - BEGIN - IF src.mode = Con THEN - IF (src.obj # NIL) OR (src.offset # 0) THEN GenConOp(8H, src, dst) END - ELSE GenDirOp(8H, src, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenOr; - - PROCEDURE GenXor* (VAR src, dst: Item); - BEGIN - IF src.mode = Con THEN - IF (src.obj # NIL) OR (src.offset # 0) THEN GenConOp(30H, src, dst) END - ELSE GenDirOp(30H, src, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenXor; - - PROCEDURE GenTest* (VAR x, y: Item); - VAR w: INTEGER; - BEGIN - ASSERT(Size[x.form] = Size[y.form]); - CheckSize(x.form, w); - IF x.mode = Con THEN - IF (x.mode = Reg) & (x.reg = AX) THEN - DevCPE.GenByte(0A8H + w); GenConst(x, FALSE) - ELSE - DevCPE.GenByte(0F6H + w); GenCExt(0, y); GenConst(x, FALSE) - END - ELSE - DevCPE.GenByte(84H + w); - IF y.mode = Reg THEN GenDExt(y, x) ELSE GenDExt(x, y) END - END - END GenTest; - - PROCEDURE GenNeg* (VAR dst: Item; ovflchk: BOOLEAN); - VAR w: INTEGER; - BEGIN - CheckSize(dst.form, w); DevCPE.GenByte(0F6H + w); GenCExt(18H, dst); - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenNeg; - - PROCEDURE GenNot* (VAR dst: Item); - VAR w: INTEGER; - BEGIN - CheckSize(dst.form, w); DevCPE.GenByte(0F6H + w); GenCExt(10H, dst); - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenNot; - - PROCEDURE GenMul* (VAR src, dst: Item; ovflchk: BOOLEAN); - VAR w, s, val, f2, f5, f9: INTEGER; - BEGIN - ASSERT((dst.mode = Reg) & (Size[src.form] = Size[dst.form])); - IF (src.mode = Con) & (src.offset = 1) THEN RETURN END; - IF src.form <= Int8 THEN - ASSERT(dst.reg = 0); - DevCPE.GenByte(0F6H); GenCExt(28H, src) - ELSIF src.mode = Con THEN - val := src.offset; - IF (src.obj = NIL) & (val # 0) & ~ovflchk THEN - f2 := 0; f5 := 0; f9 := 0; - WHILE ~ODD(val) DO val := val DIV 2; INC(f2) END; - WHILE val MOD 9 = 0 DO val := val DIV 9; INC(f9) END; - WHILE val MOD 5 = 0 DO val := val DIV 5; INC(f5) END; - IF ABS(val) <= 3 THEN - WHILE f9 > 0 DO - DevCPE.GenByte(8DH); - DevCPE.GenByte(dst.reg * 8 + 4); - DevCPE.GenByte(0C0H + dst.reg * 9); - DEC(f9) - END; - WHILE f5 > 0 DO - DevCPE.GenByte(8DH); - DevCPE.GenByte(dst.reg * 8 + 4); - DevCPE.GenByte(80H + dst.reg * 9); - DEC(f5) - END; - IF ABS(val) = 3 THEN - DevCPE.GenByte(8DH); DevCPE.GenByte(dst.reg * 8 + 4); DevCPE.GenByte(40H + dst.reg * 9) - END; - IF f2 > 1 THEN DevCPE.GenByte(0C1H); DevCPE.GenByte(0E0H + dst.reg); DevCPE.GenByte(f2) - ELSIF f2 = 1 THEN DevCPE.GenByte(1); DevCPE.GenByte(0C0H + dst.reg * 9) - END; - IF val < 0 THEN DevCPE.GenByte(0F7H); GenCExt(18H, dst) END; - IF dst.reg = AX THEN a1.mode := 0; a2.mode := 0 END; - RETURN - END - END; - CheckSize(src.form, w); CheckConst(src, s); - DevCPE.GenByte(69H + s); GenDExt(dst, dst); GenConst(src, TRUE) - ELSE - CheckSize(src.form, w); - DevCPE.GenByte(0FH); DevCPE.GenByte(0AFH); GenDExt(dst, src) - END; - IF ovflchk THEN DevCPE.GenByte(0CEH) END; - IF dst.reg = AX THEN a1.mode := 0; a2.mode := 0 END - END GenMul; - - PROCEDURE GenDiv* (VAR src: Item; mod, pos: BOOLEAN); - VAR w, rem: INTEGER; - BEGIN - ASSERT(src.mode = Reg); - IF src.form >= Int32 THEN DevCPE.GenByte(99H) (* cdq *) - ELSIF src.form = Int16 THEN DevCPE.GenByte(66H); DevCPE.GenByte(99H) (* cwd *) - ELSE DevCPE.GenByte(66H); DevCPE.GenByte(98H) (* cbw *) - END; - CheckSize(src.form, w); DevCPE.GenByte(0F6H + w); GenCExt(38H, src); (* idiv src *) - IF src.form > Int8 THEN rem := 2 (* edx *) ELSE rem := 4 (* ah *) END; - IF pos THEN (* src > 0 *) - CheckSize(src.form, w); DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * rem); (* or rem,rem *) - IF mod THEN - DevCPE.GenByte(79H); DevCPE.GenByte(2); (* jns end *) - DevCPE.GenByte(2 + w); GenCExt(8 * rem, src); (* add rem,src *) - ELSE - DevCPE.GenByte(79H); DevCPE.GenByte(1); (* jns end *) - DevCPE.GenByte(48H); (* dec eax *) - END - ELSE - CheckSize(src.form, w); DevCPE.GenByte(30H + w); GenCExt(8 * rem, src); (* xor src,rem *) - IF mod THEN - DevCPE.GenByte(79H); (* jns end *) - IF src.form = Int16 THEN DevCPE.GenByte(9); DevCPE.GenByte(66H) ELSE DevCPE.GenByte(8) END; - DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * rem); (* or rem,rem *) - DevCPE.GenByte(74H); DevCPE.GenByte(4); (* je end *) - DevCPE.GenByte(30H + w); GenCExt(8 * rem, src); (* xor src,rem *) - DevCPE.GenByte(2 + w); GenCExt(8 * rem, src); (* add rem,src *) - ELSE - DevCPE.GenByte(79H); (* jns end *) - IF src.form = Int16 THEN DevCPE.GenByte(6); DevCPE.GenByte(66H) ELSE DevCPE.GenByte(5) END; - DevCPE.GenByte(8 + w); DevCPE.GenByte(0C0H + 9 * rem); (* or rem,rem *) - DevCPE.GenByte(74H); DevCPE.GenByte(1); (* je end *) - DevCPE.GenByte(48H); (* dec eax *) - END -(* - CheckSize(src.form, w); DevCPE.GenByte(3AH + w); GenCExt(8 * rem, src); (* cmp rem,src *) - IF mod THEN - DevCPE.GenByte(72H); DevCPE.GenByte(4); (* jb end *) - DevCPE.GenByte(7FH); DevCPE.GenByte(2); (* jg end *) - DevCPE.GenByte(2 + w); GenCExt(8 * rem, src); (* add rem,src *) - ELSE - DevCPE.GenByte(72H); DevCPE.GenByte(3); (* jb end *) - DevCPE.GenByte(7FH); DevCPE.GenByte(1); (* jg end *) - DevCPE.GenByte(48H); (* dec eax *) - END -*) - END; - a1.mode := 0; a2.mode := 0 - END GenDiv; - - PROCEDURE GenShiftOp* (op: INTEGER; VAR cnt, dst: Item); - VAR w: INTEGER; - BEGIN - CheckSize(dst.form, w); - IF cnt.mode = Con THEN - ASSERT(cnt.offset >= 0); ASSERT(cnt.obj = NIL); - IF cnt.offset = 1 THEN - IF (op = 10H) & (dst.mode = Reg) THEN (* shl r *) - DevCPE.GenByte(w); GenDExt(dst, dst) (* add r, r *) - ELSE - DevCPE.GenByte(0D0H + w); GenCExt(op, dst) - END - ELSIF cnt.offset > 1 THEN - DevCPE.GenByte(0C0H + w); GenCExt(op, dst); DevCPE.GenByte(cnt.offset) - END - ELSE - ASSERT((cnt.mode = Reg) & (cnt.reg = CX)); - DevCPE.GenByte(0D2H + w); GenCExt(op, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenShiftOp; - - PROCEDURE GenBitOp* (op: INTEGER; VAR num, dst: Item); - BEGIN - DevCPE.GenByte(0FH); - IF num.mode = Con THEN - ASSERT(num.obj = NIL); - DevCPE.GenByte(0BAH); GenCExt(op, dst); DevCPE.GenByte(num.offset) - ELSE - ASSERT((num.mode = Reg) & (num.form = Int32)); - DevCPE.GenByte(83H + op); GenDExt(num, dst) - END; - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenBitOp; - - PROCEDURE GenSetCC* (cc: INTEGER; VAR dst: Item); - BEGIN - ASSERT((dst.form = Bool) & (cc >= 0)); - DevCPE.GenByte(0FH); DevCPE.GenByte(90H + cc); GenCExt(0, dst); - IF (dst.mode # Reg) OR (dst.reg = AX) THEN a1.mode := 0; a2.mode := 0 END - END GenSetCC; - - PROCEDURE GenFLoad* (VAR src: Item); - VAR mf: INTEGER; - BEGIN - IF src.mode = Con THEN (* predefined constants *) - DevCPE.GenByte(0D9H); DevCPE.GenByte(0E8H + src.offset) - ELSIF src.form = Int64 THEN - DevCPE.GenByte(0DFH); GenCExt(28H, src) - ELSE - CheckForm(src.form, mf); - DevCPE.GenByte(0D9H + mf); GenCExt(0, src) - END - END GenFLoad; - - PROCEDURE GenFStore* (VAR dst: Item; pop: BOOLEAN); - VAR mf: INTEGER; - BEGIN - IF dst.form = Int64 THEN ASSERT(pop); - DevCPE.GenByte(0DFH); GenCExt(38H, dst); DevCPE.GenByte(9BH) (* wait *) - ELSE - CheckForm(dst.form, mf); DevCPE.GenByte(0D9H + mf); - IF pop THEN GenCExt(18H, dst); DevCPE.GenByte(9BH) (* wait *) - ELSE GenCExt(10H, dst) - END - END; - a1.mode := 0; a2.mode := 0 - END GenFStore; - - PROCEDURE GenFDOp* (op: INTEGER; VAR src: Item); - VAR mf: INTEGER; - BEGIN - IF src.mode = Reg THEN - DevCPE.GenByte(0DEH); DevCPE.GenByte(0C1H + op) - ELSE - CheckForm(src.form, mf); - DevCPE.GenByte(0D8H + mf); GenCExt(op, src) - END - END GenFDOp; - - PROCEDURE GenFMOp* (op: INTEGER); - BEGIN - DevCPE.GenByte(0D8H + op DIV 256); - DevCPE.GenByte(op MOD 256); - IF op = 07E0H THEN a1.mode := 0; a2.mode := 0 END (* FSTSW AX *) - END GenFMOp; - - PROCEDURE GenJump* (cc: INTEGER; VAR L: Label; shortjmp: BOOLEAN); - BEGIN - IF cc # ccNever THEN - IF shortjmp OR (L > 0) & (DevCPE.pc + 2 - L <= 128) & (cc # ccCall) THEN - IF cc = ccAlways THEN DevCPE.GenByte(0EBH) - ELSE DevCPE.GenByte(70H + cc) - END; - IF L > 0 THEN DevCPE.GenByte(L - DevCPE.pc - 1) - ELSE ASSERT(L = 0); L := -(DevCPE.pc + short * 1000000H); DevCPE.GenByte(0) - END - ELSE - IF cc = ccAlways THEN DevCPE.GenByte(0E9H) - ELSIF cc = ccCall THEN DevCPE.GenByte(0E8H) - ELSE DevCPE.GenByte(0FH); DevCPE.GenByte(80H + cc) - END; - IF L > 0 THEN GenDbl(L - DevCPE.pc - 4) - ELSE GenDbl(-L); L := -(DevCPE.pc - 4 + relative * 1000000H) - END - END - END - END GenJump; - - PROCEDURE GenExtJump* (cc: INTEGER; VAR dst: Item); - BEGIN - IF cc = ccAlways THEN DevCPE.GenByte(0E9H) - ELSE DevCPE.GenByte(0FH); DevCPE.GenByte(80H + cc) - END; - dst.offset := 0; GenLinked(dst, relative) - END GenExtJump; - - PROCEDURE GenIndJump* (VAR dst: Item); - BEGIN - DevCPE.GenByte(0FFH); GenCExt(20H, dst) - END GenIndJump; - - PROCEDURE GenCaseJump* (VAR src: Item); - VAR link: DevCPT.LinkList; tab: INTEGER; - BEGIN - ASSERT((src.form = Int32) & (src.mode = Reg)); - DevCPE.GenByte(0FFH); DevCPE.GenByte(24H); DevCPE.GenByte(85H + 8 * src.reg); - tab := (DevCPE.pc + 7) DIV 4 * 4; - NEW(link); link.offset := tab; link.linkadr := DevCPE.pc; - link.next := DevCPE.CaseLinks; DevCPE.CaseLinks := link; - GenDbl(absolute * 1000000H + tab); - WHILE DevCPE.pc < tab DO DevCPE.GenByte(90H) END; - END GenCaseJump; -(* - PROCEDURE GenCaseJump* (VAR src: Item; num: LONGINT; VAR tab: LONGINT); - VAR link: DevCPT.LinkList; else, last: LONGINT; - BEGIN - ASSERT((src.form = Int32) & (src.mode = Reg)); - DevCPE.GenByte(0FFH); DevCPE.GenByte(24H); DevCPE.GenByte(85H + 8 * src.reg); - tab := (DevCPE.pc + 7) DIV 4 * 4; - else := tab + num * 4; last := else - 4; - NEW(link); link.offset := tab; link.linkadr := DevCPE.pc; - link.next := CaseLinks; CaseLinks := link; - GenDbl(absolute * 1000000H + tab); - WHILE DevCPE.pc < tab DO DevCPE.GenByte(90H) END; - WHILE DevCPE.pc < last DO GenDbl(table * 1000000H + else) END; - GenDbl(tableend * 1000000H + else) - END GenCaseJump; -*) - PROCEDURE GenCaseEntry* (VAR L: Label; last: BOOLEAN); - VAR typ: INTEGER; - BEGIN - IF last THEN typ := tableend * 1000000H ELSE typ := table * 1000000H END; - IF L > 0 THEN GenDbl(L + typ) ELSE GenDbl(-L); L := -(DevCPE.pc - 4 + typ) END - END GenCaseEntry; - - PROCEDURE GenCall* (VAR dst: Item); - BEGIN - IF dst.mode IN {LProc, XProc, IProc} THEN - DevCPE.GenByte(0E8H); - IF dst.obj.mnolev >= 0 THEN (* local *) - IF dst.obj.adr > 0 THEN GenDbl(dst.obj.adr - DevCPE.pc - 4) - ELSE GenDbl(-dst.obj.adr); dst.obj.adr := -(DevCPE.pc - 4 + relative * 1000000H) - END - ELSE (* imported *) - dst.offset := 0; GenLinked(dst, relative) - END - ELSE DevCPE.GenByte(0FFH); GenCExt(10H, dst) - END; - a1.mode := 0; a2.mode := 0 - END GenCall; - - PROCEDURE GenAssert* (cc, no: INTEGER); - BEGIN - IF cc # ccAlways THEN - IF cc >= 0 THEN - DevCPE.GenByte(70H + cc); (* jcc end *) - IF no < 0 THEN DevCPE.GenByte(2) ELSE DevCPE.GenByte(3) END - END; - IF no < 0 THEN - DevCPE.GenByte(8DH); DevCPE.GenByte(0E0H - no) - ELSE - DevCPE.GenByte(8DH); DevCPE.GenByte(0F0H); DevCPE.GenByte(no) - END - END - END GenAssert; - - PROCEDURE GenReturn* (val: INTEGER); - BEGIN - IF val = 0 THEN DevCPE.GenByte(0C3H) - ELSE DevCPE.GenByte(0C2H); GenWord(val) - END; - a1.mode := 0; a2.mode := 0 - END GenReturn; - - PROCEDURE LoadStr (size: INTEGER); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF size <= 1 THEN DevCPE.GenByte(0ACH) ELSE DevCPE.GenByte(0ADH) END (* lods *) - END LoadStr; - - PROCEDURE StoreStr (size: INTEGER); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF size <= 1 THEN DevCPE.GenByte(0AAH) ELSE DevCPE.GenByte(0ABH) END (* stos *) - END StoreStr; - - PROCEDURE ScanStr (size: INTEGER; rep: BOOLEAN); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF rep THEN DevCPE.GenByte(0F2H) END; - IF size <= 1 THEN DevCPE.GenByte(0AEH) ELSE DevCPE.GenByte(0AFH) END (* scas *) - END ScanStr; - - PROCEDURE TestNull (size: INTEGER); - BEGIN - IF size = 2 THEN DevCPE.GenByte(66H) END; - IF size <= 1 THEN DevCPE.GenByte(8); DevCPE.GenByte(0C0H); (* or al,al *) - ELSE DevCPE.GenByte(9); DevCPE.GenByte(0C0H); (* or ax,ax *) - END - END TestNull; - - PROCEDURE GenBlockMove* (wsize, len: INTEGER); (* len = 0: len in ECX *) - VAR w: INTEGER; - BEGIN - IF len = 0 THEN (* variable size move *) - IF wsize = 4 THEN w := 1 ELSIF wsize = 2 THEN w := 1; DevCPE.GenByte(66H) ELSE w := 0 END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0A4H + w); (* rep:movs *) - ELSE (* fixed size move *) - len := len * wsize; - IF len >= 16 THEN - DevCPE.GenByte(0B9H); GenDbl(len DIV 4); (* ld ecx,len/4 *) - DevCPE.GenByte(0F3H); DevCPE.GenByte(0A5H); (* rep:movs long*) - len := len MOD 4 - END; - WHILE len >= 4 DO DevCPE.GenByte(0A5H); DEC(len, 4) END; (* movs long *); - IF len >= 2 THEN DevCPE.GenByte(66H); DevCPE.GenByte(0A5H) END; (* movs word *); - IF ODD(len) THEN DevCPE.GenByte(0A4H) END; (* movs byte *) - END - END GenBlockMove; - - PROCEDURE GenBlockStore* (wsize, len: INTEGER); (* len = 0: len in ECX *) - VAR w: INTEGER; - BEGIN - IF len = 0 THEN (* variable size move *) - IF wsize = 4 THEN w := 1 ELSIF wsize = 2 THEN w := 1; DevCPE.GenByte(66H) ELSE w := 0 END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0AAH + w); (* rep:stos *) - ELSE (* fixed size move *) - len := len * wsize; - IF len >= 16 THEN - DevCPE.GenByte(0B9H); GenDbl(len DIV 4); (* ld ecx,len/4 *) - DevCPE.GenByte(0F3H); DevCPE.GenByte(0ABH); (* rep:stos long*) - len := len MOD 4 - END; - WHILE len >= 4 DO DevCPE.GenByte(0ABH); DEC(len, 4) END; (* stos long *); - IF len >= 2 THEN DevCPE.GenByte(66H); DevCPE.GenByte(0ABH) END; (* stos word *); - IF ODD(len) THEN DevCPE.GenByte(0ABH) END; (* stos byte *) - END - END GenBlockStore; - - PROCEDURE GenBlockComp* (wsize, len: INTEGER); (* len = 0: len in ECX *) - VAR w: INTEGER; - BEGIN - ASSERT(len >= 0); - IF len > 0 THEN DevCPE.GenByte(0B9H); GenDbl(len) END; (* ld ecx,len *) - IF wsize = 4 THEN w := 1 ELSIF wsize = 2 THEN w := 1; DevCPE.GenByte(66H) ELSE w := 0 END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0A6H + w) (* repe:cmps *) - END GenBlockComp; - - PROCEDURE GenStringMove* (excl: BOOLEAN; wsize, dsize, len: INTEGER); - (* - len = 0: len in ECX, len = -1: len undefined; wsize # dsize -> convert; size = 0: opsize = 1, incsize = 2; excl: don't move 0X - *) - VAR loop, end: Label; - BEGIN - IF len > 0 THEN DevCPE.GenByte(0B9H); GenDbl(len) END; (* ld ecx,len *) - (* len >= 0: len IN ECX *) - IF (dsize = 2) & (wsize < 2) THEN DevCPE.GenByte(31H); DevCPE.GenByte(0C0H) END; (* xor eax,eax *) - loop := NewLbl; end := NewLbl; - SetLabel(loop); LoadStr(wsize); - IF wsize = 0 THEN DevCPE.GenByte(46H) END; (* inc esi *) - IF len < 0 THEN (* no limit *) - StoreStr(dsize); TestNull(wsize); GenJump(ccNE, loop, TRUE); - IF excl THEN (* dec edi *) - DevCPE.GenByte(4FH); - IF dsize # 1 THEN DevCPE.GenByte(4FH) END - END; - ELSE (* cx limit *) - IF excl THEN TestNull(wsize); GenJump(ccE, end, TRUE); StoreStr(dsize) - ELSE StoreStr(dsize); TestNull(wsize); GenJump(ccE, end, TRUE) - END; - DevCPE.GenByte(49H); (* dec ecx *) - GenJump(ccNE, loop, TRUE); - GenAssert(ccNever, copyTrap); (* trap *) - SetLabel(end) - END; - a1.mode := 0; a2.mode := 0 - END GenStringMove; - - PROCEDURE GenStringComp* (wsize, dsize: INTEGER); - (* wsize # dsize -> convert; size = 0: opsize = 1, incsize = 2; *) - VAR loop, end: Label; - BEGIN - IF (dsize = 2) & (wsize < 2) THEN DevCPE.GenByte(31H); DevCPE.GenByte(0C0H); (* xor eax,eax *) END; - loop := NewLbl; end := NewLbl; - SetLabel(loop); LoadStr(wsize); - IF wsize = 0 THEN DevCPE.GenByte(46H) END; (* inc esi *) - ScanStr(dsize, FALSE); GenJump(ccNE, end, TRUE); - IF dsize = 0 THEN DevCPE.GenByte(47H) END; (* inc edi *) - TestNull(wsize); GenJump(ccNE, loop, TRUE); - SetLabel(end); - a1.mode := 0; a2.mode := 0 - END GenStringComp; - - PROCEDURE GenStringLength* (wsize, len: INTEGER); (* len = 0: len in ECX, len = -1: len undefined *) - BEGIN - DevCPE.GenByte(31H); DevCPE.GenByte(0C0H); (* xor eax,eax *) - IF len # 0 THEN DevCPE.GenByte(0B9H); GenDbl(len) END; (* ld ecx,len *) - ScanStr(wsize, TRUE); - a1.mode := 0; a2.mode := 0 - END GenStringLength; - - PROCEDURE GenStrStore* (size: INTEGER); - VAR w: INTEGER; - BEGIN - IF size # 0 THEN - IF size MOD 4 = 0 THEN w := 1; size := size DIV 4 - ELSIF size MOD 2 = 0 THEN w := 2; size := size DIV 2 - ELSE w := 0 - END; - DevCPE.GenByte(0B9H); GenDbl(size); (* ld ecx,size *) - IF w = 2 THEN DevCPE.GenByte(66H); w := 1 END - ELSE w := 0 - END; - DevCPE.GenByte(0F3H); DevCPE.GenByte(0AAH + w); (* rep:stos *) - a1.mode := 0; a2.mode := 0 - END GenStrStore; - - PROCEDURE GenCode* (op: INTEGER); - BEGIN - DevCPE.GenByte(op); - a1.mode := 0; a2.mode := 0 - END GenCode; - - - PROCEDURE Init*(opt: SET); - BEGIN - DevCPE.Init(processor, opt); - level := 0; - NEW(one); one.realval := 1.0; one.intval := DevCPM.ConstNotAlloc; - END Init; - - PROCEDURE Close*; - BEGIN - a1.obj := NIL; a1.typ := NIL; a2.obj := NIL; a2.typ := NIL; one := NIL; - DevCPE.Close - END Close; - -BEGIN - Size[Undef] := 0; - Size[Byte] := 1; - Size[Bool] := 1; - Size[Char8] := 1; - Size[Int8] := 1; - Size[Int16] := 2; - Size[Int32] := 4; - Size[Real32] := -4; - Size[Real64] := -8; - Size[Set] := 4; - Size[String8] := 0; - Size[NilTyp] := 4; - Size[NoTyp] := 0; - Size[Pointer] := 4; - Size[ProcTyp] := 4; - Size[Comp] := 0; - Size[Char16] := 2; - Size[Int64] := 8; - Size[String16] := 0 -END Dev0CPL486. diff --git a/new/Dev0/Mod/CPM.odc b/new/Dev0/Mod/CPM.odc deleted file mode 100644 index 0049d014759cc6129430da419c30ae3309656f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28285 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 type) - self-organizing list *) - eDict, eHead: StoreDict; (* mapping (id -> elem) - self-organizing list *) - sDict, sHead: StoreDict; (* mapping (id -> store) - self-organizing list *) - st: ReaderState; - noDomain: BOOLEAN; - store: Store - END; - - Writer* = RECORD - rider-: Files.Writer; - writtenStore-: Store; - era: INTEGER; (* current externalization era *) - noDomain: BOOLEAN; (* no domain encountered yet *) - modelType: Kernel.Type; - domain: Domain; (* domain of current era *) - nextTypeId, nextElemId, nextStoreId: INTEGER; (* next id of non-dict type or elem *) - tDict, tHead: TypeDict; (* mapping (id -> type) - self-organizing list *) - st: WriterState - END; - - TrapCleaner = POINTER TO RECORD (Kernel.TrapCleaner) - d: Domain - END; - - VAR - nextEra: INTEGER; (* next externalization era *) - thisTypeRes: INTEGER; (* side-effect res code of ThisType *) - logReports: BOOLEAN; - - - (** Cleaner **) - - PROCEDURE (c: TrapCleaner) Cleanup; - BEGIN - c.d.level := 0; - c.d.sDict := NIL; - c.d.s := NIL - END Cleanup; - - PROCEDURE (d: Domain) SetSequencer* (sequencer: ANYPTR), NEW; - BEGIN - ASSERT(d.sequencer = NIL); - d.sequencer := sequencer - END SetSequencer; - - PROCEDURE (d: Domain) GetSequencer*(): ANYPTR, NEW; - BEGIN - RETURN d.sequencer - END GetSequencer; - - - PROCEDURE^ Report* (IN msg, p0, p1, p2: ARRAY OF CHAR); - - PROCEDURE^ (VAR rd: Reader) SetPos* (pos: INTEGER), NEW; - PROCEDURE^ (VAR rd: Reader) ReadVersion* (min, max: INTEGER; OUT version: INTEGER), NEW; - PROCEDURE^ (VAR rd: Reader) ReadSChar* (OUT x: SHORTCHAR), NEW; - PROCEDURE^ (VAR rd: Reader) ReadInt* (OUT x: INTEGER), NEW; - PROCEDURE^ (VAR rd: Reader) ReadXString* (OUT x: ARRAY OF CHAR), NEW; - PROCEDURE^ (VAR rd: Reader) ReadStore* (OUT x: Store), NEW; - - PROCEDURE^ (VAR wr: Writer) SetPos* (pos: INTEGER), NEW; - PROCEDURE^ (VAR wr: Writer) WriteVersion* (version: INTEGER), NEW; - PROCEDURE^ (VAR wr: Writer) WriteSChar* (x: SHORTCHAR), NEW; - PROCEDURE^ (VAR wr: Writer) WriteInt* (x: INTEGER), NEW; - PROCEDURE^ (VAR wr: Writer) WriteXString* (IN x: ARRAY OF CHAR), NEW; - PROCEDURE^ (VAR wr: Writer) WriteStore* (x: Store), NEW; - - PROCEDURE^ Join* (s0, s1: Store); - - - (** Operation **) - - PROCEDURE (op: Operation) Do* (), NEW, ABSTRACT; - - - (** Store **) - - PROCEDURE NewDomain (initialized: BOOLEAN): Domain; - VAR d: Domain; - BEGIN - NEW(d); d.level := 0; d.sDict := NIL; d.cleaner := NIL; - d.initialized := initialized; d.copyDomain := FALSE; - RETURN d - END NewDomain; - - PROCEDURE DomainOf (s: Store): Domain; - VAR d, p, q, r: Domain; - BEGIN - d := s.dlink; - IF (d # NIL) & (d.dlink # NIL) THEN - p := NIL; q := d; r := q.dlink; - WHILE r # NIL DO q.dlink := p; p := q; q := r; r := q.dlink END; - d := q; - WHILE p # NIL DO q := p; p := q.dlink; q.dlink := d END; - s.dlink := d - END; - RETURN d - END DomainOf; - - PROCEDURE (s: Store) Domain*(): Domain, NEW; - VAR d: Domain; - BEGIN - d := DomainOf(s); - IF (d # NIL) & ~d.initialized THEN d := NIL END; - RETURN d - END Domain; - - PROCEDURE (s: Store) CopyFrom- (source: Store), NEW, EMPTY; - - PROCEDURE (s: Store) Internalize- (VAR rd: Reader), NEW, EXTENSIBLE; - VAR thisVersion: INTEGER; - BEGIN - rd.ReadVersion(minVersion, maxStoreVersion, thisVersion); - IF ~rd.cancelled & s.isElem THEN - rd.ReadVersion(minVersion, maxStoreVersion, thisVersion) - (* works since maxStoreVersion = maxElemVersion = 0 in pre-1.3 *) - END - END Internalize; - - PROCEDURE (s: Store) ExternalizeAs- (VAR s1: Store), NEW, EMPTY; - - PROCEDURE (s: Store) Externalize- (VAR wr: Writer), NEW, EXTENSIBLE; - BEGIN - wr.WriteVersion(maxStoreVersion); - IF s.isElem THEN wr.WriteVersion(maxStoreVersion) END - END Externalize; - - - (** Alien **) - - PROCEDURE^ CopyOf* (s: Store): Store; - - PROCEDURE (a: Alien) CopyFrom- (source: Store); - VAR s, c, cp: AlienComp; piece: AlienPiece; part: AlienPart; - BEGIN - WITH source: Alien DO - a.path := source.path; - a.cause := source.cause; - a.file := source.file; - a.comps := NIL; - s := source.comps; cp := NIL; - WHILE s # NIL DO - WITH s: AlienPiece DO - NEW(piece); c := piece; - piece.pos := s.pos; piece.len := s.len - | s: AlienPart DO - NEW(part); c := part; - IF s.store # NIL THEN part.store := CopyOf(s.store); Join(part.store, a) END - END; - IF cp # NIL THEN cp.next := c ELSE a.comps := c END; - cp := c; - s := s.next - END - END - END CopyFrom; - - PROCEDURE (a: Alien) Internalize- (VAR rd: Reader); - BEGIN - HALT(100) - END Internalize; - - PROCEDURE (a: Alien) Externalize- (VAR w: Writer); - BEGIN - HALT(100) - END Externalize; - - - (* types *) - - PROCEDURE GetThisTypeName (t: Kernel.Type; VAR type: TypeName); - VAR i, j: INTEGER; ch: CHAR; name: Kernel.Name; - BEGIN - Kernel.GetTypeName(t, name); type := t.mod.name$; - i := 0; ch := type[0]; WHILE ch # 0X DO INC(i); ch := type[i] END; - type[i] := "."; INC(i); - j := 0; REPEAT ch := name[j]; type[i] := ch; INC(i); INC(j) UNTIL ch = 0X; - IF compatible THEN - IF type[i-2] = "^" THEN (* for backward compatibility *) - type[i-2] := "D"; type[i-1] := "e"; type[i] := "s"; type[i+1] := "c"; type[i+2] := 0X - END - END - END GetThisTypeName; - - PROCEDURE ThisType (type: TypeName): Kernel.Type; - VAR m: Kernel.Module; t: Kernel.Type; i, j: INTEGER; ch: CHAR; - typ: Kernel.Name; mod: ARRAY 256 OF CHAR; res: INTEGER; str: ARRAY 256 OF CHAR; - BEGIN - ASSERT(type # "", 20); - i := 0; ch := type[0]; - WHILE (ch # ".") & (ch # 0X) DO mod[i] := SHORT(ch); INC(i); ch := type[i] END; - ASSERT(ch = ".", 21); - mod[i] := 0X; INC(i); - m := Kernel.ThisMod(mod); - IF m # NIL THEN - j := 0; REPEAT ch := type[i]; typ[j] := SHORT(ch); INC(i); INC(j) UNTIL ch = 0X; - t := Kernel.ThisType(m, typ); - IF (t = NIL) & (j >= 5) THEN (* try pointer type *) - IF (typ[j-5] = "D") & (typ[j-4] = "e") & (typ[j-3] = "s") & (typ[j-2] = "c") THEN - typ[j-5] := "^"; typ[j-4] := 0X; - t := Kernel.ThisType(m, typ) - END - END; - IF t = NIL THEN thisTypeRes := typeNotFound END - ELSE - t := NIL; - Kernel.GetLoaderResult(res, str, str, str); - CASE res OF - | Kernel.fileNotFound: thisTypeRes := moduleFileNotFound - | Kernel.syntaxError: thisTypeRes := invalidModuleFile - | Kernel.objNotFound: thisTypeRes := inconsModuleVersion - | Kernel.illegalFPrint: thisTypeRes := inconsModuleVersion - | Kernel.cyclicImport: thisTypeRes := invalidModuleFile (* cyclic import ... *) - ELSE thisTypeRes := invalidModuleFile - END - END; - RETURN t - END ThisType; - - PROCEDURE SameType (IN x, y: TypeName): BOOLEAN; - VAR i: INTEGER; - BEGIN - IF x = y THEN RETURN TRUE - ELSE - i := 0; WHILE x[i] = y[i] DO INC(i) END; - RETURN - (x[i] = "^") & (x[i+1] = 0X) & (y[i] = "D") & (y[i+1] = "e") & (y[i+2] = "s") & (y[i+3] = "c") & (y[i+4] = 0X) - OR (y[i] = "^") & (y[i+1] = 0X) & (x[i] = "D") & (x[i+1] = "e") & (x[i+2] = "s") & (x[i+3] = "c") & (x[i+4] = 0X) - END - END SameType; - - PROCEDURE SamePath (t: Kernel.Type; VAR path: TypePath): BOOLEAN; - (* check whether t coincides with path *) - VAR tn: TypeName; i, n: INTEGER; - BEGIN - i := -1; n := Kernel.LevelOf(t); - REPEAT - GetThisTypeName(t.base[n], tn); - DEC(n); INC(i) - UNTIL (n < 0) OR ~SameType(tn, path[i]); - RETURN SameType(tn, path[i]) - END SamePath; - - PROCEDURE NewStore (t: Kernel.Type): Store; - VAR p: ANYPTR; - BEGIN - ASSERT(t # NIL, 20); - Kernel.NewObj(p, t); ASSERT(p # NIL, 100); - ASSERT(p IS Store, 21); - RETURN p(Store) - END NewStore; - - - (* type dictionary *) - - PROCEDURE GetThisType (VAR d: TypeDict; id: INTEGER; VAR type: TypeName); - (* pre: (id, t) IN dict *) - VAR h, p: TypeDict; org, k: INTEGER; - BEGIN - k := id MOD dictLineLen; org := id - k; - h := NIL; p := d; WHILE p.org # org DO h := p; p := p.next END; - IF h # NIL THEN h.next := p.next; p.next := d; d := p END; - type := p.type[k]; - ASSERT(type # "", 100) - END GetThisType; - - PROCEDURE ThisId (VAR d: TypeDict; t: TypeName): INTEGER; - (* pre: t # "" *) - (* post: res = id if (t, id) in dict, res = -1 else *) - VAR h, p: TypeDict; k, id: INTEGER; - BEGIN - h := NIL; p := d; id := -1; - WHILE (p # NIL) & (id < 0) DO - k := 0; WHILE (k < dictLineLen) & (p.type[k, 0] # 0X) & (p.type[k] # t) DO INC(k) END; - IF (k < dictLineLen) & (p.type[k, 0] # 0X) THEN id := p.org + k - ELSE h := p; p := p.next - END - END; - IF (id >= 0) & (h # NIL) THEN h.next := p.next; p.next := d; d := p END; - RETURN id - END ThisId; - - PROCEDURE ThisBaseId (VAR d: TypeDict; id: INTEGER): INTEGER; - (* post: res = id if base(t) # NIL, res = -1 if base(t) = NIL; res >= 0 => T(res) = base(t) *) - VAR h, p: TypeDict; k, org, baseId: INTEGER; - BEGIN - k := id MOD dictLineLen; org := id - k; - h := NIL; p := d; WHILE p.org # org DO h := p; p := p.next END; - IF h # NIL THEN h.next := p.next; p.next := d; d := p END; - baseId := p.baseId[k]; - RETURN baseId - END ThisBaseId; - - PROCEDURE AddType (VAR d, h: TypeDict; id: INTEGER; type: TypeName); - VAR k: INTEGER; - BEGIN - k := id MOD dictLineLen; - IF (h = NIL) OR ((k = 0) & (h.org # id)) THEN - NEW(h); h.org := id - k; h.next := d; d := h - END; - h.type[k] := type; h.baseId[k] := -1 - END AddType; - - PROCEDURE AddBaseId (h: TypeDict; id, baseId: INTEGER); - VAR k: INTEGER; - BEGIN - k := id MOD dictLineLen; - h.baseId[k] := baseId - END AddBaseId; - - PROCEDURE InitTypeDict (VAR d, h: TypeDict; VAR nextID: INTEGER); - BEGIN - d := NIL; h := NIL; nextID := 0 - END InitTypeDict; - - - (* store dictionary - used to maintain referential sharing *) - - PROCEDURE ThisStore (VAR d: StoreDict; id: INTEGER): Store; - (* pre: (id, s) IN dict *) - VAR h, p: StoreDict; s: Store; k, org: INTEGER; - BEGIN - k := id MOD dictLineLen; org := id - k; - h := NIL; p := d; WHILE p.org # org DO h := p; p := p.next END; - IF h # NIL THEN h.next := p.next; p.next := d; d := p END; - s := p.elem[k]; - ASSERT(s # NIL, 100); - RETURN s - END ThisStore; - - PROCEDURE AddStore (VAR d, h: StoreDict; s: Store); - VAR k: INTEGER; - BEGIN - k := s.id MOD dictLineLen; - IF (h = NIL) OR ((k = 0) & (h.org # s.id)) THEN - NEW(h); h.org := s.id - k; h.next := d; d := h - END; - h.elem[k] := s - END AddStore; - - PROCEDURE InitStoreDict (VAR d, h: StoreDict; VAR nextID: INTEGER); - BEGIN - d := NIL; h := NIL; nextID := 0 - END InitStoreDict; - - - (* support for type mapping *) - - PROCEDURE ReadPath (VAR rd: Reader; VAR path: TypePath); - VAR h: TypeDict; id, extId: INTEGER; i: INTEGER; kind: SHORTCHAR; - - PROCEDURE AddPathComp (VAR rd: Reader); - BEGIN - IF h # NIL THEN AddBaseId(h, extId, rd.nextTypeId) END; - AddType(rd.tDict, rd.tHead, rd.nextTypeId, path[i]); - h := rd.tHead; extId := rd.nextTypeId - END AddPathComp; - - BEGIN - h := NIL; i := 0; rd.ReadSChar(kind); - WHILE kind = newExt DO - rd.ReadXString(path[i]); - AddPathComp(rd); INC(rd.nextTypeId); - IF path[i] # elemTName THEN INC(i) END; - rd.ReadSChar(kind) - END; - IF kind = newBase THEN - rd.ReadXString(path[i]); - AddPathComp(rd); INC(rd.nextTypeId); INC(i) - ELSE - ASSERT(kind = oldType, 100); - rd.ReadInt(id); - IF h # NIL THEN AddBaseId(h, extId, id) END; - REPEAT - GetThisType(rd.tDict, id, path[i]); id := ThisBaseId(rd.tDict, id); - IF path[i] # elemTName THEN INC(i) END - UNTIL id = -1 - END; - path[i] := "" - END ReadPath; - - PROCEDURE WritePath (VAR wr: Writer; VAR path: TypePath); - VAR h: TypeDict; id, extId: INTEGER; i, n: INTEGER; - BEGIN - h := NIL; - n := 0; WHILE path[n] # "" DO INC(n) END; - i := 0; - WHILE i < n DO - id := ThisId(wr.tDict, path[i]); - IF id >= 0 THEN - IF h # NIL THEN AddBaseId(h, extId, id) END; - wr.WriteSChar(oldType); wr.WriteInt(id); n := i - ELSE - IF i + 1 < n THEN wr.WriteSChar(newExt) ELSE wr.WriteSChar(newBase) END; - wr.WriteXString(path[i]); - IF h # NIL THEN AddBaseId(h, extId, wr.nextTypeId) END; - AddType(wr.tDict, wr.tHead, wr.nextTypeId, path[i]); - h := wr.tHead; extId := wr.nextTypeId; - INC(wr.nextTypeId); - IF path[i] = modelTName THEN - id := ThisId(wr.tDict, elemTName); ASSERT(id < 0, 100); ASSERT(i + 2 = n, 101); - wr.WriteSChar(newExt); wr.WriteXString(elemTName); - IF h # NIL THEN AddBaseId(h, extId, wr.nextTypeId) END; - AddType(wr.tDict, wr.tHead, wr.nextTypeId, elemTName); - h := wr.tHead; extId := wr.nextTypeId; - INC(wr.nextTypeId) - END - END; - INC(i) - END - END WritePath; - - PROCEDURE WriteType (VAR wr: Writer; t: Kernel.Type); - VAR path: TypePath; n, i: INTEGER; - BEGIN - i := 0; n := Kernel.LevelOf(t); - WHILE n >= 0 DO - GetThisTypeName(t.base[n], path[i]); - DEC(n); INC(i) - END; - path[i] := ""; - WritePath(wr, path) - END WriteType; - - - (* support for alien mapping *) - - PROCEDURE InternalizeAlien (VAR rd: Reader; VAR comps: AlienComp; down, pos, len: INTEGER); - VAR h, p: AlienComp; piece: AlienPiece; part: AlienPart; file: Files.File; - next, end, max: INTEGER; - BEGIN - file := rd.rider.Base(); max := file.Length(); - end := pos + len; h := NIL; - IF down # 0 THEN next := down ELSE next := end END; - WHILE pos < end DO - ASSERT(end <= max, 100); - IF pos < next THEN - NEW(piece); piece.pos := pos; piece.len := next - pos; - p := piece; pos := next - ELSE - ASSERT(pos = next, 101); - rd.SetPos(next); - NEW(part); rd.ReadStore(part.store); - ASSERT(rd.st.end > next, 102); - p := part; pos := rd.st.end; - IF rd.st.next > 0 THEN - ASSERT(rd.st.next > next, 103); next := rd.st.next - ELSE next := end - END - END; - IF h = NIL THEN comps := p ELSE h.next := p END; - h := p - END; - ASSERT(pos = end, 104); - rd.SetPos(end) - END InternalizeAlien; - - PROCEDURE ExternalizePiece (VAR wr: Writer; file: Files.File; p: AlienPiece); - VAR r: Files.Reader; w: Files.Writer; b: BYTE; l, len: INTEGER; - BEGIN - l := file.Length(); len := p.len; - ASSERT(0 <= p.pos, 100); ASSERT(p.pos <= l, 101); - ASSERT(0 <= len, 102); ASSERT(len <= l - p.pos, 103); - r := file.NewReader(NIL); r.SetPos(p.pos); - w := wr.rider; - WHILE len # 0 DO r.ReadByte(b); w.WriteByte(b); DEC(len) END - END ExternalizePiece; - - PROCEDURE ExternalizeAlien (VAR wr: Writer; file: Files.File; comps: AlienComp); - VAR p: AlienComp; - BEGIN - p := comps; - WHILE p # NIL DO - WITH p: AlienPiece DO - ExternalizePiece(wr, file, p) - | p: AlienPart DO - wr.WriteStore(p.store) - END; - p := p.next - END - END ExternalizeAlien; - - - (** Reader **) - - PROCEDURE (VAR rd: Reader) ConnectTo* (f: Files.File), NEW; - (** pre: rd.rider = NIL OR f = NIL **) - BEGIN - IF f = NIL THEN - rd.rider := NIL - ELSE - ASSERT(rd.rider = NIL, 20); - rd.rider := f.NewReader(rd.rider); rd.SetPos(0); - InitTypeDict(rd.tDict, rd.tHead, rd.nextTypeId); - InitStoreDict(rd.eDict, rd.eHead, rd.nextElemId); - InitStoreDict(rd.sDict, rd.sHead, rd.nextStoreId); - rd.noDomain := TRUE - END; - rd.readAlien := FALSE - END ConnectTo; - - PROCEDURE (VAR rd: Reader) SetPos* (pos: INTEGER), NEW; - BEGIN - rd.rider.SetPos(pos) - END SetPos; - - PROCEDURE (VAR rd: Reader) Pos* (): INTEGER, NEW; - BEGIN - RETURN rd.rider.Pos() - END Pos; - - PROCEDURE (VAR rd: Reader) ReadBool* (OUT x: BOOLEAN), NEW; - VAR b: BYTE; - BEGIN - rd.rider.ReadByte(b); x := b # 0 - END ReadBool; - - PROCEDURE (VAR rd: Reader) ReadSChar* (OUT x: SHORTCHAR), NEW; - BEGIN - rd.rider.ReadByte(SYSTEM.VAL(BYTE, x)) - END ReadSChar; - - PROCEDURE (VAR rd: Reader) ReadXChar* (OUT x: CHAR), NEW; - VAR c: SHORTCHAR; - BEGIN - rd.rider.ReadByte(SYSTEM.VAL(BYTE,c)); x := c - END ReadXChar; - - PROCEDURE (VAR rd: Reader) ReadChar* (OUT x: CHAR), NEW; - VAR le: ARRAY 2 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 2); - x := CHR(le[0] MOD 256 + (le[1] MOD 256) * 256) - END ReadChar; - - PROCEDURE (VAR rd: Reader) ReadByte* (OUT x: BYTE), NEW; - BEGIN - rd.rider.ReadByte(x) - END ReadByte; - - PROCEDURE (VAR rd: Reader) ReadSInt* (OUT x: SHORTINT), NEW; - VAR le, be: ARRAY 2 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 2); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(SHORTINT, le) - ELSE - be[0] := le[1]; be[1] := le[0]; - x := SYSTEM.VAL(SHORTINT, be) - END - END ReadSInt; - - PROCEDURE (VAR rd: Reader) ReadXInt* (OUT x: INTEGER), NEW; - VAR le, be: ARRAY 2 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 2); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(SHORTINT, le) - ELSE - be[0] := le[1]; be[1] := le[0]; - x := SYSTEM.VAL(SHORTINT, be) - END - END ReadXInt; - - PROCEDURE (VAR rd: Reader) ReadInt* (OUT x: INTEGER), NEW; - VAR le, be: ARRAY 4 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 4); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(INTEGER, le) - ELSE - be[0] := le[3]; be[1] := le[2]; be[2] := le[1]; be[3] := le[0]; - x := SYSTEM.VAL(INTEGER, be) - END - END ReadInt; - - PROCEDURE (VAR rd: Reader) ReadLong* (OUT x: LONGINT), NEW; - VAR le, be: ARRAY 8 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 8); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(LONGINT, le) - ELSE - be[0] := le[7]; be[1] := le[6]; be[2] := le[5]; be[3] := le[4]; - be[4] := le[3]; be[5] := le[2]; be[6] := le[1]; be[7] := le[0]; - x := SYSTEM.VAL(LONGINT, be) - END - END ReadLong; - - PROCEDURE (VAR rd: Reader) ReadSReal* (OUT x: SHORTREAL), NEW; - VAR le, be: ARRAY 4 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 4); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(SHORTREAL, le) - ELSE - be[0] := le[3]; be[1] := le[2]; be[2] := le[1]; be[3] := le[0]; - x := SYSTEM.VAL(SHORTREAL, be) - END - END ReadSReal; - - PROCEDURE (VAR rd: Reader) ReadXReal* (OUT x: REAL), NEW; - VAR le, be: ARRAY 4 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 4); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(SHORTREAL, le) - ELSE - be[0] := le[3]; be[1] := le[2]; be[2] := le[1]; be[3] := le[0]; - x := SYSTEM.VAL(SHORTREAL, be) - END - END ReadXReal; - - PROCEDURE (VAR rd: Reader) ReadReal* (OUT x: REAL), NEW; - VAR le, be: ARRAY 8 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 8); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(REAL, le) - ELSE - be[0] := le[7]; be[1] := le[6]; be[2] := le[5]; be[3] := le[4]; - be[4] := le[3]; be[5] := le[2]; be[6] := le[1]; be[7] := le[0]; - x := SYSTEM.VAL(REAL, be) - END - END ReadReal; - - PROCEDURE (VAR rd: Reader) ReadSet* (OUT x: SET), NEW; - VAR le, be: ARRAY 4 OF BYTE; (* little endian, big endian *) - BEGIN - rd.rider.ReadBytes(le, 0, 4); - IF Kernel.littleEndian THEN - x := SYSTEM.VAL(SET, le) - ELSE - be[0] := le[3]; be[1] := le[2]; be[2] := le[1]; be[3] := le[0]; - x := SYSTEM.VAL(SET, be) - END - END ReadSet; - - PROCEDURE (VAR rd: Reader) ReadSString* (OUT x: ARRAY OF SHORTCHAR), NEW; - VAR i: INTEGER; ch: SHORTCHAR; - BEGIN - i := 0; REPEAT rd.ReadSChar(ch); x[i] := ch; INC(i) UNTIL ch = 0X - END ReadSString; - - PROCEDURE (VAR rd: Reader) ReadXString* (OUT x: ARRAY OF CHAR), NEW; - VAR i: INTEGER; ch: CHAR; - BEGIN - i := 0; REPEAT rd.ReadXChar(ch); x[i] := ch; INC(i) UNTIL ch = 0X - END ReadXString; - - PROCEDURE (VAR rd: Reader) ReadString* (OUT x: ARRAY OF CHAR), NEW; - VAR i: INTEGER; ch: CHAR; - BEGIN - i := 0; REPEAT rd.ReadChar(ch); x[i] := ch; INC(i) UNTIL ch = 0X - END ReadString; - - PROCEDURE AlienReport (cause: INTEGER); - VAR s, e: ARRAY 32 OF CHAR; - BEGIN - CASE cause OF - | alienVersion: s := "#System:AlienVersion" - | alienComponent: s := "#System:AlienComponent" - | inconsistentVersion: s := "#System:InconsistentVersion" - ELSE s := "#System:UnknownCause" - END; - Strings.IntToString(cause, e); - Report("#System:AlienCause ^0 ^1 ^2", s, e, "") - END AlienReport; - - PROCEDURE AlienTypeReport (cause: INTEGER; t: ARRAY OF CHAR); - VAR s: ARRAY 64 OF CHAR; - BEGIN - CASE cause OF - | inconsistentType: s := "#System:InconsistentType ^0" - | moduleFileNotFound: s := "#System:CodeFileNotFound ^0" - | invalidModuleFile: s := "#System:InvalidCodeFile ^0" - | inconsModuleVersion: s := "#System:InconsistentModuleVersion ^0" - | typeNotFound: s := "#System:TypeNotFound ^0" - END; - Report(s, t, "", "") - END AlienTypeReport; - - PROCEDURE (VAR rd: Reader) TurnIntoAlien* (cause: INTEGER), NEW; - BEGIN - ASSERT(cause > 0, 20); - rd.cancelled := TRUE; rd.readAlien := TRUE; rd.cause := cause; - AlienReport(cause) - END TurnIntoAlien; - - PROCEDURE (VAR rd: Reader) ReadVersion* (min, max: INTEGER; OUT version: INTEGER), NEW; - VAR v: BYTE; - BEGIN - rd.ReadByte(v); version := v; - IF (version < min) OR (version > max) THEN - rd.TurnIntoAlien(alienVersion) - END - END ReadVersion; - - PROCEDURE (VAR rd: Reader) ReadStore* (OUT x: Store), NEW; - VAR a: Alien; t: Kernel.Type; - len, pos, pos1, id, comment, next, down, downPos, nextTypeId, nextElemId, nextStoreId: INTEGER; - kind: SHORTCHAR; path: TypePath; type: TypeName; - save: ReaderState; - BEGIN - rd.ReadSChar(kind); - IF kind = nil THEN - rd.ReadInt(comment); rd.ReadInt(next); - rd.st.end := rd.Pos(); - IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END; - x := NIL - ELSIF kind = link THEN - rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next); - rd.st.end := rd.Pos(); - IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END; - x := ThisStore(rd.eDict, id) - ELSIF kind = newlink THEN - rd.ReadInt(id); rd.ReadInt(comment); rd.ReadInt(next); - rd.st.end := rd.Pos(); - IF (next > 0) OR ((next = 0) & ODD(comment)) THEN rd.st.next := rd.st.end + next ELSE rd.st.next := 0 END; - x := ThisStore(rd.sDict, id) - ELSIF (kind = store) OR (kind = elem) THEN - IF kind = elem THEN - id := rd.nextElemId; INC(rd.nextElemId) - ELSE - id := rd.nextStoreId; INC(rd.nextStoreId) - END; - ReadPath(rd, path); type := path[0]; - nextTypeId := rd.nextTypeId; nextElemId := rd.nextElemId; nextStoreId := rd.nextStoreId; - rd.ReadInt(comment); - pos1 := rd.Pos(); - rd.ReadInt(next); rd.ReadInt(down); rd.ReadInt(len); - pos := rd.Pos(); - IF next > 0 THEN rd.st.next := pos1 + next + 4 ELSE rd.st.next := 0 END; - IF down > 0 THEN downPos := pos1 + down + 8 ELSE downPos := 0 END; - rd.st.end := pos + len; - rd.cause := 0; - ASSERT(len >= 0, 101); - IF next # 0 THEN - ASSERT(rd.st.next > pos1, 102); - IF down # 0 THEN - ASSERT(downPos < rd.st.next, 103) - END - END; - IF down # 0 THEN - ASSERT(downPos > pos1, 104); - ASSERT(downPos < rd.st.end, 105) - END; - t := ThisType(type); - IF t # NIL THEN - x := NewStore(t); x.isElem := kind = elem - ELSE - rd.cause := thisTypeRes; AlienTypeReport(rd.cause, type); - x := NIL - END; - IF x # NIL THEN - IF SamePath(t, path) THEN - IF kind = elem THEN - x.id := id; AddStore(rd.eDict, rd.eHead, x) - ELSE - x.id := id; AddStore(rd.sDict, rd.sHead, x) - END; - save := rd.st; rd.cause := 0; rd.cancelled := FALSE; - x.Internalize(rd); - rd.st := save; - IF rd.cause # 0 THEN x := NIL - ELSIF (rd.Pos() # rd.st.end) OR rd.rider.eof THEN - rd.cause := inconsistentVersion; AlienReport(rd.cause); - x := NIL - END - ELSE - rd.cause := inconsistentType; AlienTypeReport(rd.cause, type); - x := NIL - END - END; - - IF x # NIL THEN - IF rd.noDomain THEN - rd.store := x; - rd.noDomain := FALSE - ELSE - Join(rd.store, x) - END - ELSE (* x is an alien *) - rd.SetPos(pos); - ASSERT(rd.cause # 0, 107); - NEW(a); a.path := path; a.cause := rd.cause; a.file := rd.rider.Base(); - IF rd.noDomain THEN - rd.store := a; - rd.noDomain := FALSE - ELSE - Join(rd.store, a) - END; - IF kind = elem THEN - a.id := id; AddStore(rd.eDict, rd.eHead, a) - ELSE - a.id := id; AddStore(rd.sDict, rd.sHead, a) - END; - save := rd.st; - rd.nextTypeId := nextTypeId; rd.nextElemId := nextElemId; rd.nextStoreId := nextStoreId; - InternalizeAlien(rd, a.comps, downPos, pos, len); - rd.st := save; - x := a; - ASSERT(rd.Pos() = rd.st.end, 108); - rd.cause := 0; rd.cancelled := FALSE; rd.readAlien := TRUE - END - ELSE - pos := rd.Pos(); - HALT(20) - END - END ReadStore; - - - (** Writer **) - - PROCEDURE (VAR wr: Writer) ConnectTo* (f: Files.File), NEW; - (** pre: wr.rider = NIL OR f = NIL **) - BEGIN - IF f = NIL THEN - wr.rider := NIL - ELSE - ASSERT(wr.rider = NIL, 20); - wr.rider := f.NewWriter(wr.rider); wr.SetPos(f.Length()); - wr.era := nextEra; INC(nextEra); - wr.noDomain := TRUE; - wr.modelType := ThisType(modelTName); - InitTypeDict(wr.tDict, wr.tHead, wr.nextTypeId); - wr.nextElemId := 0; wr.nextStoreId := 0; - wr.st.linkpos := -1 - END; - wr.writtenStore := NIL - END ConnectTo; - - PROCEDURE (VAR wr: Writer) SetPos* (pos: INTEGER), NEW; - BEGIN - wr.rider.SetPos(pos) - END SetPos; - - PROCEDURE (VAR wr: Writer) Pos* (): INTEGER, NEW; - BEGIN - RETURN wr.rider.Pos() - END Pos; - - PROCEDURE (VAR wr: Writer) WriteBool* (x: BOOLEAN), NEW; - BEGIN - IF x THEN wr.rider.WriteByte(1) ELSE wr.rider.WriteByte(0) END - END WriteBool; - - PROCEDURE (VAR wr: Writer) WriteSChar* (x: SHORTCHAR), NEW; - BEGIN - wr.rider.WriteByte(SYSTEM.VAL(BYTE, x)) - END WriteSChar; - - PROCEDURE (VAR wr: Writer) WriteXChar* (x: CHAR), NEW; - VAR c: SHORTCHAR; - BEGIN - c := SHORT(x); wr.rider.WriteByte(SYSTEM.VAL(BYTE, c)) - END WriteXChar; - - PROCEDURE (VAR wr: Writer) WriteChar* (x: CHAR), NEW; - TYPE a = ARRAY 2 OF BYTE; - VAR le, be: a; (* little endian, big endian *) - BEGIN - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, x) - ELSE - be := SYSTEM.VAL(a, x); - le[0] := be[1]; le[1] := be[0] - END; - wr.rider.WriteBytes(le, 0, 2) - END WriteChar; - - PROCEDURE (VAR wr: Writer) WriteByte* (x: BYTE), NEW; - BEGIN - wr.rider.WriteByte(x) - END WriteByte; - - PROCEDURE (VAR wr: Writer) WriteSInt* (x: SHORTINT), NEW; - TYPE a = ARRAY 2 OF BYTE; - VAR le, be: a; (* little endian, big endian *) - BEGIN - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, x) - ELSE - be := SYSTEM.VAL(a, x); - le[0] := be[1]; le[1] := be[0] - END; - wr.rider.WriteBytes(le, 0, 2) - END WriteSInt; - - PROCEDURE (VAR wr: Writer) WriteXInt* (x: INTEGER), NEW; - TYPE a = ARRAY 2 OF BYTE; - VAR y: SHORTINT; le, be: a; (* little endian, big endian *) - BEGIN - y := SHORT(x); - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, y) - ELSE - be := SYSTEM.VAL(a, y); - le[0] := be[1]; le[1] := be[0] - END; - wr.rider.WriteBytes(le, 0, 2) - END WriteXInt; - - PROCEDURE (VAR wr: Writer) WriteInt* (x: INTEGER), NEW; - TYPE a = ARRAY 4 OF BYTE; - VAR le, be: a; (* little endian, big endian *) - BEGIN - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, x) - ELSE - be := SYSTEM.VAL(a, x); - le[0] := be[3]; le[1] := be[2]; le[2] := be[1]; le[3] := be[0] - END; - wr.rider.WriteBytes(le, 0, 4) - END WriteInt; - - PROCEDURE (VAR wr: Writer) WriteLong* (x: LONGINT), NEW; - TYPE a = ARRAY 8 OF BYTE; - VAR le, be: a; (* little endian, big endian *) - BEGIN - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, x) - ELSE - be := SYSTEM.VAL(a, x); - le[0] := be[7]; le[1] := be[6]; le[2] := be[5]; le[3] := be[4]; - le[4] := be[3]; le[5] := be[2]; le[6] := be[1]; le[7] := be[0] - END; - wr.rider.WriteBytes(le, 0, 8) - END WriteLong; - - PROCEDURE (VAR wr: Writer) WriteSReal* (x: SHORTREAL), NEW; - TYPE a = ARRAY 4 OF BYTE; - VAR le, be: a; (* little endian, big endian *) - BEGIN - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, x) - ELSE - be := SYSTEM.VAL(a, x); - le[0] := be[3]; le[1] := be[2]; le[2] := be[1]; le[3] := be[0] - END; - wr.rider.WriteBytes(le, 0, 4) - END WriteSReal; - - PROCEDURE (VAR wr: Writer) WriteXReal* (x: REAL), NEW; - TYPE a = ARRAY 4 OF BYTE; - VAR y: SHORTREAL; le, be: a; (* little endian, big endian *) - BEGIN - y := SHORT(x); - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, y) - ELSE - be := SYSTEM.VAL(a, y); - le[0] := be[3]; le[1] := be[2]; le[2] := be[1]; le[3] := be[0] - END; - wr.rider.WriteBytes(le, 0, 4) - END WriteXReal; - - PROCEDURE (VAR wr: Writer) WriteReal* (x: REAL), NEW; - TYPE a = ARRAY 8 OF BYTE; - VAR le, be: a; (* little endian, big endian *) - BEGIN - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, x) - ELSE - be := SYSTEM.VAL(a, x); - le[0] := be[7]; le[1] := be[6]; le[2] := be[5]; le[3] := be[4]; - le[4] := be[3]; le[5] := be[2]; le[6] := be[1]; le[7] := be[0] - END; - wr.rider.WriteBytes(le, 0, 8) - END WriteReal; - - PROCEDURE (VAR wr: Writer) WriteSet* (x: SET), NEW; - (* SIZE(SET) = 4 *) - TYPE a = ARRAY 4 OF BYTE; - VAR le, be: a; (* little endian, big endian *) - BEGIN - IF Kernel.littleEndian THEN - le := SYSTEM.VAL(a, x) - ELSE - be := SYSTEM.VAL(a, x); - le[0] := be[3]; le[1] := be[2]; le[2] := be[1]; le[3] := be[0] - END; - wr.rider.WriteBytes(le, 0, 4) - END WriteSet; - - PROCEDURE (VAR wr: Writer) WriteSString* (IN x: ARRAY OF SHORTCHAR), NEW; - VAR i: INTEGER; ch: SHORTCHAR; - BEGIN - i := 0; ch := x[0]; WHILE ch # 0X DO wr.WriteSChar(ch); INC(i); ch := x[i] END; - wr.WriteSChar(0X) - END WriteSString; - - PROCEDURE (VAR wr: Writer) WriteXString* (IN x: ARRAY OF CHAR), NEW; - VAR i: INTEGER; ch: CHAR; - BEGIN - i := 0; ch := x[0]; WHILE ch # 0X DO wr.WriteXChar(ch); INC(i); ch := x[i] END; - wr.WriteSChar(0X) - END WriteXString; - - PROCEDURE (VAR wr: Writer) WriteString* (IN x: ARRAY OF CHAR), NEW; - VAR i: INTEGER; ch: CHAR; - BEGIN - i := 0; ch := x[0]; WHILE ch # 0X DO wr.WriteChar(ch); INC(i); ch := x[i] END; - wr.WriteChar(0X) - END WriteString; - - PROCEDURE (VAR wr: Writer) WriteVersion* (version: INTEGER), NEW; - BEGIN - wr.WriteByte(SHORT(SHORT(version))) - END WriteVersion; - - PROCEDURE (VAR wr: Writer) WriteStore* (x: Store), NEW; - VAR t: Kernel.Type; pos1, pos2, pos: INTEGER; - save: WriterState; - BEGIN - ASSERT(wr.rider # NIL, 20); - IF x # NIL THEN - IF wr.noDomain THEN - wr.domain := x.Domain(); wr.noDomain := FALSE - ELSE ASSERT(x.Domain() = wr.domain, 21) - END; - x.ExternalizeAs(x); IF x = NIL THEN wr.writtenStore := NIL; RETURN END - END; - IF wr.st.linkpos > 0 THEN (* link to previous block's or up block's *) - pos := wr.Pos(); - IF pos - wr.st.linkpos = 4 THEN - (* hack to resolve ambiguity between next = 0 because of end-of-chain, or because of offset = 0. - above guard holds only if for the latter case. - ASSUMPTION: - this can happen only if linkpos points to a next (not a down) - and there is a comment byte just before - *) - wr.SetPos(wr.st.linkpos - 4); wr.WriteInt(1); wr.WriteInt(pos - wr.st.linkpos - 4) - ELSE - wr.SetPos(wr.st.linkpos); wr.WriteInt(pos - wr.st.linkpos - 4) - END; - wr.SetPos(pos) - END; - IF x = NIL THEN - wr.WriteSChar(nil); - wr.WriteInt(0); (* *) - wr.st.linkpos := wr.Pos(); - wr.WriteInt(0) (* *) - ELSIF x.era >= wr.era THEN - ASSERT(x.era = wr.era, 23); - IF x.isElem THEN wr.WriteSChar(link) ELSE wr.WriteSChar(newlink) END; - wr.WriteInt(x.id); - wr.WriteInt(0); (* *) - wr.st.linkpos := wr.Pos(); - wr.WriteInt(0) (* *) - ELSE - x.era := wr.era; - WITH x: Alien DO - IF x.isElem THEN - wr.WriteSChar(elem); x.id := wr.nextElemId; INC(wr.nextElemId) - ELSE - wr.WriteSChar(store); x.id := wr.nextStoreId; INC(wr.nextStoreId) - END; - WritePath(wr, x.path) - ELSE - t := Kernel.TypeOf(x); - x.isElem := t.base[1] = wr.modelType; - IF x.isElem THEN - wr.WriteSChar(elem); x.id := wr.nextElemId; INC(wr.nextElemId) - ELSE - wr.WriteSChar(store); x.id := wr.nextStoreId; INC(wr.nextStoreId) - END; - WriteType(wr, t) - END; - wr.WriteInt(0); (* *) - pos1 := wr.Pos(); wr.WriteInt(0); wr.WriteInt(0); (* , *) - pos2 := wr.Pos(); wr.WriteInt(0); (* *) - save := wr.st; (* push current writer state; switch to structured *) - wr.st.linkpos := pos1 + 4; - WITH x: Alien DO ExternalizeAlien(wr, x.file, x.comps) - ELSE - x.Externalize(wr) - END; - wr.st := save; (* pop writer state *) - wr.st.linkpos := pos1; - pos := wr.Pos(); - wr.SetPos(pos2); wr.WriteInt(pos - pos2 - 4); (* patch *) - wr.SetPos(pos) - END; - wr.writtenStore := x - END WriteStore; - - - (** miscellaneous **) - - PROCEDURE Report* (IN msg, p0, p1, p2: ARRAY OF CHAR); - BEGIN - IF logReports THEN - Dialog.ShowParamMsg(msg, p0, p1, p2) - END - END Report; - - PROCEDURE BeginCloning (d: Domain); - BEGIN - ASSERT(d # NIL, 20); - INC(d.level); - IF d.level = 1 THEN - d.copyera := nextEra; INC(nextEra); d.nextElemId := 0; - IF d.cleaner = NIL THEN NEW(d.cleaner); d.cleaner.d := d END; - Kernel.PushTrapCleaner(d.cleaner) - END - END BeginCloning; - - PROCEDURE EndCloning (d: Domain); - BEGIN - ASSERT(d # NIL, 20); - DEC(d.level); - IF d.level = 0 THEN - d.sDict := NIL; - Kernel.PopTrapCleaner(d.cleaner); - d.s := NIL - END - END EndCloning; - - PROCEDURE CopyOf* (s: Store): Store; - VAR h: Store; c: StoreDict; d: Domain; k, org: INTEGER; - BEGIN - ASSERT(s # NIL, 20); - - d := DomainOf(s); - IF d = NIL THEN d := NewDomain(anonymousDomain); s.dlink := d; d.copyDomain := TRUE END; - - BeginCloning(d); - IF s.era >= d.copyera THEN (* s has already been copied *) - ASSERT(s.era = d.copyera, 21); - k := s.id MOD dictLineLen; org := s.id - k; - c := d.sDict; - WHILE (c # NIL) & (c.org # org) DO c := c.next END; - ASSERT((c # NIL) & (c.elem[k] # NIL), 100); - h := c.elem[k] - ELSE - s.era := d.copyera; - s.id := d.nextElemId; INC(d.nextElemId); - Kernel.NewObj(h, Kernel.TypeOf(s)); - k := s.id MOD dictLineLen; - IF k = 0 THEN NEW(c); c.org := s.id; c.next := d.sDict; d.sDict := c - ELSE c := d.sDict - END; - ASSERT((c # NIL) & (c.org = s.id - k) & (c.elem[k] = NIL), 101); - c.elem[k] := h; - IF d.s = NIL THEN d.s := h ELSE Join(h, d.s) END; - h.CopyFrom(s) - END; - EndCloning(d); - RETURN h - END CopyOf; - - PROCEDURE ExternalizeProxy* (s: Store): Store; - BEGIN - IF s # NIL THEN s.ExternalizeAs(s) END; - RETURN s - END ExternalizeProxy; - - PROCEDURE InitDomain* (s: Store); - VAR d: Domain; - BEGIN - ASSERT(s # NIL, 20); - d := DomainOf(s); - IF d = NIL THEN d := NewDomain(inited); s.dlink := d - ELSE d.initialized := TRUE - END - END InitDomain; - - PROCEDURE Join* (s0, s1: Store); - VAR d0, d1: Domain; - BEGIN - ASSERT(s0 # NIL, 20); ASSERT(s1 # NIL, 21); - d0 := DomainOf(s0); d1 := DomainOf(s1); - IF (d0 = NIL) & (d1 = NIL) THEN - s0.dlink := NewDomain(anonymousDomain); s1.dlink := s0.dlink - ELSIF d0 = NIL THEN - s0.dlink := d1; d1.copyDomain := FALSE - ELSIF d1 = NIL THEN - s1.dlink := d0; d0.copyDomain := FALSE - ELSIF d0 # d1 THEN - ASSERT(~d0.initialized OR ~d1.initialized, 22); - (* PRE 22 s0.Domain() = NIL OR s1.Domain() = NIL OR s0.Domain() = s1.Domain() *) - IF ~d0.initialized & (d0.level = 0) THEN d0.dlink := d1; d1.copyDomain := FALSE - ELSIF ~d1.initialized & (d1.level = 0) THEN d1.dlink := d0; d0.copyDomain := FALSE - ELSE HALT(100) - END - END - END Join; - - PROCEDURE Joined* (s0, s1: Store): BOOLEAN; - VAR d0, d1: Domain; - BEGIN - ASSERT(s0 # NIL, 20); ASSERT(s1 # NIL, 21); - d0 := DomainOf(s0); d1 := DomainOf(s1); - RETURN (s0 = s1) OR ((d0 = d1) & (d0 # NIL)) - END Joined; - - PROCEDURE Unattached* (s: Store): BOOLEAN; - BEGIN - ASSERT(s # NIL, 20); - RETURN (s.dlink = NIL) OR s.dlink.copyDomain - END Unattached; - -BEGIN - nextEra := 1; logReports := FALSE -END Stores. diff --git a/new/System/Mod/Strings.odc b/new/System/Mod/Strings.odc new file mode 100644 index 0000000000000000000000000000000000000000..1c32594abafbe4a4e4bcef67a55b4e018b26733e GIT binary patch literal 22037 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

cR* z_5^PiIdQFSx6{>0SyJ=1fg&JO8D|%hOGiAjqM^BJU=Lph7P9&gYY1~ z9uC!bK_}W!7@pPAIUz@8QL%12`$;_fj8BnK26Z{1C=HFod}=!3(~W1CmQEL2jb zwKCfQS`Iy88Nxn~zpy|4xj30%t^-un(?0$&T0F^{9zQyiXPj~P{ZS7uu*pvAO2XsE z7T;_fruT=ZFO@ix(DTqC6S3R^8MTkd770T3C^@f;`05k+nCHD|yS{sC`(~7st1N`1 zV!|g+>w-$3^?)>cl-H+rkggAkm>c6UUXin5u*ZGxT8pr2J zld@3-w{ngF$5xwSrnQ~%9hykB*G8Dbn8Aj2{^3`XMNvTV0QG3yaF94dIRfEqGVO8jsfpuGCVPFsMlsAH;$hBFFm*9$1SQ-d zJcgfE51y0V1q7@-%I`FmFu3^mIPLATr3Oj#O7S|GZqH>cgsWcK%v}0F))bj6 ztsWr8H#b}DG5}O0Z}gBL+6!Fit5W&HMzEq=xxgWNaw89$<7oPr&lnHE^{d`%Sd36??ekgmW( zcTp>}2h->VIuY^;3$6T6W-=`bdOdBA$b|?H?$JNe<3YI|d?rXzG6FD}*W|gt!@O!R zLJ1Hbjr0`=aM`j}BXa4J3wnvjBgY%W5m*9MFWOcH4GNx>_j76HI>$Xc>!xqPxr7W9 zuV86+dal_xJan6|dEMRy$s$8?Bc7p3(C{w7h<*_*a{F+lfgc*ULh(Qqq9ZL@5VO25 zT4QHGvL@i}P9ayzU5px}xfHyFv>B~cNyq`F*Xp)~rw8006^7_aRAy1V8|_q>6E7I1 zj&;o8)TZ6;7ILaZGVSvyjcmv}x8=DDdvi>*wHH>ncxSgH`5rn>dfbeLR`7;Wz~ZBttU#tm(R3p-(k*l9N8i zSs9(gAMI2E$QYb3Dl}LfZAdLm{Fir=&wh~ndi>_rezt$vcd}o3i5ttp|9&$| ZmcIPw$-Dpg8TtPEgZ<=hzVb&&@?S*Wsz(3- literal 0 HcmV?d00001 diff --git a/new/System/Mod/Strings.txt b/new/System/Mod/Strings.txt deleted file mode 100644 index f675044..0000000 --- a/new/System/Mod/Strings.txt +++ /dev/null @@ -1,565 +0,0 @@ -MODULE Strings; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Strings.txt *) - (* DO NOT EDIT *) - - IMPORT Math; - - CONST - charCode* = -1; decimal* = 10; hexadecimal* = -2; roman*= -3; - digitspace* = 08FX; - showBase* = TRUE; hideBase* = FALSE; - minLongIntRev = "8085774586302733229"; (* reversed string of -MIN(LONGINT) *) - - VAR - maxExp: INTEGER; - maxDig: INTEGER; - factor: REAL; (* 10^maxDig *) - digits: ARRAY 17 OF CHAR; - toUpper, toLower: ARRAY 256 OF CHAR; - - - (* integer conversions *) - - PROCEDURE IntToString* (x: LONGINT; OUT s: ARRAY OF CHAR); - VAR j, k: INTEGER; ch: CHAR; a: ARRAY 32 OF CHAR; - BEGIN - IF x # MIN(LONGINT) THEN - IF x < 0 THEN s[0] := "-"; k := 1; x := -x ELSE k := 0 END; - j := 0; REPEAT a[j] := CHR(x MOD 10 + ORD("0")); x := x DIV 10; INC(j) UNTIL x = 0 - ELSE - a := minLongIntRev; s[0] := "-"; k := 1; - j := 0; WHILE a[j] # 0X DO INC(j) END - END; - ASSERT(k + j < LEN(s), 23); - REPEAT DEC(j); ch := a[j]; s[k] := ch; INC(k) UNTIL j = 0; - s[k] := 0X - END IntToString; - - PROCEDURE IntToStringForm* (x: LONGINT; form, minWidth: INTEGER; fillCh: CHAR; - showBase: BOOLEAN; OUT s: ARRAY OF CHAR); - VAR base, i, j, k, si: INTEGER; mSign: BOOLEAN; a: ARRAY 128 OF CHAR; c1, c5, c10: CHAR; - BEGIN - ASSERT((form = charCode) OR (form = hexadecimal) OR (form = roman) OR ((form >= 2) & (form <= 16)), 20); - ASSERT(minWidth >= 0, 22); - IF form = charCode THEN base := 16 - ELSIF form = hexadecimal THEN base := 16 - ELSE base := form - END; - - IF form = roman THEN - ASSERT((x > 0) & (x < 3999), 21); - base := 1000; i := 0; mSign := FALSE; - WHILE (base > 0) & (x > 0) DO - IF base = 1 THEN c1 := "I"; c5 := "V"; c10 := "X" - ELSIF base = 10 THEN c1 := "X"; c5 := "L"; c10 := "C" - ELSIF base = 100 THEN c1 := "C"; c5 := "D"; c10 := "M" - ELSE c1 := "M" - END; - k := SHORT(x DIV base); x := x MOD base; - IF k IN {4, 9} THEN a[i] := c1; INC(i) END; - IF k IN {4 .. 8} THEN a[i] := c5; INC(i) END; - IF k = 9 THEN a[i] := c10; INC(i) - ELSIF k IN {1 .. 3, 6 .. 8} THEN - j := k MOD 5; - REPEAT a[i] := c1; INC(i); DEC(j) UNTIL j = 0 - END; - base := base DIV 10 - END - ELSIF (form = hexadecimal) OR (form = charCode) THEN - i := 0; mSign := FALSE; - IF showBase THEN DEC(minWidth) END; - REPEAT - a[i] := digits[x MOD base]; x := x DIV base; INC(i) - UNTIL (x = 0) OR (x = -1) OR (i = LEN(a)); - IF x = -1 THEN fillCh := "F" END - ELSE - IF x < 0 THEN - i := 0; mSign := TRUE; DEC(minWidth); - REPEAT - IF x MOD base = 0 THEN - a[i] := digits[0]; x := x DIV base - ELSE - a[i] := digits[base - x MOD base]; x := x DIV base + 1 - END; - INC(i) - UNTIL (x = 0) OR (i = LEN(a)) - ELSE - i := 0; mSign := FALSE; - REPEAT - a[i] := digits[x MOD base]; x := x DIV base; INC(i) - UNTIL (x = 0) OR (i = LEN(a)) - END; - IF showBase THEN DEC(minWidth); - IF base < 10 THEN DEC(minWidth) ELSE DEC(minWidth,2) END - END - END; - si := 0; - IF mSign & (fillCh = "0") & (si < LEN(s)) THEN s[si] := "-"; INC(si); mSign := FALSE END; - WHILE minWidth > i DO - IF si < LEN(s) THEN s[si] := fillCh; INC(si) END; - DEC(minWidth) - END; - IF mSign & (si < LEN(s)) THEN s[si] := "-"; INC(si) END; - IF form = roman THEN - j := 0; - WHILE j < i DO - IF si < LEN(s) THEN s[si] := a[j]; INC(si) END; - INC(j) - END - ELSE - REPEAT DEC(i); - IF si < LEN(s) THEN s[si] := a[i]; INC(si) END - UNTIL i = 0 - END; - IF showBase & (form # roman) THEN - IF (form = charCode) & (si < LEN(s)) THEN s[si] := "X"; INC(si) - ELSIF (form = hexadecimal) & (si < LEN(s)) THEN s[si] := "H"; INC(si) - ELSIF (form < 10) & (si < LEN(s)-1) THEN s[si] := "%"; s[si+1] := digits[base]; INC(si, 2) - ELSIF (si < LEN(s) - 2) THEN - s[si] := "%"; s[si+1] := digits[base DIV 10]; s[si+2] := digits[base MOD 10]; INC(si, 3) - END - END; - IF si < LEN(s) THEN s[si] := 0X ELSE HALT(23) END - END IntToStringForm; - - PROCEDURE StringToInt* (IN s: ARRAY OF CHAR; OUT x: INTEGER; OUT res: INTEGER); - CONST hexLimit = MAX(INTEGER) DIV 8 + 1; - VAR i, j, k, digits: INTEGER; ch, top: CHAR; neg: BOOLEAN; base: INTEGER; - BEGIN - res := 0; i := 0; ch := s[0]; - WHILE (ch # 0X) & (ch <= " ") OR (ch = 8BX) OR (ch = 8FX) OR (ch = 0A0X) DO (* ignore leading blanks *) - INC(i); ch := s[i] - END; - j := i; top := "0"; - WHILE (ch # 0X) & (ch # "H") & (ch # "X") & (ch # "%") DO - IF ch > top THEN top := ch END; - INC(j); ch := s[j] - END; - IF (ch = "H") OR (ch = "X") THEN - x := 0; ch := s[i]; - IF ("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F") THEN - WHILE ch = "0" DO INC(i); ch := s[i] END; - digits := 0; - WHILE (res = 0) & (("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F")) DO - IF ch < "A" THEN k := ORD(ch) - ORD("0") - ELSE k := ORD(ch) - ORD("A") + 10 - END; - IF digits < 8 THEN - x := x MOD hexLimit; - IF x >= hexLimit DIV 2 THEN x := x - hexLimit END; - x := x * 16 + k; INC(i); ch := s[i] - ELSE res := 1 - END; - INC(digits) - END; - IF res = 0 THEN - IF (ch # "H") & (ch # "X") OR (s[i+1] # 0X) THEN res := 2 END - END - ELSE res := 2 - END - ELSE - IF ch = "%" THEN - INC(j); ch := s[j]; base := 0; - IF ("0" <= ch) & (ch <= "9") THEN - k := ORD(ch) - ORD("0"); - REPEAT - base := base * 10 + k; - INC(j); ch := s[j]; k := ORD(ch) - ORD("0") - UNTIL (ch < "0") OR (ch > "9") OR (base > (MAX(INTEGER) - k) DIV 10); - IF ("0" <= ch) & (ch <= "9") THEN base := 0 END - END - ELSE - base := 10 - END; - - IF (base < 2) OR (base > 16) THEN - res := 2 - ELSIF (base <= 10) & (ORD(top) < base + ORD("0")) - OR (base > 10) & (ORD(top) < base - 10 + ORD("A")) THEN - x := 0; ch := s[i]; neg := FALSE; - IF ch = "-" THEN INC(i); ch := s[i]; neg := TRUE ELSIF ch = "+" THEN INC(i); ch := s[i] END; - WHILE (ch # 0X) & (ch <= " ") DO INC(i); ch := s[i] END; - IF ("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F") THEN - IF ch <= "9" THEN k := ORD(ch) - ORD("0") ELSE k := ORD(ch) - ORD("A") + 10 END; - WHILE (("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F")) & (res = 0) DO - IF x >= (MIN(INTEGER) + (base - 1) + k) DIV base THEN - x := x * base - k; INC(i); ch := s[i]; - IF ch <= "9" THEN k := ORD(ch) - ORD("0") ELSE k := ORD(ch) - ORD("A") + 10 END - ELSE res := 1 - END - END - ELSE res := 2 - END; - IF res = 0 THEN - IF ~neg THEN - IF x > MIN(INTEGER) THEN x := -x ELSE res := 1 END - END; - IF (ch # 0X) & (ch # "%") THEN res := 2 END - END - ELSE - res := 2 - END - END - END StringToInt; - - PROCEDURE StringToLInt* (IN s: ARRAY OF CHAR; OUT x: LONGINT; OUT res: INTEGER); - CONST hexLimit = MAX(LONGINT) DIV 8 + 1; - VAR i, j, k, digits: INTEGER; ch, top: CHAR; neg: BOOLEAN; base: INTEGER; - BEGIN - res := 0; i := 0; ch := s[0]; - WHILE (ch # 0X) & (ch <= " ") OR (ch = 8BX) OR (ch = 8FX) OR (ch = 0A0X) DO (* ignore leading blanks *) - INC(i); ch := s[i] - END; - j := i; top := "0"; - WHILE (ch # 0X) & (ch # "H") & (ch # "X") & (ch # "%") DO - IF ch > top THEN top := ch END; - INC(j); ch := s[j] - END; - IF (ch = "H") OR (ch = "X") THEN - x := 0; ch := s[i]; - IF ("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F") THEN - WHILE ch = "0" DO INC(i); ch := s[i] END; - digits := 0; - WHILE (res = 0) & (("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F")) DO - IF ch < "A" THEN k := ORD(ch) - ORD("0") - ELSE k := ORD(ch) - ORD("A") + 10 - END; - IF digits < 16 THEN - x := x MOD hexLimit; - IF x >= hexLimit DIV 2 THEN x := x - hexLimit END; - x := x * 16 + k; INC(i); ch := s[i] - ELSE res := 1 - END; - INC(digits) - END; - IF res = 0 THEN - IF (ch # "H") & (ch # "X") OR (s[i+1] # 0X) THEN res := 2 END - END - ELSE res := 2 - END - ELSE - IF ch = "%" THEN - INC(j); ch := s[j]; base := 0; - IF ("0" <= ch) & (ch <= "9") THEN - k := ORD(ch) - ORD("0"); - REPEAT - base := base * 10 + k; - INC(j); ch := s[j]; k := ORD(ch) - ORD("0") - UNTIL (ch < "0") OR (ch > "9") OR (base > (MAX(INTEGER) - k) DIV 10); - IF ("0" <= ch) & (ch <= "9") THEN base := 0 END - END - ELSE - base := 10 - END; - - IF (base < 2) OR (base > 16) THEN - res := 2 - ELSIF (base <= 10) & (ORD(top) < base + ORD("0")) - OR (base > 10) & (ORD(top) < base -10 + ORD("A")) THEN - x := 0; ch := s[i]; neg := FALSE; - IF ch = "-" THEN INC(i); ch := s[i]; neg := TRUE ELSIF ch = "+" THEN INC(i); ch := s[i] END; - WHILE (ch # 0X) & (ch <= " ") DO INC(i); ch := s[i] END; - IF ("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F") THEN - IF ch <= "9" THEN k := ORD(ch) - ORD("0") ELSE k := ORD(ch) - ORD("A") + 10 END; - WHILE (("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F")) & (res = 0) DO - IF x >= (MIN(LONGINT) + (base - 1) + k) DIV base THEN - x := x * base - k; INC(i); ch := s[i]; - IF ch <= "9" THEN k := ORD(ch) - ORD("0") ELSE k := ORD(ch) - ORD("A") + 10 END - ELSE res := 1 - END - END - ELSE res := 2 - END; - IF res = 0 THEN - IF ~neg THEN - IF x > MIN(LONGINT) THEN x := -x ELSE res := 1 END - END; - IF (ch # 0X) & (ch # "%") THEN res := 2 END - END - ELSE - res := 2 - END - END - END StringToLInt; - - - (* real conversions *) - - PROCEDURE RealToStringForm* (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR; - OUT s: ARRAY OF CHAR); - VAR exp, len, i, j, n, k, p: INTEGER; m: ARRAY 80 OF CHAR; neg: BOOLEAN; - BEGIN - ASSERT((precision > 0) (*& (precision <= 18)*), 20); - ASSERT((minW >= 0) & (minW < LEN(s)), 21); - ASSERT((expW > -LEN(s)) & (expW <= 3), 22); - exp := Math.Exponent(x); - IF exp = MAX(INTEGER) THEN - IF fillCh = "0" THEN fillCh := digitspace END; - x := Math.Mantissa(x); - IF x = -1 THEN m := "-inf"; n := 4 - ELSIF x = 1 THEN m := "inf"; n := 3 - ELSE m := "nan"; n := 3 - END; - i := 0; j := 0; - WHILE minW > n DO s[i] := fillCh; INC(i); DEC(minW) END; - WHILE (j <= n) & (i < LEN(s)) DO s[i] := m[j]; INC(i); INC(j) END - ELSE - neg := FALSE; len := 1; m := "00"; - IF x < 0 THEN x := -x; neg := TRUE; DEC(minW) END; - IF x # 0 THEN - exp := (exp - 8) * 30103 DIV 100000; (* * log(2) *) - IF exp > 0 THEN - n := SHORT(ENTIER(x / Math.IntPower(10, exp))); - x := x / Math.IntPower(10, exp) - n - ELSIF exp > -maxExp THEN - n := SHORT(ENTIER(x * Math.IntPower(10, -exp))); - x := x * Math.IntPower(10, -exp) - n - ELSE - n := SHORT(ENTIER(x * Math.IntPower(10, -exp - 2 * maxDig) * factor * factor)); - x := x * Math.IntPower(10, -exp - 2 * maxDig) * factor * factor - n - END; - (* x0 = (n + x) * 10^exp, 200 < n < 5000 *) - p := precision - 4; - IF n < 1000 THEN INC(p) END; - IF (expW < 0) & (p > exp - expW) THEN p := exp - expW END; - IF p >= 0 THEN - x := x + 0.5 / Math.IntPower(10, p); (* rounding correction *) - IF x >= 1 THEN INC(n); x := x - 1 END - ELSIF p = -1 THEN INC(n, 5) - ELSIF p = -2 THEN INC(n, 50) - ELSIF p = -3 THEN INC(n, 500) - END; - i := 0; k := 1000; INC(exp, 3); - IF n < 1000 THEN k := 100; DEC(exp) END; - WHILE (i < precision) & ((k > 0) OR (x # 0)) DO - IF k > 0 THEN p := n DIV k; n := n MOD k; k := k DIV 10 - ELSE x := x * 10; p := SHORT(ENTIER(x)); x := x - p - END; - m[i] := CHR(p + ORD("0")); INC(i); - IF p # 0 THEN len := i END - END - END; - (* x0 = m[0].m[1]...m[len-1] * 10^exp *) - i := 0; - IF (expW < 0) OR (expW = 0) & (exp >= -3) & (exp <= len + 1) THEN - n := exp + 1; k := len - n; - IF n < 1 THEN n := 1 END; - IF expW < 0 THEN k := -expW ELSIF k < 1 THEN k := 1 END; - j := minW - n - k - 1; p := -exp; - IF neg & (p >= MAX(0, n) + MAX(0, k)) THEN neg := FALSE; INC(j) END - ELSE - IF ABS(exp) >= 100 THEN expW := 3 - ELSIF (expW < 2) & (ABS(exp) >= 10) THEN expW := 2 - ELSIF expW < 1 THEN expW := 1 - END; - IF len < 2 THEN len := 2 END; - j := minW - len - 3 - expW; k := len; - IF j > 0 THEN - k := k + j; j := 0; - IF k > precision THEN j := k - precision; k := precision END - END; - n := 1; DEC(k); p := 0 - END; - IF neg & (fillCh = "0") THEN s[i] := "-"; INC(i); neg := FALSE END; - WHILE j > 0 DO s[i] := fillCh; INC(i); DEC(j) END; - IF neg & (i < LEN(s)) THEN s[i] := "-"; INC(i) END; - j := 0; - WHILE (n > 0) & (i < LEN(s)) DO - IF (p <= 0) & (j < len) THEN s[i] := m[j]; INC(j) ELSE s[i] := "0" END; - INC(i); DEC(n); DEC(p) - END; - IF i < LEN(s) THEN s[i] := "."; INC(i) END; - WHILE (k > 0) & (i < LEN(s)) DO - IF (p <= 0) & (j < len) THEN s[i] := m[j]; INC(j) ELSE s[i] := "0" END; - INC(i); DEC(k); DEC(p) - END; - IF expW > 0 THEN - IF i < LEN(s) THEN s[i] := "E"; INC(i) END; - IF i < LEN(s) THEN - IF exp < 0 THEN s[i] := "-"; exp := -exp ELSE s[i] := "+" END; - INC(i) - END; - IF (expW = 3) & (i < LEN(s)) THEN s[i] := CHR(exp DIV 100 + ORD("0")); INC(i) END; - IF (expW >= 2) & (i < LEN(s)) THEN s[i] := CHR(exp DIV 10 MOD 10 + ORD("0")); INC(i) END; - IF i < LEN(s) THEN s[i] := CHR(exp MOD 10 + ORD("0")); INC(i) END - END - END; - IF i < LEN(s) THEN s[i] := 0X ELSE HALT(23) END - END RealToStringForm; - - PROCEDURE RealToString* (x: REAL; OUT s: ARRAY OF CHAR); - BEGIN - RealToStringForm(x, 16, 0, 0, digitspace, s) - END RealToString; - - - PROCEDURE StringToReal* (IN s: ARRAY OF CHAR; OUT x: REAL; OUT res: INTEGER); - VAR first, last, point, e, n, i, exp: INTEGER; y: REAL; ch: CHAR; neg, negExp, dig: BOOLEAN; - BEGIN - res := 0; i := 0; ch := s[0]; dig := FALSE; - WHILE (ch # 0X) & (ch <= " ") OR (ch = 8BX) OR (ch = 8FX) OR (ch = 0A0X) DO INC(i); ch := s[i] END; - IF ch = "+" THEN - neg := FALSE; INC(i); ch := s[i] - ELSIF ch = "-" THEN - neg := TRUE; INC(i); ch := s[i] - ELSE - neg := FALSE - END; - WHILE ch = "0" DO INC(i); ch := s[i]; dig := TRUE END; - first := i; e := 0; - WHILE ("0" <= ch) & (ch <= "9") DO INC(i); ch := s[i]; INC(e); dig := TRUE END; - point := i; - IF ch = "." THEN - INC(i); ch := s[i]; - IF e = 0 THEN - WHILE ch = "0" DO INC(i); ch := s[i]; DEC(e); dig := TRUE END; - first := i - END; - WHILE ("0" <= ch) & (ch <= "9") DO INC(i); ch := s[i]; dig := TRUE END - END; - last := i - 1; exp := 0; - IF (ch = "E") OR (ch = "D") THEN - INC(i); ch := s[i]; negExp := FALSE; - IF ch = "-" THEN negExp := TRUE; INC(i); ch := s[i] - ELSIF ch = "+" THEN INC(i); ch := s[i] - END; - WHILE ("0" <= ch) & (ch <= "9") & (exp < 1000) DO - exp := exp * 10 + (ORD(ch) - ORD("0")); - INC(i); ch := s[i] - END; - IF negExp THEN exp := -exp END - END; - exp := exp + e; x := 0; y := 0; n := 0; - WHILE (n < maxDig) & (first <= last) DO - IF first # point THEN x := x * 10 + (ORD(s[first]) - ORD("0")); INC(n) END; - INC(first) - END; - WHILE last >= first DO - IF last # point THEN y := (y + (ORD(s[last]) - ORD("0"))) / 10 END; - DEC(last) - END; - IF ~dig OR (ch # 0X) THEN res := 2 (* syntax error *) - ELSIF exp < -maxExp - maxDig THEN - x := 0.0 - ELSIF exp < -maxExp + maxDig THEN - x := (x + y) / Math.IntPower(10, n - exp - 2 * maxDig) / factor / factor - ELSIF exp < n THEN - x := (x + y) / Math.IntPower(10, n - exp) - ELSIF exp < maxExp THEN - x := (x + y) * Math.IntPower(10, exp - n) - ELSIF exp = maxExp THEN - x := (x + y) * (Math.IntPower(10, exp - n) / 16); - IF x <= MAX(REAL) / 16 THEN x := x * 16 - ELSE res := 1 (* overflow *) - END - ELSE res := 1 (* overflow *) - END; - IF neg THEN x := -x END - END StringToReal; - - (* ----------------------------- string manipulation routines --------------------------- *) - - PROCEDURE Valid* (IN s: ARRAY OF CHAR): BOOLEAN; - VAR i: INTEGER; - BEGIN i := 0; - WHILE (i < LEN(s)) & (s[i] # 0X) DO INC(i) END; - RETURN i < LEN(s) - END Valid; - - PROCEDURE Upper* (ch: CHAR): CHAR; - BEGIN - IF ORD(ch) < 256 THEN RETURN toUpper[ORD(ch)] ELSE RETURN ch END - END Upper; - - PROCEDURE ToUpper* (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR); - VAR i, max: INTEGER; - BEGIN i := 0; max := LEN(out)-1; - WHILE (in[i] # 0X) & (i < max) DO - IF ORD(in[i]) < 256 THEN out[i] := toUpper[ORD(in[i])] ELSE out[i] := in[i] END; - INC(i) - END; - out[i] := 0X - END ToUpper; - - PROCEDURE Lower* (ch: CHAR): CHAR; - BEGIN - IF ORD(ch) < 256 THEN RETURN toLower[ORD(ch)] ELSE RETURN ch END - END Lower; - - PROCEDURE ToLower* (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR); - VAR i, max: INTEGER; - BEGIN i := 0; max := LEN(out)-1; - WHILE (in[i] # 0X) & (i < max) DO - IF ORD(in[i]) < 256 THEN out[i] := toLower[ORD(in[i])] ELSE out[i] := in[i] END; - INC(i) - END; - out[i] := 0X - END ToLower; - - PROCEDURE Replace* (VAR s: ARRAY OF CHAR; pos, len: INTEGER; IN rep: ARRAY OF CHAR); - (* replace stretch s[pos]..s[pos+len-1] with rep *) - (* insert semantics if len = 0; delete semantics if Len(rep) = 0 *) - VAR i, j, k, max, lenS: INTEGER; ch: CHAR; - BEGIN - ASSERT(len >= 0, 20); ASSERT(pos >= 0, 21); - lenS := LEN(s$); max := LEN(s) - 1; - IF pos <= lenS THEN i := pos; j := 0; - IF pos+len > lenS THEN len := lenS - pos END; - WHILE (rep[j] # 0X) & (len > 0) DO - s[i] := rep[j]; INC(i); INC(j); DEC(len) - END; - IF len > 0 THEN (* delete the remaining part of the stretch [pos, pos+len) *) - REPEAT ch := s[i+len]; s[i] := ch; INC(i) UNTIL ch = 0X - ELSE (* insert the remaining part of rep *) - len := LEN(rep$) - j; k := lenS + len; - IF k > max THEN k := max END; - s[k] := 0X; - WHILE k - len >= i DO s[k] := s[k-len]; DEC(k) END; - WHILE (rep[j] # 0X) & (i < max) DO s[i] := rep[j]; INC(i); INC(j) END - END - END - END Replace; - - PROCEDURE Extract* (s: ARRAY OF CHAR; pos, len: INTEGER; OUT res: ARRAY OF CHAR); - VAR i, j, max: INTEGER; - BEGIN - ASSERT(len >= 0, 20); ASSERT(pos >= 0, 21); - i := 0; j := 0; max := LEN(res) - 1; - WHILE (i < pos) & (s[i] # 0X) DO INC(i) END; - WHILE (j < len) & (j < max) & (s[i] # 0X) DO res[j] := s[i]; INC(j); INC(i) END; - res[j] := 0X - END Extract; - - PROCEDURE Find* (IN s: ARRAY OF CHAR; IN pat: ARRAY OF CHAR; start: INTEGER; OUT pos: INTEGER); - VAR j: INTEGER; - BEGIN - ASSERT(start >= 0, 20); - IF (start = 0) OR (start <= LEN(s$) - LEN(pat$)) THEN - (* start = 0 is optimization: need not call Len *) - pos := start; - WHILE s[pos] # 0X DO j := 0; - WHILE (s[pos+j] = pat[j]) & (pat[j] # 0X) DO INC(j) END; - IF pat[j] = 0X THEN RETURN END; - INC(pos) - END - END; - pos := -1 (* pattern not found *) - END Find; - - PROCEDURE Init; - VAR i: INTEGER; - BEGIN - FOR i := 0 TO 255 DO toUpper[i] := CHR(i); toLower[i] := CHR(i) END; - FOR i := ORD("A") TO ORD("Z") DO toLower[i] := CHR(i + 32); toUpper[i + 32] := CHR(i) END; - FOR i := ORD("À") TO ORD ("Ö") DO toLower[i] := CHR(i + 32); toUpper[i + 32] := CHR(i) END; - FOR i := ORD("Ø") TO ORD ("Þ") DO toLower[i] := CHR(i + 32); toUpper[i + 32] := CHR(i) END; - digits := "0123456789ABCDEF"; - maxExp := SHORT(ENTIER(Math.Log(MAX(REAL)))) + 1; - maxDig := SHORT(ENTIER(-Math.Log(Math.Eps()))); - factor := Math.IntPower(10, maxDig) - END Init; - -BEGIN - Init -END Strings. diff --git a/new/System/Mod/Views.odc b/new/System/Mod/Views.odc new file mode 100644 index 0000000000000000000000000000000000000000..f1553bfacd2923cfe5855ee8de7989828e0fcf9b GIT binary patch literal 44177 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 ^9tv)38uQq{WS%D z$AcTm*+Ry3?q3b=HTvgZN)6Yj^6eeviJBhey=n8Az&FKfj03|!7;c*uCZ(T3rt*+^ zh{%(E3ZBD*OA(CpuO(TQQt&b!oDQ>e?-le=N)_Azgf`?LjGN?mf%v?_`D}uj6(k1a zuPOLD9^6RI7Ba4Le+bMPeI!h&p&Od>lc}E%Nj+{Uq$^R-#XSOgryA&L2i)kg&|7gO zKV#{HWbdmUA=}I;0^cN|u_K}mgn^ubiJU5=kmWpN9>h>{>RAeYkq4I|Slv+BO2O~& z;8ie7_ulOhB54Qk+Q=!wxJizK#OE;Q^C?X1sRVRFh!uw0wvm9bJfx3z(UVgng!(Vha~9HZO&6Y}==qFT z2^WXM=gy1c+{~PGA4nVM&x^uu8CXToFXqDf(OJ-?Ab`q$}d zH+GT&VXFIo$|66s&C&MsMamzHwsxQK66cI9$O0E-;4UEiHZ=t=)a~}P0ATr|YpBjU5 zgs+|+%j&Lo-no+e#zHsWS0+Ut~9)dW`#{?We*yPm2}k5 zgt9iDx>f!)uSlw#QAi-qHzT?RwI4qxrS;^R=}VgyqtbC)t-2#2(2t{+Q^yKISNDF3 zVu@i=P#4~OO7hS7?CV;d=)q$9wY7F% zXe%g$Qcr%u9b(-oqX!PF_^*qz@KDy*(=xQK}g)j9douh5XH;N$m|R?)t_6F*YAGD;~r zUKsr51s$E+3{WCaGSS$^nfNhh7XhP__i@U}`xv9Os?MrCwqi=7b0mSM7;iYX$6=ZC z0{V^;+p&1HytKIHG^M5CO%msEqEc=v7_XkWNvaatbA-Wf3P7-{r`tHvuexZ|9w@Qx zYK?fq4S}kQR_y_3PH}$SI>t8SHFhI;PkLHbB9~Vj898u@oNg(;6|yhEel!}prI>b) z(Q|9*Xix^45q_@A$}{6dE*UYJG&P(92plpj#e?DUa0vBqNQ4?iSx0RRpJ&jN8S5ML z6T|>V9>n4W!6MUAJPa}e30`L0^TL~ zJSr3naQPb%FWMG*b!3#95L{m+k?odZx_jcm^XT^y+)&A|pE;dZv<;QZQ!j}sHwVGa zhbhOW7?rYpa-uBs&5`!Q65Hbm0OlFTw$d~QkhR42yZ{x}Xl?{Xl-S-?fm$D6!xM<_ z>VrlnX{qp3tF|Nlff$H-)pqpO?mh@@3(>DNimxb3paPz1M-i@7;|PyV8KU9hO0rw* zr>?a+&1nepf=a=Yk92O^I%1!SQc<+sCZRHv;+~cK>uD-cBeN8TB8VD)tBWcp0VWm> zj3cxWP>&glPY)q(v%CW&ah-`!suUFUt{jbP%6$@5b=7bDD5<%D?v&%e+cV1DLVo35 zfT|l7hvUAwVd*jmT?B1?YIcfF&>3kQ;x{vBrbR=2?yKT7jV1;+5viT}&|Nf1L$&v$ zt6ybWT4A+}->I~;G)Iag_W4D{TLt6r1Y;&Y#K~}{kfd!+)~`XXFRJ6Wq=59LKpGUar^|jt;dpY> z1c>+g!}}+Yck1;AcTyi*ZUC9@QI=e0?!^P$<@6Pyvm<<>ipY+XSCA=aY|6C|F!DVD zY$fUkJ-wpx2>B)hMMaJkspS-HYkHiOm!y`fO3V9r;%#&uMzpGydpZmxM30vH*Sv`Q zBF5KWP@m9*(s~Vfe3a3 zL5|~+mk3-gIo+M`mHa%;b5+SF0nctHV-^fty&`9D9~j{<+_oGFOKRM@&;e-KcT#y@$Ky32LC5PmE|6<8FBn0@a3g zflts;a~`1RrZg+V80mq-A%59K@Z#AgA4j^V-=Nd@iZuCo__+e#qj1!w)&YWkwFwI^ zf4E9h>(b;M96~e>pB|{_K7om?C_2Lg4KDxv6E5BliK~9+l$!)JS;b^MucGx-Ht$<8 zFK}>4-uWHZ!!ecV1s+uC_*PjxhCm@HsrHgO@w z#1nh%bETFSx8oBdZ}<5YkAyEvMe8iAe1O(cayF_LFRdA#g6Te`3B46mS4wmz0M{}! z{cb2TK2E#j#ppM(jGQ{wi!!C@Zo3^tZ-0w-^Eq&ma6FsDo+vH4TI64;*GX*}aWkYV zAY5-SI)i5QK7s`kdFOUC!xgDp5T(0ZZSz}{&Ov?@4~Z$Dr@Vb zc}f8ajO#SF6n}(T=13VTdW4SP;WQ%&g04AH9|=#gevr?ws2=KaO~ROV6ukr@%oNq$ zw#dQ-F}wT9Cy}s*MesUOl6bGlVVE{jE*OEZ0|+;)h!c=oM!6P=69@G)UBF4x3!m{J z#s!Nn?!@3&2rrV8s9y&5%2m24X6=DQeG$qxP5y-7>eXpSN)tv~blvC+Fh5<4t{+s+ z*#2sAn;a=~;X#tr19BfBeXC%6Wg>?ooL^?drv$jnNZ+aCRXXoz6-%Oqq8epX!8y!19Iv{j>n_6X?86}1g9FSlR7{5GCfJ#2o6Le*1(o{|S~mFG3DfnDfuDl)B|i@G!*u(2V0oPh}zu z<)36n($l#f%Pc8NOQG(hizvV>$-WT``vlod5UmP%0aYK669m~n z5Sa6ljct0KqfkIABvDZwm;iB$MwVh(U#P#Ze$=h7x2DL5wQo zPAo0}xrZRJ1o2lPZwkm9f@le1QXwy(>jKS_1i=gK&>dzEXX!KmI=3MVYb5*6ZuCYH z{vl%u5tbzmoaOg{zVA2!O7feRxYaMsN{8+*9eSPebo1uT7-_J?GOPK{oVOwS=vLrj zAoxxIGRdzj(n7A596E9 z`mlHbs*f`r8(cJ}=g~?i>zkrIN{ijUigw1W|BGl_<>Cy=#V}Fva>06Ehzb*PSUREY12=@ldKO9_f~1OO;d(BCxM;55_D@o19J_y^DV(hB75})h~X8 z?00!^Kx0mG#trd^OkJWUu8+N=pgPvkm;sy=&j+4U=mSqE+5Qma3R>&|^FhtZnE3LE z?=m?1dSXDwu-hjW)9n(T=CbcX&m^y*s_`iF;nsY&1)=I8ia=QLPUCFUipIxXMaNw1Bnp0I@oj%2nOix#yc2V$Gr(c=pcZztVV~9N) z6aUhE1L*7&%@zcks2W`q>}d`Lq;gAk9>w>MRE2*aGxo6%JjB!D2KxQ+wf? zEA+{&%A`cM6yYckZxB)Bo$>lh@-$A`>wCKM z@2EC7RX~J3>tLOn*~_~Q#;zrVX$77=)EA7s#ug-oHB`XBCV^Msb}be=1VL_izLG7~ zIUGX|4MDufgo2xa=%sXrjt)ibmFdF|bQm{$f45=^W&us!6;cF3a9=jD?iMVL3Xx+x`@Zu3DI2xJ9(=8U*BVns)i{z3bT2)&)#UOVeOkUY= zy*%$iYh<5{;K)~MS|K}!QX)%6xZG)&wU374b=KJjWQu&r`e%LPMXhQl z?*$ngfpP^L?xgMLO>xEaHSW0+V&Q_zi`pHmcG(<4=jFN0tZQs zCU(3jd4TwYyVr13y}VB#dYJq>4ddwS(>K#1OHbr`~TP+Y;K>QO-c;B23 zhcYy{lb*w5PY!@G4d*&fu;{|KdHlFz7(r{4`f8rt{C4qv4-{Q#N1rIumEPLWk=50d3v0 zE~HZqbwbh7Kz*Uu1NMDjU?liSSYw;r)XZt1!T0qoEbj|2@(w$%dukR5pv3Eu#A!qt zNB|K9R0-qm!fq-({)R!TD14ZH;bF?VSg2EXElG8iLrgkgqaVqD-cUJPqoHgBket9s zA19@{_P>MzYZa3;(FHnx{K8t((j*^AQ!5>?2z{j<(l>NM{5&VB z>a=B7DdIky%R?~B^q69nNocE%l(Fz*RHHp5dHK&+Saa%nv^Ed*bx=c!Y)=0&%rv>~ z0Hm0UdR2B9Ksp%b8$b)trPDf)_LJlvseeyx!Ra)H@iciL+F;qe=m)bT=MK(F=B%D2 zRv)5@P&bctHxu4}+N|KT6nj=>E#y2GIE{SYUv|X3=MLg_Xv# z?*M_Qy*b4=PLV_uLxIdM`ni)HMyMQzz!KYIaN^@+?2l*~WImfAmnI^wSl;0EO2R!rw%tZaC zFw0&>0XVZ!N6WJK+5;bUAXqLUid)dMYxT)6Aq;cANB9&rd{K>bd!Nj`>Yydz~9M=qvnCOfbs zb);PO37LoeKu5}TpOC%Sv~r|aQYngJQ8aRoN?e@W{4D`G`T&e_5CN)wB)||KfKG1N z4?s2tOlk$VK!D5mp23ka(+42QH3YcQOn_n^fKGmk0E@6+jiZNFfVBkZ-a>$#tpNWb zKrsg#YXx|O0H?8i>PW%nw-blfD=ux`tUfD3RCrc|#^cPl zGT+REc5i$Q-drj>_o388$=C6%LjFBojea^JmiYEajs6_Dl}d+RUF~nhy%Fyqk6C1m z?$D3uEaC!QJ@I|sC8iPJlq=bnc)*6ba&GYoe`}uQK#ws z(AL4xC{{Xi4xgUO~bo|Jxr?nH!$rD|cRc8sTh|P6d@5^b2u6S|AHwr0{?rZn}>Gz`=wBXmj! zlUbPmC-OD74VY)yk_e#h3I)$cWR~RpDI{#Uk!2&Xj1zm6HxIH{!xYpp`vMC_m+tX& zfy`B!H?AZfGqIj+R1K6yiS0pj<8-IWRkns?*?>o1>2`x)-B5`Lkoq{NRj1PhpebL= z@~eRafkJg^OT^#|&gB|tElA<<-tZxq#WXyslG7bMC{e$HsR;)8ie;96CG=(O0gz4-G!;@J9;F0W3m?9Bx!c~$Qnp{jfi=NXDCOMC|<1D;W%f0(kq zRzG-xAn@F)<1@r1C?V&+0dn`Xr%>f6u0Xn!`r+J3fH^w*KG+^e8su^wLrBR8f@8KnB+(~y(DW;Gy3Wlg>_EWy}a}cg-r!T%21y{O*`t#Dgq&dEgdYoBXT!Bb{ z$L%zG#6*uY@~fb+XL}+@~6JYXW?=0psZO^P5D{6gG>y!&mfO}*(~?Q6iVK| zhXWwW{sMFYVmo)N@+=G9LUE)#2{uRspEJbrnaZ7a@DOAME|RarHG$nU?C`-Iqd3NJ zL*|=&6i19;+&WA}^BL?*pCu+YUEMVzVtXJZ!q%rVO8XGx6OFL(g}c-2harXi6Bwd+ zvy{)!E>UnJ4?Yglc^#FX(Ep@x?VW^v1e)wConw2`r<5Pd~N1 zo0VU^6VJ9W`%L2YPtGj_d=PRCmZ#2tjOv6|s?_pY{b-MCqQ{lzaTR!6_j+8@Jg&z) zuGethhJ>o$FW-AljXnzUqdz&1?o*PBQG}%#EmI%jvwH%MO5@=1u<&`H7o1jDb#0-h z--m@?yGp9M&{8O|uB56;Hs=Q5ah66G0>{8Tb-0p!)w8maeVbTO$$sdurIP*HePbmn>snOFO3$;F;hUqHhX*$f z_p2ZN_6BKVEqi%`)KtU1go5@O_WR4yks7uE3fF5`%X(>J4SVthX>|>IsZ?5C!(Ln= z71gkVhuFD8Y~Mk)=@9#+iaB5oKUd9~hL%^ewN-3&HQNB$?-evjMFkGcy3wmO`z}L;{POn-wrZM27irHeTB|+$Zoww) zlmDvFZro8&t=%*Fgm!-eleN_q1x?yj3l8g!%sZvKlqc(U=CkrwOC>!huY zxR=&R<&H}BG*Z)2$(~&$k>2IczGbBDc-eQ1^f(`JGt%FLboxHOT-peN;{!=g@cYXp z(jI(bnbZVO<#LI%T-Ps?8ezGYN%gRnEtg1l_OHvNI#@3*la_;^e7Qt=qu*F26~X%A z327~?qfbbrK6?8T(rQ>`Pe@x~z5Ikky0D9%khZ|u^%EmK*C%_E`s!UzNG^DODwaqQ z_WQ+B3#?5=(k{SWDUwL@acPlM0qc!osT$U%Vu_R{Hy25ju)Z&nj=`!gl1OWEMUiv_ z)~Z*ebFi)!N~Fs8_vabm*m|laJVEwU7BF*HN5fdzVBUf(y-6=*IqAzTa zNb~g98@cxDr#5iS-TOC4q>%hev@lp#o|m-8&N9+n{xQlMrGMfp)(n|mJjY1=G}DbG z6;3bj-ud3bRkW$ABTX7()wkU*oqc{Z&5?AI=FFUt%b$zi{ML8RXPr>{U#IC@9+Qp|NiLYy;ogbU0q#WUEQx=R~J#B=&J}vzu`YCx0%C8*Cpf{ zW%FnE--89hFlOl;|7Y(fbi*!GnJ*!zBIFE4Oj{1v+n6}G1r7hgdvp4HOeOs z?bwX=46g+*4{m>E`NE&?qpH%ORpdOc#qR)AV*{>-YH+|lu1=hqT~d1K$kC$|zMHI2 z5Hx1GUYUwUMI;z%{CcI70~AiIscyi1T}`d8uAvg(ODlah*3)tSzN&hq1gSWp-&a>J zs7(_Wueh8qE*Az1E1^3@378PxqbCyQ-*dE})Qf!$jdc_&N5#?kjb&8`MFOmH1n(=q z*oV-Mrj)Y!dK3=~ceSs+fu!A|evI?%Y=3X`Q9Lts8y?Jv1>h^Iryz6Um)qTLgnP2r9a6D2k}J)q+Vf8xe!p~!QN{D|1V&q_&E4ah~m ztqjX@Ww~>mxq;73<7E75TN&RVFp`Y2V119#Tv_(4z?)$g`6~VtGxi~qwaPX^O?ISN zGi-4dm&Fx$K72g0j-b;<0acZ=i6bEk#Bfj&Z?)N7=45BGEzzD3;j}ufDfUDJ!n51r zZOPVnYo3~7OIDNlmlT!e*sWM&ZQ0KFxFL2ovbb#tQR!+%bfVMaD6pkjQ{6*ivZL(k zxi)uriuLE4l22Nk35eK~k~GkkZuK}v+T(0lh39w%Mmyt&A@t3_#5C6+d%W{3TUOdI zXNKx==SB|=tc*F2Im9M_U@!*l>{!FpQ z$DS2G-0q6aL;%cmYqC8qHp`l9%dn<6+_Bl#6kDb>)s-1L%sS9kXw6SKBhnL*9Jra{ zgqPIJ{)?}!+DDp*Rrm71e8ix@{UO{pEntS6kD2UoQ8sG|!hE`Hsj(w6Mn=cl@&|sY zxK6XVB2yE_s5#b8=SA-f53E+b)s3^Kp${R%MvwY1h|CkRP^aR44y-Z2_;Rn@0y~V` zA94CsL!GZ2x^Mqy7{W^@sVNz6qOP`r%nl{~6=k5VxQ3&Ybd)kACMEE!D@eVQ0uu^~ z8*q!rPDCaJkx8T6c9%_cWP#;Gdyd8B%yMK|;$lxK))y9Lf2kyoLV(v~PkzFnxa_D{ zt2-vczFV=mEXnpn0z?r2v2hVN5+S5A?TMa(j5DGV-2?5Oe#z1C(N1e(Y`QhUc3MnQ z;871p#0s)^96Zetm5*$gQ8Sx_f*Rika4p4yJP%ShA)8!{pt=Z=e1lI&s?ebo*Ec5n zn~FKv;)-_0a0gJc?HQIVHC`=DZAHi5K?Sgk}Zt2EkOsJg^h70NSa(3FsWwNwpTYmIi2*W0A>vNy0wFN{?|z zsev`A7d6hFGILUOgRI9C15th26s5)#SXE1$H8FEkT7fmenme=z;a1~glCAg8k6s)e zouH<;hMl>{WFKT7fv8fa#TG<3Y@R4rY?e7Gc7Qq6mTJol+?okXj~;+=iWicX3@H$GiWv*aKG-_qPE(`Uhrp{#EKpNot= ztk~aGqGDr*M5oy^1MlZ@lOt#wiLSz^MvwYA4!EK|G zvZFEv42#M*tte^)f(^d;kNnrnVUEBj1E->05YPn$@^Do>9CyP|w5@uCVq0NCRN7oM z$(0h99qEjUy=&mCH6|Mjku5F%?5Ox?nx;^RT zY;;zKb#Ro`jEJw+VXoY$G+TnpWp=>QkBUpR*^%vKM3Qu+M@*+#C%RPJ1m(|(YBWrG?FtSLH^>b>uREZQfS=5kJ{Tx!D`ngK4)z(-~w%Izb5iskV#<_~kZ$jrwv8h=j6H-0-$yo_$aRUPS z$O#z9SvuBC1oG{%=4v!hS9GI@D&I^R*vz=M)m2t#H16itHz3Swk97#HKny7~w6I?F zQoNp5=OAR;%ZR?~nX9NvOvBC{I6U{X0mCx}x}47V_{`kX?C}Yic#6#!hA7$So)e~^ zm8@7w`FOC|j*XLODp@W^yIQrDf*Z)Tp>KI+XN5p48mJ zm@(5g{VlAJEIsRwt1JQ<#$&IC`ME7|6;4ag~U4F+Qw z?xgg5&p-sd%gGva7}FnjsQ=~-_nuIw0hT2{_*&)|H7vn0ClPPZ+?KE$R5*1xQj z`|2wz(7ZuG43liD4^ao>K5F&UH`I{52(8IgT!+iK4(DXaI+Xl~h}Cly>wYEwHN{ee z__hgAN$3}NuQjQj`x&A)QedYZ^+upt<|v6znAF6Se7iMi2m-vGn>;x6Y&V_|p7=C} z+u;s8j~L+W2~%sSIau#1FQaDp@Q2>=^UFwkoJ2@!PY0le_Cyww+)bHKPL8^0odAw| z)dN6bUAYH0&=sp+QIk^h(nlnu2OipsaHn-pP%s!2$Tr|n2ar^Ljt)X0;egH#>yV`bt6-+x-*w+(yO)t=ANs> zys2E#VhXgs0Vf_2Lw&>#a?BJGux>CV7G@5M9UL9&8J0MxutRZ=h@|+0p19KjFYZ?+ zm5xKqDpDr3oXV)Cb{c^@TQ#YECX2rSpQy3;JxGA~6Lm#Rj2>lnM%fW6P&KZZg9AI? z0!6faM9g!kpt>BkOL>_D@?K9E6#r}9QlJ{ce&qFoRc&5E3O<@wky|_9X~K}cw(+A zB{|C|Gj?ds*^x;D#yCG&V13c#eoawbcr0@McY*bBlSIx4JoW*_a-%s*kd0M?vGs;K z!F%6fh+0sN5UA?wxZSvr1@c$$c5;E>^ErSGKHG7>a$!ATKZsl4CcbHkO0&8h?Mm8c zOe1pKgX~t%P`d>#y)|WUgxk7ue$s8>HhXN2&2G&Ie18~vF&iF*59V_koFxRij&%EI z#@4I8J_JJLxbzb!`g;|UJaBPQ*oP!5(P-z2a(mQd+@R5NcbgDDHO1_TQlk(<)tq3- zG{;6c;95G(34l5QRn3VA7aJQD7oVG)iYvxVz~U`wt_*^@GLqBOoP zxyO+l<&1oHrY z`YX*KQAc0h%(5AzJKvwCK+tdlBTp<4Q81??0Q~t>U9}W<8xhAEqe$e*1=W@4W0Cp- zQT0brO~db+2)uGcGA2#R16+zE9pIG<8>_EZ;y*J*tEq#`9yP6Szv4-86ecFeoi*aH zl8_p6u4S5Mx1zp;c;uOdi38)~oypqWri_7U1)fYbE;=J?MBx3;m2o^(W-n0Pirr7; zWn?r5p#&SnSy$IkOQ3(6t_7P7m^I^8C1<)-h{kD>x=NzcUTQXBKqvGQ-0tfxdWFLrFJ#s`YlEmO4&YX$3vq(x6c0!ZLm8pWkB+f)REEdgtXj23F*$9=z>V6D^K-AyOMHU=}uR4eoV64Z9g+` zPq#9orn3zrHoD(;&dhFz*oZ3 zZ+g<%8Lum@0iJw&tnD1vxw%DoZz<_TS??+7gYyo+zaW$Ah>wbmD@YlgGPdv8ks0T) z<);ivh_}btlT&sp=_4WOG=wxBoU}(7@se`R2TD@D&6Abm8l+~2Pm64a$<7!NpPNw_ z9h)-rkpcF^AzvsNBU0OyA%3Oc+{A$Z=cT@@q@ERJk4ug6obg{Jdvwwn2|4aFQ^%&{ zdXiK2DDkNff4VCZ{I4_FTya@}TW>e{ctmH9ym$r${O&QIM~e;H7s^I3PsHj`aK!I{ z5UC+7k1Qld!0>)HEhHB%a_d6T9@fnZ+4;HYeAx&S@!=UfMT9EG&G|PeiT^aIu7uG} zcgkoFA}`0E;dHx4x`!v{27bH4gs|!*HRRN)RoIJAPE)I1H4+)!^8Q!Enzz9_qduBj zRfcP?`Ym9oB6N2HP+3`u$)0?Kg!Aj`V4&dTD7invrODi_#KVzt6*%Gs>{sG41`W18 zxX`x9l%E?LA9&?1lkln}4^QE(@y3NbrYr`jl?&Ok!daR@&+10pcP$WQSK;39vefJF zz{AdYxS?_Qw3yt$2X~ox5>Y!tiC+|kWv847t0m!{UroctmbIBu&+-&lVq-JV|FRqj zferVWux40J%d@D;G?2N9x(kmj)J4z($mU}1AuYpC_%^~)Nt2U z4Cz$0c%KJj=6>B|ao7$kQRxYT?N}19CR<{ys~2Sdh7}t%CEDT0j<7~0+fw2O1y(;` znlw`|6FCnHn#6$0MnAGjGO!axH82BHaaSuCh@4||=p)4*moX$d#(qXDX1$hLOO`b)Cc|1|&9P=A zV18*%PQ_ABUgWlg3AdPH@*-bY7~84jjEam+9)cO{=W7voyxs@14;{gHEX)dctw7xD z$T@VynstxKBl)bYs<{!e!)cu54P>=fd?i(B9*<7FYB645!mMPro03Ojn)`{8mhVW2 zA7V>S8|X-|X2xYEWJM)M<*IKgBua}X?XYq>+!s&m=z)W+$<{{~Ms_J!Q@Uqf^kQ>h z(ZkH0Y~2==b=?fHs(GOlu1yGcnqXK>0?JiY2qD`OdAZ>9N55pSRKy)WUyh=Me`Uu@ zeF~G!jKTIaPo6U&ZkXNeE=V12k1segd02KSr<4EU%o+<3?mEMs`xS z2d09CQ0rr&m|k@$Zrs&1Gs#_!ybApb6E^g|27n=!^fps;VO*9oEqR1%X#UH}fU%zZ z#PrmGacQv`YDQdU%1GCMltJl3;^Flr4UT}zk(iX27MtWqvgKKOZcMz}5_oPSG=6ri zRI-B$BriW+LSBYoX1=Vm8bD;^LklD~>X&$0xe!YxVEr)eH!iH_fgRWf76>2fO@O&W zK93u8$mHMPj;d%iXKKOgiZeNSSWL1rRZVcE$DWfs#6386U|gyz+mYlN2tLyTZ#~7l zNv9LVoCFzYbFaGnGN=W;3+Pd=?koCYqqy@#ap_x3m}SCEi_cqfb2yseh@z&BcvneE zPRwwnn?BV*%z$rFp}wE zkGs_iZ&K3tnXrsG+U~N)MrFYYq`dJe7BpR1tMl9ghrX@2Mr56i5wakCq&h5XNb-Qx zAxT-8LsCyiZF1ZL2A$(dDfnDT8I^c?TpB#dl*}=>A0h9HJh{;+sV^(Z8L2tW;fXoX z$(Us155Pkq)=ksn2Bj3GzoeMs%<)lfI2Nv9NvFl70r|9)Tt_NsB&80`8kRmhAvgP+ z^wH^%*6Hyh9r?E02uG~VR*;q(Hw1UNQ91TFYi3lkHN%O%i5fUkvavKUfFMyRj(7n} z%>gVIZx!MIPj;l*RcnUDfmQ0f2uE~+ZII0q;hOTZk~cVcgnMXmUUZf%FMSxu547b* zyPWZ6yC*-wk(d-W0Eo_lF?mJF!)!xy4k=L{+la)%2zNxBH7?qY7XoS4<9|)uIV{o< zSo${Jg2AL?ZBTUZdokKlpNo8Cp|q5dYjH;_3+jF}2M=c(7IG|UG*tx+Nk%VRy|5PR zGVZRMW;FwF}67q3$2;iW1{k-Gc2CC!D>o=o-I4PHX$=s4Yx#DV$V%*hFiid ziN$drD@lnN888NU)-P{Je9{`35cu}6i9BWKaM<-T$YR3)pnJ<{KD`E*i>i=t)M_lr z95+_NN5DUp?+NxJlIuL-ZkxWEFF7B%-xOWs%(KTwxMIgTuTDJ^YSMamlTJ~k?kyWj&cr)9cYJA#irRGop1js zEIK|SlV6g#qjT)82)smzNDaJq)Pxs+6z{ty^4R>caa;wiiFyp|>GP=qAK^}}srINZ z-9Was=kqNDCcpFc96&70{XqkdRl{eyq>t}_~cu~|oTZ$eY5&m#I)Di;9XDV5m51_8pjYa6 z?mXFY#kbgnIw4y;KiG0t>q?X{p+G#}`p(|DbT@7UKXZU#3vTi1{r~hJ&2?pBh`d-8qs>9nsJa=yEUcVLyD zL}20*A~R*c~gwC;lJHq7B?Ai;lSp zDXSpNpV0@Qk^m7qj+q}Srywj?4n8*UQ@`Ww<3n(08*ZFCi%qCs!|~v~+1WzLUp0Jm>$cuQ0)L$SYdDu?Ck4Fwb%N1I*=NPsH(^g-dkEOLV&GBF>A?Z+u*M{IH z78$Qfe9JP1W$(WS+ai$EJjaHhOUv=FT)`0zfGjUIE%pA!41w!oIOO3sJ`pq*`&ydk zAHyb3`odUl=Evbgq}IF%a=DkzYdyyC2yqx?YcXnojr6!d#qf!(#ks3EvY8?X(x%3} z-V>bjT-*oKAPt#@!W5%vMZU;j8c9PQet`gYZ1p_CEus<`H5Ee{e&ggSJoQOy@2r?h#Y#GSU z`rhIpxIqdDfez(d@web3Wa9q|o^YZNeZ;2!hW)j~@+IBNN{1lFHtdvKIJneSbP3M# zjG=7BHWTuY^@Y%7eS2%&+WUZTTjC40B5#+7n#q!e0Pt<0E)IF5i9QN|>LpM+E;-Uq z9Ec`Kbh`{WUedL!6npRuY27Ban4?RsAi3bc6lQu7GmX#q!L$w7dy6fw3cddE5QtD1 z94}Rm3`QGVf<48k93%|QjaE@NXsfbkRWfvRo`Vs{>8Wx z`5ne*2B;gC<)4W(qdGT>`U}N`-I7*7bUbN%jC{k84^PPQu2TNfAsOLWZW{*7*UH~# zEE})xB#gEll>gy}wdW#e<1jslEbF=e=qOHzS{D%sb6=cFhr+FM;J%|c#neA<2@x{# zMk>B_g^Y&0<3jRY@JD$c)+UE!KASSnHZm^=$$ZQ2Gs}ZFw97&W%q0R(8U%I;0{{7H zQ|`Kbk^m(03ToEey^sTa#~;N5LTi&Oev3E?B+-w=r-}4Uv;3~Pd5#6vkq#q(hT|_a zQfo2HqBuEg3AH7Ca7$mj!&aj;sppL+Q{P%Vl6zsd|0&Mb&1MjNz6(YY2*Cq{km?gB zUV0f32S@?8aM}1m`sBAb-?{BNTbQ#sK_(XG!yx1-O0q(yW#=-~0xh0(quxs@>=Frv!!td6@`ONjyaA z_u@fLDV|Rerj#mOYu3Ld18Rt6syr}@;)+r~YW)~kLT%mv)AH~>z=Un!!9}Q&pT>Q% zM|2o&h}uBAg#4FGL}E}3XmY4pw|*sCQnV8t0L+3AjSGX{jtFw~ zQ5Pn*yC~vg6Mg+pu8J(I@jY>5mx2nQ`GPFaaL1au;%6XBYj6V6c!7-Z_Yczt+0bqI z5ep>2)774NxP#s5no3U=y#OY>TB?g)4F6f8_95;PGTsB zETQEnF(!sf45>JkMCTaxuk)p#jnJ4-XZ|D-2bgf}4KGZLxF;Y2Ax$~P68;LncIKe; zKdHz^zpuzQe^Qb6@I_A_|AL)lkY9IaU*%fkbx|cg#dY1Kp($ZDDPHJ&q5dm>zY(~y z@8|<*A)DqTVf?ubn$c05gag$qI-Si3eRu9uW-entl14t<(qRd#e_hU9u%C3u{ATb& zsO%S_tJ5$_ByL0_u&+xG_sFq!XK{FQx5K$Y7%uA58u`IGqAW}MNfsI&ihdC$8cLL}qr_C@b=(5 zqi+P*gA*&dNTw(mZR+2_x3IhLxVyyOr5EF=4a38t^GR$?@=z0r0VNnGax~8= z#3W%PJ-{2T&D5LFcxMdJ&dD@1dJ5JD+Is>Pznc$(_UuUPvh0+SqpbZ0Yt`>p@< z1D#ic#c1dhDIxChml&6bW@j@Q<>uKZ&3(X(AP{2)VR9=;1hR&umZ0y6=_{YC!bh(7 zie(*aT~P(Q0f_l zBQUG|%Up+|$_;Y?CWowFrqZXgLZ&DdMuDF!dIgV#AkVTfITr_QgB-PAr;b47=R-T& ziY+ZlDL>lalIV%t@sWrpv;F|rFtGl9D$E$&<=`&52X$mBxKRI0cFesKx{oGK~x=fTy)n6T2(q)$}+7m$9x)T@?s0E^MG>mj*s0XccyYLkw zM0k)JpzEhY>rq_!x*-fU>r+6iZ*j+8YGRhbBUWDQ&gOG~+?(4n2iPlDu6)*|RM4*n zzl1oYA_YIXZp8Cm{OC&QbS(m0i&M11c7L8A+Ik68#9cJr?OfIFkCm`ubz3dhUtyV$ zSH#WkA?%Ai_?o|Hyt%<#*nT{0lgV#*twBmlZbJqXu^ShEGiN3hk!>;vm9xP0o+XeT z4hK3Ze7qX`!$Ws6xV?-|MiQI2- zrAar*Qxs{VB7=@U1fmv=SDj0if=pq1Nbl0o>-T~fF`*Fc!1E68AJ)@l$*_ z1O5)~nXs7}t+^ZH3Q;2vMvEXz+~6{gaJ273Mg*$%-!2Fsx4l`9qK0ZFt{~>^U}NPd z$Zh2R;dd&|#lR;R{WgVM$K&3hb!r~M3rT~FjT)Zh$<7I?dGq8zn7Zpq!2Urp`L=&3c+=_HiH~AOi#y?*YAqmpr<#DXs9Ou>J86t(G zg*ftqoXwkrtaKdvwi4k^D=vnGwxz1bf;;`YS~tss#@z38LcatGGcTbb_A^gcY<<0R*%ETik3_mV`mFmmGJl zKj3VR17y+Uz{|KGC%Fdx*9b|7Um}s!q5@>W{zn8hN>lu+@#hp3CU?j{oiFYoc%l%- zQNfI~G61(K=HGMEEHY6&{AY`ME~~KbzCVMs2+9(mxihM>TOd+(FxTNlQ1N#?}gv~d)9v|(^`ei`+EjmXDno_u7II5P<#YAPutHj|vZz+l@JY$&QO9ECE#uScJ zk?LFlTS{j}(kUhYo$Ldhl%NxRpc4dwt$`CNd`^S=P$uuKKwE>#+zTNIq-pj%<)N9FvlQB z>Vzo;1OY7tpFwaah0lQ2)_AOSzU>84m+v3;zlaM)SIOZLtjlt+iA-WM2iZvIfZ_ZG zgD3@uW%g=i@{klcTQt~PLL(H(hpEgp3ZD+VKHexeEQo7cjO0Z~?$28WNc5GvOCoBz z$f@r`22wIU`$#m+p*HV9C{`y_hy2}LIC!JYdjOCl41vG6k89nT(0q71(T`57vqg;Coix2|rzj;AP!Uv@_yQN# zqH4X3hXDUqs*t8&_&mV-M6^?;X&>UoXbAsyki^@~BdN~jtC)!+R7f!u@}GXhen}Ut z(2kTCe4o-+d?!-+ipfJ7H|RKlq#sX3gI>}{n=5cZAB95wArKJ!SIEq=VmA}zpsFk| zC_f-6Uz{eIjO_w78BJ7<2>HXkh;}xQK(X)+jvxbk?8tPbf_@L<_a1&%W+)ZUWQrf6 zy;jg~N|yAQ;Qr9`>k`}Y;)JD$K*y7`QV;o##ne1ti{|?$}|z!xI1gQF$m!H3MgN1#!rLOmso(bx@xdBHN2SRDZ?Vd?%GnF!ry z_^;=C535NYJmBA8cir0YP-6R2p(~>^Lbw=(Orkf5zEi0G9Vh&W-gL<5P1gXl72}HX z(}5W8p`Q-W(tb1Zi$-YiEA2}8C3p4y*ad?Gr=nN+Rcos81(E;!tgr=B0qbs)KRh@W14VR5~lYQnW3QV?d!cc6Kq>6Pj@|@%@ z0Zc7|n-0LPx#0xz3XcbGA;~6V?hEC_43nsbEb+6Y~csB5Z!hKz7~UCP|f}d2Mt<<6tW;;rP`$+M>^Av;{9YWrOwp}IOSOYRSdSh zF!R__fo6oIg8uv!nds42Kp%(arhlYDoU|G+3+wSV?Goak-p%r9`Ui>nZFIZkCAm;u zNIwK&QkSd%%A$W)pyB0P(ms=6k8)M0{{MJ87M`7b?dp}SyUOq zW{>?Ow-+yfVta!3BzBST1HE3ujgVhh!zZ*Ziu~+Tk}D$@(Req96j~1RC03|y92ldk z$a`|$ryS!*=$05~laZfv;%|9^9!(CkkMT!;-yzhIw*yUW{aEZ8cnuc1%}4KSGRf&? z*2QcbniDipYEXGj11V7+%!OTU(=bd%dT>8Pa3*CpR?vdxgZfZA`p{y08pyhA(|2H< zgGYR^?6D+^D`C^G7u~#t7CR}jhxV5N)EPYbLuf#;(zzB%(%@v0SGG`MG*WLxnhD)} z9m7--%Tz8&R1hy$#G;?N%?V5_@$&it^*fqi@!&WN4`d0b(?2K3=)ZzA5IPhG{s!F- z+_B$-{zse!BytBhrK+;0P z4Uuq&E?lZfb3&$MNVSLXsVA8vsi8=10j!$` zQXS#0p^hQ`S?>j*Tih^NJzZE*h(_@J>P^9X^sSq$0 zbWof3KsK`SG)tBpp~L$HUiXSV)#*oTpnW<;e}sQXV*s9;<|M;v(UgHZp-!^KInk?7 zPxiN;Mxk^ARO;y6JW6+RKkaOu->Eb{9+c6dJ+)B0;q7fZ==uUp7{7m9GSEUGv2~Dd zi2&a;Gcs5hNGvc&vWP?J`H?tmc$Er&lsjj`4kJ&?G_C_`2p`ub=>3mn@G>qFC2|uB zsIND?6C_8n^Zx*CLQo<_^Rfu!=n6=rwz+_0v9eU(ft-MZX&nsNSgOAzAW_;Og0wWC zwx#-~0CN2^w>6U zgL5VQ*PJR-XUo|^kZAcK^h`S!sO6~#p2uZio#1hKBU*t3_A9M|Fy&L5ukk+SJfs=O zW9(}`=aS!*v)L#oZZHV|8WwDrJO8|#jejQ3RHlM1Je_aQNTra`AIS51PTyFnwbG4j zsfNL#Oa0zaLy+k`s0z9Y)C^+6O9Ibc0x14h1vqHqH;L!wIdt;$dVcUU<9-FH9r=3N z9rzfRs>;Kb7KQJaspUbsw{|qcS{rR4t`xEr3!g5YQISzc-*0Q&*N22wo1$S$q@X)# z2wQcs4>vE5;U05li_xK$)>qH$%fce|kQq@6UioQjqy3L$4HDEhSHLUQ3)$cwS2mf$_ZLnlWJp$mCiDA>9g#;ja#+hAy_}c*l3r9 z04Q4rlK`Jh%qIu`5;9wYWTm6!2FTvd(OHes8i?Yc#=d~y{ngboAxpd%DmUx zkH#jMMf*<(4{On{WQ|3ZwR9l~X(x;#0PtyX`0Slc>k!CjmeR&bQ97$vp9}_M)pb7_ z3}!g27%Q7ultBvUIRrq`F75-+NK91QS~Rl5l9)Dw%h<<*dpyRm<{gxb{#g!WZj2Vj zKsU=FA^clDY0vQuS$P!1h&v6$TLutIXk`Ks!7PTfG62!=v!F4yNp`5o3ia)o!1f+xY~h_^bEg?&C(WObUr{t0bx@7Be+5X%TE= zA=8+2i5`I>&H5E&D3}r!uY^k60xHr=FVqiVrwGqiSzF!=O-e`Enl6jfei2E`NYHy1 zQWG*m&z+4TAjNI%xRQqQ4vWhLFgP{D`)x0SQi=Oww24Pcfv|!s{Rh;q9nEaCql6 zSWy>rw9A4W4{y~~dLz_)F-pd|x%&)WH(z>&QgPLv{JxdLfm&OPP%nlor!omuo~ z`*3PSPzcw+P-;Gu1PC+jUxw))t7yo&Cf)>a_b7%k-6)WOf}S-U$bHSaAvEcWFG=_K z1p=#OrnXBKGcgNRAsaba7d{EidU+IFG74l`eZW+9{!LG^W6NpUyxJV1z#b|^yG9Zd4SWt4;n9{DMX0|oV(OW}BJS^3go%nc3q=_E zL|Y`bz^ZKFH=pE1Yi1fJyra-$DiDng16z2*z(yc&)?jbBGz20BrU`&RD_@fQX=4ye z)KC*LOpn3v^t~S|K`Kc~D-&q?N>s;xcR16SWh5@>qrtC!XA%wKgx|#8VxT=NY1EAd zjf+9U*eD>lr`IE z-Z6^LMd+?zbD}R^-AS{M;Ok$qdJuIdf9;lwhrSvNMNXDNg&?8-jCE%JO88SEgUe|| zNaxWOOZ7C`_DQi;WYhjF>F9ILqUly=$h+tg5My?ql0|HSGuOw#yE3PS@7|~q`c_cz zJCKPgx|aUz;q2cTh^{gHYg=;^hARa?t_a0#B{In8^Y4X9wRyMWy+J#VP=)&9!z7w^ z5{a3X@y-e*rauULDy;Vmq?c=&Br2L|0k)D8J7#2Sk)?bDW;KfW%4Khq&~al>_Fq6t z+YNl6KPM7o<6er5vTfe2+>Q4KQ(Cc4Q`MiuPSoc4Tj670i>x8M%W-`7A?oPunr@Vt zSrn8;p~O*+gV6%OnW=FCLElS0G_SFNF~v{*i+IEh-E}D8+65995TAcJ!=>TGitFFR zGxW>mAs2z)ecsSlJk&OsMD$1>s8FxOIzWZl7t+N*MTTWBly@)fy=tih8NjzG;FwGY`v&{nRzeymbaD1RO2U@z&pO2vW_rK0P+KDd$ozr9+|S2Qd-pLu1==?_Mz84$G%qA=&!| z>gvB5?1iNLEYnQquqq?oH*(q9ipkAx7d?J3a?G+aEt?jP(1g@NX~6f#N?O!=yfOiG z@%g(kLULVIWBvfkthAjJf}xL>dHwMkkp}`o56Gp#Viz)McStZPAB2@j3sVnKdFznc z=G_Fn+6*q)sz)HWAH62r2b1t!b zA1Cr(6GEq6!v2W%sPUw4hVY&j{8IB2>TB^P*JuQ40Y#fxEMzp5s`EBHd}H6>UUo`o zD3oTfMPLd-mw}M5KzPr1KhG`5Gfnfa;QQd54^xXtAc0KAjF_DvIb6el;h=#&Rb-sy zVor>q!lOMUxtmGaX87e;_7LrxgBU_+U%?TMn+~a3FLfzxoInuWri;97@RDz2pB|e1 zX7R2V4kqzhtYWi0lW3A8W{m>}PlE(kMYw4Aa%41Djs_MeSn&N7RhG8cxR;HmT|5v> zq>umsX?KBN%o`0(9uDOs<0d_K2mQ;luFXH3Yx$m zXS-3*w<1*(^fQJfpnN z!^cyuL)4=f*gJVs^ZZT9!Y^k<(J=5MilgSz2Sb6`=K7GE8}LTlka^sQy>0&Y(F?UE z0igkP`UmjeUjoo*hu|h&eCq(Y(wl%hsuoXahLAWcsND!`S@h2b4JlcSt~t); zyO0Z`tJzBi@(wS)HJOOLa`Lwl&sXA}V08a~`n@G_&x4QgKj9J{{r(7t%EAveQ`FTg zwl--{fwi=nq_d$sXo&4eFfOeQ&zIhPm-;J4Aqoh~f;}KG^qr*XV$;0nO@~DS$+rSQ zUHxS=1%NQy`-=I_AQC^Ze=$`kCa9ri+6twm1BDA5Cvb(Gvws13ypX)P%E{F%&?7+d<) zb|R9|C{wgi0-b5<>#*z3csuWtbcVvHkdXor+E%t8l>AFf#V}EKg_8OKeh%x!CP1kX zs08qQ4i(WMVcLhG)apS^`;UN-RNwgulDh^#!QB1uP32JggFuobkADx6$vEaSIM)3H zIl_eVd=)be%s*sK0GAhIqtj4<%|fE88RL$mf2B-LgM$8k)t1(6kA-eU8;%zYt=>J& z`^J|-q9bwiCx%IV@%iLcrOHY35*pEfWN*inTUgPya51U+E?}aaZ$paqDPZ(|lLX*G z#rnOsG`58Oz(_D!H=oz93^!4L@??Tq@+1;Ss{Rw&&uG(g80OX|PEvf!y}6~@#Q;!g z+6+z+T0=GF4LX1RDiVj)SoB_)Kw1XRq*9w?(U|Yzgiva5LMirJ0 zhz$BoAe$YM=K{`ySJ{`!%*X=IFNHTfVbsUUFFYoCF+(qg8lHsVx;7;HG9&w4GCTD( z`ovgU(}$%;Umz5RUsm;=k?QJypa;e<>Kpt9YnHKQOnS&m&+A_UB^@#D$)3^MoFn2x z;1^Lp$(FO_Nv`Y>G2mLAx2_3&b~tZa5flbh!`ZSR_zd9yzdH08_@bXd60P1N5XbvC zK!n=%Jb{LuOK|kx9Wr4UC*aeNFz17`u%iB`n4EXf-4V7&=dc!F6%u$pKaFXk64c3o zBkF+_?-{{o@P)oQm7k^fkzNvf7U`#pXM@jSlATmR1}-JuplLh)LV95oj(I<3VPeU2 z%!MMQxABNxi!~T9-g*f>e4&NYX);YO#yZ<63#ZSERZVGe);mxM<82OFQAD-%o|Ns? zB|m=lUx<=}Zv<50L7dKTl0K!UxUEfNfk9z5Ex2MgDNBp+^jj~ap4~;w53*gncc@F8 z%0l%4h|VWzT!$j*{ZHe)bevG*9r97UzohM{XtEz*4G~%$>xTS2`2fyt=-SVuYnRd7 zvzH6+i1-|0P`K0b_ExY>2TCx@Gp^>^IKlfBSmO!R3HiH8J@NjSgZK2Hit2%2mt%E=FpB#yAg6qw_z!~(>YGUZlY*v;O!}yc`Uu_AN2pNmgemdg zPIRy}=+EgqF6lf3I>Bb6*Omr%NBf9^yX8c+2vnQqV?CmUUeSWK-i7M;bMYWVLc%mT zo2x_{(+Mo3SyGX3=zMVdF!osZ!rzmcGNsSC z!1rzIk*~bN>k;+T?i8sY3JdZfbj43^(OCwpTfGtMfgu=ejei&SMWyC>NByyk#cKcN z6udo%I2wZX3!_=)eZuu#B3Nae559QhoL!tVvQ#NI3NVhb{6pXgsTt(Em(uDub^2|hoE%gcTprr$J+#UtvO} zZKOvNphquWESiUCjK(`8g9Zk@IG~UgVxP`iz@nTp;1goHg|7mUPJW$C|3OmGdoHH; zY?*NJwD_r7WVyA_tgn)uOdQFw+=fi ze3?yaGZKh8Yle2WLGmngH5TQg5{V>Ts9yl4wHFx#zk9zy;E8GI93Rk=+>-V(R9gF- zld0!+mO5D;*Qwiu${03vvqC(r~0bfzyg%0BA?d zTWAX;{ts%oA33OCRyFyJ%g{ekKRSV!rw!PUg!M0)^JuH_NB@*wT+s@o>L1U<#IzKa zL%OmkJ*>Gq!r4ZOu3dJi7-4%+doeIZLHa*Ps2^5=>W zL7$vYMKkm6j^bp6Pks{h?WdotP@_2)6lwrU)~bys6z1bip7R(2y}23b+{i0rIiQF} z_JILytwhqEm1%k>wIVD8@4H9KH1FvO?tS6?t)0Z7*l#1=-2J-OdoN0bGz0zL*)3xu zLLbL~d+b761SFWqUwH>ugUDetR4FBt>ap1UL9f-*IW^dfGPUG#v7d|X9(TWQhEJ=xq+(s`O zva}lv`XjFZ{WZWvvd}f-OShs>ptKYN0VBz^a`vsI+G~;yHit<;Vd=z97DQc+Q+RHWki|Ms`y8l{4MXI`sRyn-L)^H2Zd{GTE1EZ|PPPN{ewKckGB zfS*5u_y%u=v1{(emr-lMAHfXo+a_M*3ec&G-Tizj7d9ICXGB8(P1;HXdSG9v;p)E8 zg*~sDJuDBgMWq{lEiDfTa|lLg-^wkok}1;Wb55)&ZjmHdTl`@tpttc>@_xU=dourb z&^|neEG@Uoj9{58o9lh3H!4Nn*PIODrcnRoW2D4fLkyyrbiRS7a^{ujn-3UdwSf{r zl6wW2sDlfE&{FofG9w`r>g(yn{B;J=dV^@;H6S`MNOWF*qP3E!wyGbkzX43;1ic1~ z_Jc(GkX5BqBkBFbMx(S(jnaVQ^B=<7H#S9I$#neyEGKi$x!Zp()lApQ+NbgjYF`Z; z|AWX%c9(V+hmtP}k3jr-*0zh13AVy!y zh>_a85~4jObLhj6uM>zSZGePmqxlB1*-qRnf;Z098Yj~wD;q(ndHx#~XWPZH3sJM-Eqia{8`|Xt z^&24+LmQV!x`LA`9)E)e!z?`4kHR44KnDk9k^`Cy z3l?#v?wttnaDIZvZX{%orMBnJMNcIZIdip zUp^IO%tS_fF%;h6eKHcR9r2FocyH~HHt)UIZDnNoTxOD$z)p7Tj|47%DDsWO((fVN zG-)x@sm7R0r0@;A(%of-=HwcnNYv11vNIVd-a-}XFC2!1E|hrMwK7eg0vi4+z#!$K zDZ3_7Bu}()P+KfvI&h?}-fe)2r^}x6s3b`lG5?`_FG?hBzf9Br4s8E%s-j8zz(_q2 zl9TQ3Pdiz-KNtx18B}$&=c`vE`$lA^Pk`FIOQ|(r{b^pab`wtTxDDGBW4yPGsbog>AY&D$a9d02|DaUl%|zxj4#4uZ*lK1_q&N%O+Jk^&73o%`{jPQ?3wnEV5P0d9o7%oJZ8G>ygj zC@n%+k=W+lfQnHz95mkRr&I6r6`)9Pf@agO)(Pld?<0^B5fjQyONedWM@scIn6B>i zuEiss*Ouz%Vg5-8Bm}7S4y;@--rvi`JW4n~ccTJ&9v8G0a^Fy@eIctLgqL)HvaK!E z9xazGwf;<6R_o?!O<{)m%3KE8l0l>BLLG6MMaiG{EBPJ})E~zg=Ts^e(JqUS9IwHI zmf<-*S@c{i4|hbo1vHcYAUgXx)U|w>cXg|G!}?2r6k7doA60*?^nZ3?rKM@?1;8PB z8zL$LL+h>s5dI;)ZCigIZaX5D5SG6I^mQB9(>CB)Uj=d<5sz`w--Mmv#r=PSmi{?r zi(ne>Yv?l{!-p0xp$w>Wq9*~LP-#Md=@ZU;Ab(lN`uSaAr6&&%C|(f?9rz8FzmsjH1=N=0;+ZEVQ_Jp$4)10b>1fZ9I=XkO@wSA%Jp4b z#aFnBH^6RCyMQs$S*&Sch$lTf42k$JN2-1jd%n5SubIMi~m9PrK+W?v1eJLMJ_y&0lO3pio5tp1l|{kVZg@4_YhMCpgUi7FJ4Ne| zAKipoESK>%V)(RZG%W7mfDpNibf&ZUKY(H?v`16QlV>Rv^wTTF?-zMpi>r}FR|8I0 z`WZ07dk;Ul8fpIwxhJ{?eIuWNOV|Iuexc<^zA*>Eq*dq|MYItQG)5Haul9R}5^trq zS6-5f$O6#A1RBu?!b#%<$qa=o3eusTP*3SdW^>TD6xcEY@L*F>Pgu0)BtXAKWXDs8 zs0C;T%Ed=#A@IidSxPy!TFGNm<1fdfJVbSQQz3FJUEBZ=>yn#30~3cihp+f5&mu{sjfyW#eNwG9qG9<4^ zjbjOe&b4jY9zi*j#xH}QjwK8l2F&1r;;4nXyjaEYs(!J8+DBpevo^WP zbnfL@rM4SU!tx0!W#e8@r-5nPMv_2<=*p(TiKvDJZ#q?42X zz#z#r>%WU;s)Hi@X1|y82kWD}a!tov)7xY0CukuJUdEv)mbK`7PjQlhZzpGk)7S#u z;o?Gm8t%&Zv1#m~DpG?bv|QT9gjrCLCw&k>K8}KJns?A&Mk*g?lvnE<6~OG_PM!jTN?g zP>XdhMx&u|T73&Oxn90Pf`^tEmL;AX(;lynx&33)u`&CXn)VcR9Wk{ReR_*&d(nZC z?$HNJPMme99=L3CCg18_bSJFm9@Vr8-7(@`&l{gv(j}!={}*feWk4WN_ns7NYQ_W z>O;2--ahz1{=xkJ=62_ZVrS$MpYxCsVhIU9QgNwPd9-j!0LSnnf>->Z?1{hCXfgqXx-DgYgyO^ z3}Rs{$@OdR+Hq6({pTYai zdGeWS)Ah~G?HCHf&;Nlo3&U&zp_*@UMI1`-q<*YCw!EAG}XlY8$JsHz5E0i1IYl)QZ|a+q!I}=}9iF zvATSwf%WuZU@2yffI4k%EsNm6*7uLhIf{2{=JR|F7uHl)Tvk(8Uax$;^}F`D&r%i4 zQyLpesA*X9o+r&D(D}Zya)d}{;2shx0WbCmQFBLm_me(oy|UxposUI6Pb?AQ)SAY+ z89tzkF7eh~fQQehs;T!~IK4`Ails*gR$fm%j62cJT;k@EdSolBs#kXJzUPUk_1qb& z!1e^hME?5OO{*eI^fVbyA1>YeOoXhh(7rd8ZViNgvy^xk@2lWY;>`a8TL>iL!7|_* zD#=@2-iPue?J|dms!PhMs+8yM)}Nif`V+!pP`%HKMxCo{>DiX| zcCE7O)-6BG+i^r@zMv7HkD6ay`i~#pl30^#Ztw}L?vEwb(RX?c%)&I8ho>rLyvCxHX{6~zu@`8 zvgrum9vP;<0ABACLi_srjgK!_MK2*4c(JcSVbDr4V-+=(+L+vb)^6@7zil&?WS& z&)eU9^dEO{AL1C^$Nv5G@_%gNXJKx)EdKOF)Ei@wVPa)Ny>f5ww(sWAhrH&ARW)S| z6QGI-gG{%$xh^83tfnd7Z){576Y=d>-uC#JZZ< zQYcNIZvWc6qlbhtsZ>TqKB_;r@bFOqx)_5i#I5|Y{KZ%1zVswfm?Rr)#}ABBUGAGB zgz@N00#MnYusXt^(&*BF?uA}A<9aqyqHO|PX+&BM*6Fo&LAxPXqgBrlgd3lf?{)4= z^f*yjb=%z!EZFm!kv>fTHZsPAWpx!k40J;L-|rwKQbbm&nqJ)5o_TzG>UP2m!rGd3VXl+9$ZXT~yN`2=;zO=u^ri{S`C~HJ6svmCaUO`sA5+ zqTcwN0k8Km&XlqL5z zZ;1Hq4dMxPATIa5{`8{}>;KIVt#W3Avg5n%?F+woRsd@18Ze+t^T8px=k{gy&wZI* zDVR@f$PH|~piCs<-+o=+KKDTu@zlBXZ1cEN9AGH}M8aUmL)_V?l~ssl+1o<2Dc-g) zY+W=OnvLR5==)xt|HX0CExdB}g=~E`-ud2h^B;Z>STr0PLArU2T+72*y|1C9L}`EP zpIiUYaSzaxi6v8NXvW@zpOPP@Z2j4!l>bdpwttVnm>fcTn!=aK$~51c2J~MaMx?0? zHFa>8CRSGAZz)8Ad)N-#*THkEYp4YH(n{Zr^@_{@H6qL6gIVeS&vExF;VBNYBRbX^ z7aea)wWZjy@Hf|%>u5Elj)_mke;)peyM*+Fbh=MSP0UNowWrw5iBC#MPa7EHP8(oJ zuqN7E>4S0g*kY|6ip^t-k4d+tWF+JirH`>BInwB<;LP09ato0)IXW>RH6bT0-x80E zsx8r)X-!W%+mhl)&l{0DA|WGvh$AblAbpr4Cp9}Q&ykisIBjs+p!6Z>!w8y|pYWcN zkd`+hAvMTdX7DZ@q!})*bf55{0=BafG857hbDXhpsnHqyUl#sm;lCXGmlmBHoymW* zam|h%2zWZ~(xX!YC)^0o-a}i+%HQ}bM!K*)rq?@Trv7beF7G-SAN& z)8zm?@+E^t3kWf{`IDF#HM6TKtFKpjFhldzHfWM7k8e(GNyD55JbID!$QLn&6DfFH zYeF>yLPSSr3?68r0qoO>nNMOWt7leLS2oNABpQ&lUjou#FoVN=%U3f*IH5i2RzOaC zK{%sE3ikd5$Ogud{H_Av5Th7wYLAL@+{=#vCSA@RwFZDUzKE#`t@=|azvGjbs>rw`>eB$+`(+F< zVF+d|K&u4E;HwQF{R?2#3rXFC=apZ^z*_LLDXxBIEfRgz)OfRyc=C&wdUhWS`A-J$ zR^(uy5O1WVe(vlNt*p8N)}ZJAVe5Y2V%zS*&~MHk7+?lAFb9Tn=A1L<-nsYAy?5@- zBq0eg#Lz2ANkv72m0Gk!F^~9}B%>MQ*?X_OetWOI*4lga%+$3@y}eTY1|6da z>)IrvcJFa`DAtYNZT{egKX_GZ!d`hz$?L-(yuL7b96tUF%lu*U=Z5`{!&9%U|6%hh zgZ{_ir@gTGyIy#&p^C2gaeX|Rc<%?^A2j~2ooZ8S?d4>2+4=Z(?EOLFlR+Y0`;j|J za5eV3+Q;Ruzr50H`K=())YyJAUi*b;iRgm(ariIfU;co}%elAP8`~RyA&B2^3gamY z{z#_goO(TdT241YaHG}qs`nW$|=OJ80ETI}nK@BW}2 zba`r*-yaR7pE{_EKe$=yc+}KzugtB5?!}Ht}nm$dhyu%FJB1%gFRNV zfx{q{yw%az+1RZ;O*eNnbu@Lv+G{_b`uyeM~nt-sS)Xns1?mFl|n*P4GdsD13-)pf|@+aG#w z5dTE*<^Ln7{r(B73isjQ&VLEw2X(FYJMT4gHnudjH~*8m z#@5D9e_Qnz>*_m_4;s>qVPkmnJOA!?e$VaZuG-SWw|~>Oyt{anSA8)m)bGgWGQ)~! z%ay3*`-fLqYXVJ_9Hf>{1rJ`3QFrFG=}i0=g2un~;1j{aZ0$62Re7T$HT6n9UwpN8 z%YN`>zjm|bm#Q7F?I?7-t>c%2j$aEpJ{_2-9X|27y9Bb@8W~ zT5q@A?QH6*SZioZ`Q7=zr_t zx>~**{=CUB>X+M(gIIUt6Ebd>@m(2zD!84NY>9Q(hqpUo@!I!26=g2lbt{!FYs1Uo zubO@(-;aJi-~Yp8Jj%CYsjlV4yPXL+wqz6E@zMGpt7}~PwmY@D#&~V{=_tc@XuV#( ztjVwBGiK##blSWeJ~Ww(@_8J-B$zNdCz?-#wg=shl9}4sRR)*$Z(g0n%VF~K>ouCZ zT(9MigXGhf>;3#Q(S|>N@8>VCd+7IZuDAK?CNI~$^Uo6Zd+J;2leb!1Ubx>?AHUt! z*jevyeS2eP;^5or|6N^EQ{qlzcVk;qyU>38*{hpDM);5GzP0!bhJ=s9pK}aK*Qei- zoW)r1@>@(+KJay~HCZqjyNdj&Xwx6KY}xOcjDPU*23O+u0;g%R^M3d!`D9aT!@b%M zJa>KD>E-Z)BE8y&FNdwsI#Eulu-};|M>*a3p}It}`EFxdbp-D>c^$#mo4k(T2cptM$1d^b*X3_h zhn4=P@>d(X+R)44A4aQR?xL5&(aZHOLr9st4B>J3B_=PkYTd1?Z%ei&(zg=zjkS~f zJBD4Gmam$-8z1@l$>8Ps*n6C>x4-SZ*YzuYnQ`;a*Tvd9dc*t89c|A%d^UVT>z!~v zX#DpdY5L@i+W+(7RW|R6E~c+D2oq63TpQSzH=?bpkI`j7_gY<|^VYu)8k(D0n_F8_ zE%zGlG^V>>^Zc{jFTVDdf>@Z$C0b))YbKdZw6(v`n5r$l_MH<~`O9kBk4lukF4`%N zZ%-Pt-2TS*Xs3(sornq@{sVJMy2h(R_-3hCv}oJmjj-#^b75!WotEblZH-?Y-w7V} z##&pRYHg4IR^Zk9H)lVZ_(yeb`fSkrAbz*G>rEGz6ZM^~sm`Z6UwrPiJ-qiT%>fNoIwNJh2YAeoiCvkoJY9l`wt$vwtUHGB*e(=4~z$Et=hN}-_&=y?epLIHUvQQENHp$? zHc-9XdvA^Mk9J-9VImo8ZA`V^Y0D=%I-hRsYJ0w3KhXGzprI=|Y>oGvwVjO*dp{Gz z+FCQsAFFGBYx~{H$rqZ!=x^(@tq=X5X=-hKviZ%8_q+4;_hpc(ec#)zwtd-!hoA91 z@)KY8xg%Cpg5vejb))<7?Qf2b?s)0zqVm;`l|FP?&Tq8RKXH|KQ&SPyJ>PrrI*i z$*vdfJk|A@@NWAv&G%v*^|6i@?>}|x%iBI-w&U`8d*Q`9Z%w4{J>S}WH{0~^UQc~G z(cV$8M_+7A*M9w%gR6+X?DC}hPIZ0K1>7rzFB{M~!z4@5808I7z)|P&IQ+2h+P>V~ zk7Hx%P($&XKlE;+&ic_x&~g~GCcPQc{q&0s?d=cZJ*{m`J$LWlZf)yr{goi0V=%L` z-Q`W&7w{&Yr>{PG{i){e^wYPKaj(X^8hvAy?xn*eCB8C z#ve9zwB}sj-f!$^|5OkbjHO}?v8Gt-UJyRG)zbKnKbrdPy1Ne&EscM@{x^cBe<}Fl z{}yz-(Ad>yN``@F>KWdCDFvcGKJJ|E0`{>pYzKUEid(A0UeqbnER z4emeDbf=-aBh_?2mUdgCCDzrNO0>s66|~=d@NE2HN4By3L9XdjI;aQFC*IWYnV>n0 zJ5AzIpOR}S-0kk_Za?v25`mR#(~&S(6+6MMR;Q=y-3>gs5V z<%*rLJMm0Bo_Z?Q-q_L6m3a8*ZKjeP5AHnd&c?etKNYmLxBc7T^0i+KlHKuiV_W#v zSX<+lnw5Bvcrx)slSb}J+<-`LrlNxikJE7sBYn?dWH*xjy2O|6ZuNu*mJhWYmU@n zKi6_EcBl8B)!qF>(3E`eOrpE#w*tH5Q7ml!Lc8ec)T8)Q@k0Dp>k=)%HQ#u* z@m^zR*HiAzJ!)-f2%Depd23U9)2D-2rm6jQn0VyoSk#g~il^T4+d*eC7B-}ACmWwK zV9T`rauDxm`pU-71c`J*TPl~jAAd65*_2LnYGPij{qeWgeeP1~?T%~g-NpC5`-7Jq z$;)-KHzq#t{^*kPD+E}IZdjE~j9<3zw>}V6hL^+d@eL0%H?C{LH%VOH40v2W5sd*R zqaD%ulb3_o`i{#%?8@#)Jk<8zl|#$OH|zR8&Jkujr@@12&rH|IW@ z_@TNt{m(!p(w)8OPlATN)>Nx2%$SqA{!UYK{8xhK4lZZc->LoC$D^(Nm4V}1qWy3^ zaQw7yAo$-89N%lsWi<~!Uf2D6*d4#u@UXe4QSN_v!1y)M zYJX+G*t`=Yo^QR=(3!}E$@rsCBNTSVGY#41WOMpXvhn*r(lm3kp|kcq-xK9`-8ICc zl3k7EzbMM{dMw}iyFt^P@JDX8X2R}zgc;>awy|pQ9%il^~dh@HM-uck0xRY#nO>=kcA1_D6 zzdGcTPPeNOP;|km)X}AP^DCw9_`bTR-HqM3|0s4R_TY(U6R&H1nCNVHQA5>`iM2P} zb#yyh+Z*n^emiJ;rYoa2O0{G^CsFw|CzfZG3Yg{V4mIPXu?Lyxp1D4xayH zP=7zsar?7D?Pq?X?(LQ69C}y&Nt_(M4@| z^X~_Vj%H10JlT4;_QyY2cljpmOWqo|JhXPi-?VqGTCm6AzxvN=+y|mdjQW`y(eSbT z_kz}r&{(Cd^Ul56Z~oNP>d}J?udF^~l~-;H^qZc$ak+l%YW>7)UE)rg%{PV(U5y=y z_LjDW?nHZ{-MK__y!IVGeU;}(bhUkJ=En7H*2L$seH_-kQmU83Z@t{Y3Uuitg}7nZq>^0s#0E`1#Sq}MK^Z9a_Fi`M$j z*K7T?^5q%$p8w5SU-8OXZkU7*b$<;ViLg1Hcyntm-rmq{2>Mj4tv%h4RIA#J>AQ^H zlGm>&+$*od-GR02)6qJKrxVXvLVap-0c`p9+Nb~N^=`Q?f5BG6tM2Od+;#cWuax9* z`2ELr!ByM&-BFp{Y8PPDtH#jL={kSoatEClv)t-veS%6{C2BwQvsc^EV_e>= zdmMh;N>_E@cKieHdCv!RmVI7|ee(yrty}xOpRLQj>h00L{Py2vDtaH%)1pC>iEpxE zlc#fiSmE;NzUcLY=lG&!5{*}XKexPRg-$HjryozE9| z#@J1;HY_ zyWZaAe))dy2TM13a`YgY|9{yJ{{EkaP0`BVsJXc;*FOq^UveAtvs|W^y*q8bkKbP| zH}3D{asA1w*PDLk>Ti_Czju}Q zmzwum=gHAOjr*+JuS7Wp6H)qYQTo@e(xvbJonMN)(~DH#gF~hmyUwq z;~rG4{>d-SMPBmI!I1e|r;l>KuTBm8&#U!+`p;Ls{MWwn*Wc6bIgoDe_`UmwFYZ45 z73SZLN)}u$zohOB#IMr7cQgGnzy73j@+$q-*)RKs?|Ufy;41yjkG$#o8~EX? z^cQ^i>smhfr@!z|U;44D^!NVGXP=3@6g?kf`6q{e?8hT7MGv9b-`ijFiy!-_hYtoe zujc>7@4oJ<`aQ@v@X4$6?W3K{-6;KUuhKn3<=6d4w0!h{gZ#c@;OX{Xh|o^3osF1%2`_|G#yW_Uubv`_f5W5Isx0_O++KoezKizrFNFb-|B1{$KjPCjKz; zl4l-H)T>Ya#TTypTomtRtqUd=V?X^5emmO!?Wh(86My?_P6xjD%>He?aan((`VxKN z(!jl|`LB8B`(i`U{OpY&cJ%VZmo$D?(>wn3pa0%VFWd-z<<<4=4L5>{?LGQeiG1Xx zz8k@wbjQ#^t>U?hFZ!Yz!Nu=hrK?f;OKt=w*Xh+LJ#r&BxK6J{>9HHZ&ULyRrJZ#f z*Xflg{r(%l%5{1yO8XJ_1?jI%{M1*!BP#DlZ(O#M(e{_3`5(U#%v>+O7^VFh$K-Xo z7^Q#sMlgDvUXIc~dLtOTPLD?EpS%(DUZ*Fb^gq85 zKVHQ<9L?Xe|E`xGiPHZ;{GYj+KNF?@llZ0ozwjHs_KTzRsmJ&nps4)QQTp8eFu(47 z_3!A9^8a)B$v=vBFpBr(&&N9+E#G)ESh>!BAxgL13@X>@`6zwwrXLo*+Wusee(Gj0 zdYzt&()pXg;B~qbrC)zD=)F$QM(MZR406}$sVMz7ZU!mofA;np?Hf^g#P+V^UyssX zb2EsUAI*!>(J_vWdvq+L{T&^n=(t2>jmj65A=*x~Z=(34ZAA5^LYb&cMWV7t$0Le4 zst2QtFw9Uy+cC@tql_`m1d|jgQKmwbDW;iWmO18GV38%3Sz(nm*4bc_Ew7FlAM6;@eeoeehGVw)Xy*<+sr4mskO6HYnfoC|6Mj@vC_#0g1~B29)Y zIr0?fp_e}T8HoNmPx|PkhXQNPDP6SR9Pm6CTWqt#E_>{AK=hFB5ywPNsGf4hInhIc zHKIoI7BQkOGbHLNQ>4j|CF&mY6zHLsKKdD8kRhUOaD?d7tz(Qc!6Z?aSE5XXDpO1| z!z^>mv%n%tEVIHYYpk=uCR=Q?!!CR5bHE`-9CN}cXPk3Eji_6>MU3ccz(bOxNRvU= z5j}<%}Jp8*CLVi;XPFp4f97)R3|Oj4vonF>{=m}Z7q=9p)JMV44*g;myA zXM;_)*k*@a_SoluLykD+gj3Eq=Ykr6!R0Mt#0g1~B29)YIW(z3fgXD4qn`l=8Dbbs zXE4eb<4iC~krHJpRGDI$8D^Pdo&^?JVwn|IS!10IHrZmE9d_Acp92m#;+PXoIpdrQ zYDAsXEn>upeq=03iZmIrh9q)CgQ`-XcbvkR&P6WXO^uPk|nK>7$mv%n%tEVIHYYpk=uCR=Q?!!CR5bHE`-9CN}cXPk3Eji5pN#E27;Bt@DGS#snl z&_geM^fSO9Lku&*C}WH>LG(Q_MM{*ZP-Ti~W|(D;c@|h?iDgz;WsP+<*kp@scGzW) zeGWL}h+|GT<&1MKs1d}(PmDMrNm8WAkR?Z+0zLH7M?V7$GQ=<=j55YJ6HHR1M41Xz zrkG}iS>~8$fkl>BW`$MOSZ9Mxw%BHeUG~`LfJ2Tr=7dwuIOl>I(ancj#E27;Bt@DG zS#snl&_geM^fSO9Lku&*C}WH>!6ZdWl&Mf!i*0t; zWsiLhIOK?9PB`U^b1tY6xK_PIj5r}lQl!a{B}bkDJ@nE?KLZRh#4sa_GR8O)Oj4vo znF>{=m}Z7q=9p)JMV44*g;myAXM;_)*k*@a_SoluLykD+gj3Eq=Ykr6Yw26Wh!c_| zMVbs*a^xw{Loa~8$fkl>BW`$MOSZ9Mxw%BHeUG~`LfJ2Tr=7dwuIOl>IfqNyl zh!H0wNs8z8oC6-xX zl{MDcV3RGj*hAcVq6zHLsKKdD8kRgT{ zVU#h(nP8G4CCXH&GQ~7A%reJ33oNq4GApdI#yT5pvc)z#?6Su`2OM(5F(;gI#yJ<% z2;3{ZMT|HhNm8WAkR?Z+0zLH7M?V7$GQ=<=j55YJ6HHR1M41XzrkG}iS>~8$fkl>B zW`$MOSZ9Mxw%BHeUG~`LfJ2Tr=7dwuIOl>IfqSdBh!H0wNs2TXvgF89pod=i=x2aI zh8SjqQN|c&f=QzLxFyO|s4~SgGt4r_JPRzc#4;h9q)Ckv3KKV(EI3Y<=_>G<*LzWzQ z3iQxRAN>q4$PmMfFv=L?OfX525@jk>nPQq5W|?E21r}LinH5%9W1S5)*1m3&2MT|HhNm8WA5WT;VBTs=Idg-H|0R|ajm=Q)9W1I;lDH6SR zQl>(cDW;iWmO18GV38%3Sz(nm*4bc_Ewuj*e7TfHw%O3k2aL5tIoN&q+=Uh-D@Ltg^V#Enak|IrpEIINN=%JTB`Wax5A%+=Y zlrhGcV3Hyw%2cQ_#WXX_GRHg%EV9HhE3C4{IvZ@V#Wp+avd2CL9CE}lC!BJ|ITzFj zy!UsD7;!?9q)3w?OO8ARdg!H(eg+t1h+#$;WsGqqh~8r?Qldmv%n%t zEVIHYYpk=uCR=Q?!!CR5bHE`-9CN}cXPk3EjUf6q6k@~)Ns=N>hAcVq6zHLsKKdD8 zkRgT{VU#h(nP8G4CCXH&GQ~7A%reJ33oNq4GApdI#yT5pvc)z#?6Su`2OM(5F(;gI z#yJ<%h<*b67BQk9Fb_$RB29)YIr0?fp_e}T8DNkhh8ba$F~*r-k|HI_RH!n=G&9UH z$2OwwoN~rF7t{#4#ZQblAxToC$&e*So&r7e z(nmi73^K$pBaAY}I1@}#q(qqtRi>C`hFRvAXMshQSZ0M))>vnQO}5x(hh6sA=YT_w zIOc>?&N%0S8o^!h6C+MYk`!q&WXX}IKo7n2;Wspb0R|ajm=Q)9W1I;lDN>?Lg(_1_ zGs7%%%(K8EODwa(Dr>B>!6sX5v%@ZX>~p{&M;vp)DQBE>L5;xkH@AopCnQOVG#Rqw z$Wx$)Ui#=~fI)^BW`t437-xb>ij*i*p~@7~%rMIw^DMB)63eWx${Oozu*nwN?6Auo z`y6n{5yzZx${FWeP$Ni-pBQmMlB7tJAxn-t1$yYEkA4OiWQbu#7-fucCYYp1i82+c zOfk(2v&=Ei0*frM%nGZlvCamYY_ZJ_yX>*g0f!uM%n7HQan1!b0?)eKB1W8$Bq`El z$dV&ZfgXD4qn`l=8Df|bMj2zA2_`90qD+Ma5v%)HCth2!;TWqt# zE_>{Az#&H*bHXWSoO3~q;DPvw5ho-`iZmIrwMEYvMx#0g1~ zB29)YIr0?fp_e}T8DNkhh8ba$F~*r-k|HI_RH!n=G&9UH$2OwwoN~rF7t{zc;wMI&kR&P6WXO^uPk|nK>7$mv%n%tEVIHYYpk=uCR=Q?!!CR5bHE`-9CN}cXPk3Ejo^{^i4i9x zNs2TXvgF89pod=i=x2aIh8SjqQN|c&f=P;$C{v-z6w}Nw%N+A8u*ee2tgy-&>uj*e z7TfHw%O3k2aL5tIoN&q+=Uh-DctZTdh!c_|MVbs*a^xw{Loa>wGr%B23^T$gV~jJw zBt=S;sZeE#X=a#Zj(HYXWQk=~SY?fMHrQl~ZFbmYk9`g}h9q)CjWTCq|r*Bq`El@FhP%jywf==%tT-1{h?BVMZ8b zjBzHIq)3S}6{<`z%?z{5G0y^vEV0ZAtE{ok2AgcL%?`WlvCjdA9C6GEr<`%l1vP@F z#7~SkAxToC$&e*So&r7e(nmi73^K$pBaAY}I1@}#q(qqtRi>C`hFRvAXMshQSZ0M) z)>vnQO}5x(hh6sA=YT_wIOc>?&N%0S8o|@zCq|r*Bq`El$dV&ZfgXD4qn`l=8Df|b zMj2zA2_`90qD+Ma5v%)HCth2!;TWqt#E_>{Az#&H*bHXWSoO3~q z;2H4~BTh(?6lpSK$&sf(554r!&j5oAG0X^~j4{pxlN2dYrb3k|rkP=uIp$elktLQ{ zVU;!3**g0f!uM%n7HQan1!bg6G6fj5r}lQl!a{B}bkDJ@nE?KLZRh z#4sa_GR8O)Oj4vonF>{=m}Z7q=9p)JMV44*g;myAXM;_)*k*@a_SoluLykD+gj3Eq z=Ykr+^WrB)oRB0b(qzbzBTs=Idg-H|0R|ajm=Q)9W1I;lDN>?Lg(_1_Gs7%%%(K8E zODwa(Dr>B>!6sX5v%@ZX>~p{&M;vp)DQBE>L5(0UeqzK4Ns=N>hAcVq6zHLsKKdD8 zkRgT{VU#h(nP8G4CCXH&GQ~7A%reJ33oNq4GApdI#yT5pvc)z#?6Su`2OM(5F(;gI z#yJ<%2wo6BG2( z7FlAM6;@eeoeehGVw)Xy*<+sr4mskO6HYnfoC|6MFN&WSaYB-$NRuH;jywf==%tT- z1{h?BVMZ8bjBzHIq)3S}6{<`z%?z{5G0y^vEV0ZAtE{ok2AgcL%?`WlvCjdA9C6GE zr<`%l1vP@#h@Tj7LXxCNlOaovJOz5_rH_6F7-WcHMi^y`aVD6gNQp8Ps!TD>471EJ z&jO1qvCImqtg+4pn{2Vo4!i8J&jE)Vam)#)oN>+tHG+cpi4i9xNs2TXvgF89pod=i z=x2aIh8SjqQN|c&f=P;$C{v-z6w}Nw%N+A8u*ee2tgy-&>uj*e7TfHw%O3k2aL5tI zoN&q+=Uh-Dc&+$}5ho-`iZmIrh9q)Ck@neqzK4Ns=N>hAcVq6zHLsKKdD8kRgT{VU#h(nP8G4CCXH& zGQ~7A%reJ33oNq4GApdI#yT5pvc)z#?6Su`2OM(5F(;gI#yJ<%2;L}uV#Enak|Irp zEIINN=%JTB`Wax5A%+=YlrhGcV3Hyw%2cQ_#WXX_GRHg%EV9HhE3C4{IvZ@V#Wp+a zvd2CL9CE}lC!BJ|ITzFj-Xwlv#0g1~B29)YIr0?fp_e}T8DNkhh8ba$F~*r-k|HI_ zRH!n=G&9UH$2OwwoN~rF7t{!P#ZQblAxToC z$&e*So&r7e(nmi73^K$pBaAY}I1@}#q(qqtRi>C`hFRvAXMshQSZ0M))>vnQO}5x( zhh6sA=YT_wIOc>?&N%0S8o`^zPmDMrNm8WAkR?Z+0zLH7M?V7$GQ=<=j55YJ6HHR1 zM41XzrkG}iS>~8$fkl>BW`$MOSZ9Mxw%BHeUG~`LfJ2Tr=7dwuIOl>I!54_17;!?9 zq)3w?OO8ARdg!H(eg+t1h+#$;WsGqqn50OFG8L*!G0hCK%rVabi!8Cs3ahNK&IX%o zvCR&`@e?CX zNRkw3GGxh-r$7(A^wG}%gA6gu2&0TK&IFSbDN&|El_{o~VU{`OSzwVRmRVtyHP+c+ zlP$K{VV6DjIpB~Zjyd6!GtRl7M(|eg6C+MYk`!q&WXX}IKo7n2(a!*b3^B|Iql_`m z1d|jgQKmwbDW;iWmO18GV38%3Sz(nm*4bc_Ew_JoRB0b(qzbzBTs=Idg-H|0R|ajm=Q)9 zW1I;lDN>?Lg(_1_Gs7%%%(K8EODwa(Dr>B>!6sX5v%@ZX>~p{&M;vp)DQBE>L5-ka z{KSY8k|af%3|VsIDbPbNee^THAVUl@!YE^mGr=T9N|dQkWr}HLm}QQ67FcA7WmZ^a zjdeEIWQ%Qf*kzA>4mjk9V@^2bjB_ri5&Sjr6C+MYk`!q&WXX}IKo7n2(a!*b3^B|I zql_`m1d|jgQKmwbDW;iWmO18GV38%3Sz(nm*4bc_EwwUBJmR=PDqjzX)8oC6-xXl{MDcV3RGj*8o zC6-xXl{MDcV3RGj*a5v%)HCth2!;TWqt#E_>{Az#&H*bHXWSoO3~q;GN%7C$lKgd|CkCPS7S zc?$Ha5v%)HCth2!;TWqt#E_>{Az#&H*bHXWSoO3~q;7i0$j5r}lQl!a{ zB}bkDJ@nE?KLZRh#4sa_GR8O)Oj4vonF>{=m}Z7q=9p)JMV44*g;myAXM;_)*k*@a z_SoluLykD+gj3Eq=Ykr+mx`YlaYB-$NRuH;jywf==%tT-1{h?BVMZ8bjBzHIq)3S} z6{<`z%?z{5G0y^vEV0ZAtE{ok2AgcL%?`WlvCjdA9C6GEr<`%l1vP>%6F)KHgd|Ck zCPS7Sc?$Ha5v%)HCth2!;TWqt#E_>{Az#&H*bHXWSoO3~q;LF8Nj5r}l zQl!a{B}bkDJ@nE?KLZRh#4sa_GR8O)Oj4vonF>{=m}Z7q=9p)JMV44*g;myAXM;_) z*k*@a_SoluLykD+gj3Eq=Ykr+SBRe&aYB-$NRuH;jywf==%tT-1{h?BVMZ8bjBzHI zq)3S}6{<`z%?z{5G0y^vEV0ZAtE{ok2AgcL%?`WlvCjdA9C6GEr<`%l1vP?qiJus8 zLXxCNlOaovJOz5_rH_6F7-WcHMi^y`aVD6gNQp8Ps!TD>471EJ&jO1qvCImqtg+4p zn{2Vo4!i8J&jE)Vam)#)oN>+tHG&cG6C+MYk`!q&WXX}IKo7n2(a!*b3^B|Iql_`m z1d|jgQKmwbDW;iWmO18GV38%3Sz(nm*4bc_Ewa5v%)HCth2!;TWqt#E_>{Az#&H*bHXWSoO3~q z;BSea7;!?9q)3w?OO8ARdg!H(eg+t1h+#$;WsGqqn50OFG8L*!G0hCK%rVabi!8Cs z3ahNK&IX%ovCR&7~@PZNs$s|DpZ+bni*!9W1a;TSz?(LR{wv7?pO-}005{eBLf2i0|NsC0|NsC z0|NsC0|NsC1Ls6Vg+_&iN<~FQg^5NCmM|p8-QgjF~WH#+(I9R;<~u zWyhWaM^2o%aOK9G2TxwS`S9gO;P2N@kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ z7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RXB^b;gRm@#e#qAA!1lf`kYYAxexm36i8plOaov zJOzrBC{v+IjXDjQv}n_zOOHMShKv|9Vakj-3zn={vti4QJqM1QICJ63jXMvXym<5B z%a6c6q@N%m!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE##!Q$pW6pvl zE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@DJ-JNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-S zsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RIb`Uw&u zOoS*g;v`6tB29)YIr0=JQldBzZ*|F!qkrQVwT)A=Q!IKwnK79ER_yhV05+Y25C^6zB zNRlE=hAcVq6ev=nOob{n>NIHLK_6(-p-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg z%8fe@p1gST;meP}AJmVjb|6HU2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R z=EIjCfu??fga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%FftBw=+dLlfFUEsOqeob z&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0kLf2!h%gbN#E6q1Ns2TXvgF89ph$@_ z6{>jD2kJCv(xOd=F21vYJ_Ck~7&BqYj5!OItXQ*Q%Z@zn zz(1~^AR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~ zY}m46&w(Q+&Rn>1{0Ox56C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBnz#q|1kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7HwR; z16_Lb88BqTmC6lpSK$&sf( zkrHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER z_-FJJBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W z4O@2XIdJ5}nG08L+9DN&|El^S&# zG-=VMLzfnz(1#-AR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCS zAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1nBKvFcG4}h?5{miZmIr zNIH5qD_Y`J^Bn7GGfexDKq9Q zSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLS1d1PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb z8g&{pY0;)bmmYlv3>h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(DQ9nUK zgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWa zM^2o%aOK9G2TxwS`S9gO;9t^DkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o z>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RY+^%EpSm{0I#66C^~K2vK6h zNsuH(nhaTT^X4c#F-0M zZrpkBnz`w4aAR)p;h!P`Cf+Q)@WXO^u zPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1L*BuFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$% z;?0LIKLR8D1PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb8g&{pY0;)bmmYlv3>h(I!ju_v z7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(DQ$ImMgozL(Mw|pmQl!a{B}bkDMM{*Z zP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;NQ|u zkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k z=fIH@XD(d1ap%F47jHg%`4RY2`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@WBmjP5hg;E7;zFL zNs%T)mK=Es6e&@rLX{eI8Z>FqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$ z9z1#R=EIjCfqz>+K|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAMCuLq?35 zFlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK$&sf( zkrHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER z_;>XaBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W z4O@2XIdJ5}nG08L+?9BH|{)m^5V^hFFyi*T0cQTgozL( zMw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o% zaOK9G2TxwS`S9gO;LqqMNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S z$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RJ6{R9aSCPI`LaS|j+ktRcy z9C->9DN&|El^S&#G-=VMLzfnz@O7kkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvu zQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RZ{^b;gR zm@#e#qAAy;Ef`kYYAxexm36i8p zlOaovJOzrBC{v+IjXDjQv}n_zOOHMShKv|9Vakj-3zn={vti4QJqM1QICJ63jXMvX zym<5B%a6c+pr0Ti!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE##!Q$p zW6pvlE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@aOdtBt)19QDVeNkR(N#3|VsIDNv+D znF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzfnz+cc$kPu-aM2Qh6 zL6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1 zap%F47jHg%`4RYw`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E z%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@e@Q<wCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6u zM_{3!AR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~ zY}m46&w(Q+&Rn>1NIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~ z%!MmA?mT$%;?0LIKLY=Weu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG z1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}Qa?dLgozL(Mw|pmQl!a{ zB}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS z`S9gO;6K$*kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf z!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RZb`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@e?>n* zLWGGBB}SYCNm8WAkR?Z+0!2!csZgaxod!)>wCT{LN1p*hMvR#-WyYKZOIEDeuw}=d z14mArxp3viod-`|y!r6uM_{F&AR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG z(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1NIH5qD_Y`J^Bn7GGfex zDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLY=Seu9Ju6Cp~BI0=%ZNRuH;jywg5 zlqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP} zT0cQTgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~u zWyhWaM^2o%aOK9G2TxwS`S9gO;J?&QkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ z7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RZ9^b;gRm@#e#qAAya2f`kYYAxexm36i8plOaov zJOzrBC{v+IjXDjQv}n_zOOHMShKv|9Vakj-3zn={vti4QJqM1QICJ63jXMvXym<5B z%a6c+qn{ul!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE##!Q$pW6pvl zE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@ZahuNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-S zsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RJa`Uw&u zOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tn za^lQ|D>v>uc=F=Shc7<@Tm1wH5hg;E7;zFLNs%T)mK=Es6e&@rLX{eI8Z>FqrbCw= zeFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCf&X4VK|+Ly5G6*O1W8h) z$&e*So&rTml&MgqMx6#tTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UG zUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER_#gEXBt)19QDVeNkR(N#3|VsIDNv+D znF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+?9BH|{)m^5V^hFFykRlYWAP2ooVnj5rCBq)3w?OO8ARij*i*p-PQ94VtuQ z)1ga`J_Ck~7&BqYj5!OItXQ*Q%Z@zn!2hhDAR)p;h!P`C zf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1 zh(I!ju_v7A#q@ zX2X^pdk!2qapuC68+RT&dGY4Mmmh)uO+P_GgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl z22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;D6UokPu-a zM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@ zXD(d1ap%F47jHg%`4KqiCrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfey7cHX zV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWfOMRs94B5hg;E7;zFLNs%T) zmK=Es6e&@rLX{eI8Z>FqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R z=EIjCf&W84K|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAMCuLq?35FlEM^ z1xr?}*|25Do&!ftoVjr2#+?UGUcCA6{0N-%6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBn!2hkEAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+ zE!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4M zmmh(@sh=Pr!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE##!Q$pW6pvl zE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@VE36Bt)19QDVeNkR(N#3|VsIDNv+DnF>{E z)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+?9BH|{)m^5V^hFFyi*TR%ZUgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM| zp8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;Q!N4kPu-aM2Qh6L6Q_{ zGGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F4 z7jHg%`4RX#`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3 z<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@SN#MD5hg;E7;zFLNs%T)mK=Es6e&@r zLX{eI8Z>FqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCf&X7W zK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAMCuLq?35FlEM^1xr?}*|25D zo&!ftoVjr2#+?UGUcCA6L*BuFcG4}h?5{miZmIrAA}G>=q7{^LdY$I5JCuX8X6iJ8X6iJ z8X6iJ8X6iJ8X6iJ8X6iJ8X6iJ8X6ipM+hN=5W3y@@faR|!1J8zoa?&YKVB==Y}m46 z&w(Q+&Rn>1nBKvFcG4}h?5{miZmIrh(I z!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh)uR6jvNgozL(Mw|pmQl!a{B}bkD zMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO z;6Kw(kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkg zHf-6k=fIH@XD(d1ap%F47jHg%`4PD5CrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;- zNsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWfOM=lTf}B20uR zG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+KwyPYE?l{B=fRT~Z$5na5%{n46C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz z96533!j&6$9z1#R=EIjCf&WH7K|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lV zrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6f^Y2@)bqgeWoMBuJ7XO@=Hv@)Rgi zqD+M?9BH|{)m^5V^hFFykR zy?%m(2ooVnj5rCBq)3w?OO8ARij*i*p-PQ94VtuQ)1ga`J_Ck~7&BqYj5!OItXQ*Q z%Z@znz)L?tLWGGBB}SYCNm8WAkR?Z+0!2!csZgaxod!)> zwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8o?ZPmmB{B1DN1 zCqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5 zxpC*glNWD3eEAXhAN3O?M3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4M zmmh(*eu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDo zShHcvjy(sCoH%pg%8fe@p1gST;meP}|E!-NA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y; zPJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk;fICrF4e z5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~> zi8B|j+_>}L$%{81zWfOMulflRB20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$ z`V1H{V$6goGv+K z@#e#qAA$c(KS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wO zoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~f7eft5Md%ji4iA3k`!q&WXX}IK#>w< zDpaXar$LhzZ8~)6(PzMr5o0DynK5UyPYE?l{B=fRT~Z$5na5%@p! z6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkB`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|3Cc%2@xhjlo)Xm zBuSAbLzWzQ3KS_(rb3k(bs98j(WXO}9(@K388K$Ulo@jtELpK;!@#e#qAA$coCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~|F54QA;Lt65+hE6Bq`El$dV&Z zfg&Z!RH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA- zBkCtDvkP%}hOqnrf!IBkg zHf-6k=fIH@XD(d1ap%F47jHg%`4RZP^b;gRm@#e#qAA$czKS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0D!@D~Dq2ofSpgeWoMBuJ7X zO@=Hv@)RgiqD+M?9BH|{)m z^5V^hFFyi*K|eu4gozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH z#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;4jiokPu-aM2Qh6L6Q_{GGxh-r$CVs zWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RYw z^%EpSmNIH5 zqD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLUS=eu9Ju6Cp~B zI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg z%8fe@p1gST;meP}U#g!VA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdL zBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk-5$CrF4e5u(J1lORcoG#Rqw z$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81 zzWngw3;ZESh%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XOj*x2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M< zHR?2I(xOd=E?9BH|{)m^5V^hFFyi*g?@sB z2ooVnj5rCBq)3w?OO8ARij*i*p-PQ94VtuQ)1ga`J_Ck~7&BqYj5!OItXQ*Q%Z@z< zj+{7i;mVCW51zbu^Wn>nz+b7KAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG z(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G z2TxwS`S9gO;IGn8kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}h zOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RZ5^%EpSm@#e#qAAWcPe+UvHOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@f31Fkga{KM zN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRL zbK%O3I}e_`c=O@QkHBB2pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLl zfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0*Xt)ph%gbN#E6q1Ns2TX zvgF89ph$@_6{^&z)1XOsZpmvlNN0{bm`G&z>pDRCQO+z zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXh8}t(-M3@LsV#G<1Bt@DGS#snlP^3he z3RP;h(I!ju_v7A#q@X2X^p zdk!2qapuC68+RT&dGY4Mmmh(@Nk2hCgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD z>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9h3h3>!~f`kYYAxexm z36i8plOaovJOzrBC{v+IjXDjQv}n_zOOHMShKv|9Vakj-3zn={vti4QJqM1QICJ63 zjXMvXym<5B%a6d{te+qu!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE# z#!Q$pW6pvlE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@VDqENQf{IqQr=kAW4ce8M5Ta zQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#> z{0RK5`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sU zV$FsvJN6tna^lQ|D>v>uc=F=Shc7>Das~bnBt)19QDVeNkR(N#3|VsIDNv+DnF>{E z)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+Y$E%!Da3<}6sUV$FsvJN6tn za^lQ|D>v>uc=F=Shc7<@f17@Sga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#uf zk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHFuqpCBQ^M2He2PJ$#U z(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc} zCokT7`0~RBci;~}LWGGBB}SYCNm8WAkR?Z+0!2!csZgaxod!)>wCT{LN1p*hMvR#- zWyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8ssZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXh zJM|MJM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmdzd1pW{tM3@Ls zV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(@M?XPAgozL(Mw|pmQl!a{ zB}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS z`S9gO;P2H>kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf z!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`Qcz&;15AUgozL(Mw|pmQl!a{B}bkDMM{*Z zP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;P2B< zkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k z=fIH@XD(d1ap%F47jHg%`4Ra0^%EpSm@#e#q9}cw!{tzTYm@#e#q zAAx^JKS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl( ztl6+-$DRX6PMo=L<;I-{PhPzF@a0F~AJ$Kh5Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na;Xr%f4?#kN zi4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6 zPMo=L<;I-{PhPzF@a0F~AJI>c5Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5%@>-6C^~K2vK6hNsuH( znhaTT^X4c#F-0MZrpkB zFqrbCw=eFh8}F=oP) z8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCF0%yw5F|vH2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+Qor zmK}Qz96533!j&6$9z1#R=EIjCfqz0jK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#t zTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVw zT)A=Q!IKwnK79G%B3s}OK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAMCu zLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK z$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwn zK79ER`2XrBNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bL zV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RKh`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7=|Vh#Ku zNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA& zbKuB{GZ(Jhxbxu2i#H#>{0RIr`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|Ezw3ga{KMN{l!O zlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3 zI}e_`c=O@QkH9~tpCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEs zOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0~RA_P`&4ga{KMN{l!OlB7tJAxn-t z1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@Q zkH9~#pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT? z)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0FX$&oh%gbN#E6q1Ns2TXvgF89ph$@_6{^&z z)1XOgrs2@)bq zgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFy>g2>c;Ph%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XOeU>2@)bqgeWoMBuJ7X zO@=Hv@)RgiqD+M?9BH|{)m z^5V^hFFykRvVMYu2ooVnj5rCBq)3w?OO8ARij*i*p-PQ94VtuQ)1ga`J_Ck~7&BqY zj5!OItXQ*Q%Z@znz`vrOAR)p;h!P`Cf+Q)@WXO^uPk|yO z%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1nz`v@WAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+ zE!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1NIH5qD_Y`J^Bn7 zGGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKMbu3{2@q)FcG4}h?5{miZmIr zNIH5qD_Y`J^Bn7GGfexDKq9Q zSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLY=zeu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7 zN{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}zonlb zA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2K zfg>l*T)1-M&Vwf}-hBA-!@#=0AA*Dk6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%s zp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}zpbAjA;Lt65+hE6 zBq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M z&Vwf}-hBA-Bk=F&CrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu z6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWfOMyZQ+dB20uRG2$dhk|IrpEIINN zC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+Ki8B|j+_>}L$%{81zWfOMd-@3yB20uRG2$dhk|IrpEIINNC{m(Kg(@}b zG-%SIO@}T$`V1H{V$6goGv+KbjG0Lh(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmfx|1Ah=C zM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(@K|eu4gozL(Mw|pm zQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G z2TxwS`S9gO;BVAVkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}h zOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`C*_w@CQLcgozL(Mw|pmQl!a{B}bkD zMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO z;BV4TkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkg zHf-6k=fIH@XD(d1ap%F47jHg%`4RY=^%EpSm@#e#qAI>QPe-I=@m z@#e#qAA!G3KS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wO zoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~Z`V(d5Md%ji4iA3k`!q&WXX}IK#>w< zDpaXar$LhzZ8~)6(PzMr5o0DynK5UyPYE?l{B=fRT~Z$5na;g}}y z2SGxFi4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+- z$DRX6PMo=L<;I-{PhPzF@a0F~@6b<>5Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5%@dx6C^~K2vK6h zNsuH(nhaTT^X4c#F-0M zZrpkB?9BH|{)m^5V^h zFFyi*Qa?dLgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9 zR;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;7{o%NQf{IqQr=kAW4ce8M5TaQ=mwRG8L-S zsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RJA`Uw&u zOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tn za^lQ|D>v>uc=F=Shc7=I(gpq?NQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p) z^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RKr`Uw&uOoS*g;v`6t zB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>u zc=F=Shc7<@e~*5Gga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv z%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHFunpCBQ^M2He2PJ$#U(qzbzBTs=M zCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0~RU zW#A8jga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_ zVatv^2acRLbK%O3I}e_`c=O@QkHFujpCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0T zCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0_vb*32@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFzd72L2#Oh%gbN#E6q1Ns2TX zvgF89ph$@_6{^&z)1XOgTk2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFykRkbZ)M2ooVnj5rCBq)3w?OO8ARij*i* zp-PQ94VtuQ)1ga`J_Ck~7&BqYj5!OItXQ*Q%Z@znz(1^? zAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46 z&w(Q+&Rn>1nz(1m&AR)p;h!P`C zf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1 zL*BuFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LI zKOE2p{vb$*FcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLY=Reu9Ju z6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sC zoH%pg%8fe@p1gST;meP}pVm*15Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5g6zvNQf{IqQr=kAW4ce z8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2 zi#H#>{0RJ$`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3 z<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|CD}$ga{KMN{l!OlB7tJAxn-t1&Wj? zQ=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHDYN zPmmB{B1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1z zvFE^%6K5`5xpC*glNWD3eEAU=>L*BuFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA z?mT$%;?0LIKLY=Zeu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$k zGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}pVd#05Md%ji4iA3k`!q&WXX}I zK#>wyPYE?l{B=fRT~Z$5na z5g6$wNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO# z8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RKB`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|D1k;ga{KM zN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRL zbK%O3I}e_`c=O@QkH9~#pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLl zfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^t#)=!WSVIo9{5hp>C6lpSK z$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwn zK79ER_!smOBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLr zuw=!W4O@2XIdJ5}nG08L+9DN&|E zl^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d z14mArxp3viod-`|y!r6uM_{6#AR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG z(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>13H2@xhjlo)XmBuSAbLzWzQ3KS_(rb3k(bs98j(WXO}9(@K388K$U zlo@jtELpK;!@#e#qAAvuwpCBQ^M2He2PJ$#U(qzbzBTs=M zCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^t# z)lZNRVIo9{5hp>C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ z*|F!qkrQVwT)A=Q!IKwnK79ER_*e83Bt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9 zMVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+b+H~mBqtAdL zBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-BQVoXkPu-aM2Qh6L6Q_{GGxh- zr$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg% z`4RZn^b;gRm@#e#qAAx^EKS4r- zi4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6 zPMo=L<;I-{PhPzF@a0EfuAd+w!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef z&wwE##!Q$pW6pvlE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@NeoTNQf{IqQr=kAW4ce z8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2 zi#H#>{0RJ8`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3 z<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|F(XDga{KMN{l!OlB7tJAxn-t1&Wj? zQ=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHA7d zK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAMCuLq?35FlEM^1xr?}*|25D zo&!ftoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73 zI&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER_;>XaBt)19QDVeN zkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L z+9DN&|El^S&#G-=VMLzfn zz`w7bAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~ zY}m46&w(Q+&Rn>1NIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~ z%!MmA?mT$%;?0LIKLRWL1PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb8g&{pY0;)bmmYlv z3>h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh)uNIyYBgozL(Mw|pmQl!a{ zB}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS z`S9gO;6K(+kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf z!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RX}^b;gRm{0MCH6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+Qor zmK}Qz96533!j&6$9z1#R=EIjCf&WrJK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#t zTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVw zT)A=Q!IKwnK79ER*y<-ph%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XOjRj2@)bqgeWoMBuJ7XO@=Hv z@)RgiqD+M?9BH|{)m^5V^h zFFykRjedfJ2ooVnj5rCBq)3w?OO8ARij*i*p-PQ94VtuQ)1ga`J_Ck~7&BqYj5!OI ztXQ*Q%Z@znz<;ZsAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQ zqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^% z6K5`5xpC*glNWD3eEAXh@AMNSM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT& zdGY4Mmmh)uK|eu4gozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH z#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gOV6UGbA;Lt65+hE6Bq`El$dV&Zfg&Z! zRH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk(`! zCrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@JH5<0< z*mK~>i8B|j+_>}L$%{81zWfOMPx=WGB20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SI zO@}T$`V1H{V$6goGv+KoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~f6-5n5Md%ji4iA3k`!q&WXX}I zK#>wyPYE?l{B=fRT~Z$5na z5%^#A6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCfunwcga{KM zN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRL zbK%O3I}e_`c=O@QkHG(~pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLl zfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0f9NMjh%gbN#E6q1Ns2TX zvgF89ph$@_6{^&z)1XOhS=2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFyh&{R9aSCPI`LaS|j+ktRcy9C->9DN&|E zl^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d z14mArxp3viod-`|y!r6uN8m5&CrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfe zy7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWfOM-}(s>B20uRG2$dh zk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+K@#e#qAA!H5pCBQ^M2He2PJ$#U(qzbzBTs=M zCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0 zm-Q1QM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(Peu9Ju6Cp~B zI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg z%8fe@p1gST;meP}|Er%MA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdL zBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk))B6C^~K2vK6hNsuH(nhaTT z^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLma zS+QormK}Qz96533!j&6$9z1#R=EIjCfvbLkga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+Y zIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHBBmPmmB{ zB1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^% z6K5`5xpC*glNWD3eEAXhYx)TiB20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$ z`V1H{V$6goGv@sN+}v@jYWcnxbl#hD?XJZZm1$|EmReL=>65njN)=n?Ue3Er%bm-c z;lA<=G0eT3xr~o{24|R8MyV1*;x-`>ldailb__{LB+4JekaU}1Ld-THW@~nISGP(n zwcCmnE4CPS4X@7+`^>%PJ!@iO|C5{#Ykk*Rzu)?Oe{22Lfd!i}6Q<0VbIpP!H>|kj zj(Z+hv*D2~JN6uS;z;1Xl|N?$2@xhjlo)XmBuSAbLzWzQ3KS_(rb3k(bs98j(WXO} z9(~RkFyw+ut{5?9!ju_vu350;h84HmanA#5HaxOr$DRXE90{!D&ly2NgozL(Mw|pm zQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|pK}Hbx!{s3MvR#-WyYLq7A(18#VvQ-^T3)7 zk8Iho=fD$30)IjNoDn2MmNIH5qD_Y`J^Gw8V8{iRTrpzIgef!TT(e-w4J&TB0v z^5={oA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqt7`5hFoyT6(hz>m@;F| zH4B#9u;P|G?s;I%hDWyS*mK~CBZ2>3{+tmcM3@LsV#G<1Bt@DGS#snlP^3he3RP;< zY0#uan+{!i^f_n1kP9xkV#JsUQ)bM$X2FshR@`#OJrAte@W_@Odk#EtB=DEz&ly2N zgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|pK}Hbx!{s3MvR#-WyYLq7A(18 z#VvQ-^T3)7k8Iho=fD$30*~_Nj36PxM2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@ z=+dLlIRl1VaLE-T#!Q$pW6m`TmfW!7mOJiwV9ka{w(Qt*;E5xF|3Uto5hO&I2vK6h zNsuH(nhaTTqRn ztl99$mK}QzJaHuOSLDwbK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAME0 z1`N62k}F1xnJ{I>oNE>=xnadEcii*9nhlR^*|F!q6GsC7qx?A|NQf{IqQr=kAW4ce z8M5TaQ=mwRG8L-SsMDZHi#8p)^yqWWfFT!La>a--6Q<0VbIpP!H>|kjj(Z+hv*D2~ zJN6uS;z(dCf6fRJB20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`kXUh$OV^N zF=EVwDKq9=vtY>$D{i^to(I-!cx20tJqMmR68N9w&ly2NgozL(Mw|pmQl!a{B}bkD zMM{*ZP^Ctl22EPD>CmM|pK}Hbx!{s3MvR#-WyYLq7A(18#VvQ-^T3)7k8Iho=fD$3 z0)JKhoDn2Mm{E)M?P9 zMVk&?dh|JGz>o_rxnjha2~%dwxn{wV8&=$M$2||M+3?7g9eWNuaU}59wCT{LN1t;B47uQvD@Kf&FlEM^YZffIVZ|+X z-1ESi4UcTuvFE@OM*{z={5c~?h%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XOqRntl99$mK}Qz zJaHuOH{{P5K|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAME01`N62k}F1x znJ{I>oNE>=xnadEcii*9nhlR^*|F!q6Gs9E`Ey2)5Md%ji4iA3k`!q&WXX}IK#>w< zDpaXar$LhzZ8~)6(dV22LoT@FiV+pr?%jVno>=d`(aUb(n z>wov#B7v7*z2jc$uhvhCp3D48?|6^O9ZU6V2;(z^Z z{F_hlzxg))EvNX;yc5u?&yUb4{Y zo2Qrm{yX0HziGpB8~@xp?iKu+HvWh2xR>y2+V~&6<6gs?_<5fzb^e84v(NwZZJXXb z?ejl>+veYTivOFp@oziDfAMYn+{VB1Hva9W^?&tkd}{a0zy7xVf8Z4VA8+I6DgIk; zk4x+nf8&Mw7;oAeKgGZCg?l}3;>0Qb%`e;sc@rm3@w+d6a-37A__x1})2H}%zHm?C z&Gwm7{Ci%w7xO00p5ov8!o8X|aqblVffw#&y@~Uu_z$0YIZ!`66?pmH+xm;*ci(^U zd`y3QuAR1f`JET;kG-kmRQl!5zb*589#!7P&*xF?Mc_A{3VJ*rqaVHqoVGhXp8NQ- z7w(7s%C9?D-)+CGVk5|4NP-M4KzEq{0RcAuyI zdUyWfC*$Y2&HurhI!@=&j~_3WZ?`#(otOXd+xVwX@qh9*K8^pE|JmF4RNKox|Lgbp z^1pr?KOc*~^tO%9$Ko%)jh~Oj_HFz;M*rH|`1#oU?{E9<`TYM|Z{z3l|Lhw-8S~HQ z|8IF4KcD}<^=PFsB3{Pg25J~$P8E?xiZ^{YVVlg~c?QQ)iR=g(U9e_DOo`SZ-F)K7vR zG(Z00i@@`iKltoNUpJxo>X%e{>^G{#5Uw;1i*K^<1 zsyE9%`t*mde>~f^`qS6-=cjLe{Kc!E`}9@wP4sr|{U1G7{O#uVzoR?eufM4!VDa;Q zzh3?R>mM|~tn1SEUw_*6^u;TUc{6!aRq@l;zx15LX{Pw8w4OWjgI9m*O_FAQyx@b+ z>aPOgQ=3gb(#kiBEPt-TiXTs3{h%HAZtK*9^wF#4 zC(re(?YXS!r>}n)F!@pyAHV*p)&BhXIKTetH2MB#pEaMSU$tMIrax$W{P`dF*&okk zPBTCJ^3(chYGVN~%ySWIK7aM`bH$&2`TCbmtD0|X zZhrdx=O#97_NH9(wDp_W*PlKYd;Qrb-#(p|uRl8#e*I;$8ED!0t1rIz?DIhD>pD-R z-n8Itd1v^k#22sH&y(lu-!%7&=lSRMeeu;7Uw1?Mv(}s5{PK1ElT(S$KKVr1fVTb8 z$Mw$*HRoLO)hF%1=b!$t@n(78%}M^nm*4+EGtiKP!Sk_!(){Xq)Sbq{4?cVS%O5xY zwt`9S`<4*$G@k#UJ9|mOlD)6J%pBX5DU;gw9m44Cw?DMYzUw+}(e$sj# zgrBrdXZrIVTBnA7y^H5Ye)*&41{>(7cANkH=N~Kn%3=8GRQac$eERD1FMg8L=W0FW zrM^=u-%S4Csn1T~sV|=!f2!(~e_0DZfAxv$i=*;+;76an)-RuZ@*@SBpPbeNJ~NtH zzifjaHoq^8ueUy}dET!1*$+-j-(D3?k%~|0o;Lb%H@psf@#(+t>U0S*bPe{_XI})q zeBJ)|hd_2c)Srf;6U_2aoWtI|LFr{9)2mH+uK zUw!`7`>)%tKL6z7AG`_#-mBL?)SH11Upcv4V2j@>e0bWf`0|7D`!D79!7pl}?LPR$ zQ@Vkld;f#?itqn3&+Y&4W%1>EAH6)~^xU|Q3g7*({H?-!rwYEF1d8AN;M+f*|46@l z^B2p{WuLcw{{xw6-v{NF-?p#Qwx>nK_dfjg%dgixZ};I#y>{x0=gISSKc4^QcfYF< z9|V5xy`q-r#}B{vT>twY{9K^$-l^vTfe&8($-sNx{3!6P_ez0NXMdeq;Jf*J;5+Ys z5ctk}747{n@VqbEpW1OM_tDpRzW>3u0(qTadTK`CW#!FO9|gYk-O}kW1>SS)-}~sJ zmmk`rr}5H{pyoXUn^@gzxw>O(ejmD{`z%a$FE=gslTn3SnOwh z=4VdpW2d#heh0bsn8JHT+vV%D zJP_!8mp}IPyix&YU$0{N$4&L+@>hTLSO4O39dEV?1pf5tg{a5+H~c2Am492{r=Q>b zy;=5apHHv5N5;d)4#47X{B+>2pI!iZFY#ae=I8el_2qx{EA<7ZWxrPb)h~amWY2%| zgEve6|2CD?PaZn=S5Lv|y_iS+r+)uW`+n7%_or_b{eOC{pI+;pUf-rUy^h_TcI5Fd zn;-v|zfwQFcZi-|=Q@_zQ~c+C%5i-2NQ&Rd{Ob`>0pIWWJ8%E-RIx|zkNO&hdQbbyYVRo?d>yB?;}mzlj!*BYPVH-c z9sk<)4ZTOJTK-dC%ENsRoBf?U>ZkWcVIrK~$Ha(pde8BH@B7oS&5@_T>7rJ`DIPct zv??`DjcU-OMVk&?dh|K<^MD~2Tyn*TF%zcDm~+j7B{!_N<&JwEShL}gEj#ucc;d+E zJbA$xK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAME01`N62k}F1xnJ{I> zoNE>=xnadEcii*9nhlR^*|F!q6Gu*i;{|5~2@xhjlo)XmBuSAbgP|12k*7eB5@jk> zsc|~V8#HOrrbCw=ea;y$ zoNE>=xnadEcii*9nhlR^*|F!q6Gs9s{Ns!uA;Lt65+hE6Bq`El$dV&Zfg&Z!xD^(t zQln0TCN0`@=+dLlIRl1VaLE-T#!Q$pW6m`TmfW!7mOJiwV9ka{w(Qt*;E5xFZ^$3F za{@s^gozL(Mw|pmQn)n}$dDyRo&rTml&MgqMx6#tTD0lVrAME01`N62k}F1xnJ{I> zoNE>=xnadEcii*9nhlR^*|F!q6GsC6b9uoTK|+Ly5G6*O1W8h)$&e*So&rTml&Mgq zMx6#tTD0lVrAME01`N62k}F1xnJ{I>oNE>=xnadEcii*9nhlR^*|F!q6GsBSLH?W( zBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh|JGz>o_rxnjha2~%dwxn{wV z8&=$M$2||M+3?7g9eWNuapZJE`UPhM2@xhjlo)XmBuSAbLzWzQ3KS_(rb3k(bs98j z(WXO}9(~RkFyw+ut{5?9!ju_vu350;h84HmanA#5HaxOr$DRXE968;ff590+LWGGB zB}SYCNm8WAkR?Z+0!2!csZgaxod!)>wCT{LN1t;B47uQvD@Kf&FlEM^YZffIVZ|+X z-1ESi4UcTuvFE@OM@}Ciyx@!=A;Lt65+hE6Bq`El$dV&Zfg&Z!RH#zp^Z`eMCN0`@ z=+dLlIRl1VaLE-T#!Q$pW6m`TmfW!7mOJiwV9ka{w(Qt*;E5xF-z0y|2ofSpgeWoM zBuJ7XO@=Hv@)RgiqD+Mb+H~mBqt7`5hFoyT6(hz>m@;F|H4B#9u;P|G?s;I%hDWyS z*mK~CBLN>0zTk`?A;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqt7`5hFoyT z6(hz>m@;F|H4B#9u;P|G?s;I%hDWyS*mK~CBLN@azu=4@A;Lt65+hE6Bq`El$dV&Z zfg&Z!RH#y;PJ<>b+H~mBqt7`5hFoyT6(hz>m@;F|H4B#9u;P|G?s;I%hDWyS*mK~C zBc~6AUvNf{5Md%ji4iA3k`!q&WXX}IK#>w!y{XE>^bnnk-*<8f6fRJB20uRG2$dhk|IrpEIINNC{m(K zg(@}bG-%SIO@}T$`kXUh$OV^NF=EVwDKq9=vtY>$D{i^to(I-!cx20tJqMmR68QV% z&ly2NgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|pK}Hbx!{s3MvR#-WyYLq z7A(18#VvQ-^T3)7k8Iho=fD$30)M~!IU`7jFcG4}h?5{miZmIr1N*x&Il4B zOoS*g;v`6tB29)YIr0=JQldwCT{LN1t;B47uQvD@Kf&FlEM^YZffIVZ|+X-1ESi4UcTuvFE@O zM*_Z_`GPZoga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Q!N7;?cSSBw}l zVakj-*DP3a!-`w(xaWa28y?xRW6yynjs*Te`Ey2)5Md%ji4iA3k`!q&WXX}IK#>w< zDpaXar$LhzZ8~)6(dV22LoT@FiV!y{XE>^bnnk-+bg zKW7995hg;E7;zFLNs%T)mK=Es6e&@rLX{eI8Z>FqrbCw=ea;y$qRntl99$mK}QzJaHuO56Pc1f`kYYAxexm36i8plOaovJOzrBC{v+IjXDjQv}n_z zOOHP13>b33C0C3XGhxb%IoB*$a>I&S?zrcHH5(q;vSZJICyoSukNi0!NQf{IqQr=k zAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yqWWfFT!La>a--6Q<0VbIpP!H>|kjj(Z+h zv*D2~JN6uS;>hXCJuf&TNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yqWW zfFT!La>a--6Q<0VbIpP!H>|kjj(Z+hv*D2~JN6uS;z-~hmOp0%2@xhjlo)XmBuSAb zLzWzQ3KS_(rb3k(bs98j(WXO}9(~RkFyw+ut{5?9!ju_vu350;h84HmanA#5HaxOr z$DRXE90~j*^5={oA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqt7`5hFoyT z6(hz>m@;F|H4B#9u;P|G?s;I%hDWyS*mK~CBY}TZ{+tmcM3@LsV#G<1Bt@DGS#snl zP^3he3RP;CmM|pK}Hbx!{s3MvR#-WyYLq7A(18#VvQ-^T3)7k8Iho=fD$30>4lG zoDn2MmoNE>=xnadEcii*9 znhlR^*|F!q6GsC7xcoUINQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yqWW zfFT!La>a--6Q<0VbIpP!H>|kjj(Z+hv*D2~JN6uS;>hWbDPC|!kPu-aM2Qh6L6Q_{ zGGxh-r$CVsWhzvuQKvzZ7Hv9o>Cxw$0Yfghw!y{XE>^bnn zk-#64KW7995hg;E7;zFLNs%T)mK=Es6e&@rLX{eI8Z>FqrbCw=ea;y$$D{i^to(I-!cx20tJqMmR68ICmM|pK}Hbx!{s3MvR#-WyYLq z7A(18#VvQ-^T3)7k8Iho=fD$30zWH%&Il4BOoS*g;v`6tB29)YIr0=JQldqRn ztl99$mK}QzJaHuOPs*P&f`kYYAxexm36i8plOaovJOzrBC{v+IjXDjQv}n_zOOHP1 z3>b33C0C3XGhxb%IoB*$a>I&S?zrcHH5(q;vSZJICyoUEDfx3okPu-aM2Qh6L6Q_{ zGGxh-r$CVsWhzvuQKvzZ7Hv9o>Cxw$0Yfgh{E)M?P9MVk&?dh|JGz>o_rxnjha2~%dwxn{wV8&=$M$2||M+3?7g9eWNu zaU}3Z<wCT{LN1t;B47uQvD@Kf& zFlEM^YZffIVZ|+X-1ESi4UcTuvFE@OM*@FL{+tmcM3@LsV#G<1Bt@DGS#snlP^3he z3RP;9DN&|El^S&#G-=VMLzfa--6Q<0VbIpP!H>|kj zj(Z+hv*D2~JN6uS;>hV&VP0@XkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o z>Cxw$0YfghFqrbCw=ea;y$6fW0RH;#?L6a73 zI&|sL=bQmUF1X~15o0DynK9>@1xs#NamyX|Jg{cNBU^UtIq<}hz|YB_GlGN&6Cp~B zI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG=L{Hf!6jFW7&BqYj5*gVSaQRPTkg2$ zfi)W**|KBLfhUdxzAb;w2ofSpgeWoMBuJ7XO@=Hv@)RgiqD+MqRntl99$ zmK}QzJaHuOzWg~ONQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yqWWfFT!L za>a--6Q<0VbIpP!H>|kjj(Z+hv*D2~JN6uS;>hXO&|YvxkPu-aM2Qh6L6Q_{GGxh- zr$CVsWhzvuQKvzZ7Hv9o>Cxw$0YfghNIH5qD_Y`J^Gw8V8{iRTrpzIgef!TT(e-w4J&TB1d z{5c~?h%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XOC6lpSK$&sf(krHJpRH;#? zL6a73I&|sL=bQmUF1X~15o0DynK9>@1xs#NamyX|Jg{cNBU^UtIq<}hz<1@(89_pX zi4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOqRn ztl99$mK}QzJaHuOq5L@`NQf{IqQr=kAW4ce8M5T?)5U=TMM|80-?u`Q8g&{pY0;)b zmmYo288GC6ORg9(X2O&ibFNviS^sBuUs??~{ph=519lG@BbIyPv7hH11h%pnU%$Re{f+aVsxaE#} z9$2&Cku5v+9C+f$>Bl->a7K_2VIo9{5hp>C6lpSK$&shP=~t3Zzi(TnLX{eI8Z>Fq zrbCw=ea;y$qRntl99$mK}QzJaHuOi}L4;AR)p;h!P`Cf+Q)@WXO`^ z|Dx!Q*$`kHa344PhlYlRhK7cQhK7cQhK7cQhK7cQhAu+L5kd$dC6lpSK$&sf( zkrHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER z_{;SZBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W z4O@2XIdJ5}nG08L+nz+a)CAR)p; zh!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+ z&Rn>1L*BuFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$% z;?0LIKLU0A1PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb8g&{pY0;)bmmYlv3>h(I!ju_v z7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(@T0cQTgozL(Mw|pmQl!a{B}bkDMM{*Z zP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;IGk7 zkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k z=fIH@XD(d1ap%F47jHg%`4RYQ^%EpSmCmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o% zaOK9G2TxwS`S9gO;IGq9kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZKOU332?jcJ z>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RXt`Uw&uOoS*g;v`6t zB29)YIr0=JQld@#e#qAA!GKKS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a4xJ$2@-`NQf{IqQr=kAW4ce8M5Ta zQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#> z{0RIF`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sU zV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@f1`eaga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+Y zIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHFugpCBQ^ zM2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyj zC(c~Ba^uc}CokT7`10eAQ?5S|Bt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?Pfk7}Sz zhb}$(3>Y$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@f3tpqga{KMN{l!O zlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3 zI}e_`c=O@QkHFuepCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEs zOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0x9TTIh%gbN#E6q1Ns2TXvgF89 zph$@_6{^&z)1XO9DN&|El^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8oSQPmmB{ zB1DN1Cqa@FX)sZpmvlNN3Mc&Y8uqtAdLBgRaaGGoqyB`el!*s^2K zfg>l*T)1-M&Vwf}-hBA-Bk*_VCrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfe zy7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWn&(jPp+f2@xhjlo)Xm zBuSAbLzWzQ3KS_(rb3k(bs98j(Wb*6zt=tb3>Y$E%!Da3<}6sUV$FsvJN6tna^lQ| zD>v>uc=F=Shc7<@f2V$ega{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2 zj2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHFuhpCBQ^M2He2PJ$#U(qzbz zBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7 z`0^w0ck3reh%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XO9DN&|E zl^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d z14mArxp3viod-`|y!r6uN8s<(PmmB{B1DN1Cqa@FX)sZpmvlNN0{ zbm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXh`}7keM3@LsV#G<1 zBt@DGS#snlP^3he3RP;;t_A;Lt65+hE6Bq`El$dV&Z zfg&Z!RH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA- zBk&LCCrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@J zH5<0<*mK~>i8B|j+_>}L$%{81zWfOMgZc>)B20uRG2$dhk|IrpEIINNC{m(Kg(@}b zG-%SIO@}T$`V1H{V$6goGv+K@#e#qAAx^JKS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~&*~>gh%gbN#E6q1Ns2TX zvgF89ph$@_6{^&z)1XOiqP2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFyhU{R9aSCPI`LaS|j+ktRcy9C->9DN&|E zl^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d z14mArxp3viod-`|y!r6uN8r!tCrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfe zy7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWfOMqxuOFB20uRG2$dh zk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+K@-2@xhjlo)XmBuSAbLzWzQ3KS_(rb3k(bs98j(WXO}9(@K388K$U zlo@jtELpK;!@#e#qAAvuwpCBQ^M2He2PJ$#U(qzbzBTs=M zCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0 zkLf2!h%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XOb>81PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb8g&{p zY0;)bmmYlv3>h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(Veu9Ju6Cp~B zI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg z%8fe@p1gST;meP}Kdzr3A;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdL zBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk)h?CrF4e5u(J1lORcoG#Rqw z$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81 zzWfOMllln~B20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+K< zvSQ7KEj#ucICA35g)2AiJb3cr&4({P0%QFI2@xhjlo)XmBuSAbLzWzQ3KS_(rb3k( zbs98j(WXO}9(@K388K$Ulo@jtELpK;!@#e#qAAx^LKS4r- zi4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6 zPMo=L<;I-{PhPzF@a0F~pVm*15Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5%_2H6C^~K2vK6hNsuH( znhaTT^X4c#F-0MZrpkB zY$E%!Da3 z<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|Ezw3ga{KMN{l!OlB7tJAxn-t1&Wj? zQ=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkH9~t zpCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0a zW6yyjC(c~Ba^uc}CokT7`0^w0&+8{hh%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XO< zHXXY3=rdr*h%pnU%$T!a$%-`_w(Qt*;K+$H7p~m6^We#gHy^(I2u$@8Bt)19QDVeN zkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L z+9DN&|El^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6u zN8n%5PmmB{B1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#c zYc_1zvFE^%6K5`5xpC*glNWD3eEAWW=_g2tFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~ z%!MmA?mT$%;?0LIKLY=Xeu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG z1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}zp9@gA;Lt65+hE6Bq`El z$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf} z-hBA-BQV!bkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf z!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RZn^b;gRm@#e#qAAx^EKS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0Efp`Rcj!bFG?BTj-O zDbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE##!Q$pW6pvlE7ok-vSZJIBPY&WxN_sp zgC{TEeE9Ms@NeoTNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$ zrp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RJ8`Uw&uOoS*g;v`6tB29)YIr0=J zQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@ z|F(XDga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_ zVatv^2acRLbK%O3I}e_`c=O@QkHAttK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#t zTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVw zT)A=Q!IKwnK79ER_;>XaBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7E zWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzfnz`w7bAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQ zqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1NIH5qD_Y` zJ^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLTt01PKu)LX;SB5+q5H zCPS7Sc?uLMQKmwb8g&{pY0;)bmmYlv3>h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT& zdGY4Mmmh)uNIyYBgozL(Mw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH z#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;6K(+kPu-aM2Qh6L6Q_{GGxh-r$CVs zWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RX} z^b;gRm z{0MCI6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCf&WrJK|+Ly z5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ft zoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sL zXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER*y$%oh%gbN#E6q1Ns2TX zvgF89ph$@_6{^&z)1XOjRj2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFykRjedfJ2ooVnj5rCBq)3w?OO8ARij*i* zp-PQ94VtuQ)1ga`J_Ck~7&BqYj5!OItXQ*Q%Z@znz<;Zs zAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46 z&w(Q+&Rn>1sZpmvlNN0{ zbm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXh@AMNSM3@LsV#G<1 zBt@DGS#snlP^3he3RP;h(I z!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh)uK|eu4gozL(Mw|pmQl!a{B}bkD zMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO z;Gmx%A;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el! z*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk(`!CrF4e5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;- zNsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWfOMPx=WGB20uR zG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+KoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF z@a0F~f6-5n5Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5%^#A6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz z96533!j&6$9z1#R=EIjCfs=lMga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#uf zk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHBBlPmmB{B1DN1Cqa@F zX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*g zlNWD3eEAXh-}MtDM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(% zeu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcv zjy(sCoH%pg%8fe@p1gST;meP}U(!#I5Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5%@p#6C^~K2vK6h zNsuH(nhaTT^X4c#F-0M zZrpkBFqrbCw=eFh8} zF=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCfs1~Ega{KMN{l!OlB7tJAxn-t z1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@Q zkHG(}pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT? z)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0|L7-3h%gbN#E6q1Ns2TXvgF89ph$@_6{^&z z)1XOieL2@)bq zgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFyiT{R9aSCPI`LaS|j+ktRcy9C->9DN&|El^S&#G-=VMLzf(2e5&o;&;yLWnzr5JKoCgb+dqA>^EfhK7cQhK7cQhK7cQ zhK7cQhK7cQhK7cQhK7cQhK3Fygb+dqd3X)4Kj3}Nb{E z)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzfwCT{L zN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8mrzPmmB{B1DN1Cqa@F zX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*g zlNWD3eEAW$>nBKvFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLY=` zeu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcv zjy(sCoH%pg%8fe@p1gST;meP}f1#fsA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b z+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk<5qkPu-aM2Qh6 zL6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1 zap%F47jHg%`4RXp^%EpSm@#e#q zAA$c`KS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl( ztl6+-$DRX6PMo=L<;I-{PhPzF@a0F~sh=Pr!bFG?BTj-ODbi%fk|R%nA|=XHs8XX& zgC;H7bm-Ef&wwE##!Q$pW6pvlE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@ZabsNQf{I zqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{ zGZ(Jhxbxu2i#H#>{0RKF`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|DAqC6lpSK$&sf(krHJp zRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER_#gBW zBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2X zIdJ5}nG08L+9DN&|El^S&#G-=VM zLzfn!2hJ5AR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02 zm@;F|f+Z`~Y}m46&w(Q+&Rn>1nBKvFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8Zx zhAlhx95`~~%!MmA?mT$%;?0LIKLQ{91PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb8g&{p zY0;)bmmYlv3>h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh)uRX;&OgozL( zMw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o% zaOK9G2TxwS`S9gO;D6IkkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDv zkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RZv^%EpSm{0RK?6C^~K2vK6hNsuH( znhaTT^X4c#F-0MZrpkB zFqrbCw=eFh8}F=oP) z8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCf&WK8K|+Ly5G6*O1W8h)$&e*So&rTm zl&MgqMx6#tTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ z*|F!qkrQVwT)A=Q!IKwnK79ER2>b9DN&|El^S&# zG-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mAr zxp3viod-`|y!r6uN8m5iPmmB{B1DN1Cqa@FX)sZpmvlNN0{bm`G& zz>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXhi}VvDM3@LsV#G<1Bt@DG zS#snlP^3he3RP;?9BH|{)m^5V^hFFyi*v3`Pt2ooVnj5rCBq)3w?OO8ARij*i* zp-PQ94VtuQ)1ga`J_Ck~7&BqYj5!OItXQ*Q%Z@znz+a-D zAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46 z&w(Q+&Rn>1L*BuFcG4}h?5{miZmIr{0RJI`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E z%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@f4P2wga{KMN{l!OlB7tJAxn-t z1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@Q zkHBA{pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT? z)@<0aW6yyjC(c~Ba^uc}CokT7`0~R?Z{QC>LWGGBB}SYCNm8WAkR?Z+0!2!csZgax zod!)>wCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8qp2PmmB{ zB1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^% z6K5`5xpC*glNWD3eEAXhtMn5jM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT& zdGY4Mmmhw31Ahn-B20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6go zGv+K{IJ*+_(PBoVIo9{ z5hp>C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVw zT)A=Q!IKwnK79ER`0Mo(Bt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7E zWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzfga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+ zmaJH_Vatv^2acRLbK%O3I}e_`c=O@Q4-4IaKLiO8CPI`LaS|j+ktRcy9C->9DN&|E zl^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d z14mArxp3viod-`|y!r6uN8oSLPmmB{B1DN1Cqa@FX)sZpmvlNN0{ zbm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXhoAnbUM3@LsV#G<1 zBt@DGS#snlP^3he3RP;i8B|j+_>}L$%{81zWfOME&2%(B20uRG2$dhk|IrpEIINN zC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+KC6lpSK$&sf(krHJpRH;#?L6a73I&|sL zXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER_&f9yBt)19QDVeNkR(N# z3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzfwWBt)19QDVeNkR(N#3|VsIDNv+D znF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzf zwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8s<#PmmB{B1DN1 zCqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5 zxpC*glNWD3eEH#ETi_2tLWGGBB}SYCNm8WAkR?Z+0!2!csZgaxod!)>wCT{LN1p*h zMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8s<(PmmB{B1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3 zeEAXh`}7keM3@LsV#G<1Bt@DGS#snlP^3he3RP;g1PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb z8g&{pY0;)bmmYlv3>h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmdzb2L2Ev zM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(DP(MLJgozL(Mw|pm zQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G z2TxwS`S9gO;2+XYkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}h zOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`Qbo&;15AUgozL(Mw|pmQl!a{B}bkD zMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO z;Qz0mAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~ zY}m46&w(Q+&Rn>1nBKvFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~ z%!MmA?mT$%;?0LIKU`)B{2@q)FcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$% z;?0LIKLY=leu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb% zISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}Kdzr3A;Lt65+hE6Bq`El$dV&Zfg&Z! zRH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-!$r2h zAA*Dk6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcv zjy(sCoH%pg%8fe@p1gST;meP}KcSx>A;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b z+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk)h^CrF4e5u(J1 zlORcoG#Rqw$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j z+_>}L$%{81zWfOMQ~C)KB20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{ zV$6goGv+Ki8B|j+_>}L$%{81 zzWfOM)A|V#B20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+K< zvSQ7KEj#ucICA35g)2AiJb3cr&4({P0{@JDf`kYYAxexm36i8plOaovJOzrBC{v+I zjXDjQv}n_zOOHMShKv|9Vakj-3zn={vti4QJqM1QICJ63jXMvXym<5B%a6c6tDhht z!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE##!Q$pW6pvlE7ok-vSZJI zBPY&WxN_spgC{TEeE9Oi1@^!nf`kYYAxexm36i8plOaovJOzrBC{v+IjXDjQv}n_z zOOHMShKv|9Vakj-3zn={vti4QJqM1QICJ63jXMvXym<5B%a6c6r=K7p!bFG?BTj-O zDbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef&wwE##!Q$pW6pvlE7ok-vSZJIBPY&WxN_sp zgC{TEeE9Ms@XzZfNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$ zrp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RID`Uw&uOoS*g;v`6tB29)YIr0=J zQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7=2 zuL%4hNQf{IqQr=kAW4ce8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO# z8@BA&bKuB{GZ(Jhxbxu2i#H#>{0RJu`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|B`-!ga{KM zN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRL zbK%O3I}e_`c=O@QkHEjIpCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLl zfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0~Txn!q1|ga{KMN{l!OlB7tJ zAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_` zc=O@QkHEj8pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob z&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0uj(gAh%gbN#E6q1Ns2TXvgF89ph$@_ z6{^&z)1XOfgM z2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFy>e3j85Rh%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XO< zHXXY3=rdr*h%pnU%$T!a$%-`_w(Qt*;K+$H7p~m6^We#gHy^(I2>k2%2@)bqgeWoM zBuJ7XO@=Hv@)RgiqD+M?9B zH|{)m^5V^hFFykRhJJ#C2ooVnj5rCBq)3w?OO8ARij*i*p-PQ94VtuQ)1ga`J_Ck~ z7&BqYj5!OItXQ*Q%Z@znz`v=VAR)p;h!P`Cf+Q)@WXO^u zPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1nz`v!RAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQ zqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1nBKv zFcG4}h?5{miZmIrNIH5qD_Y` zJ^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKMbo3{2@q)FcG4}h?5{m ziZmIrNIH5qD_Y`J^Bn7GGfex zDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLY=reu9Ju6Cp~BI0=%ZNRuH;jywg5 zlqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP} zzptMlA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdLBgRaaGGoqyB`el! z*s^2Kfg>l*T)1-M&Vwf}-hBA-!=T#0AA*Dk6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=V znzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}f1sZrA;Lt6 z5+hE6Bq`El$dV&Zfg&Z!RQ^AP?$`|h2LSVV!*6J4XlQ6?XlQ6?XlQ6?XlQ6?XlUpm zgb+dqA>`zAgwVMV7eWXjgb>%c&UJLebBzZ*|F!qkrQVwT)A=Q!IKwnK79ER`0Ml&Bt)19QDVeN zkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L z+9DN&|El^S&#G-=VMLzf{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8oSLPmmB{ zB1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^% z6K5`5xpC*glNWD3eEDIZKJW)YLWGGBB}SYCNm8WAkR?Z+0!2!csZgaxod!)>wCT{L zN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8oSPPmmB{B1DN1Cqa@F zX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*g zlNWD3eEAXhTl5noM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmkh4 z0)G%BM3@LsV#G<1Bt@DGS#snlP^3he3RP;h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh(@T|YrWgozL( zMw|pmQl!a{B}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o% zaOK9G2TxwS`S9gO;P22+kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDv zkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`Qex*@CQLcgozL(Mw|pmQl!a{ zB}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS z`S9gO;P2E=kPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf z!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RZL^b;gRm@#e#qA5N(Pe-I=@m@#e#qAA!GDKS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~@6%6^5Md%ji4iA3k`!q&WXX}I zK#>wyPYE?l{B=fRT~Z$5na z;gBxy2SGxFi4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl( ztl6+-$DRX6PMo=L<;I-{PhPzF@a0F~@7GU|5Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5%>r66C^~K z2vK6hNsuH(nhaTT^X4c z#F-0MZrpkBFqrbCw= zeFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjC&L{(a5F|vH2vK6hNsuH( znhaTT^X4c#F-0MZrpkB zFqrbCw=eFh8}F=oP) z8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCfqz&(K|+Ly5G6*O1W8h)$&e*So&rTm zl&MgqMx6#tTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ z*|F!qkrQVwT)A=Q!IKwnK79G%h&J#CK|+Ly5G6*O1W8h)$&e*So&rTml&MgqMx6#t zTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ftoVjr2#+?UGUcCA6C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ*|F!qkrQVw zT)A=Q!IKwnK79ER_{a1UBt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7E zWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzf{E)M?P9MVk&?dh{7EWW<;WQ)bLr zuw=!W4O@2XIdJ5}nG08L+9DN&|E zl^S&#G-=VMLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d z14mArxp3viod-`|y!r6uN8q2*PmmB{B1DN1Cqa@FX)sZpmvlNN0{ zbm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEH#kKJW)YLWGGBB}SYC zNm8WAkR?Z+0!2!csZgaxod!)>wCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3vi zod-`|y!r6uN8q2sZpmvlNN0{bm`G&z>pDR zCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXh6Z#1fB20uRG2$dhk|IrpEIINN zC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+KoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~pVd#05Md%j zi4iA3k`!q&WXX}IK#>wyPY zE?l{B=fRT~Z$5na5%`n(2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFykRoPL6Y2ooVnj5rCBq)3w? zOO8ARij*i*p-PQ94VtuQ)1ga`J_Ck~7&BqYj5!OItXQ*Q%Z@znz)(LyLWGGBB}SYCNm8WAkR?Z+0!2!csZgaxod!)>wCT{LN1p*hMvR#-WyYKZ zOIEDeuw}=d14mArxp3viod-`|y!r6uN8nHCCrF4e5u(J1lORcoG#Rqw$Wx$5i82+c z)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~>i8B|j+_>}L$%{81zWfOM^ZE%A zB20uRG2$dhk|IrpEIINNC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+KoCQl(tl6+-$DRX6PMo=L<;I-{ zPhPzF@a0F~U(`>K5Md%ji4iA3k`!q&WXX}IK#>wyPYE?l{B=fRT~Z$5na5%`z%6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBFqrbCw=eFh8}F=oP)8FLmaS+Qor zmK}Qz96533!j&6$9z1#R=EIjCfw6vqga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k% zXw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHEj8pCBQ^M2He2 zPJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~B za^uc}CokT7`0^w0uj(gAh%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XOfgM2@)bqgeWoMBuJ7XO@=Hv z@)RgiqD+M?9BH|{)m^5V^h zFFyhk{R9aSCPI`LaS|j+ktRcy9C->9DN&|El^S&#G-=VMLzfb+H~mBqtAdLBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Bk-^5CrF4e z5u(J1lORcoG#Rqw$Wx$5i82+c)Tq;-NsBfey7cHXV91Cu6Q<0VvtY@JH5<0<*mK~> zi8B|j+_>}L$%{81zWfOM8T|wa5hg;E7;zFLNs%T)mK=Es6e&@rLX{eI8Z>FqrbCw= zeFh8}F=oP)8FLmaS+QormK}Qz96533!j&6$9z1#R=EIjCfvJ9iga{KMN{l!OlB7tJ zAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_` zc=O@QkHEj7pCBQ^M2He2PJ$#U(qzbzBTs=MCCXH&Qln0TCN0`@=+dLlfFUEsOqeob z&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0Z|WyVh%gbN#E6q1Ns2TXvgF89ph$@_ z6{^&z)1XOe_6 z2@)bqgeWoMBuJ7XO@=Hv@)RgiqD+M?9BH|{)m^5V^hFFyh^{R9aSCPI`LaS|j+ktRcy9C->9DN&|El^S&#G-=VM zLzfwCT{LN1p*hMvR#-WyYKZOIEDeuw}=d14mArxp3vi zod-`|y!r6uN8sPlPmmB{B1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDR zCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAXhv-$}VB20uRG2$dhk|IrpEIINN zC{m(Kg(@}bG-%SIO@}T$`V1H{V$6goGv+K@#e#qAAx^YKS4r-i4Y}5oCHZyq{)yaN1g&jN|dQkrAD0w zOoCQl(tl6+-$DRX6PMo=L<;I-{PhPzF@a0F~-_uW!5Md%j zi4iA3k`!q&WXX}IK#>wyPY zE?l{B=fRT~Z$5na5%~A@6C^~K2vK6hNsuH(nhaTT^X4c#F-0MZrpkBY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=S zhc7<@|ABsjga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+YIt`k%Xw#ufk3Iv2j2JUv%8WS+ zmaJH_Vatv^2acRLbK%O3I}e_`c=O@QkHCMZpCBQ^M2He2PJ$#U(qzbzBTs=MCCXH& zQln0TCN0`@=+dLlfFUEsOqeob&VnT?)@<0aW6yyjC(c~Ba^uc}CokT7`0^w0AL%DZ zh%gbN#E6q1Ns2TXvgF89ph$@_6{^&z)1XO{E)M?P9MVk&? zdh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+9DN&|El^S&#G-=VMLzfwCT{LN1p*hMvR#- zWyYKZOIEDeuw}=d14mArxp3viod-`|y!r6uN8mrzPmmB{B1DN1Cqa@FX)sZpmvlNN0{bm`G&z>pDRCQO+zXTg#cYc_1zvFE^%6K5`5xpC*glNWD3eEAVr z=_g2tFcG4}h?5{miZmIrNIH5 zqD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$%;?0LIKLY=`eu9Ju6Cp~B zI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb%ISZDoShHcvjy(sCoH%pg z%8fe@p1gST;meP}f1#fsA;Lt65+hE6Bq`El$dV&Zfg&Z!RH#y;PJ<>b+H~mBqtAdL zBgRaaGGoqyB`el!*s^2Kfg>l*T)1-M&Vwf}-hBA-Be2#_kPu-aM2Qh6L6Q_{GGxh- zr$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k=fIH@XD(d1ap%F47jHg% z`4RXp^%EpSm@#e#qAA$c`KS4r- zi4Y}5oCHZyq{)yaN1g&jN|dQkrAD0wOoCQl(tl6+-$DRX6 zPMo=L<;I-{PhPzF@a0Efqn{ul!bFG?BTj-ODbi%fk|R%nA|=XHs8XX&gC;H7bm-Ef z&wwE##!Q$pW6pvlE7ok-vSZJIBPY&WxN_spgC{TEeE9Ms@ZabsNQf{IqQr=kAW4ce z8M5TaQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2 zi#H#>{0RKF`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3 z<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|DAqC6lpSK$&sf(krHJpRH;#?L6a73 zI&|sLXTXpVVBzZ*|F!qkrQVwT)A=Q!IKwnK79ER_#gBWBt)19QDVeN zkR(N#3|VsIDNv+DnF>{E)M?P9MVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L z+9DN&|El^S&#G-=VMLzfn z!2hJ5AR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG(xcCSAtT02m@;F|f+Z`~ zY}m46&w(Q+&Rn>1nBKvFcG4}h?5{miZmIrNIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~ z%!MmA?mT$%;?0LIKLUIG1PKu)LX;SB5+q5HCPS7Sc?uLMQKmwb8g&{pY0;)bmmYlv z3>h(I!ju_v7A#q@X2X^pdk!2qapuC68+RT&dGY4Mmmh)uRX;&OgozL(Mw|pmQl!a{ zB}bkDMM{*ZP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS z`S9gO;D6IkkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf z!IBkgHf-6k=fIH@XD(d1ap%F47jHg%`4RYY`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sUV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@2mJ&I z5hg;E7;zFLNs%T)mK=Es6e&@rLX{eI8Z>FqrbCw=eFh8}F=oP)8FLmaS+QormK}Qz z96533!j&6$9z1#R=EIjCfj_UGAR)p;h!P`Cf+Q)@WXO^uPk|yO%2cRQqfUb+E!uSG z(xcCSAtT02m@;F|f+Z`~Y}m46&w(Q+&Rn>1nBKvFcG4}h?5{m ziZmIr@#e#qAAzHOf`kYYAxexm36i8plOaovJOzrB zC{v+IjXDjQv}n_zOOHMShKv|9Vakj-3zn={vti4QJqM1QICJ63jXMvXym<5B%a6cc z)K8EQVIo9{5hp>C6lpSK$&sf(krHJpRH;#?L6a73I&|sLXTXpVVBzZ z*|F!qkrQVwT)A=Q!IKwnK79ER_&@X$Bt)19QDVeNkR(N#3|VsIDNv+DnF>{E)M?P9 zMVk&?dh{7EWW<;WQ)bLruw=!W4O@2XIdJ5}nG08L+CmM|p8-Qg zjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;4kYZNQf{IqQr=kAW4ce8M5Ta zQ=mwRG8L-SsMDZHi#8p)^yo8S$cQl$rp%bLV9AO#8@BA&bKuB{GZ(Jhxbxu2i#H#> z{0RJ?`Uw&uOoS*g;v`6tB29)YIr0=JQldY$E%!Da3<}6sU zV$FsvJN6tna^lQ|D>v>uc=F=Shc7<@|CfG(ga{KMN{l!OlB7tJAxn-t1&Wj?Q=v+Y zIt`k%Xw#ufk3Iv2j2JUv%8WS+maJH_Vatv^2acRLbK%O3I}e_`c=O@QkHA?!K|+Ly z5G6*O1W8h)$&e*So&rTml&MgqMx6#tTD0lVrAMCuLq?35FlEM^1xr?}*|25Do&!ft zoVjr2#+?UGUcCA6NIH5qD_Y`J^Bn7GGfexDKq9QSh8ZxhAlhx95`~~%!MmA?mT$% z;?0LIKLY=ceu9Ju6Cp~BI0=%ZNRuH;jywg5lqgf7N{u=VnzU%sp-YcG1BQ$kGhxb% zISZDoShHcvjy(sCoH%pg%8fe@p1gST;meP}ML$78gozL(Mw|pmQl!a{B}bkDMM{*Z zP^Ctl22EPD>CmM|p8-QgjF~WH#+(I9R;<~uWyhWaM^2o%aOK9G2TxwS`S9gO;Q!T6 zkPu-aM2Qh6L6Q_{GGxh-r$CVsWhzvuQKvzZ7Hv9o>CtDvkP%}hOqnrf!IBkgHf-6k z=fIH@XD(d1ap%F47jHg%`4Ra4^b;gRmbs#6kj0heSw%WJrNj zm~M}AqVnc9c+LCD1y!4g%T)(N~ne!*a5Xr2My2&yP*m8LNl~LE3`p7 zbU-I`K{xb3FZ6){{V)K7;D;g5dPqO$-~boILIO;OL`Z^UNP$$C3u%xJZpefzSOVFw z99F_ASPeOl2kT%16hIMd1}~IA8B{_w)W8m?g*s?}M%WEauos%41zMpE+MxqFp$od9 z2YR6o4Csde7z95Ifp&uQgANXGK`bP|bV!6GNQM+hg}IOh>EMP;$bu!14a;FAtb)~$ z19`9xHb4Os!DjG636w!4R6`ByfLf@7255xc&;)y-8Cswf+MpdepcA^F8+xD@`oMsG z7=S_W!w_h1k$%v@0WOGz1egwqkOaw)0;w<;(jXn&kO^6^1hQc{tb|pt8gd{H*1-lS zfFjroUMPVwsDx^$fgMl_b z?QPNzIyk@uv5)}MArX=w8B!n>=0X~zgBvm-3zk4OEQgh_3RXi7YM~Aqpb>UM6YPa%Xn|H}gLdeEPUwPe=z(770|WYD00zMiL!kANe$c@I zE{KH$m=1}M1j&#BsW2DPARXM030bfNvSB%_gjKK_av%@Z!3HRRBG?RGD1kDlgledP z9Z(B(&;X6F8=7D*G(!utLL0P02XsOgbVCpHLLV5=4+Ag=ei#Dn9nudvIKTz5kO0#m z5t1MoQXm!PLK>ul8!{mamOwTvhn27jRznWt!8+Ig1yBT=!3!l&29;0^HLwF}p$;0L z5q3ip?1g4%fmUdPcIbdk=z?zOfnMkX1NvbA2Eh+QpuJ1_K?eu8AQlo}IwV38Btr_M z!dys$bZ|o^WWf^1hUKslR>5k>fjn3T8=wG+U^9531j?Wis-XsUKrPfk12n>JXo9`a z3@y+KZO{%K&t&jAB4i0cZEF{2mNQ5Lvh7?GJxsV3w;D$`df+dg* z%V8y~g4K`%d9V&PKmioNX7EA@ltCp_Lk;YJTBw5tXoTI+1bd+wTA&r$pdC7(6S|-q zdY~8jz<_=jfI;xX5NPj_e$c@IE{KH$m=1}M1j&#BsW2DPARXM030bfNvSB%_gjKK_ zav%@Z!3HRRBG?RGD1kDlgledP9Z(B(&;X6F8=7D*G(!utLL0P02XsOgbVCpHLLV5= z4+Ag=ei#DnBajNPy{(2uY9(DUb?tAq~>O4VjPyOCTGT!%A2Mt04#SU>$6L z0w{vb;Dr(>gG#7|8rT7~PzMdr2)m&P_ChnXKr6ICJ9I!NbU`=tKri%x0sSxlgW!iD z&`yzl(7^#Nh=l~04vCNi$&do6Fc;Dw9o&!!S+E4MVL7aXRj?XzAP?5T1}K0c*bH7M zfikFsYN&x7Pz!a?0FAI4nqV(9LkqM*8?-|QbV3(&Ll5*q9~jUN1271F7y`{8{h)&b zTo4NhFdY&h36dcNQeiHnK{~i06S80lWW#b;39Dc=uunsmr0TjVz@InccK_yf}4eWqgsDlP* zgx$~td!ZRxpcUGn9Xg;Bx}Y0+pcneUfPNT&LGZ&6Xz!DL(7^#Nh=l~04vCNi$&do6 zFc;Dw9o&!!S+E4MVL7aXRj?XzAP?5T1}K0c*bH7MfikFsYN&x7Pz!a?0FAI4nqV(9 zLkqM*8?-|QbV3(&Ll5*q9~jUN1271F7y|7B(hoW~zy-080Mj86k{}sUAQk398l;08 zG9e3=KsGFgm9Pp{Lk{G@I@kaOPz0O73nfqnl~4^eumftL4jP~lc0&{Fg=T1hR%nBE z=zvb>f^O)6Ug!e@`e6VD!4E^A^^<i-bumrMU zIjn?Luo`k857xm3D1ai^3|=UKGN^=VsDT|&3w6){jj$V6xG(aQlh9=kx&Cmj^&<5?$0iDnV-OvNQ&<6(e z!vG9|ABI5tko1EN4sby%B*1h?gd|9Y6i9`+kOt}ChD^wUC6EovVI{1B)sO>uunsmr z0TjVz@InccK_yf}4eWqgsDlP*gx$~td!ZRxpcUGn9Xg;Bx}Y0+pcneUfPNT&LGZ&6 zXdjV&(7^#Nh=l~04vCNi$&do6Fc;Dw9o&!!S+E4MVL7aXRj?XzAP?5T1}K0c*bH7M zfikFsYN&x7Pz!a?0FAI4nqV(9LkqM*8?-|QbV3(&Ll5*q9~jUN1271F7y@m8^n(r# za6v32z;sB2BuIu7NQJqO2I=62Ovr*IkPXXWC9HzgkOO(J4mLmm6v1ZjLJ5>XB~(KV z?0{ORg9d1X-OvPkp&44B722R3I-nD}pc{Ii7y7_}ei(p3@WT*je<%H*g9BU;3kfhC z5+MnaAq7%lE~G&^xFHj=UU=aK;1lq@>A9Qel3t}Mwrb8kmK{BL3 zD$Ip6NC!7$LKZB6Y*-E}VHK=~9LR%pumK972sVQkN}voXp&Dvn2h>6xG(aQlh9=kx z&Cmj^&<5?$0iDnV-OvNQ&<6(e!vG9|ABI5tg!F?B4sby%B*1h?gd|9Y6i9`+kOt}C zhD^wUC6EovVI{1B)sO>uunsmr0TjVz@InccK_yf}4eWqgsDlP*gx$~td!ZRxpcUGn z9Xg;Bx}Y0+pcneUfPNT&LGZ&6XoI95ba22>)R|%V)A-B$%julSe20jEzy97Yb3*4S zQ%*o;I`%!-+j{vav3G`ZMDG9MPx((k!JvwT8ILvz_YEFZZPf9w*G)Mk@qhNA!U@B#4i0cZA|ydF%!M>a2RCFwyOoAOoFuPOBu?CS z?0EbCoxBRfN#YX=l6QTh@@~i5BMO-nNT&)BAs)PRVoss5CX9J9H0ig6|a-{Wn~ncNN8dJSFM-`8N4yAfFr2S`dE7 z?VyHhJ0a(w+oc_{%N1z({4*Yk;`sk4t2}WvzP}u2hk3nJt|QIs1#%r_UeDvY{>MlY zf|Nl1B-4I|*e}JtBJP)bmS?9Z`~0x{=xuEpN!TYrl%LvVOkIJm*m0J>70aY?mbGFT zH_q~2v79o_@=mdgA7^=^SSF0K%o59~<18;1%k#!s?lNYG?X>Z>;bJ>|tgZ2}zA3#v!r2be!!jqe-kUJInglSl545veg}?3bUR&H}YPxUdz9Dti16fQF6&x z%U#9_Yy*WcVZ39-bp&u(h?cVkrLmTrYkXerGHw;Q>ybOCIqNsdx7!v{|1&NQxpirR zW(bb)<+W>#$s^70HXHBX%5xNu{pO+=%lPj(H@y90^g zdE59j=8_5dA^Em3g1eB}sbroI8J8&&a+b^?CG)b#^h?w}qYeZs#FtoG6{21bolc+8(Y-u6mt&3w@Eo#P$Xe~+-fgGwp$wesz@h1IX;f-;xxrM^gAo8?ua z1VV@FtJTFUvtytGm^fZ85F=a#YUE^ep?<4xp9CsP> zMNzp@w0g9nu>6Rzii}A?J+}O?v2MGJ!D~@dLRGGa`_pJOA^G-kqPvWCWX%YL<)78Q zp9(ta`IE@JZLb$w$9P+} z*p45X=ZNLF=4wn4%d`3hO>EC<8}Bm%$e%PeEaNX?c~;%qFSaq`M4uGP#IcsUj2f}M zaJ=o$#dcg+^xeM^>$5^D7u#{6?J_os?YOB3Dpp~ws+B<>m#g~Iig_gyXp9-RMet4= zr|RD8e@!bl$7Jbo&8z)LnO7@mw&s-)yc!5zO$^Gd30|#7x9Q`Fpxm{Q`66UE1z;AwA^yfU{$XFrkj=Y4c7;pDkGH>BPfwA&vsRuC3Z9EHXb*{wlCGo zbVRlp>UJTI z%syz|F4X@JOI0&W3!C*dayL=0hojS-OcbP$MjWi5t(>pgr0*wQInQg%Bt~UTo|vno zuKf!+P!U&1c;yRSmS@eT;zzL=^HIL$kmny1(|IVOe*UA_zx7TE=}=hdW_(Gq*9?39 zVYzHRA<~JOZ>}Ys;k`=JEctt=MItYr36&$pXe-=x+BK@?gLs-5^!Rxz9bNV#R=S-?Ax^GA50dZJcQv zC$`cUOxXm}HbHDJ5?vYJoT%mGIIE^Ak%8e2i3sv(Or;R@R%hv*QdOd#MoPt?R2qjF z11l}Nluy0Fol@?hgCH$jIEFp_#asGOOz%k8W+mMWFg-~B>EYqAr8i3H`6^^$Ldg+^ng8Px zq~s;)Vb0Q<10F2%wWfK#J)TY@SiQVO37WH1a;eGY`z~KTvstQ3@!0=;$9Icp+uD>m#>?TX#vBdN5^#V_2xg+!g-UlwU8qm4**mtd>;lw>wLxnNC#9ga{gdbkc!QM+y_s zgYNTeYHX(K_Ulw&5(EXjw^0hJ2<#Y{iP9 za+mK?oQk&$X`6m0nIUc8RlLPT%{Ft`HQzpuy140{3Qz1IM2Rqy6qlJ%!<%Ah=7s+X*)XHt@nV;NdrbV3m+NOH%me0uKKv}KOaWuP^ zA!b75*iTL&>hR{PFI6{w(;YCD7T8qyE{e{yx=cBNNTaDb0i#*J>1x?sS8>ihOZVD&?%| zh(tHl_Y0MFb0qW!bMk*B6V<@?-^)bm>PSZIV*{XKg-bHZH9n)VR3^GqMyZV1#JtZ% zuE2aBpS;zLUkTTC{=X0LZ*)o8UJGo4m&Um++ z);9e`+K?45s=M)onRg7^BD#Evmg_54RxX(yDF0irRP7_tFh^wCYNF+##&i?eVtbbuvh?H5%EN>x)(JZ`LWoN|8KbXKz#vnwdwIMP~!xhZoeztjlI+FLY}%COSL zn}6IhZPtVedq(6n<(~J|mD|RpK_0!IUFGS|HqH*Xa^4t5*3** zlq8{0Vxp!7=Jbd=kWy)yrZtlt*=8BuG-wPfjWWSfiP%WAeK!OJ$@@8$;Ok=rFG*18 z8{VKRf7fC3Nims`VCrK{T81~I5{#00iwT3|#ESm%>_n@=sTqE8+n~yIa=@IBW^J;Z!kne|5>7q3bLj5^gTa8YLiOJM`S!0*m1)rr5jx}<;?umPP@}5DMgy~k zj{)NXd<@g2dWPnE1~?o;e%*je*gg2L=w>T=cy6Bysm+|zI$DF0J z`Oc57TGW$m{E$pWzq&p&m23MFBIA1aqHbDWM*RbW9jT z!Iwj3vyke`-MY-d%_=EXo&GP(Su#N?Um!2kI)qFFL~?~0I^Fuas)Aa6xM@fYR5vrX z&c{fFB@Sj?aVMyrRmQvgkSfnmw&4v#JK6cdYR6<}vBV;OvU0m{ItjSR^vnIa2u!jB zCMkghB9JjgAjT4iQ35{{0qJy97AOs|=A<`2RtXd%Ks}e3G;pahCsi4r2^b~2luga& zR+dq|!D14hSD6mQMQ-v&Ra&>3E+9~nA~Fq;;Y~xTT=t<^T}#o=umTM;9+Iw(>{gxA zbvImZ<+wFKRGc7g-l7@wsB_pLmI3aCKztJEmT{F^Mj44FnducH{WpOmnSm4+F{iZR zmsalS4#p3WpRtK6D)zZ&jaGrtR8g)}^p<;ikg8bGTb`YyE_%wdleswPo*}a(bD;WI zU8#Y}>>=p}Wp(ajbz7n**Ijs<9=|RvF9xkd$-Sh~>51HvuS?X{j_2FwV+X0Q9iD{M$c;w) zh+A=@mY2WPu)jY%?7NxvKvd}=hBt(%NNR~R`>de#3AYUCxWC~J>z+p}a%fw}TaOQQ zzxsCXiR1rv*M#m1#r941W>(TLOySYK-t=^LM?XZw-}0TfvFDK!o}L~VMsnWn{Ws@5 zGNxkFePJg8mh;&GJdL9Spd$EFA~?LMTU}2(pU6HE$VSpYwIQQXn(HeGS`(Y&H}*er zob@E)9?+wNZXPXUZ843gSP*oT+pMl&qbG=an1cJHi}p=7h0Id5IZH1`F}Z-5AxdKN z6(Wg+j2t(a6;sWdX>mAqND7XdUS9B0e?*U3O^i1!nXjo%6xnMf%%_9u8EGP%r5nx? zOO|^KRb~=v!}*-s#k_ZbI|L4fQK<&ZXmMYjtM1J!WKO)|<14e(BDnLpOqa}E3Gdd~ z>W1NCsfg0%=fC*#KdYN{GkJv1QiqhKl{&9E-mb0JAOX_9$&Zkm>%y z`_#8!!uOjRi;L3fHe@nV;Z862bdJt_{S$Jcz?8#ZyeR+Hi1D-Tk!ktw=?lv}eWtbr z0c{SM8&i~5q^|TTti2iKvX<^F`5Fe}q$rO!b!4E!Hw{}WPULW@ zoI3Jm+?J$#yoRpgjB32cI;&*Qz}O^F2+jK&F*dewjn7dLY{f>U{|jUpfcVUxVTSdZ zgjFckl0RRLxSwab|4rPjTO3D*%!n-i6HWK%3vs_9;QzF8Pv$d_mP^H5nv?0x*o(gW z38vqrxDDGINt3GCDh8&8nRp0hmPFUM5!w97roY>`9wjWp;z4`)g<6iyC)4$V_Eo4H zv)aF{ZHQsgyic#O%d6u*uM01S*887NCj@wUl)O5zs-4{+JV3@W<%;% zQ6n2tvSt%f^{jZWSgKb*Q5 zYy{aJSTh?P-li8Vud}{ldX?0%h_rp_CnRyBgf*M6xce|SCS!jD%|OCoK>?;o$5Z-j1cRav87kye#ZVZpK4z)@2?WtJxu>a z<$k$!&ME#v$#2)n?q*XZXU(v^U&N)-(u_trgcXkM-Y;<}3z5=O%d*?rx+wCmwKB10 z;yij%l2z>Irr>+%VCt|knW;ndqsiLZ00!3q;xEzGUI}4vJ-Ab}wRO0U<^{~+=1g3}+jCv;s-Qb1Q~fFZ5N1%I+Tak0+0|S62J6Vkv6)KreG(hize)?}tbmzr6@a zRt_;Q3;2Ew(L**QQ6AjZ7Nxkx!!_}>bF-Z;z94t|;OuF;r95pMoU!fqa!>M9JZLE4$6jUtr zpVbqwKwYt-$C_|#Upid2#O3l;t04RpZb#O9PmlAysh0UH!L_D?EEEOZ4l-#Wg6w!Y zUhN&zMgH!RkuH)*v1uavI{(c`4SRYhe8!E#q=ej(p4wS;rI{IHg89yzF~R(2X=i7J zb@-8@p*xM_-a#qFjoU)qcQq!fv}ghtD6}4CW!>52U0^bRZSJtAt9VPdwy76=6)U>L zuenbpwL<&_`w6p`ACkr1m!##fVIapktR)7Yjiec~-jXiRPghBwLp15=WMjr$iIgR4 zwSy4cB%p_6{bTR~XX$qc$+$H|+A^NvjAyx&0uo*BxL5tfy*6iw43gMztTNPRmF_54 z88%JVFm%S7yJpH_ip^)<-Qsmh2#!-nIigDjXKc?icSS(l@aVuY# zq8wBUS*vc`Wv|5e-lZzOXqoIR{Zy*$n8llVLdX%hGd(JU$dvP(_b7Qt4uk{X0|Ce=Q8B_h`*`GIAw-SX{qA^Oo+B| zCvChKlt5EOoRb|c7JtpeP{fx7A}p@v;URi6HY=+yHFK!v&2v?una)ykl~IZ?nphL3 z9OL?6SjH~AsfaPo5^On<9Tn`3K(ML4Gx#)PV(F*NveG<66valB-zDPVE_&gFbw8t0jEl=zX|=@S*2H2%R^(6_JQ%|~ zlHH7@>}HgQ`2JPrn2oCa+(Hg9Ex9k1<)i(cA#2_ulQ8LT)-WGhv$Fw5BP~_Rz%Qfc z@Fu@eD?4~{>-0IdrN+MFQak$Tsps2oVxr?Lm73tq;Py*yLnK~@JiUBszH~nFL(GbD z=^Iiz`l5wcem8l6;e??p$v0&;Z>p{jQ!c!At-x1Wwl9`;R zI)|1yUo*8VL`(6OUgA=Lhv7}VM#zU!?7gx|vwy|Vwl4w)izwvsum=&!@n#GVq;}F{`85@+|#{zos zJ1#aFk=bSy&Zx5NW&W8f=RznmyF^`LGID1uV|`v zv02g2Lc&58sXW6nD)g)AFRlsv{F+(V)G9g}X;DVw*QH6AVN5Vyz@+LIdaX6q-?S>{ zvV{rw;y%J`hy7LVbZLiw=I+^OH+|tAY^S)ZcKUm9KNECk;56qh=x6n*%AF=k?h~Pz zms>&mi;dV~f1I=UUx*(w;nkP((>34F*6zK0EM0T8wE@PvjW<7s-w(lU`MLWWGACBq z$GLa)Z9PL{UDJ-NVrC(!%AF$7Os7NfWib|8{+#AF&t9kt);ui17zB+)q(|jk`9k_g zRZiq`#j+H&akh}rA7lAKhwmS1oI!w-{Q-@kmc|ZC;{j_SinWy##$fX}l{qGhX16GH z2SW3i-31Oj8W2ne5(j!iid(54X22>4b9anqNX$f8nc(|jz+zOK%o8Lo( zw|~x|y}+QVLQV;We9#?gYFB4P2Gsbk0zcy>oopn^-k}_32~0TxTZIM3jhMN?Tyz-U zpBFT^j5Q+$CN+LWbaP538R?!i$v21av1jfv+J3T6R*A4@#5U(erhKfi5q&#<$2fM# zV@TB1aT()DhJBW!0&S^J&9G$s-t=r#tmtD>RpIGleFgXJawBsclN|ycqw^`z z8UGD*EhC!VI-dKgRn~<-OM&Cg!7G#f*KOx!#Ot@J(sHp>nV{ur~RFpmC}!nwDIoJoQS? z>YhG-;q*X7?WGeA@yX*iW23xcfFbz_RL@_S>@1P$#E67!s84R_WOO>WrhT}cLsM*; zrO9mArltpiaSWbWGXt@ywK?-z^U1>HIaJ;hP-#x%MI~d$=y-h{k7`v?2GzgG=0hSj z-i+t32oC*f%$XWyO`jQIrrKBuW3Hj*8^1P-wem8i=W7nxGw{dZ@sXJjvrzLMhqDRw zcTtroQTCoouK$~Yq-1qU>*>wig}De`L3e8`<9NOZ&>QT=a8jVMBxuRrH2+ zhhN3bxr}!|qrL^@cx$UmMllqxa`=dEM%uq+Vx8m4W8MmxAd}=A!=CSl+_|r zJ)=qgNWZbdPb0jETBmv+f>DW@O-+`0?whP0;)@o~zKG3Py3o|ZtgpCeEp7c7-z{JG0PlU?#o9ezCTt|R=;uoe+&bk=cKUOsMaAGdyXuzVDdwDlig6EB|`Bir&{uhp~~O3KA*nehjCnve^(U zQ<;^H-0;Y=C$geSaUH@q z%sr~{eus1z1GFPGj>YZB5PN1ftWPm2IeZCB@kU2h)@3BJTli+ty8!u6XYp!G#nJs3 z!h*4=ef^xV2n`#FMS}`0(a0GWir8yKzc$Tbg-L>78H=`({_LhK-7wbOT|f$@nN=$gW2)&RCXW zscxd#)%AQN_k)A#evk%niK=pm#u;MbyMVZQGyWYb3R(JzgZ4+*o6*cIkR4bU#fO8( zSao^yhlQlk$5;c;WSPfU&2{hK##oOG{MNB_=@FPC1iD7&J}=s(vQ+(qi%~8_|6xg! zXUNy{6 zay$keS_*h0N_EJ7)}3vXqj1!ug?@~gES=uD&r!;&tbFo5*Pu|y|K2&upAt^}oLQ1V z=Q>CE(}glImfht4;W^6Lf%yNkbCi+XB~_etj#4HC`O}Oy$S@8X8c~a6r?!Sj_+G_D zWyskI&GVDjjZqjF9OV8#{{kZhMWcMHVL+Bs+!H9p!0I_A5+{YqD7i`kCIXcz0#g@p zr?h2|9og@q&U`>l^92td5Tn2m%1vV;VRewDvfYS!|uC#wPp zG>-z_h|xSadEJPEIt?fdEB`#hhZZ$!&Yx<0HB%)|j+>Owd6QCAKLe*KjbEx|Ob(T# z81oVRr>7imv=0CNC#M|0PgNfkZ8=ycdr-dLsaUFGrqX4{N+d5Z)~JXn+iasNXfUTs zDk1U4I}#%^GewXikD=xw015Mpn{+E|b(n5pmfLwotS68G2}UZ{h)4z$tD47Uiji*G zj?IgE)slmQrHpc(Cy)mXZsNqrEl%(LX=CcC&Qe`Xnd__2<41{^sZ zrW_NEgsX8}U`D|5$&pUwc)l@D9FxX4a-35+&Nh~bql)SbV?Ea@`_zf03uG@uA~L#* z%T@<{$ktTjXO=W;6uR-MDa=taF})mm_uN669zf_HPGmvyH(K10rh5 zdeA=Xp<0+pS&bj!ZjNKBLS16mvP6M7js=IK2Ic?(rFdcrHzh0|G*#YKLs z@t~gST7dqWMd#;ohlw4qP313%2&??1nzPvpG#Fp+|bSE zqUzoJ3ytu_DnrHVPtDGZ!*qrRTc1y2bCK~cBN8hm*w?T&E6^-CJE8XU=y}$PmtYs~ z#%)rt=ebYZB!hzfxSv(cYMSw+xT$9K72}{8RB=%Xos8_(49|O(xrotAcN{pGBQfm^ zbk7dsHPg%R2A5&~j+GSMaB+Fa{*m+${Ea&Gdcdsk>iG?lNoLWHO%snaLhG@OKA9_x zJ|iOco$3*pGt84XX*9uEdV`r5dXVCxFt4+6+Gz7O=lxNbWuC_FR!Y!m8*hv8vQ$&x{kq+1D7f8hya^_&Yr_-cHoif!2E$1#@Jy2s7JpXJ!X3 z4xX813x0q>XPBi2`SN8^_o+<8XS9mr?{v>Vw;77uIi4-@&(7z*^WBlK&i3`DXRtf^ ziY0PB_v~mc#ojvFI}nIp&VjOZD7 z(=*T=J%mNi?R{rUPF@;}v#iQ#&PwSKSjyqhj@`>;w()Zc_`sI_@G+J*FFl840hVej z!BR3XqJ-Cupkx3gqbwWFW%)doGL!s;)T>*A*+&F#!9&vIG%Us{Q zpc4nwttBVrV6L)BEs>qCos?p1#^&vI*%7;4QSMtYDRey$44Mrsy zGGBO~Mk;d}b@cd`rn5N)GRczr=DaWXkYWAne<6e)2PM?=eR7lwE#g52G^wbv2&NAG zt5I~evZ0rjGZR(s=AE{by~pjRFAqZ?TO;6VKdos94KK;II`Rr8oh zjL~gIOeW3Out@H!Mv&q9$Jr`9+foCd}LXUSuG_niKm*f-7NFI($CE@uvSa0h0?He0(x6Ac$U!_ z2uRIdb2%p-2rKaPrSSk^`Il>H}b}ahX=$}6ZBgL z?bRBFI%v(<*npFX;9nU+)UMwqIy?-~ph8Q+&>4fRap$l?_Zoafb9(cxQGbZoQ?^K5(} zepFxO&3Kqg+~oH+ID64f+7H>+i=E`2&1hSu<<@V(tYYip!sgAm{{rRb77@9`_zNPY z+V^obPW??1|5s7rRg2m;A}0N+Ecy6@ad=ANa4T^*WKaH{nG9Aw&!;9PlFyHkO}ruJHNIqe^ADS* zR^BMhe^^U=2fa@bJ2}lAd{50g^?&1OcPYkOXr$hZzc2?R%OZ$|H)Eb8H1K{7_Dst{ zI2nTm1f;X_W~7UNxdB~&gzNd9{tQUIMop%qvyIKyajG@r z%H>M6+!T5)moLb>yLv><)TfSx zAuP{%2X8O)S+N~5SMKxnvuZnEsUA|hW^$sNot&YHxChniq!QIVQgX$EvWhE_leQ%5 zkHLBI@Ut$Q)IPv@qU~>ciRgo3Cvi=#C{>rl0KL|AMcg4vdBB3{n_4GUhja1cW?Mf=!I6@%msEowdE^%bnPfp%pPEdOw9441@IdmisN=~YM2sWHlI?P;_ zofHwZELC2P7-R?0%*qiv^kYX(n$adm^<01z*3H5$c?cn&ha|gfVcdp-MZs=GR{XgC6FH`6OtUGSp_AB zE>#{)k-bGUQJMLQBOm;S+$nM=$5ln#V&2$cY z&0KjDquP(Qaz&~evDK~E%9}Wpg0nI~s)x&L1I8bIEBPT6J&Yr+AF`%vd`Ib}V9`sO zw66xD$H>TA(Nd&?SRt=FF;73qi(|~zpIv<5%b$dN?QrosLlp-u9A-IpPH)A51BRm@ zidRkc4`GqD>C@r^dPSyVC|f=b_(EQ)uC9KZ9mijMO1vNZt*!l-e*76*+cAB3kFAyK z23zwn{nU`wbWDHkOKtZteb*OS!!dpPyIS2b{hbrqj$?Z5QLW^d-giVBdPQ$PqV>I^ zHy+WtUeU{rXw9$a#$j#8EBa8o=6ywPZr6HW*8lym*7LI7cCW4LWqtoWwvLzezx~$M z_OjkNx%p-Ng~?4X>kX3|U)HN8*S@TOHmT-i{hdjbFY6tX%3ju=o8*02ub(v3p;t^A z?9e}T^>^sKE~7&~>gwyzpLO+g=)ZAwb?^e0jt+g$+1{bQ?QHANk2qU#b++K@+}ojV zcQ)a7;%@v-Y{c)x23#lBcIb5zcXa4qL|1p{ebHqd`YX}i4!tRQ@TmUF=>DVnr;gsE z`hPgOj_NNsI*#i9>S#Nv4@Wg0)w`maj_S=(yN~LXQFTZ4k0N&*)nAINJgPqyS#ne_ zi5xnjza24fME`AsaYR3^_a4z(^zI}2V|wQi{hjdkBl;i1TaV~9;Y~;MS0^+a(SI{x z=&=49`@muSy)fgj{>QN1!+Kp<_hF8sb{*E=3~fKGw}rMG*7t<&J*@vawCS*361w}a z{$WVNVZA$~_OSj^$PQdXYH$sy#xO&)?6CfZt>m!&C!6=M-eenU*Z=lwTmLbA z=fgJRnEtCBw!UNf&}&-nG5wL(w4P)7FJ9BSkLfKB+q#bFe?Opg9@Cp1vJD*5jh6Mb zzt=nWt?&H3-nW1K;9h;Gb^VTJedvk8p=Q1IslvJ!^q$>?eJ|*B&lEPNH#}45|D)dc zOkwRoZTB;Ub^G+@X9~6EeOqhOyZ3D^NjLUw9h~31e{0YD_WfJC=6CPk+BV{z`Y0ed9;rmF(Vi%%C8PdoB-;eW)x_H^M3Q{Q;H@Ic(V zPZvHM_dXv}K7P8eb;=h{7Y@hXy{E8q&h|Zpk6--2p2Gh~cz91?f8wKi3V-#5_T-+z zf4l5=dkTAIzp$sU;i4D!6b@W;WKZFj7reHo@cD1Pv8T{Td3R6YFTVBup2AlTX&>(? ztef@4p2Ei(YUg8Ay*KJiqpiXA+rRUxR^h)stvzY0KCLy{K0Kp2{_M5Y**+iEcH7#w+4k6K zJNe<;sDC_eoBU9tZPJsE*$%!HRbOL^{nwAQrcXofdEC~~8`VUBA06R`EE;Vw?>E?v zo{V~9m#yR7sC{2(M|-2*jrE3f$5w{C5?dD17F!bXLag7`6gy~pEOx+F8{2PtAl9&z z#rE0G#Pr$*V|r}w$8_6zW4dgw$8_2{VmfRu#h&jWyH7>cM|Yi!dNrozRMhXEvh6q()$Zs#8TD*z z|H-I7#?)dNQ+F!riI|2{QE$dnpNcvi*>N(eK6dbA)Nf)MPeoP5`cFnZ{*|GVQ6~~w z-ims0h#$R;`rR|O-jh-LWBX1WzH|MpSFg*_KHU56FT*XXf;-3AEEg&5`28oJ zwM14FWRDUGyE^;M+wLgPKB#``kG7{DMYm$G<|e{noy+e-{jmbJ3&dFq)* zY=3=m#P+(}0`2t=9vlwYr!2pnTd<;FO`2Bq`6IPI+trPn&5Z3ex7?nqd4Kgrk4-EJ z?o{T#?5*LErmP$lQ)P3o<=8K_V56d{Z2s`U+YfIEU3|wH6@Jx255GC#J`TW!Em^{t+p4jv9&uW8KlBYXA{OmWI z?+aSxZj^kM8uePErS1m8ROx?jXTV0nEN^?LH014|(5Nu~wKgCZ46`I?C1LK}|HL7i zdYwV&t$De({%GT-+qHZDqi(-_r>L{ty8d=;@0pe}cDY(mc*~u+TJfKnyX|4Q>(^X& zwbt{5uVF&BN^I_(cbf6|G*;6>F>P4C(bV*Jwx4Y(KiAxHYp(XU-#69RZTYv{b&K|P z;}fl6p?9nozi+> zq$KTh2sx*np5P#fchQJW%k(@acHKs*p?N+14rvId?UV1=bbG;1HfX2yusdmPBf<$H z8}|E&kTm!39(b1VR~fz&mOTkCr3txIb)p@CJq%xEY8Wjqu{nRx8+*8Ex!>5Ln57yOClqj zmxb&4WGSr4tGY+jC4gLIM2W2lF+5m?V5A?d6(-^kqOgY*P_1? zIW;mqcGl!?eEqV}maXw8wV3lRNeTV!R{dRV;xy;X$hg>f&aa3+y@Xr z5+i3$nH?FS$AzEg_-b_g$>^dp+Xd1;##Jy|~DE}K8?qJ;CEQzK&|rVQ}-Q1!Li>MU(sx^Ep7yHfBoC!tw zd=yYQCTzHa8npP1T%5u)Q55o>0x4X5Ns$&_X>+DYk=d66wDtDiVWO^dv5>*NP)QI~$9$-l<;&I@xm|ByQ|CM?o9EiB48 zO(~7gr$p${vm<7cEz=YZz6H#Y(UxQi|_e=*8-`-H0##C#dQVuie1i@yKy zpY&#u11go`r)mvL#b)cV?4qDR|EL*nV`+P6-e0%XV@{M89g6ljI_M&UAxlYD} zMN6(#7Ma(Q2aB)QJlAAuo+YLX-;1wC#T8Qs4*q(00l7HzEa+7s6J{8zIw7)EeHnz>f|LRvGml;V^24X-&l@!Y;^m`JS_atcYWsHm72l<2&-uu0*ze z4i@M1bGNvr<62%iNU)=24rOLD52;Z0yaVD(@+~vyefQPYuT1=-%J5Z;j+?XUo1=|mqZ)|EyXRJv zhR^!r|0EXQ4z*%2M=s2tx)>FUL-w1oM}d}i5yhdZuG$BXw{vsuK#u*4%fju^<#;J8 z!w(1EJ!kTMkI}dTgMaX}h4f zHPR=>{1A0MYt7eMgJ(6=S@z<#+TbRX^YWFrW?-4~2(9`&Dr$(tkazSt zOOMeD9J2oeJMm>@nK$Dxf?H|6WGydl0#W)UQNpwQMvo2U17Xhlzl8_&&aZs7Fopu@ z&9pz3ZOl=9PHRP67=91D8y4DG9(N;`q#4oqo`KCreYkMV6>G(qxb50^`vr4w-GAs`gxOmG&bn6W$@`^Z_rPu52Vf7H9>2nF(is#P;^I(}mtZ-s0-F=L~o=#V`PJ9IN?us2~d zfv1O&HKX|;4{rOKFnTk3&64{ElJ$S)I&0^feCBP$xAES8qog9xePV_O@qboQPtx-Q zOX_(9yQ6Q%la$oE;w_k^=P0QGC2sI}V#Xx)q|Z@O-$lJDsU=8RS(SlkP^~Jd8*rqg zT4-Ws7CayagPz9d&Df6HGH2=4RNnfnTxabp_$8R3t*-=+qL_V2U%98wNAb`#a9KMN ztnREd&&mbbxOcN%TFrkQgQRoEKy?7GdNaNxu}m3)!PkxiUw6V&dt$~6$^Aq2ERo}n zTJ-}i!!_S+VSz0D7KfpHKfvg#kxU@+fmm)=JyAV<3z;CtxI9D6K|nTm`7@z_sL1}Ii5bd{J`)5zw1D+oUuA#e+2h8xR{Z|>+5-ASl`9= zFs@G6FXhvE;n|D~ajUacinU09SFWLV-=t3J+CsTB1mRQmAVbVL-v2gfVEY*<_(e)**KVW?IJNQ zPzno>lUKtYx4)~dx*oCKsBp+5-6hlTqaJk>P_oZIrX&9$eM_JndAhoz7omVgbYmAS zNM4fTbXL)Ci#O@i_p6>|cfv>@^DcFmaZ=-uf9p|iMioWt37pd@ z!#UGg8fo_Jhv*&X+lL6L?m=A2JV)#AMm%e08J~I2U}ZcI!NEh%VVV{X0p(n3K4y-E zE$>xvKIGsWnGDU|jCU~eB)QaqyuXXvN!+{{r@3T8P_1Ni-uS|Nq!>fKRu_jU+qj+% zOjV_UybG`}LZY?Y=HabUVFt$3sQJ7Pw$gkW*RZO>fbwXV&+Z*Xt8vfAGW5?y5rN9` zf;VG}1bWx~-Yth|6*9~D>_)>p{}*E1fH*aY$~(t1c(KRWw#8_XLAFY6`;OcDrC?|9 z!^QN7i^w#b-%!r!I8!=vc!JZInSI=T7pb&f(`(?AD{m9_biMWWo_UyZdgkd9MbS}W z@`&#X<(Fs8{mv>GGE6-v`4H!Tk}t@GfRYn4V)6cn?*PKYV6K$j{iaW24kvPt+b_pG z;PYD(gFX+Rn6Xs(yw~(OPkdT$=Cyp@KFa4$@Yy{tp0c+>#{a$I-~6S^?s?B+=$Ubd zPiZ`N%d*M|`x_X$qr3P#F@rY(5l=bDX0{f;9K%#KLKTh=qcltMGfWNw%RO=)k1pmI zSCU+H9x?A?C&tU1Qgza}J2e@KNW%X2z*fM&8Wb@OUjhb9pX?eJ|)WDj0V%^M#9Rs8}lXd*au=NM;iV0 zf1sqZc4C|3o2@+UH9eW#Ew_M6eD`sk$9y`+ctWLvHIJOcyZ++Mh~lEIprgJUH&ci6 zIeRRY#m4N6x6tM+-bUBL+1gAjtE-R2XlqYE!ZdAd3*Q4EcA>G_+N-Yq1EpJ^~ zTMoa2X;V#^9P9gKzQ2LLo1x6|AJFqQW(n_OzU`z_?8O{#|KI+eLzq_qzqPP72MR&L z|Nk@pn|c2KW!au99siB+^W+z=@-C(c8g>_*!*fi@syv_ZVk{nn@ik&XATsYj3<3vZ z5O~nEvgf@kR;R@3ZmjY?72_8ey&3$>x%6ch(8!GmOmpksq7UG_vC{h+EEutOCjLLP zeF=P2Me_ffBy+!+_vXyxo*di(!VwM;jX)3-B#PIru1h4rNj4@J5(vtjM1c^zk9Bn= z-U_aGpooG25%9iHQE^2U^^Kr{M$PKP{J&NG-XvlD9smF5^VbiV*WK0C)z#J2)zue( zqSFMjfzi{&M{-0#v}X4MYrcpwMb4(E5{gO@QI^PM6g8KkEF#Juxr(9|Qq&KyKtZ%M zf2INaYsME zP=OCu^bLG)gM5g+)jPn5vKMRN!Z0q8Xr?&^0E?pc8-V|a1MUUNI3O7w0Gu4X27m(5 zaY~1B=gTZ$Y*Kn=^b!M6c^r`%1R$arP)9T_Ix>!EJf)*ez47!v^iKa3COit7 z9{nC4T(uZvSWvW>01b-tg3_a}08pggOX&!4K~D-qiP1+4L{G&L?dlDvBN`Q55l3{C z(od?<=;)kyx-9HG$=kRT8$4TqyhIU ziGsQa(5Tuu0`Symu>m+M4%k1`t72H8AUZo5!%75~Xo(}L>5b?h z(m~p==z9j>r#OBgFy29cK-62#Y|%#nDAITSPI_u|Z9M(+-UZRcdnoA4Xr)n5UA!Pu z3JM}4k*;~st2QlqMjX*#N~h@%r4JT}CPlLiL_^|;<jA2RfoNqMa~$1;q<~C;gP@ zfq44Oz0-Fh8Wf)%-HH$9;Vvvi3Pev4pwVi2L21$J%#@$7~Uk#6cxk)iwV$>d~)4^^r=zW7Q=wnIAC>ej5_J#qx%6U zs&+f28&%tmXds%%7w<8m9k_Nb`k;s&6uFz!=)I(DZx&IZ$Pwh%aLq`0bcKlWM1H2I z7)4zvqP!7D8ln_>%Zi-9C}MCVgQ9XM>P!(eGEzWMg%mYfM5RO~Q`9ty$`(=Ckqas6 z5{jb9Ja7dg6%<8JWns-_?aZH7+xk9tvB$gw0Q$pmwBuS@iyA*!__ph&!hNpj=-saN z(J#1eAN{oJ=TVzoAC7w1^^Z{-TwDi zdHc`}^4&x4k~{Kmk@x4Xlb_CSl3Vgu$VZ2CI(H2@?z}Nsb3K%C#PwaqA=gu$gRYm; z4!G8*A9roIYK7zetJXOmzN*Q&>8cl;Td$H1)pyvB*B`M<2j{Ogwb$Qax@+0PrcLv= znp&3aGd+3r0aM%6n(3DLXyfqi@Y<_x8++4LZ)H7w6<+VXO8PM)>Dj_`%@W#{EdMRj zyTaCHlW0wx_qDAYixq!_W=IFO z-X6Vr4Ax3#6i=&JP$%|kVf>d8vAK>mmW>%L@h-hLfh%!teb3&nyTZT`-x>x*&}V1Z z(*sd*4Yr`vR7={;kA0ccck9=En7Jh`C@-y@8;Nfw+s<)yrL}eOsC!XH&wmNLgYdo$ zw{E{WadSP^oUy~H0vnoQ$6BskoUj5hlCf=!{1(Tt9G!$LFv45BSuA;WpZu#+!+;U$gZR;v8n53 z;8g1ul-F`}(vN9M$evp8p@dE9)2p%dZ$52IJ%90h>;hs8HrmJLywl`R+k;&qawgY^$J+nO&-r%ICdt>Qa0zsh8|u zOZF6RhQs3ssyW__!nY+?vNJFCL&9X*rYLsRcA4a|#ntq^s2qD(EGo%Fw~FUT$^?O{ zOtMeO2;>IGsOj!ql4q#>vE{)Nk}JhMKK57=V>+)K^17g6p;5aa6+e&nKWzpc?CQgw zKTsGUq&4-}6>1dZKV)(Q)Zva{nWMdV{q{?0fum6NdWWck+}XZi>S!fkOIC8!eE;i` z+Rx^3$xhksv3l%YONtW4o;>ha8Ic%prz@wZ$!RZ3f$X&1k}cVh;~kcMs+_5g5@_6E zARCAFNVodkqk=Ck*QdHPV+*E6u?Nx03p) zWK)y@HZ?QFH_+u(vV6(jEVTSU%Wq2^FDKX(hsQp|mK^No^t*;6C8v(JJh;sAgDE-N z^{$jL$dzS#Xu0JZDb}rW6HKkC#m>?)qLK>#9)&klW2+_vf6@Hfnk%qTlj2XrSTLOH zOb%c6_^kXPZ%VFovmyt*nR31>T@D2%syUwiv2{MidO>vs#1{EhfNC4jE$+mHs<(MhOn* z*<8`HY12N==TZU=Uu=t?iNF?M+ReE@a{nT^vmC*};~dFqz%y70S!HXML$Nw-p(GDP z0b98S7GmF?EAX~tbH=_5UR7UORYChGA<%bFaTT;n>l*ZQl>gbUdQI$mC7a)yVztY; zvAdFa&p9@W6T`5B7CGOcUe+LGHklm3@ZixeOIE+?kyEUhO0qTF??cIv93GM8x958T z)^s&R3Ch_Hk5%c1jgTqfQF=mH4aupFG$iIKX)<3njAZkt@C)n)T&bKICRSx zt*|S(%Y1c()D5mLUNDanR1@*5L2^A}awgkli=sk6ogvlj@K{u5rX{EZtR8Dn^;o@f zvLo4(;>EVl+22W4yFHlQ&uVuEt*SLyR@`}VDE4GO2t+v)MlEfaLp{pDXR4H{E4jb_ zqBl;rdJ!5fL~_!l=Ab1S>KLS3?GF$?$z6Anys%<{6j+g9b=&+_#p*A5O|m$WJVc>A zg(yr??a36P-=qwe&pj5pAX!aG%FGz7_%a4La@AyawgY<=kwdlTp-$i5H)wuE0QDNOjmPLhB*S3LH1)y99t9B zfRc)gA#;Wm{TQ1ky{g~gccywm&Q#gw%#1xZ4E^@X(kcuz*xn4iNIhf(DpohIq84LI zw_5mbG%N>rFj5C1Tvkz0CPE>E=F>0+v0kpTF%8)bHad_VsV-k6pufiUtA_bBrl|+< zSw)+-yHz*fF_OiY6L4zZG57OrlbGwq35p!KF5dI(p@uF@C>Q{A7$lN2z{p>FL zSIg8VO(`!+DTA#3k?j)3n!&NnBUq?rp?w$CR@Bje_YM%smzOS}?>R)r zg5w-6M>uVaLzUBGM`=sv8FestF2_IxUf7qEA_Th509|?&>gvxTguTHV%EHAhX&-6@5}LJ4O0Mp!)# zkDP5wA?bCfs*v7HU3vo~x2|AtkL1g?pKbX_0tsml&=d%0viVL^FxNlOs>IrNO6Z!< z)er}2t6J1V*6aH4Pmngf4e!EtgAmd#^#%m=@qRhrBlB2t)J8#RfMW@bDe9L$f*rbI zdJErNEA?qom7vw?a|Goy)$h)mcwF-LbA(bSSZ&ZW0kln~I@IC7w@Vph52|TXZZV-g zAvImasRK1rPL;EuGdwQz0h~g}P=okRp)~iP(750L4(ALhNFLxwb!T`otr_!InanP$ zta{8YB{}xl+mcRe3#cMmyVaHWlJ%x|zXNm|8nr%7_!A~rSza{&WtwbHafI^5*)!yv z@KFCmWr#1wnd-~2Wc&L$$EeyM$d&660&>U8HOeDH(E}Jj8jM$?gw*ziiNJrmOoj(h~l{2QcwiCrwew%pk0zL&7bPa z@&?QUtZ7OHPFM`WX@*qQ?;Rv(%Hv_&_~qQZ!NXpc{B)>6QM27%Si_1uMou+W!`XO2WK~2ENV{dOhC22MP$Cz?*YMSG6my6q|3rFxMRkYUoasa=JSs_S84h z)Kb0ScBA|{z2PWQuWFp!<-iO z$mw}%;yl|39F@t7wRh67hRI}?;&2BUC9gpKm+*Yb(m=;`>PXd)#d>_{0?GcmB>UtH zIm;C$g`74TYAV6sitf(l}!ZwLRqPEma%E9AlR^=uC#7J`BhTr z0~16rpeR-~{S-CeO$iMO6{Z%zKKILhYbZR>8Y9m+UzXS8%svudxrd6j)?;ZXj1qlT+jjHP>8#(R$c`_a%qdJ=_)a?2#O9Pk;9y zZ@zaZOzD2gP)~oeUrCp9gCiZO7TJ+z4a5#Ln)t-(l=8VWr|d_KMdn0_P%$&VMVpgZ zXg{=c-l8(H!2mT8u?>h!`U^yW&JiN+06NLnOA$VY4+W|l5GD!1PzS(Dd|e2e73~A2 z99cTQTI5OuCfK}l3CbU`x~yKi!>ZVo@BmMN;)m+W4(vf!fl(Q9E)OOQ!9gtx=6wCZfE4JS zV{7;fYm+AYZ^TY%mR1Y9NfB~q=4@=po?^1n;>oC-I;Wyk1NH3cq zelXa()uV_*msB24ko~Ia^83>RA%8|FWc9>;TZ_|Va7)p2LL#tgDG;>F7}@$vzBT&)sO6jK-f)dU<)3aHN@4 z4$zbcHLD`uN;M{->PN>wbX6%i4f62G6CMh7TS8ZsHsHs9Wd*5$6eP;EHSofAsj;Kr z5e6wsq(Ph!J&uSv>OEzPDI(C3U<>5s%U*v-@um#324GLS(Lq#v^;7-XV=&9{xO3G} zs)Aw5k2!}GO{!YG?*6X+P8!wo99C}_hvm}jS+VQ`w)PsQGhIH^`uA5vh=d zNW~R&5VQ^{RiY+;#Ag|e$^;0IC2+t20xMc&bGQ!O>NtF}n$5>YWHD~Zk(^m_O6;Xu z$u(HQUZz|DW8Wj?<%7aO{$xyx2E`t~&BRl%Ni{W9;EYW`WhdKRR=-unB;5~-G{u$) zC9F78?0&K+?a6r~?Wv@`gQMgOhhlTOvoXQlOw z_0whYYbIM3jZ@&Y&z)^m+%Sk3&V{p#G{TA;Zr}(b2I|)C2c=S=i3Kb(m_)ghlSI5oLAA2{H|1*soMX*Za^p&1q}?5-ntw}EH5k<{?HqdFhv-am*H~`X|37#fCIafdd(ty&!>;G@Np^G zmxcJa7+qG)$H)0sOX#=Xs!7fZc!DXw4;i-SE15Vp9kOSu$<|!!!Fu&Ahw4)%sv-A4 znudGBa*iz(6Y&g8#B=PKPPhu8`)Jw`G-tu95e)8>d|~^!mNzBqJ6Ee8o5MNgfEhJ# zsu)rS+M$PvUY2BZ5j*@CSRC-$(=931*O$rfo6^QQQ>-ZkBQQflQJ5a5PilleH@%-b z-I)^m*9)dexGsa-gr|XTx+kg2d^x$PkAA7^PkiShl{JvCAkM;I8J`(^1h^`4YdnFE z25Qc36;Eggr-pz(ACun$ONC>u38)S)tz}E5TfG~AvSEvKsauh_Li9JVKVUP`e^@T#y$%doCSXK`R^(tc7b7-G95u4ceL+T>#V7r?%x^`M2qw9Xv>aJe3)y#awNNqSfh zQ{F%>j+-74@PsdbWkdrXl@Z9tYN!s6;Q!r!Tz{IJT}C%Q5NCNQLSLyOX<{!D=>--U z0!0boF#c87)P;HKK{Gq7NKt%6HB!WXMX-~M@Bi(wSr;-8PtMTSCm*H5XW*yt@9lqe zm%WaEM%eh(mofj_knC)twnW&bhbfM>4`YR2zuTR+jv&a-EaHwk+XULifSV#A8FX2$c*unI z2ne7F=4>R_B^9(EP1wvgHuAN^c*KcM#|c2ZUa8{ZxG3$EpllS%Z(QofPVy;;ir}9( zT!>ra=z2-IQW77y7*5%PZ1UGVSqh=)P z`Ep{~uMZf0xFMhJ0N#eCjaDEQQSny!g9x`26@ZWYNDb$~+aO`eb1m`^=jb^M{mBF> z1W~|%E0&Y$-Uc?l!oG>x4ViIeJ>{H1Iq8y1K{;J>iPN7(8-D_U5@Y}g-bN!fii@ZV z7`2`Nrp4k*~YnA9)(l+FGi6qlgj6l9e6Y#yHP>PdhIE#PyLGI5iLj zmwJlBorh3KdT~=YMP=mUdLzFUXLotOPn=A&Z8q|uc)FkxsCVJ?970rQR2ZwW-O(SJ zTw*Wkg||TZb6C_yQJOzMuI~Sgv+az*r`z;X{v0?kGCFKK6a=K*0DtHt z%-GRE$*n~eekfE$9W0_k(MbZduNeO~@I*=5M4Y|Vxj9}t3&&8YY`olqUd8VU<5gkA zh!^+LiL|28s3lk0#gvLlnhdJNBN8XI^Z{%W?rG_(aIP@=HVY129WI{AHAKV2qVZ6l z3`LaTp57TCOBZoC&Q_u4NYJ@uKozMYBo`$X(Z#=$a2M$BaZSKvkrE+ws|We53L;5_ zS;r8&P>IME{Azb3LGE6NItb)I55k{p?ViVyOW6FjKM3;xl$P~ zQ;rVgKqBjwPJX=`2X6Sb@MEpGgqjsi{4#Q6z=2kJrjRxyQs*%7u~^Om?L&vNr1~8_ zt#A})@u=v&Z5!ZpsTI6U8L=cV|&df zaB>ScB;I#N{Yj!5dh25?3;j5nPmC&ijz-H(`nmj{TQxwn7RiwI2zHE%F$+XTfh(zBBRT}}P`A1UF)K}?yFnkTmD9A@RshjHaVk0R3uqCe8ICTZ2X-1dx_K_d zwe1E(GR+U*19@nNp2XY!;&hW{m+30^e4J*p>EjUN{s(2|k@7IU_i3~($ok-hSxWhTVt742R4$1gOC3Lygtw4rtl$V7eZ(X5F$kUv zW*HaO&*t;F^caxnFZ##^OmsGt3Kvf<0aGO+AhnTp{Av|A)XIvuGBJX%(XbGA41wb1 zoB)pSReD6~0DMD93PnUE;hI~{HcBLjTkVaUGZ4w+3Mj>M&zb}5>j{J9|Hf$3Yj};G z4P0EwB-S9YsNOTtT4*8WXMwhxGEs$~WAxEn9G;3zFz^E4{xV#;%_$g_g;6e!JMq=@E?MJ5pd z!sQXX@>!sovC-Bh4(vfrkXxp4<5y~iH zxsYEl{=_-imB58eWNbJ#_zl95O3FG3r(01D^e4)}x!4&*j(FOY%cT>dcmydyXALgI zvErh6WS8#4zcT&7#%XHXR>IIAn-<|_o;^h#TuOmwDa(cf_W{N|9L7Adwe3M@MS}_r zp;xIT@GYX&loUk{;a9_~rCgUNNJ&dk(V9u8 zf~>to6e+c}0_LR3(P3Gt+(Y=)rqKCNZsFnD_mHOOZsdx5Nl8aV4NN$C+PfhxLE6a; zQ3KH4HTWlB*1DkUxdvwthCVfLA%<#D%D7R3Gg0bFJlO_OR$6sM9lwF4B`^zcYi?;K zamTTEaq#shvS_CxCQ^Y^&4M$wMnwi87T6zW?0%&wAK6$Lte=Za=&ikO29mT9$Z2mE zR~S)8n=~al7+~Eq>F$pnBEa19roa>!Un|}zZDMlPOnFiz)XU#C3g3j$vNEJ?#ZMd1 zl=WMMzvyh@0QctzXlrOdHF`5EO|;m&y+{JpbPBk!6J4Sd%!n+d)2>fb-O><5G99z! z<{$w=zsO*4OnPWUnAdhDf|xV>0?krF7fgYG?hEATqxgt$*)EhF{Tt=oVZMuTLANeK znDurWDUmawM1*#phIlYR4BnVB#|@b9w)u=gOkT1D7)DZk%3>7%Dhi6m8@M4%aLqmr5WUbNWwR|1C2&oQFVkeN;yrfH46GlM=b1`#Ya(51Q5+*{`!~wz;S@*(4cd_*bS`x!8hlT2cS7_$ zfqXoJKqhEljhsUur{U--fdEM&cMf2>l)+F2gVhsQX%ARZGzqzp2X;kqH@`GW4jJy? z)N{2bN$0&-9DAp;@em&3qWLCcr#?pUJ3A9NL7@39NyH^`95o2g;>tC=rpTrqtBS*P zSIK~Q{v?JK)&apL>aTD!>@$ExB^tRBagEYh5~-j*0379!Q|S2WYE%i<`P!M?tEUC= zvA4*EL8N|}KkGHSBrz=RtinOmd4ed&PHl%%kv`8Wy z%ld>ccmNeeiiFPkCX!&h^9$ntMxz)F)I<}E?!x<^f-B)RI8>s|$6-MuwRtj91=FEe z#~{#Bdkr}0IheZFZ>klJR`{)Pi+8uZXEIK}pO^CxF z#&!hQh{wooIEPs~bMC(xxsLz`yBa%0<4zT<4uPwUog?%~Mm5f~Y8iC&?H0P-cxm-}71YL0sBDg}gv^OpVCAaK8Wp{7t)3|(9sB<7}WrP8xc_Q*h z{z>Jn3>xz>Z7e3JFN>)_DF$GDAQrJqLj z#x9(g)lQ&|k@7aaS)4MELVl{q4AKjDMn?Bf-OH@+02y#t;8wDmL>NwRjF-&_plj`c z$Xb+Dq&HU1#9)Azz?i}(5ut6w^(K*nROI_1E^;zXrLr0-LULplLfW(xPWcn3K(=Z0 zU}C$;PP9;w8B|O;{#~TMj5z_h*cod z=Ok3z*=KgNOwXrdxYB#=_TpHif=Ig@q#1hj5bhrkuViO4vhtX!tRjsVc@BTHok%w7 zPf{u5o_d6`jX)cjDccD2Hh@wj+$=>1$DNEGy>01`tacTEdPx8cH2~}-0Z$Rs*$hRl zQ+A6AwZ%bpi-rM1CE+FPlPP(gvdhRW2)z_RmfnHrpy(XP1?NN~IT3YIPr+w|=5*Qz zc$H6#)By4*tHN=hRpevQ3*`DT{DXkkBQHlf_l@ub^H3a1*N51b5UnjIv}YIq=%F3@ zu-02q>hn@+X1uqURR4L8BQ?TU#sdp+RM*^Wp^6%;Vv0zlH9rGU#~~j?i5%Bh`b*vP zSSXuWw|mLVGG25u%q(F_9f|-|negswr?cXPpR=hDu@E&}M?>9$W+LD#q|m4P|1fv* zt}V)6Jt?bKKWW6x48#|VPGZDqo`Z~y6KkPofs?SbElZbZ`g)DHd5oc30&5YurevJR zt2?)ahPV%Tv?0KYj^4?AYoIP)8z{viQeH;>#?FCC^A3o9xtZpu2pePKK?H^4 zpFr60-{KXnf3i~#8mlInST(th9qa_!%m2?o7W7Pk9Lene=MKIFaT?v*5EW`mtal3c zKm1Ih8e%zs8H`37hdNu8Rh*q1+}crCDR_ji7cd^ip3LDmI;a;i?ZraCHp(D|NmMn+ zB2EgevQWE+l6XWa&~CadC>kM9+G-45xbu#ZFE|EXOoC7ISW93g^enIP;v29$ zFFSVMt=Qs#asNW#({F^+l_FaG-$o0rL<=JPJYZSf??QeqU94tKG=gZx3Fe7_5^tE3 zEe){l0x?s)hBP8T_4zQ@#H76f1FHwnk)^|6w4?{l@DsOc;bS}j-0(5dv++e}7%^uP zb}d%vFrZ>lgx?2e>bP$f#FYT`R9f&R#h|ls23dDI%&&39p!2!m?k5_)Plx8V38U&s zMD$oqel3Vx(PNnR8dhtF>!3^cB+LrB3)cW8t$jk|_Z$KwO$&s4ch`3^Q?${Dhp8=$ z3AOelI!9>L$Q2!J&>6=K zgMgR&sJqaDAGHtUf&Xy(RF2Z7B5Qm)52Xf^fOJ}kcr>=P_@@%Bm9+8>^Iy2oRHd0l zvC2eDEq|js4dOaaET%%(vC{ezR$48QLqzwV!!&n6G$ggP_&DU`SZh%}R(`aEMB>zO zPQ(Jap$;sc=@Jjixx4UZZ~_wnk)zy5g8T_}fmwhs^icpJ!D3n%r1vLne1ioe*99v| zW({1RiuOIx6erxEmuG}`5kJU)Q~Nk;#8d;(@C_uf0K$o|9#$_LaPTj5FIU!Q6I)K# z4u8cR3`I$N1q7aJeXA#m=@FAJu+*DP?Fg1$0_e!79Iz`nJI<~nf?Y@S%D)Gczr(H% zKaI2NP

lzzAs+>>Be=h{bfEMp0(~Ih#`>si?nGQB!l+oZ7@Gsm4+%w-l5rH<1SS zwdg{*njN)Z@=0v_ik9J(GX_O?nqAsPs!5#5=!-0O`Y1Raow_nZ+xKOh_~YcG!L?I* z$zOm>(Scg97#J6h=s`ULYoM7B4y9=@Km}h7sesK%nomRq7UYsH$*&x*O*M*(%TJQ= z5~ePo`U<>|CNZF#ORK_U(->v+U5gJJDG*m`hq2PwF4AfKk^hNU|9lKlLb2aYr6PoOmDeOhuoRO!~#ToM4o)IF(V z&%t)N-xqgO<`c#W8*(mT%^d)&hnUI@7r}Sfv)o7SM@GV92B`&o%wYXcK!ZmS?3mxt z53d~17cBV}b;i*W_#^Ju;SE0MmwSr}P_`tLnyigJ%wyXKkV4*+bu=#mp)YWFw6eZL zgkR@yveHx}!Us7#Lun#pfIr4zIMKr*9OH10`&}ML__1U|!p1Wqj6z#K=d#l|4PBPg z*f1G~C~eFDbOpLkxcBf(BQt6xl!I=^q5QKM2k4sy@z?FTz2Yu>?hHqPR!rZ-79ASj z49i?hf8mY@8_pZD)j1n}A!&GW7_L(KMu!uM1HMw?ln7&bg<)7MONfnMG8sgA9>}`z zzQ;WrKoQv4DV(S@4Me{oOHGX9Q~*+ipDb?h9T$@~QtG%O8}l5>hrtl8yS{|M*RIdt zA4J!)Dvf0TM7O_wkW}VY8h3MXdL;mxE5clNefFW(3sEZ?LMZ8E5L9(pJQssBS92JZ zI2N_>CmG{pmmk|U8e!B(#zJ`QSBRi*W|tUHDC{D?%@8A>0D!*gjY(|qL3WaSKvF}n zH7N@@F4C%C89@$~upAinEk;IM%Qz5X^s`uoz6lXDhvTch0e&Bc3zX}1Uv7V3iM~c- zJ_^wVh7IU5G$)cs5P5It%H8{6Y|>gf{XTa#fPdHsd`~extimlsOeAp#iobm@QHze( z$cx2f9gAMsBY;#>(r531($?Z*CE7&TRo(T+C=N;FfARnoTQ5XtXh^b{STyZ#^#psmeRS_z&cj*kIUK`}DZP0#Tm1PfA| z5C+XJG0h&Oc?lGFt-YDSWA(g2EXEih9)7s(NcU6#uXxU zo&iK%(|iDR5!>4iws64M)1zQkBl>nTXNI8cDRN<-Ne2zBUcygLUBj_M?xuc{Rh53b^S8}5E>Mu3k7IoY~?yKY1hLLGmMoxF|sI4H^f*r${`KZpPN=7Tscsi z2f%0@eHUtfr0)oQkJiqi?@Q^sK$}G0CHRJHEf_}mAzS1$j68*qRtf5<b;A^b0~9%G5WW) z=diLAyN1XY(j!A8X3^rFC{esy_<)V>DFl!A<#Ckg8FqbStwPCri^-crLOQ`b540*x zGY}ie0Ck#uIEmsxNok%95OC*trWx9TJT5$*o%3<8E(#q@J*3j4TXXm>kDj2I(b}gU zfyrOccY*c}eSd^+{jr6;#fK08!sE~j#-PXwk{B`>Nk+BxE~)TtERI~$ObVBl#mLWQ zz;(~ZCV>`Cq5;A;i1erc!5GP|i5*xP=J67~H&G_9`WVXx-35fNGL!YKKzqRv>bcbU zpaG7o0mID`A$#al>q%p@{SC4QwLx3B;8yB}-4*=>TLYqIB(hef(ZV>xup5ghqLIm= zS^O(jgFBhW?-+97r*BKwbsNJaonq9cvFDo)A?V2yFOXJCEfLvV%`NyT`Tti44M+{5LOz;ztBxOhRPXdyAS z57ce|EJ!$9Ah_S3>WI2i9h=AlAp)6VA*$^=fa&ehs|AQ@U!rM%XDkYA>dPJGMp2BR#afc<%3H@15C5z*TM z>Br$7M&18`Awuz{ITeTnO_dgw&!cw;F{LR;Ws25>EWK!>O|bFTp+IOMmyoSbpIzD{ zfJbg8x>807|A!!nr_Wn;a+*nyNV#j5037p-o)W39|Ne>e00cU&VQ@0yq;6|dny*46 zfpds6XD1fN`3^%)N0S7!Jygt?MLGgAA$BI zhK7CHkD&iW(E9+5k@whpBqla(mB@4)!Dy|>bb>SCwsjt4Lt~KXC%uTrNifKI2JZey zXza`u=V>CR6WEY3f|5K~d5%RiPU0LAvOMq@%QQ(Rtnh3@M^@G$x=H zKXTZ-Y+K&~kYXN7kl0O|4ai6qLfQv<{px|4>Sxu;5F>U=>@W}I4A`>98A>R_$gzSU zQ}hfLZ3<%8tfeXpMRb&giw&0nnyRpla?J${Yd06t1sncz^3e^W#YpSx;G=$Nq`<=1 zX2ZfYEMDH)Y(pBA?7^7D7FygaA}fyz-GS0YQeU)UUKzt6dot2^))-fph9YM9w_pw! zd5g{$!&ea*M~t;8>n&8ho^~Zg$lD}|KwP9rV@LzT+Ld)#qKnZp59{q^r6lD1l1Ob^J-|X!a=H&4bt@|yK$K%4xGt5a; z3~mir0HBVKwZNQQ4?tlJV6!7->S^VbyF0jjI#3*u9OhD>G?yUUHV3+=*S1}g_N}{T z+b;I>^ZSc!Re)-_pksWA*rSVsJ4-vx9KVc1Yp1B{>M5tGc-63N8*ul)tyrR}QvEK- z_S%^p*mE7ZmMWWa3djx#=`u~A8e^<0BU)}jGW>c##4a437_D4-oChj?W^v`x4i2#I zzOqQW<4qF0z{2%&OZY1e^G z+#5#%SIdIVmW3*vReJ*7mLBf_b0|qukR|euiQwzHQz1$mTcG{>HSUPiZu+_xj+mgT zSVE0OJ|pNO6R}~HtM5XIbHELnJ#qHw+BRe-Zx_u2TbsY8jIG6A+;P_{l#yRi2B;je_sVDD}+KdzbnKae+K&qtOk{pz0KjW`8Rm zxHJyI!2vd!C@rz^!7_dO0VH^w;a(dj)ql$n<9;(A2fI+C4OvCB(lHs%eU#l=M14|k ze(hXrlI1RdX9AAu3ZMwzU(*&}>KYLE<4^{T6TOfHI4U3(IA@G4WpJ`IPOJjvo=A3} z#)yYL%*_Q$22fSFkG0%N+!|FPuRP3qEZ^04{A>k;mh}o0BKcoA`=6jNRy>a@uJNFE z^X51PW!oIwRNnX}MC@%oLaF!<#liK@!4jc3ePDKr2;Y8YO=docDLbd2bh+@dWjxA)-MfiXf4K-DTu?(CCmcVvUn&`8rUbh_UDE zwLjUF$kiUWue=;bY+>SMs3W@ZfxiM=QbTa}tg z-&yAE<i4P~tiT%zSb7b`Dv0IGub{Odv9Mt)8l zznu?;1J_{2g#~Y_eU$7JL@wk=`1NRr5Cn?jX5|0d3uV><0L^=vnE&e3@am>E4E&1* z#9VbNr@#UB8wOwAXgLQp(eA=B?v5i!Yu(;U8woG2@aGvSVlS9Zn{UOM3dM@up~P9; zmK50*AOb`Bws!my6dTu^LvLWZ z?xaTJJ)Rf};(CJ|dzA~d)Ayi`XX0BFt}BW`h}DVWVW(MW)Ja9a+q zQc%=lG{;kRun07EV(vmU6%t|X72QO#i+1u&?lUAj^fCm{JZcIQMSbUnY4|PChKl0# zEiBrHKhwyd5q1@K*k6^jcS73CA(Ugy|y)ue}bY8vVcy>RQWVm&Cn#ykUpunqpueCb-!vRl(S7r25q8rFwve z<=ICjlq4ywG#<0*4O@zgl1)%J+}ri31(dxup#*c9P!AxKWfH-zAXwrnHrv$i=DsQX zjNCiPp6F=#G~ONe8mpl2<+P&)R7sxw&BM~k)&`o(y?DVf<-WI-Mml-G$syk3qlxW1 z6Eziu;4lmspj*k?Wn{RiU2GA0v0hc~`(C+;chECor)mdZ;t~8^?m_Ui)gWKQKNT!} zVv?A%Xd{^#42z;TvCqHHuA~31fNM|yo~Wf)NLz_XU`B+aG`wZ2pO&Iey+ZKd(v~lF08b78RCNT05 z)3VYe-p@`4O(@d`w30X#nT+!Q=(TRR%Vq5aq{K0Sj*_HkW*_9XBC45wj3Az^xlcB# zQuHgmcr0n1vo{|A*)8OcQjGA|hZ&(+UVylMiD= z!-1ne0W~j$h|6&_N~`o}Pq4QDI}>SBC+6fiSUdsx>gmMEk%DuPHxSYmO~Zn7Gfxiz z@CgHqR&HruUHmg&=fL+BMZP7_L({2`V@GH*7{IzpKTL;R&s0jKsyzb`G1CWa!_I=G zr17|NoXjNbeu1#kHdgG572hOkq8RR%9IKz;j?yB4fYT?1RCh5g0^9|MkTvcx(27tN zd5x(UmhjmxP%(x_;eTp()-}tt*bXqYmuFR<3HOqL1pP>UgZ8$7?a&MEIg&qnyec!;761&&Ms$CLD3mU$Wwp?QT;64K~#K# z`9e&b^_>7?wI5$FK*se(4EM`G5$-O~u4AQrkhXCqX;+hmm3zZtg2=jLtoAUFMUUI4 zz5B9_d;p+lEc@#YihT{ki0~qvYTzLCX)st+NUVw$A0(S$6zUF+T?^)r;oVGr?#O*J z!KxOd82Q+{@OFuIBbIsL`5!{`ki73Lej9&bEn?5F*aLBf_UrS+SvVx#X4*Ci+L%LM zp_Dj>-UFOy)^wntW?e*@j0Aw2_0K3@G%M(P3pN+I2#!K4wynfO1mgxRutq;d1k#@X z#f_a~vAY#|B{KIM(ErR#sl4raNCISC$kErN=fJMvD5o+_D+d8AY%N?a%K|o^jX8(( z&p|B;?FfFYDc;Ao;6$z>qzjSQb`8E5DTH|=c11Iij{y#(DkI%rqK#ps`zZ}b|G`KP zXtw~0#crQyxjj&JAb$@qHg*=)-P!iGz>T<^Srj)~X(mQT#vr7<1}t3IM?j-%&jZu| zx+G&DOPqyOmr>f9ZF*giSRUPiHC$kv!WhRX%>xMIYQi`j;BEQ%GMHq?N;UFNNB-zC zk?l6lHeP9_Nmk@V%Jw(PwxL(H`?0x^dHdck$e*s+xqR?vxKZJQC6z&~N>F$7IbaV9 z>~ApkQ=6Uy0y@?v}m-Ppzuun^J=-B<~1Y_ZU7 z1xdidD;;8-o}wio6{<$X4>!?G*c48h^eJc@s3t?#Y=BggbhZ2&;2GNITXC(!Mo}nd zy9C*wNrf81$_&}5ldMeJq$~u<2o`7EkxVG@Q#EY%q))wXk*3nrMcOqVU5aqTOqr_%Z znAhv!QMwK5FicE`ww6o6UZ?#Sup1k|uJt|?YP5!|-3|>OC0(Vo_D*nXf%A|+(;yh` zk3ZYffNpIVQXpH8A(F@O_b^i<7I%nRRl2yw5Qaxafc$5f{1;H7mI=VdrH3S?*$KR0 z@0#L6>=D2LW6-Pnr$8xA%&;MoZ3~f02=HYb4*~uG za6Gs_0_?=EIY0v`5Oe(TNEK2If##u`v;$(qum@vB7*QQ7XxE(B=>0CnU(E+>u+Xyb zgL*GCN?XjO!Cstz1lV2z4c2hZM}jDFLcBM$_b1Wx zV9pV}iG=NMx&Tc%9fe0v10SP=8!!rDN!^p#{8d{Oa-bPkEd2@tEBCs7l*@ks^*Wfa z2Y%FRsqdNMT0xT1wA;^TNm~6he3P7eD^qxoHV;NOiL#2htkaZca`8uQB+O?4Gp>IL zqFju#;?(yrZ8)&dj%8p@(XIqYv{GQWhcTS4H2;w>yhj-BCk(jzf>TB)tuSRcr?y(` zB%h3tjfQaY@U)d605gR91H$Ee{#}%$WnGBH0q!m)VPui(h;-&fxSybxlKKTTMSp0`VP!a}o<%?*SgAe8#2Vo|=(p zZ-fgjCN32#%{P-KEJ8>-g5sieJTjxQbwt5pM2RBIT*(K=a3!hY$)HIj5xR32on2?T zT{}yZdc6@H7Il4)!})QS!807jJr9LQkL*E6n|(2OBz7(Xy;x7wim^n}EjHHDwSi#} zfcfBA4;dsdbw%Mm*R@87U)b9V7fP6JY{eN3XlUcc*27piZCMyT`O?z!1h-P5UI3a*t-2NwA;zITVi+NVNCp!06DL__%L=a9*!>&uXw>s zS)}?e`b6((;^@mLvM3I$$3ob#P}ofQO0;=s4lGVV+`;2xMs0Bv>DZbQsv4+fS2Q)C zs3~}CRF>2g??%Z-q*w+NRiv?md7Ey6h!#A~BDtT10V29Y_?O=MBZ(;PcbP@=kAESg zeFSQv1qedqPH-~D;zl6j{#i=$6ZxYdvefqRQ@#eFx3r^GR!{O1t$~HefYu{%p0=3= zEG$Gf!-S@qz{AHo2Y5N5%?BmJ%_-}K&F|i6bN)ZLA_-IKM30K|98G zrHR}xD<;kd2FNP;A=*C0H(<~c`GOd-up-U)qrJS5>uLe%WPkKWT;s$?!}03Uxt_oS z2;(F z^>@m%6nT)ciBnMDS3t#%gD9ePdnfeW$py7;p;)AW`zNPGwi3c81i~&x2=n1=AdJ}O zASGdrs6W1W)5%~eY7gN43v{`ZDIJ*%8-Lv+q=3Ex0T>5}0@!ENGJ>eSO=IM_7tAixql2tzK1LjBJ}$`YpdamF*zlPBY@x{3W)bJ1wOV+eZ>1o1@H`}3!*pz)z0&Al zp_W?-8GFF>Ej@uzkZfoU5dAC@JzX3Kh*XuLP8(4tc3xv62o=RUE4169q<;m1Pt2DC z@Y9RczhMq~&cj^$s}aL3LUVL7E6ZLS0o?zw1xN;XWDAwEytJoPeuB9JY7R3JT-(Bv zGoSVuqK!s)58r#uM}bo??8o@mC1`$%Yc21*?9a5QdczGje19tTVgHQCx9&A*V_yj$ z8N1heaO^+4`^Mhj-92{G)Q-Z$5Jri%#>^@VH+Rv1_pEo&IZ#Sjiwc8YWaJR|7;yIK2 z%S)!L8@8J=k8U-ol4&wM566#FfAiGlTg*xHJTJZRI(xBrvihb+)_=70?VTWzlJo~! z`y}4G$4CUGJ}Fz9AU&K7DR>vIPvWm{=-I@BxP8*@8Yl8ySXzrmzxpI?9Dt-5HCJ3T zqgwhP`d+(v4c13EVs>4v^zqAg@46cI6iP|_l=pj|-L*e~ZVxxjENz%xT~^*8y|C}a z?TJaK^!(B*O6$r|*OIz;2`if4IKJ%meMDFs0_2?xabWMs5O~qopptQ12WNl@Pi`Xe z!qO_~?S1P%u$bo7Tq!;M+Y7&$lgevrr8T>6Z%)|gm!w35=&hFPKHTu4`8PVpZ{k;Q z=atSam$*?(m8A-0UBmAtzOUVUzcsPChA@4y?TLqy{>d3@E-$aen~mDd zkA0bxSTmoVzgr+}+w}J?%g!A@oQP*~YU|>K-S-mWdj3nATvfB6eD>TLJWb53-M8fV#ivpU7R2#71LAjXy9_G{iEx4Cj9ts;tv4ItMMp3 zN4-;kn5h-jWzsu`-}t*Z+6>Gbo`m<=rdE_!l}Q`^ee)Mr-`z!739wgWb3AhTmGf)x z2;8TwuN+_UASQfCdc<9=cOJWj??6b>ALHX<{`w3RBVq);+gn~-lkf!XT}t35hVI*N z>-MV??||k`I;VUQS5?~m{F=WvJim*wB96g+-TvBhW{n06ikgKdcAmcDotqQCx>g4w z*;}>duQ!^Wd=fDU=g^agJ6_!Q<+6l*XX#<)V8^%Dwqw*v00s_k-u}dkOGOy(%t~*@ zZhn4Q!t2vf%&ht4)zZs9|GM+)ueVbn6c$Z$*NsniHGHrdk%_a*tL8C%kKeTACFvz< z&IFLcsP}yPVJq$$pm0U?6?#*xm?|LZQCQng&m2lfIEKO!ORE>t3sN`V@%g-W;o(c1 z8!4?FF~*3xheigD8)rnVu(&6l+XQ( z4z_OV{=>`eyDuI+seazPa%T6AH+Q_7a92+TNDV(rT2fk3E8TY2BRdj1-=*><6E;o} z@6*5a+Lq!Y+lM9<)G0IS{SQP$MO|H)wCl^KJ~cnSlVWC6RR2YKaozXt zH+;B>h?zNSzVyL!FMVS9@mop;Pv`+f(dnN3WZS!m8*U>o#80or^RTF&bo7~xuO_V6 ztVho%t-Yc=o_6amN2l&5L8Kfr%1h@-pMAaR3(E};>CopvGz6BW?t30s@(jrVf$BZt z<*&N#HJ=cX6;*;kcOE4ekjXsVcRyj8HNS4U&ePc6^@xfqE3Pi5_caBtZ=ff6lDHWq zX5(k?5T26S^7$-2M}Cc-SoZmy1aw|`U43n}fO?#{g4W>|y13O2enA-#bzW)p73G4x zZ;80Nsc7p%pLK0ZdgBNK(L=Wd(%+xI>6rE3a6cd$#f*?v-0()*k`qij$DAX5ef+oU zE${wIz~E8Tx!f`x8`izLbUz%I$OxTLYe>##-xJ{Zi|3zTju!Z_bLHy9haLv)EEm%8 zf9DHWwvcwFv$JVmU7lO2G>3LpSnU1>!%!7)JTe54TiGT0*=C2$j5 zZB12`0f^RQPQtLKsE;$6JAJTr=? z)u0i&Y%h3V!cg?6kqF&ygvN|UXt!r(MRh!FlM$jca^08RFJru!$||?Zvf6WbZF%Wm z=-Fk<3+i0bKMU&dA}m85Qs;t8Q=p?nSejcq7uprC!FE~h^31JgLq#O5cEI*HhaNGU z+1*{X+J;aGy_srR=fP(UYSv}Bg+9sL5Ls4u=Al9K!2RkxykBX46hC-6(flxe@v0?L zu|dXzv*Pmxe9m4B@+@0beh`z3SYfL|JDkI0W0PZ96NkZpGAK5Yag&P2h)b*H)8m(> z`#i!@>QYld>n(B(*dZvn8M*J0YpP(rT`8jMO&-H=5|~!YHT88gw;o(1KlwR0m}Tgx4uxTPhKw5tmiUn%(72qbsN2y%JO_Rp8uR9D!lI6NM|+3N~9 z6qi@_#IDD)!suQiy9}wUgZLo06WMJGYU*oY9l8fPd=3@=d-$Id&n+G`u@xsN?@FrI z;#G#(ys<|TpwOl61lwG^lAE}2Ze)byK2`Bpy!N!%`;<0A>Q1CY&wj}jOdV(sI+6qF z?w~SO&2qXe&n)*Gk<4mr4Jq{US$K4jaG*(SRN2s*k|o9EO7htJvF$L#FM=%$nY5uH zEK3@szyV5@Ir&7=w2G6H4@oY?mgUa3=h_A&I%3<+lWSn(VPr;jIYMuN+vufCTSKkn zzST756g;1u;rEXo=WtuY!(NiC=}C7kbNysWaK)ar!ql!PI}=8U)Rj!&0SeOYq(hfZ{PhwhYI zzSG~96raOk^TghfX(H5XuG4My&#NlMla!()D&DL@vq`z@O?Wj{^-j#`k0;vm3MRVT z-n@d-=ieSGbnQ({S3^U zaMIranJ*!saAInXD>-LiYOX7!|LvceV@u=GzYn7HzB94^vGnWvlpe=xOJ|IKO##L} zQ_24kVZ1t`9;y9Mk9;P&htM_Y#Qho!HRbVX+y8_(yuvgZ{1(j@V+4ICr2i!X_xI9( z&n358NzMLT@&+6ZS4w)WLyhgo>^(p1HT&x_+vxF4o=|t2WtI!~&(eTzfyCv@%peS| zofPmZ3I|?C0ME?&U3>V$=8GK<_eS1p^7&sN=bUlmyZ-~>gz73n>UW02Cpc?3*kLItjnU(;O+TY3aDmi zG5bc=}K6H&ibFox&<=#Tav>Qi}t5UKRPz)ss4wg zbf?E3dtm@Y!g?|Ko-xvN;z3v_jMJS;?0tsevBF{_eIi$3X5}7YcE-NsBsdb}4T&Rn zOLzhr?{|j_Y{{;Spg)*vNp%No$*Dt90>Na9FSd3t`xKy%FgRIc(tYkxZcpsN!5HL7 zPgP6*hrKTkkE+P}u1-4XPN%zXC+TdEkewab6+|=%iOUQ~*hI&1K@w;J1_pw{3^BnZ z3WSIYDk`Hyz(K_YMGXNV!3a@N5m7<5hz#78$V810wV}V?sj7RsJ4DBs_x zee0Y$b?VfqQ*~=SH|hd2N8%gDY1RZMzKCocnARmNF8I~b8)8zQqs#XG+%oS-ac>Y+!_4y%~Z!vy>DVOG@Iab{J_cF!joLrxO9hzg8zAH>c}bdh^mcz4ek!HKK; zyyM`HT+H((#7CcCR!3NpXVqmSm>>{bHW3xL5LM*+EG|AS-t*;ULc5aDLz0nMV`Ozi zM0-{ZBUYkrF#w=iU4UA3%#;j?+Wrl5M44lu`n|(2k{Uk>RK~lZc;2`p@B)s)P~bZr zC#te|CbN#P$9SrT6Fs-RF!MYXThHuH&ubjXrSh5}bnI22{DLE;jhW4`Df@6!r01LA z1+%A3xSGX2Z3uNncTo}(B71d@>)$mYBB9R}U3FRlP zrxM~ zF`n-^(oYW~V`DvQt|E@Q9-xN)_DD}1VaFHDgJn5?VqIf0`auI-WBS`->>1JYf?M9e zXr@dfZ$}17(ZF@*MtPxL(0$k}8sEQS>F?R5tS@cu%VYb&0^?3Y`k zJi@+&GN^<` z(;@eu;-Pq2F!!b>{c$|z;2a+=zNxL_aiEOj zafAlzpZt&0WA%aK`s4Jp`Y1p_ z-=DF~KZAadq`%Zh&-r0}ey9iWSIYS84)ND8HjmQ(LB?O-A$|g5w~{w5!Z z*TR@d4(*TU|7u`5%VwWE#NYN7W2N9@dAkGMjt+2x59aCKVQdJx9@_^Zf69}~yI1P( zUu1JB{sg%$ha8rO)tb=8Vmlk(h7N}xYGL!jsyIq$GQ@utUM00NnQ9^aF#_bwDEWK(ZT!ZnN=X*w|<=bDTm2b8UCuPrp?@p z{6>`oar;{DT3CW@HI`G!=f{yjAQTyKzx#biGL&U?-k7TN$^I32MbuI#~0h_Pq*Kz1w7{c zym@fb&vM3dIG^CUB)~Tbn58~_cLc@XF5s}^>yvvCJYB$~|1l|mi)8wib!(3kJkLj8 zM{tP`o=Nb10uCMY*355ktS#pO0qgDeQ4TX5t`TrqcGQ_UnEvOyAm|CcQUToHgBOu~ z9}w`+t}i}-?>(}de+iiEV|g;*b3QmV4R9z17HA*T-r`7}NC8v%^9YU?@XBwl*!>#8 zDFW^_d7ihL;64IQJ9qw_zYsh`z?9z_(&rTdCVd^F{w!C(q)#iwj}|cTpG)vW0Tcfm zf^QY@=G(rB>q+o*0cR_Z93Th6IkN?vx9*)nDoEBs4zv6FsFRnFJ(L@HKTPly1Xl?- z(S9iUc7j(L*#b;8hFtaWZ9M&Ik-j|Delv&Hbbz1t@n22pUl#lhPkb`}3o8E`JU*Yw zXQB4IRlt=0a-!eilV>Hty9Av2)P;j(1b=8`4*&PVK9Qe#-3Oz&Jck8*+eFK?96l~! z{e5ss!20{;I|1wV^s|5m&R&wm(|ZN1w-=KbT}^7MDCY4F0aJgpmgI{K;r)>=Pojvw z{IP$`uAunz5dPlPqnRG8WFF{_eUT7Dx#k#=&AlP3BDzS zB|%?$f0Zxj_5Nk1fJwK>=+6`IKMwz$`0v1fEB>4D-v~9pobqP(40G5SlO$ZOntnoXSR(SBF8Rb+L!y0%ImTma*X9v(f z>es@wct`AMb(HHU-z7l1NPQia$PUZygz?)3ks$VswWCnL1a2t+!B>3o4BY7uMdGU_2o}$kAzmCA=H=mG zZGV*SkNGd1%FR-_OU2iV=?4qE^q^G(dQLzE@s(U`sE!(i-~yaf!uIf#1=miQReU`~ z%Clk!kdCn9Dnr;&<)P_vJd1pNGRa zS@{Ty^#Zv9g4(842RtYbJSO|CSP;k;H7G!(l8Z=M^}v`IuNWEV?4%pw1v>C}n?Krb zS3_Iy@35$&fsljIdeSHtf6zJ%fx^}(#4U{iR2q8nl_vyfsf!*miCm{5jFx0FCAmT0 z*z=vK({{1-9c*pqnvU7wf7abo<`y6@XCagO)?($47VG5(wcMPZMq9x%XhVq~xtmdR z7tX!#BX{&8_{^e{C!k?C&@`928k`8gb9T}6xzzK?Q+Z;SSsudEc9F4NObm&Rw|w-G z+D7p_h>HIr3w_6Up4cg#w{RX#x3S{6Q|7QD+WVcx&oi)V*=Q6C2h8v{75caX>o*iG z!a;$VQ(Zhfl_G$fK7Y#G`~q~wv!~6aqZdUu{BajjQb(xqD8k_v?6)(>iG1#6GtlGC z$4Q6j(~*$#h4yhKivJE`;yFYUST^^SKXn~j69yf|zETgdJNO&ZGq<}P+QyAGY{JcQ>mv@kXW&zT&WN34)?9@N5k zx_O`|;He2emE$=Peo71?bl4Qm94r>^RGStR@Wj-Ej}u-=7w1W;Fm}aX{<=7Rb~pd_ zqu%^K<3Hj2|I1@1?5FDm_WwWs-_Qf3)c-Jzp+7#B;<} z!ZiNE@p>;F3`07W13a1Bf^WI45cw7=&2CUKS!INXxqM(jWYNPQF2XF$ULpj$&$h>uvCzLry>^-++q- zYeATwSC#4U=Cuo-F7l4=?huM0IchM!lq7AOod48}0k&KX=YWrRJEht|KkL`8_Xn!Q ztpRx_$d};131xvjN#;u{xQkN3ohf|=vSuHsM9EsbA(H`2TU>IM8Ri|IR$g*8s2D!A z;HvWM60?+yfBIqa4e%#b)9#-##DLpPx#nr*!-9&B2ht*^@{xy07;*8Zkkt$VwWdz4 z)%vwqD#Rxa1#+)Xo{=0u~*3f#47+$N!=;<;ibZK0=TkOvqM(Ka(k)AJ=H%c{EBR5wYKn%*3SF>;3-abDvyS{!@2xbqzIBHtcW0;}1RDEFp|&~W8GdOt7A{W1O66`nX z`N!i+B3pke-pIH|ah*Szn1A}S@U7>co?aRL@n+_}`M2U7%ss+Co>bzW{+QR@)jwX7 zpX8wO9r4y+;Fh1k;5ZKV61j&6=+WW(#0UrQjUue&;VP~ZpG8Vqn)xN>*RCZ95yfx~awi|~R-1|XSgReB^ zXVB_LU`q3^r-aV1dBtk5B0>f0n9}jd&dw;=J*BgQ_rU<^ zGlHaq}ic9?sFMGX1 zu=7>51yQ1I&tPBY*XlG2O+)W+I@W3DHK?`GKFFZv7=+4*k*#wNMo=UTS!6xJ!Zy%H zy)Gh92f-c6sC6iuS+SXzNfRpdV>VA`7R=n!bY{j5%(UKxGixAbv^r09FvyP??N|xP z(EG*f%tC&PnLW&p**~ShQZWxAESQBb_a5EqLw}3e&Hl{j@{6XkWG3j5`3+HAF()sZe}RJ}GnCeY zjH@o=N8|vz`xim7a=%7cl-k1FpNk0a{;`9g+S^Jpnrz`8zI@J)5p{%u(T`qtwa(~= z-)6K%FuKK$(Kwya4_#u-PuXw!8dD9- z|JNE*8#ZWvXJfhz)=4k)fW|Z^+^;cpt|l}lpPJe_l&*um8^8{qZ|Yo4ZT@P~^t})I z@E>MKH94%DQRiy<0oRx>R?}ah$6r&^huF9Nood>MB3z`Vn;?$fO>}OSP?OIr;X^CH z2()fOnxzVM7$bD9Zw#P(`bOK~jQUA6$+pA&`N5hlv+;(~xxUd*E;h@qvUnZLvJ8y= zL$kD?P=WfEBg)$`7?;Wx9l%*xh!GeXk!rQxgkDoM?;&S>97Hb{(G)P)@eLK8K?;HH zm?bhW^O2bxQUeH9mecy0h%qTErgNUwfZ>Q0gEsRt3`gih27S4A2OOcnMLA_D5{3%L z(C)E10bE_1=^GCtfe~*x+J!=5K7!%jSQbf9XE?H@v&F|gd~NwNG#IHgISlW-1hPg^ z9F!nW=SKa%&=KVdlRK_QaV>o62f_v$0SZyE=jIdjC7?A?E3@<@fy`k&m3kEK#P8C% zDgNAU)4BbqeL!9+yTVuQBd|B2D)hSj^b|iRmB|1^4bWTDm*Pb|#Sd_`&fNlZ&{*Yf z=w+qOmFva7B+!emB(%4!SD~*YZNFZUC_M%Gv)@&cuP}%dd2}pEd5ME5%c(*aBZT@? zmeYU}pRoX3hLBQCZ3L!Y#r$TLV;oEHnVejwm$`Q!n$n{0Q>w4yw2p@M(2#lxPI6X7 z4xc1HWMp1qjNxgj@J?>NDx~b!DcmzCE*FffAn^Av$PK>lX2U?%Z${b(`wb|ZV)pJ6cCD{a2n&rQp~`i;|G zG}jl0TsQx0wJN{0Ozv6&SZa#^x#lOvcNU?d_yr<+x%5>6k3Y-bCiT>1jI#525OunX zOU!Q&Qkt=uhIz^ZkK%V%$Us`Z;@?`YrZ?d3Tuck7?yMt1(AM&m<+MOkbGZ`}m-?^~ z=!UDW5%Ftt2{*C;M43u;U!uB=FzuOhu?Rz}JWguT`86~Bu~v!ohAajeVzx)I{3N9u z3v_5x`MfWOxH-^;vLYME@{y}Rh#ZCj!0N}j169!t#PMgI&r;)~ivZPpN+>OB%H&}n zydfv?D=SE9(>ruLgrWiMdvF>PSb61*Em(m&k2G-g1cy+W;_F9nMU{!n#M#H%SH8~)kN@tkJq^DAc9=$!CcS5xTkbVoy@Nt-EdO2uXETq^~2BA@W+5B4!m*s zH&XIoNnPp$tM+Udu$o=?5OS&B-)5_l_p#WiY!wOAYlA0zxiOlR79r156 z`$Z=_vGz-Z%SUE)<6C}{z}`Fb2-IG44KSi8>e`72V=O3WFr-AIC+nCAg!&G=f#O@K zS5Fu_TXXe}dNFV>imt~&t4@WlZ)qajs$rKSZxXy{lvDE-!Xl^k-68K#1m(bAbfVJv zXxw!r8ObvE*k6X%M9pShu`Pk-$E~iNBs&htI*E%(qB!V3FitmHw2*`NY?tR?Li$tQ zp@WE8{Y~m4pl(0Hsc$E0!$s|>&{*>TVniWZ{fkB)@FNGBFwq?-weTm|iG{j8KzeCv z+-o5ZyHv`rAdwaLN7W3~6$-;>gB4nJ1i7s(#7D2%YMjZMK%^jNp8%bDKh7aYJ<1U{JaxlV%SZlEaGM9J?H9lVpXURf zx4>yHO?z=#7@r@tRjX)NvtWb%B~VLHB(kwWLwRHK_IJT*>8bVWwZ_B!G-{2f<_W|K z%{K222}-%xe9A{EgjM)=?rJg+)~#(|C*<6`nwUn_nR!h{GPN9<@HZh^&k^I8n)!Mj zEre}ohrvGT!%_b(yEqtI1|1a1lOrL}I`UNb_YGh@`3C-VJJg+bz5`BHaSWT`Lozkb z>pWE{iELms=k=J5{dP@ks#Y{V3ou5dXiQN)6i-{x5^iE;ncO5p1>*(0dtX64x)U?)slDUS<38ra?MZE7#Fw7 z@4nOZ*TE{k65LA2Dpw->TUH60fWoPtqewohygBW+tg=61b*o$j0Nik-#UMleeL(rh z^@Nr7`L3Q2z2PSpk^2unuvvb=fWG*`GPWf5d|AnPgR-*z*?WUnel1pHO7jjH)5{x; zM-r(ZPu1dsW!{TX9jIJh@4vi-UNz<@h9@E+p-O=Y_Mu?F@8p#?{IW1;;Ctm?d8!&R zym;;QX|8H$P_4z`Fr*d_5ZBKCvAn@tm1D)HpYhY+4tnQ7OwKNEZ(wV>v^KDxV$}xr zTGtZ|Y-ilz2DUVMe*<%OX=-52QS}Y%k*L}Rwkz^g&_!%$U>hUWG_X(OS2nOF<-rDa z&W=mq8|+IO*g;!G1N*zJtbuI}YpZ8Zg|*bPU(6@!*&*}cdiHX{e&Ebaz?rrIXWCrP ze%{6Q?__63H11@`d)rR-cHfmd*)MGQPIiWs?PP76OVe);?}^+LG~})K%k8q;43$C$)C`=2Uh3>eTk} z%Tt$3@T9Doa3W>Hg#9VC6B<*RCTvSNFkxegI$?E+I;kS1eNtQUk{b>uuexD>@`f84 zlWT9-oP6Mhb;;@t%afZXwp6H8*bdzt@g&%-I{J( z-c7x+EwTN^!--37YD`>p)5gU1o7N>R`P1sera!GrJn*OGiA){4!KmI-Yus^9ld<}q z1IBf=rLD#dqnkoD+@$d;i#E+WbaovuWEKr8qaUrF2>Ehqsh|G5pCb zrEiBkyQOr)l`m{5ZM^ceEv4UIS+}Kh`IS4jlpY)T{+7};SMA$U`rWWEx0F^7Kfa~( zwc+1vDcw8l`z@ubhW)&y6!+Ngtt*8YEUPQ6OMSSm)RXXJUFr62&(@W;CcjWu`pxjy z>Pm4>zYfvwu$^_KxN`q~T`BJK@2e}t<@qn`N^#fzIAX8*rml2XBm2It^kk2p>q_0- z@7-Fut;e#hrJwb9cx&k=-Je7#=-I8M&-H#`YiaarKw0aymVTJNb8G2($NO7LmnQ7n zTKbmh%dMqP#2?>U`h3tgTT8!>`F?BZX~WN3OWXV3yRG!00n4_PzCPgLZKZEs^5nKs z+@XJVTPZvdys)kG)se4lD_vpO54&QmO>AAnktSIC`%P?H#9K|QF=Aa4+Z?fV7h7k2 z?DDdRZ$@r&>;-9Mza{2VeV14sZekxtc!JB!r-LiZuk2<^tVegVmDbbsY`Jy&PPWSG zx#B_V-jS=V>+4y)W9z%D*|Dkj@`!^yYaO38vXv1#f>uX7)2kxlnVxGSz71MqCFis= z;q-J?0l&_0>d@n(S}@Lr8@@TSW)ySW`j<{V7W~A!KpJM>QHU!Q1?=IKCz?VGI2+EP zkJq*?GqRwZ8FS$`boShZx3Xt``4X3)SrGAMwWr@JGX&NDQNp*f^`E|RC(+>YYRIgevOW9M*H?0%zWw-IdN0Cg@-uj8osr!QCS3Jz+XO)ATV zn~5U0>YFib1`0;8?yoN#H*CUks)(B)9OoSWa2n(MeNHZn_mk-cK8cIVt5w(w(PC@?+My_n})cRJ@U;1b$ID%+B)>cz1vEH zR3Z@iyOlkE=G5s$;CUB35c0$Kb#ETpL@RCN1{600K5)Oc$#l3o!0T{&e*H5I=S@vL z0BN3%4-tUNCgjf5ecvxNhF5^#fBtsx_JgZ`_#5Xj4}J?-(+|yUf2*eAO)9z*4u;r6 z-)*P}!5Igx{C~9UdOx^@)}A%5igSG<3C_4Ki)oi$goRsGwH5Td1L$? zBuej!WOjjW73nUC^qeUCB67_IxKZTXCJLsx$jI+6qAN@w*Uo`$j;J;Ib zBYDW_dCx$O6R}mm@`uq)Dj80gG7zDixJAjP41$B19fny2ccJP8WvyX$Q2`4-x#FJK z)KDeN9_H}e7ewt6ms&vVoHlzdc^!m@zv*xhQVT9-IIj7Efi@z{VNpD9a%yp-!;hY> zt$7_-EF=1)XAF@kmN;jssf(h7HLgAZ#;XC`R@jv@jeqdQ-x#NxeFsc=E*D4xyiZf1+Hb&VKgadsUZ)!h{5*=eTS&rMM6-c1A-PnQHOCA zlf>G~A`?x~cEuJIJ24PG3H-&`9sGZ!U2(*ODW0_! zPJA`D3?K2G(^%L(HsnM2T?5fMK_qGv9?ZzW%G~R9&QwoDlfqa8@O-^8yOh~??P)MsCJ2i*Kt2$ z;C;#KxZVTfMO{B+7<`EmuO!&IjP)?ZYU<)hj_q%cPrNd=hqGs|o$QH224Eu{iS{ne z^pv5t_yLF56JHyg(WV5@Cfeh>q&t$7czYLEa95Mv8q@0vgcF_7@Fds8)^)&p%ozjg zN%Ji23Mt0S#>FPDBN|67%-m|cj;3EA2uud0yPHKEVv*gVds@4h(xOv?6;rg?869Vf z0E0-+i|`3pgi=Tzzvw(r@Y!>~wZfm1y@^F8^twXn8QseggX-wxsZB)s3AiLBH1Q;M z4mBBaWJ)B88=TNDBFUMGdW&`@bbp6gqPuj7>|%*d86xF4lLS7aXHUte8-ZTO3yP1A z=VwtCxad@3qq;>n?eWe8B{q3rOwXup5F_66ZVD3T&7a2|sgc>e>_GB)bEm=&9uY=l z*wD(YT|pe@*^^4dylg`wK$Z`8K+4x_a34pPi1_Y9lmsU{VL2j|uAcSjpoD$GDYDlQ z6^TPVL<>VfV)*u=j0z!}l`?|az}4DuVw0%EDhXW@tZ~uto)0s?0z(zfVrw7^ucJpm zYWqJKtfq^tizOkcZ_FS^9E>B)mgpCbPq{pyM{KIaW=Tru$*XTuFYwRG&xa^~#@D?Gs(uv@Q z1_)LpcnJ1uG+w_dcq82YaGgYa&Xg|Q>lsuXn>Y*-CV5s20yA>N3TEvZGq2-rEeV&# z-iUOuy%W-6(`7xZ8BEH9>sGJhHf)b@5xkBpEtP#ICFqrq8k?q7+z=!fOQzoHqmSrF z@5^B4P|)9q;j7oN80+dXgJw8L5+(VV4esISs>CJqfYl_SvrwGr_9P{;OBAfI`7$Kt zF0HxvUdIPrVff^}^6y~aSjZxpNe5lfJbk8hco-60&&L2Jtd8<_a^B$3YDiSehccZk zRpW3GA=8L|+zriKS~~4`=V-iqi1s4LsZ{xUw|#Q9~rUkjRwCAr`A8CL-C^E!1j?at?*u zF-j6|Rp47Zfdh7L9a7`TvR6sv}nE?uao(D;dbG2iIc{N3=E0lwj#X zmgT$*&NZV=8TQ!tq4cy412*2-AK2bV7iEn%bp;j0r32rO(_Iu}sxqPgcF%*mr~o-L z?t+XC{)RF*>5f0doLc~Qk&cB}dGc%V#~F1<(0ih-Yy1#%RG0qtF43u>sBK52qi@nB zcqYo)JK036C%9%zE9U(b#+LcksTh#M{^7$gp!dUT#r`S7;4aqD#S#Nn8L5N7xSM44 z`uoHxdxl`t21YzJUZP-RB?k$j8@2CYiM=o`>7vBQlp8FtPz6(u+l>|K>u&+a{x^m4@8 zQ!HT!^-xl|Hp@QZN%=?~sSZ&p(a94VXqaAt5y$c3vBX5BQ+|#(&uNh;2TBsziL!Vd z6M8^S{@NK4kzr4ToqZG~qPw*h;3P|g z(hd3mHYUwxb?#)IvVD~N5A&%@3bkTn%9R4q_<*SpX!~Abm4IZaNZ!Ts8Bc*1GEbx_ zF|(Icq8+baXv5>-WcZkY;O!^?0WW;izgX%(3oP215s_{S4{=%(tx4vDs4FdZ!e?v! zev*dpAxWRSyfY2BVp$Xjog_lHqykAY3U-!4w1Ykx=tInskNL`x6{EDBSJ`P<$jP!YoOW>Qf z2~(#OaUuh}#B$pR-2g2l3>M%$bB@U1D;W zFex=-RB!5QNis*6BWx*_1a!TM^$PM?4xiI;9Ghn9ZtE7-H!POd^Sj3>FR`K^HGx+u zpFv~#MK0J4=7I%NN#9PXp;@!h6+kAbq*o1Gfc}00^s>a-P`{>L$Tktv6EZ08*S?Ij zQUzv&xuxJN)o(91pkV!YDbp=+oXfrwJ}&T%F};{Zy0YrDT06=tPP@}&4oje4b5~O& zwA|eiZi>dt2>qYE4`)?%QnJ!&N!Tzq0sED*8N9-YMv^X1Re)#H}COvm-!DEaRePs@8gdM?*K=m9t6ZC@}}k0(Uu z^=SJNw;Tz74CR-2UjE}KKjBZJe0W;E>A>%M*aP9u`tV$?3yjT?e0aX_nn^eFZJ`Es zt;BOWi-BeO!*&B3;0IeGeO@Vvk0nOHHh8s6mUO(_i4vb|VC|=oPr89MG6$^^`w+KU|Ba z#U;{_e8k5#2YR6RVgu_*@e3s1dwg_UkN2V6M7IRF;z{W_ei_RB4e$>bn2IOixm*wX zyoz!;9)n&GZ^11%-u_k_^nQlN*Fa8+Un}GP;fp7JHh9aVbo4hI|3@1ixav|wSn|$MeDIu0 z04E4|X!u`0f4(>1-U5DW`^&~mg6TdZ(o_7RUVx>SP4b!-PUZQdh$s1OMxUEALBQR9 z*?9R4$$*8|&HR7uy74fh^mq8^m)Zc|DPSJo1MmU?Q+^vW0GA1v@|#KVO9g!Frn~xF z(;e_bKKe<-|0w|<%8K0dI?+ETV3MyEHwbcG_QB*OFK3H@N&k&_SL8GZnD{q$1>7WH zlIPD9|FJLq8mf=aeev(&-IR0K2cJ;@e=T5=KNjzroYMlP@(!l*{U~6nKSvti3j!v2 z`;fe0WS#g_F4B)51Xy_4v0|FesO z`SaW1GyjP$kLCPT&=ZUX>q8QEi#EbYM zoyMM?w6?&V2MP%^i6oUwKrCpAOi$!Kn(32Ljb3|dtTmY_g@0I!Cp?8|<^_(NY!0JU z2ny=lXs9mABu3M|^6_E2e-ss8#+b{%%+R_8O{85 zuC%=;-zJV2{A#;UH0{jKry(~UqxciE3j)Pt6d|!nLIIkW@kxRP@TrLghygpGQRLx_ zKede`3GfLyg=yf`z!E2ZX}O&qv_y}moL?h^O*gFbP(ZFaQBdwCP!J!erBB##3cmfT zsYguRru9?dI}i4YAfe@}>B zsDh4Or6Ppm$@mC3!2EVS0D&=F50JjK^WIB%A()!eq+}49%9pGmkk2OE7+>d1mMz~vAo;sM@a`={3!d8X> zyDQge;&*NkFuO6dC5+kK4S`x_yw{fjbq#dS75B(8%}cY*kh40|NY`qrGvo4>??-e6ydy7xHqw==a@?`uPS9~t8DJGVcK}Cd-T&bE(G@jZ zHdtIh76di7&QL1RH;G#jefX8dmc=D4WkBir_s(y@p>QsWb_4HEh)3cAr4o}5ro}>= zHGjYfQ}8KQjgVg?s>)SKfbNoVSr97#C2l3s^`(%9k${ud053?(OWJUqVJsvh`J>+f z#ZrgxPKRr&V3V)aB|j-mH(!7xJ<(}u6=U&&D(x6GMMe`sMt0Z2I7&T83&-WD7=Zf{ z(e0Ra+?Z)-4hkk;X}H_x(88_a4&=~(LMkfZEQnq6w_uh}dE*XXW}aFOUNuWN%0Z~| z`k*}ZF(Aux+hCZub=i8)_FW<0f&VZVmNCn$JIrp0#ih~J_R9hUC~oD-njTU)o<|5JhdG+2x^{!FsKr`%9L$%n?Q}* zo=53!fp(p!HW>qMSihNDKc*n8aGLrDt{^Mj1V45HT4lf>mm=wZoYKk7R3NW zf4aUn4^&YFb;*VKt|8b(AzQlwN_8(LN?)ccsI>y7n!L@3TeMREm%%T9aH*q|@ypyh@q;v+ z!l6{A@TfNaM#ya^3VF46cdnp+*pFUOD#^&uv%n1)y*qj4)Bur58DK3DmSyQuHuVLF z!7p?F0YAJkRMN#EbRn<^>SMKd>ZlNpS|_8yjo&gnlxj(m34pf?nGr-l?JNft7l_dZ zl-C>c)UQz$LZXJ|V7ir9(h6fG9n{w22lor})FKnAi|QYd@GZw9%e2UcDKcL~!bKgA z%+w-Zp~!1Qq(Qf4>SFd#3|57tEIgl+z@d=Hf(&qR30IG@f;a7S^=HItl>ntm8#Qnn zwW_OdWy#&wFPZ3P=6lo+a4m{^cER=POr_Ec8r&gNepJF%Y}1Ocw51c zVJgr~o?0mlP=DFNj$|WD7ES^j%J%U=0TPQzf$Nbo~j+D^S)KAgu? z61lr4Y?UszSmEYs3+eNR^}9kE!JOZ01Dj=;=+57RrVvIy0ttqKN^~7q>tnS8@WU%< zI_WLfQAb^f@=Bg{@y>dL#;ebSp+f6nI9%h&>EsSi#vKnzTv`o@FGPkq}pPX6k2g}?z?l`uDQx&TdLiqvFT|Ao1r2(1`umdT`<*Rjxehyk>#$CAV3f(j2`a8 zNC}CA;f~>eXwop;D+MTO18btJ_F4RJac3hR)O@ALNmX%4v}(R%$CH4y(%(x7mS_pS zAi<6ba+eKkN4ym4CJM6`V4v~H)&ayz`f)&+lV+G#% zt?EfUUE6RhlWOq?UP_0GBaA4eGvch5NUtv*&N$R7(>Jt{} zgxXP;c{{Z@p&7qXiPpL4qc!T>GPrz>x>`Jg^Q`057r_!{GE8VhZNQwyy_pkm;C&U>}rv( z7~aAwnlw6U(XLh;Po5fI~Tp%-*u$DkR1F~qD-C{qqo zoPooXPcS~gFy${ed8{`f^0^-1IcHxp_#cR2&S{*Esp*Ocy7`!Lsqv5$;Hdj!E1MaD_YV8BB7!F zpQ2El7+z>xyjCAZ)w@6Ad}&zd{oQ$9tL0e&hVDlI`R93iK%O5_p7+9W7WHCgwHxI* zMb8tR74_S$vx2}Ci!KM#gRN_tfz(qK*$h1ig-h1mf-41`)Kk zXPfMvv>{6($@n^spF>5icye_Gha{LqB~S_DC^Cg39j;4#kp~c2R+11<#J@WKT@hD9 zJ``~+J!BE%sJZ=~A|68`nDJJ~pcnCf&5U)Ex+S_3Gq#=aH{+BTnAD9zUofc;{slGt zH)fm()$*p31BMrw@e|+r=lLk*c^&r*Monij<$19gzbyz{M}-Tq!k+4lG(Yv3@kvSG z)d?;m0&d18TuUGe=*pjFByK}oM>DR4Air(KrKlj(@qP68PtABI5}}Ttfe3mX2bghB z=u8d*$ycy=e~KwCH{+jiqksz0EDAwpJPCttVaBQ~;dx(V1TSKs8E3`*yCO~n0~E24 z9-W)95UE5+DCWEq0f(BnT62z?G0=u#=r9+|0GEz||tF9lNdxE}vj zpeoQppoi)4UkMZ{1-b8Yoo6InjO$`5zXvsH{gfc zZ%g_a;6 z3H)q@R&`x}738kx1s`>D3z9`s%qD?xy(1YuiI|JD<6qRVD%z7S-J>MkN+Eq=oN9w~ zVrAL)st!sZdGu+Xs2Mq078AyoM9pmWs~OE36S+h4ttxza%0F*-04s16$-EuvLw67A2%4*M{jov8pNH)${!FK*;swy3AbKBG(gPV*zcA?B0a_$oF&=V>{e)IiRx^3(`*jSZF5{`6;Hk;G zDpChXQ%RK}rr0m(2{l&xbPQO*w_l!m0+{j=)u22;?@zJla8^*&H3P#(A(kXsG*Q*A zc=B0@_>4-SK}`cjl+{|6NX}m<^o2;`vLthP)d}F#aj+8tA4Mp*n0$(sUy5XCk@wLUF&V%Y(e+VOs}bR{5+~YV6+-@;V~Mjq4rvDGT54&^ zE4i)Gyf05-1)}q$6|TaC>h(Yr!W9M{wUh~eV@w0&`X^U2Htn&AjqQ%dP$zB|niLWh zQzC=9k{;KpPvPOd9x?u+EXVGwZ}axll-rVJ;X7QC<+DybB_|=umGIp~KW~ zD3@ufAr-mMUIhm5W`up^bQ08|oTEoV3hHrr>2d(M-VYR}mNciAe>_o4 zP7M(EF;KW&LegTyUnFU$3XfVO>5F&>Nki1v5cWyBouCeq?x94*YBN0y>M43$tDeDQ zS4b9W0G4|#J$~hV>Ex64q_4A?`2lNDO)XZ=N9-ArMLizs4HdaiDUXOQy+r)_Gpn8b%DGG(l#<& zJmWsy!Dg$>c$oTkuyH*_63s<~dlEwaB3J`Nr~--T)ObPe#%)~^CQhBKb9tG#@Hflb zGS;CEN9?YU$AwOx{uQ0-Eg}&jxQ>!UpMV$K#8LTSLy0}WnZ_AHKCxUo>j+eIfRkWB zuMbFEmAq{HyGQkqKCt>w893$>LMigp>p>2L@aw3S0D}AaX7s|E8JtEDU4D8ABY2-Kq&i2Vy zGAv~n(JliHnQK|P0jl{FL6UQ+ge+vgY6(R|BZQXp7{YSd8kO)YAg!EyxC@cSAxk7Lc00HgrmHV= zDdav-NF@^Fsc!&RbAn1*Z)#`{!eKKUw4oPjK54Xoj^9jbg&S%-qd)3}^Kf}|kgST7 zj4*}`ZEFp^xo=07&xevm5_DejxD2hWy0k?p zgr}o8+=h5JEjp962f#fEk%$vj^$;*Mmp}wmCHfnxDDzV7h^EX4#C7#hJ*MUS025id zi(5>u-n=PQWyWETA{GadmftLyXU3H;=!*l5)T}A9%($w|zI{Sgh@A4&c#@>RKavb5 zn56kh(CCI^t{NY=G`p`hQuSFuj;LU@jCjS9P+t6~O%Td;HSVWV3X)&4_sd-c^KuQ=SQNc>P> z;unbeMLqG01n&6N#2+C>*eK8Hd!kkY8NN(7kIwKF0v-K?G+ZMA(j*~96otAWjGBi7 z;i{)Ze?UmgQ^M4VI`(#i^n&sAeO{ZDlaU0Bj0z4b&=j9${>+^&uuvV1(M-Wq+Dy?^J_%_72z|oh{(CUCpQ7169WWl(-&PbudEG4&}K@8XBpa zKJnti0ao<_j?ajC=FR_VbtLF{hSfPpjztkQ4!dSV`ZS(}21;ERqIShXa2fT0{P<+y zSoKbx&H=0X8`1%>9tihrgaw(HOJT=aa%s)Otn@Q1HB%OE(D^s&6$#h?fbzS^Y%jc^-tjZu*tFboXfJhh*Y)MyTpm4S#rn?fa5YJVq1V$C7Cul@ zSUy6XD69;usVDsqd7;kHFr>nYKwk*Kt!iHgPQsyRA?nZA@%B^fHR{u#BL*~FN1#a-4pevPBANzK9ns6&XOj`Ykq~FVi2S>o)xSg1T_N8Hmfu~> z5@Q-(kcz)R@$~v{4yHrGGysr&Sp(h+yqDv#28yM30%B>M;FA(_fI0I{D}#$+R;NP@ zoLq%%(#kmcpN)u+Yy(p9PVHSp`ud0CfOdt99K>~zLl3D7Ij*L{wQ`!Xg690iH2Q@P z5Eokb@Je1P5aX>A7%HuWWcdealM#ob%H{re(#tW!tZI~!C+#PbI1ybP8ccW!@ z$dXQQE^+0H@eGC3?>xBwBqcp|k{uZFub}-SHtZ;Ubx{4NC4Cx4H4bhXwR+H=QEh_{ zjAE;Y`6`-X9Qy4Q}| z+`Vbs%I*ioRdiR!wPdu9JDjm({GN!f)A$qV2gdJ7SI2KlZy&!g zeaVEC>8mDGq;Htel2$ume;Qm-ryZEEI!&EWk=8z;C3VTf#?)04*QIWlxH`3V;>y&f ziESwdCbp!g6ZfRB>sK1p9iNi7xZQ({FZFb+%#lY=FXuX zWwu}PdFIMKM>FA9=42-Pu$;++*O#-I@TGDg^TmYwvL4*U9>{{Ds>ib69_Z<;GfB^7 zy_@oK)|$a@W*r{3J*)Y$U0IF8KgwDg@p)El;?XR)aXOg=*Ggxy;BV?|7Mws`$bz$~ z`?AYEVh?05?fO_YJT*O?{dqlmF8k1cm$Tt$<;`sPSlXTqk4d|-;rHmHZ1~^#JR9zO zj%K$UWhb-YaO+GqycwO%UNPuG_NHF|gB->%w9cw)w)ALYl(Br3A+#9jRhhn>xpJGE!$0Y9^#hyIL z61EyVY?GnP@DD>f`@5lyJpvD@OARf|3nTiGonWU~Gy94iW?!%a>_fJny~Fmh;d@yB zCYI62y4JIZD;8fqj2Za#NZjY-*Irr8YyVibkgQJp1&Pa(t?SObxhSZ84BRzvL{7oH zsm$}wtxqgqACrv+k(W}Atowc`8s@Q2HRR|SxYt|#))za1g7!`W;n+J0Io+#oZ`x5J zU^seaA9)_xdQVV2cFKZq_j5ilHD}*!MjBw4zc1PH>PJ`ILmy=fraQTm?L79(v4T1m3P3Gs|#c4pnPj~U+K@K}DklUT8) zuO4bD`33#6F>ih`PxtAu)%$~9lo;*^mSgsy@f#<)X3XQL-Fu(@&bS$<;5k#-{a>uv z5%TxXk(2IwcmTp{5KT+k$<$5a&%iHnUMqYAPZT&0IsA=#DWd!E$Qb;O?S5Hgv^A!0 zbW}H6RL|}Vo?!%xjFDriTw73 z#3c47=7{gLo5l3+Hoz8Ziw(0|lIN^3Si0C0Q-mqPtiUl>4E)blm|!P&aerKnB}fhK z=N_p&g1sABILo)8glaX3@(A8uluY51SwNOkrCRzlV;N_=>qaJU4c zxQJ-P_T%Byh-kzmhIjY8YxU2v2%h*t7r|Lv=mNM;cI+dEyC_ST6*tJ?md_CZX}DLj zutRJ_!c|`}XJ7u4G}ze#%)Yhzn2o_T>GKYJTFak9*a0?wmtkY9Gu4@le<|{r?94Ft z^n4oWOP#}0Cj_RpUSQUUFsC(Q^e-$t8u=ZM@}=O{rTv9JO740|c!v~z47gdT0>Tb6 zB_^i7=Rv10Ij*qdsx~C9(UOTWhaF)t=~4YWJN;-imuil}Kw5j5AtF7@7M2ydpLu@r zOOQ8Z?i8{t7u08+MtZqYODTkNoMz{`*y0@BZSbb(=z&nTm;pT8n|@=40n<0?BNlmr z+2W$wSy=T#%Y7!#$MLcNR5wPAr4T&o6#Fr8K&5z)ZFmjq`{cMnz~!lSS}b8%G%ClR?sJ2B zR{TwBt0<;t)+G96?6^C34n4DOpBx#%JKkdjN{(e!}6u=jvIr;R~F} z2ZwQepI~}Wx{0$T6M9UXO`I4bCk9z}%wr@E`86QH$G{;5`EnrV0$FfmFlI&(8#9I0 zYXbj%@7;cy=+j>kb#wUJ4qLz<4F>uDWSk65z<&)k%dmVcTy(FW5_kB^r$Ic~72WS$ z+}MU`5AG~idhlFY*^XbnA|{San8j5@!Z6&^<40d`JB>JO$A5gyhHj;=U+-Q7$S<9# zlXRxe(vf-jrNgGMQ)2Y|ux)U0elYa_2_Oj0lk(37Rlh+pZN%qrLtnUV{<&(EOSV)d~2=zZ7Mz{S=WMZbtQc(kK(~6Z*e0%z!b#zfLbO9ept`P+huPP z9cD#QJP~ownc|RdLDhUK#KP50E>?g5q~<*D8nK7`-wCWztcEp}`nKmlJHB_dY!DDhvK=k#$vs^q2FSn9=MCsm^$sT!ZGY>%X? zMPz2QN2%T1r6p+J_d1abOQ=@*GI^y~NFg?LnGAOtMYcSu5Sac~oHdGeLtWKd=nhqc>IshIkzCuW|@lh1}hKR-XNQbl; z6#F=0y+gZV#|vfh4p4id`4)z{_5wj13`8>zG*Z}hF6TEFVLA^I$+~pU-#<8z*#R|3?JhU zkw6yXOQ?_f3cdyoDbVQ9$k6N4@S?muT3JDLqEyW0pi`-6L4aR+FK>@kDrgU z3bRrkiy-L^eM%V&NcJiBCQ1sXl)t4@Ad=q_Uk^;7Q7`oXD$PSO!S7<3e-X>^fh>=- zgXNWyWw25{SSIj)GbIHkd4ZCI1BazCs_q7AnVO!cuwhC$?FCU`iA_Lp$034f3`#j^ zPot3qt{5bv!&o{pQDv;pHQ^1<&>=4L^;@a}|G^PA8(0kJ>;nghv z!3Q6F$jqj%$Nw$({~`V_$N#VJ|3?|l4P(GaM?rX&N@SpO96G)@3+I8KyI*^_S&$^#B)@Jo&!#BP(B z&HsWjl808@!-F*I#K7V*rTm}7D7})dC_nh%>sB_M{x6pQaX*%a7laGE7Ek!U0{1xn zCnHRF!Vz7O4F8BQ;daU=g^4fGj>CU~DNJc7Owa$V|5`rU6ZyERkE70nD!+%WWCgxX z-F5<6tRDH9h$KqX({3N>tMu}sSEo+;f=-GzI;!Z&02ry40^z2Cu%6^@orJj05D?WL zT(^7qO>bbO7m1&xVOAgt* z{}FHt?QA-Q2~SU=yG4cxrvGt%F!9y+Yw0MBmX^Z*8~^?Dkut-k=*@u_CC%D->l1GQ z3}vnp81agZRw`&_DKx}i*_FLGY|Zd`&wFj;A(O_wu%V5pMB)^E1AGZ#K;woRUSC2C zsHu}c`$obGlrTt3I1dTkH*sQ$^zbj-gW=7DhfiVcB}eaW%E149I#K5tC`=L;rlXKB z4e_mT+28Vk!7<4;x+m^AliVNaJatj_!f=G>5(Q4%$jF|(n08$UTG7HD=mZNUcM}s@ z1L?^9R*IkzWI)6K^=iWRy%>K<2maL1x)3c$xdI(ZIq#c?HuFpIX7y^iwn^hJvV;ib z-ed$xy_t>?A-i#9SsWnq4h5ROI%7c3JuAY+>&AN)Vey$gI))x9>n zCYk%}J$ujno|)XQK!9*jz(yq&Ths_xIhM8}2?C9fLlPS;l3;?3Ts$00TWV=b1Y2ye zrAk`_)NoO-V#O9UC}>pF9Yq_F*3?eS`~271Gnvqy@0{=Z-uL%=3D4|xzpwwg?Y$ny zHuna{26vZZ(ADWU>uPtLa3$>rT!Z$_t_$|(oCEeP&U5ysWzD`*I&FW!al-zl{g{2b zy~lpRw%7isZMXeX$4>h}%QkzzVXOV1VT=6%$0qxytjqp|cKdqkW=DJTfTgo}vu#83 z7TcC)Ht?-pOM7dNg$=LnGMsE;>|AId^nKq}-`|yX_5G$7Lg$mhdZyn)G(3^ZST8za=Ov8o!YoGS+ebBQ z=E7!_!k6n;E(hfuH~ZhsZHR>E|4e5e$Wolf5Ql8^+I&#?Z2nQd4x`)VQN*v^=(4$W zHJP}Qk7T8p4mZ0-4tB&5!D&@c6&T|5yzcg^u=lzH`^Fl~mp3(!pA7v5=+6rML~#A6 ztDx@_`pH$$H$Z<*=%+%v0NP#^g+!+x*Fdw?^<}hz%U9B|L^br=xPDGOaTZoWe^R}s zo;yxJb3&!f!XecI^>Gz+kVFtxuy9fH)pe~fMzPeDK-YrJ%pt>nxNcc`EAES33cAf9 zbK;hUZ*o`WEv`ikD{z8!3mkDT6^p114w?6WAF-~!mPmh83t~8;qCqd>=V(LfL)fur zbqx)(IiHHU8CoN0>6C5Ayu+0upBPY=fZTNMQrx3EWbSk=t!t%XGPje83do#Pp`xNO zcaa$i#cW;5`xnK#7U3RK=^#iCd5~+6JM#r~`HIDj%`4%|wu|=a!A%Oa;YoEx3!Nd( zsV8Qg{iH)Df$}L*3ey9moQvy!hYU}U@&;~f-s!@z*^uEr7u~@6m4z#DAuXqWMQoe6 znYfj8$h=#{{k@`O#vp|~YRmHGTd5|f$dxPjHl^KQm!*iqDdocGU1rUxxmN(YDj?;7NgB&%U*EK$1HLdo3< z4{Y8Yja*KO(!X$*e)@P8x3)BsN4-`^0)ozG@)4H2prj6G(PoKJ6NT+O$Yi$?a7P`A zD>sQwiFU>h2`+XLb>(^@UUHV>$?+5=2V8I}Dsd#RBW(PX@pIgm*o6YQF$%nn^V`1U#GBu&bJaQyxmX(O?w7V=Ju)hTJ%FMFami)|@ zI-!PZsDIF$|EG9(3b2VSV+$$bGhN@bvxxn5yl42n5qi`DOy zy;5=5o4v?dVRmG{x!UoFA^GPZCoL8dRUJStYPbbOxC$h!=2n!pxtSB8E@$%h4TaOD zyvmfy>q0W5xtuS%9e!I-4qN^1OVzM?jB(>cxWw+WTnY|6+rN3ix8wn(6lj^Gpe>Ru zC*O=_oURY4zk@u}$yU{0qJ|sk43Lu;@~SpVbkj0ZKVr6^-E9pT-4-v{kEp#wvZdrx zF*KHXE>+YX+(@9ek8KFZO6@~=mRWmHjr=iE9;jpqVx2ZkYb&`Rb3CYH8aZ~Rkyd#dF^+AN7)+Kwn&Z=pzr)aUW(_Nv7VoKFoEZ%~&K_faFsJuhc( zQ*VL`UZ##0QKb&ALrH#CATq=!RGFpad6@-b_E7cP%n|<9D+bjII<>evAyv3z0G_f6 zC{npQM=B#TIqb=mDpkK!VR45KvM-%scutX>YN>6E;tdo!@_faPaB^3U_$>@7 z>a~<8DmCX3HvJ5<=h*|6N7~#2%vACoOvcig)Mz>??4 zbr#vyx0&xVB!4spu4?%U9}pg*curB+4fGC(4NPMmi!1qCawQz8)9|^kuysAhtcnyf zTg{-^HD7O@Ax-o7Y+o}^O+Gvp?x}D{w*LSgR*`H!hp!V`(ZkfYp@5XM-(&E)eNnr| z76)>S^ea?Rr6_rD+?6XDi78k#TpDj%?_kal=nX-p$p7r%$hCtRca$ElgmCkb-{i*e zNX{2qmJ(?tAJ>{NFy+2)u(^2ZWt(iC>-ZCM#$u(C+nHlg;yG5Q*#UJF#hP#xKs>2t zH~$T}bDdE~$tW{nGh+W7vndkj0wF0BD_Ga84%rW~%82dpZ`oh9CXdc5=6UopOAO0P8ff@=m8cte zU$QhpZ>~izeTjh~OjV*1_+tTjh9xi5vBf=13cK@NQ7J4%0yET@6hVg$1P-x+qQH1d zPV&MfNT~h}(vVt_>IXvx36l*bz0NGMJ5TmGE3+Fwc^Z%c)`%^TZBGtfN_BrV%>d1- z=(UM8NWN&T-#4g*_K4XoMY657+ss8)nc-u3P~M zgWyvJHKs<)lC97d$Qx_1JLB0_bHs%-xj{bcN=R;3Wgsq14DGwi-jVG+$Q)h;lR8>(6 z6~%9XBd^t|RK6V2oK6J+@GyQVF>)1qons_&J6e5~XBZ zxUiYOO4U75NajXJc1)llH5c(&7>Wp;#&`>u4p4;GQ901CyBD4CO?|p$ZWfbz6la6r z$x~N>&us}cn=&YCFpcJORP?-fu?(d#3LX%;K@wlW)90xxso$ul6{;hQnJJL*`(8 zYa^fPi@8Y@ixZ*cD-ofzrc>?3ibR;97c3U*9(4@D0?&u-6=rwab9^8u_7q#Zj@)F= z35t{!Zu1tRSdhs%$RzI@w&%!kwCZ(cjW}Y-9WU}WS<}jQ9){HEAE){d#vivmGIy=P zn&TTMN7T4YwR?RNo$>HtydszPG=2&WvtY6JGDkG|3bjCXTXWP99E2QEHRda{B)BRXEVktOypFL* z)R9*yQTm3_60_PZrxnj#W*%yfUa;*VJ z)Dg6uz01Bg3v;_ociGowOQqhpJpg{fV0K5Fw84<A9e z??KT@Q8_jumvV0W5;@?AnL{$Bq4V=Gf_r7V*=P2nt9l(dR@Ic_fS`8fB?n%|TSN^F zkccxIXyv_u0>TO!N*aPBNI58{QapSrIHX<)wP+fzQu!x*1r8MiyLrhYZ?GCvP^pTJzHoAF%eh zL)lx~qzlaAu;F>$irV*<(i+uK_d8j3_09xs*R*j}2aCF9y>mm;)tjkB{;<1{=v_ zK3?}%HDb^GO%;0k494HQT!&GRn_teD3MNK74z^O^@x?2=! zFW#<1dA@wXJO5gg-OTR_dt$IFMH`s;!x8;wr0*WlUxC*qX8uCxZ`&H(0@6x0^HHHc zyKl_QwaEC)r$+4Q@}!y13H|c>kGXH041KTAKUS0F-b(2?!&n3IMEY%{e+O^V_hXZ? z(RgYuw$5jMDBM$eC!!6^92EL%{!rU=5HF?7NJ-b$sz>d1aJ+U`s+b&`I@ zhU@C@Bs~~8Nl*FR<%7OZ=!v0kH6LiDYfw+j7t%C#G}P<~ek=1S7vD_09Wl?{~_ z)nNm$1gHaU1{MJGfq6hJKI6%G2A~mW23i4XQtdz|&;@J&HUXP~Ex=Y_8?Xb|3G4!P1ABnIzyY8KI0764jsquv zlRz(U8t4Pg0vd1*7yvE+gFq6XYBvH@-4dVzULXk25q$zE07`%g0EDWn3YZE^2daUY zz${=k0HRbzRW~140Ne~vM_U3k03bqT%>b&0tpeJCPM{0e0Biy_16zQtz&2n9uoKt? z><0D#dw~N$4{!uH1{?=Y04IT7;55(&oCP%C954V}00x01z|gmh0I`%xfC_klAP@x- zKmkw!Q~;Gg6)+W;4paj(fmy(8pca@1%m)?#Hv=R{mjDewBhU=A0;_;_pcCi{0cQaXI0p;>7l1(^2{6by zBVYw2Km~|=GYCY11W*8!02M$bPz6i{rUTW$Okfr;8>j{50rPIB)_u3G@P|fj;0Y zpaJKA0pJ2K2qXb!#DBmFNPr4>fglhC5PZ~*85jsVAi z^fJUGhXa!aQ?La5c1#AE|0h@s>z*b-zumji$>;iTJ zdw{*b0iXvs0vrR511Er!Kre6_=mX9I8gLF604@N7KoVe>C>Q}NAOR}i1%f~nNB{*u z2~Yu40#(3NU^-9@%miiuvw>P*9xxwR0Nf1J0ZV`epb=;WT7gwSJJ1Pq0ULl#z-C|z zuoc(_>;QHGyMW!m9$+tU0O$dZ0LOsizzN_a&pbD4@Ob4ognZPW7=1H}{JYYVs0Js^b1C{^{KqJr$v;wPu zcAyjJ0yY4ffX%=bU@Nc<*a7SWb^*JAJ-}Yz0MG**0geI3ffK+xtAmdnzHfv~MiYMQ1A6cwJg<}ZX7bZ(6@ySu< z`9$g*Gksc_I*Ux7JdPYRrcV{;>1SZ+*9XLzKaS8ZpGseWU5?3OoxW|ts!^HMEzMYz z;>mv*%jFf^ejOeFXDxk!8)f|bPrq`K;m3_}c8&i2$&2(R6S~CsOT<@B184Bw1wdw* z&|g#er>~s;Z)5TN@6tn=P5-Orsydo>5a{29)5CSy_tHcR`G?_I=*g}IUwf%|p49az zKSxOa9Wj?DPkW%pawHwzj*Il0GxXGVJIOyLoD?3qG;1dP8lmSm&o68F9?!#jI8NPsSbMepG-_x;-x(luF^fg2G?zz>N%C{eesRHGpBxXyScY;8!TUo z79b_kP4sb+^cp*T+d!}U2+U8{XcWK{Qc;K3+OasN6my?+Z7nYO|d`fk?MScAgoHrXQdp^k8ZCL-# z*AD4d#AJN^weA{;7I5s(J@}N*2HvqJaY>VA=@@h=9oRUc*O;*gpf5MT-*v0W%x=Ye z{?=Ckdj2ciW@NVx0T#qx4u) z>A@z}f1jQ)|78&wMG^7tk8(XdpBhd}k0_b#sBm7EC=u~lXS$R+OilO%%i7=0ouI0| z^*>1mBcjag7}U7EERtieG&HGHI@HY z@$ba@#v}3nfF~XCf15{y{F{0HxiRv;?tc>h|KFx6L>UtC4?PiB6V$1qfM_dJ^c4Cg zw}gLEN&N4=u4|H`gmhSOu_$S4v_Kwynd~S zbB0Xs_b4KKySnDxVRZd9pR;OV(=~H~lz#P_kNIg?nF}unkf@01`;Z^u%M9^p25wEi z4{H8x6imo+HT1e$Bn=L3gTck&;;Iyq!Cy>;8|2|$nes~X#^iNE%77@4Auez)T^vRt zZb*+>O@*%i3IwCaPG4$|iv2I*vw?$yJWL+M>6B4Wgo*ug%Y4`l3z(A|`Mi1T-g ztbRwgC%50$ZQ=Ezi>TUXOa^Twf}N=cTRSS)E4arK2j8;JNtM^Qi;R%js2)6p!JWa( zIuZ^qBl?8vrtDNmNb!3k29(5Ju07QM&q-V(2H0wRg|Gn=Gp6g&{FIGXLXY8&iVpW~ zLnEei-PQQwYow@sUxW5u?^+8nbee8~=BTL>zi`j^S3{|Gxz+`fC4a&X4+|WMaAi1Z z!uN69@lo2y;3{NO^akI*!*2Z~qT(Fg@`p`-hS{)bKYlN+%8jDTF}J1i;$+~sz6H(D zs@d@9_riiSNfb)T0p5^IwJ5zuw$CsSo2JsK3rJ9=i-yO&fH(Y!4DY{znu2^7Pd@h} z&DIPDn^J0c>`bWmGTfg=``UDk8a?(YS+5+;9&yxJa2e?+u$RJk}`W*tPE21+U6(bqYk2vZS@;bw0 zv^Re3>ptO&qQZBuveGdf2AECt;iIrkx8kcTFR)5~`gL_mpJ_+xOJp&3(uFr2FQlY1 zzIL>3F9boRehV_3RN!)BtdTIcnu@P%`hOx)g4<>dHB$GlX+Vc*7fic>Ix@tO7B_5y zK|fYOqYCNkLXZ5n^9$1Rg??llS?{Yv{QUA>>-OE06q=xlA`B2qM;jjojMO&~%|J)% zbhJsT-SIvBSY?UQtr|5C#P>n^JP=2AaByKgn^q&Wye$SrYR^l6I?cr|M!>)%(JbLY z#w`OhQ>;o|T5$oR6|6@KT>W+didY0Y6+!ZT4U=c8y$1N8WhBM!`wnFBy>tu2e=!!0 zgsxv+kkms;;s)UsD`-u|zkG)kbSK8~FK53zXPGL}j~GX8W5v>BG4C46Q#Hv;YNT&v zZF~>%f1NR_s|Mq8g~aL?qp7#wHOyL0(|n#UJlbbmEqXaE&rs@ITKE-Kzm9GTzXA$= zg*DfG8M>5{eFHcY&T=pK^^J|DBW?VSX2C9^6l%NPm$$Dl7c9 zNRl9(m~P>dWPC-8z-b|h$;`pNAYC*u$B2;)mziWAs@3j*LVL!^>dUzV#ofzv@p2OP zPw<-*mw{RhE-1NtRYVirC0-!5EVY2;KG!rwN+4E zJDKK6~2_#4slm7MEBCG( zzyA<7Bsqza!2Onw3cbiV&m967(0O|X5gc)kzyvZk^u0xw{@|O~+2V zl)S_fqCi3XQIlz}$DEeVB^S9zVy;R@hRWepfk4I!!&DB$_1Z)5tlj8FrzWW@E)ORz zPmzGs7%9PSnWSwXl21Aj{uj0m?IE(&zup}gI{Dqw%Vg~^*)D-!>^FScF$h``9%#1q zCRtpUw!o*v+`_JXMi!GZV*4ekQMb+2JYcx&4`$dRi7DGWZ9LghZx*pZS}cG@FI8Pk zh#MsX=^d$@ifTVx5zB9+1h=)*NAmxfjtJb~GPeRM^4=E4Y3ft52es%jq97W#C*2o6M^jDp;lG_z_oCy{01 zT@ALb=F?iO8ajlGs-~GqiX56GgJ}sy>ssv=s&PJJpwIp*v=zbwS}XeWaHF)b8Uw%r zM2k@9o8VVQdQ5tziO496_u(lzOD9xtuQ!^`7HGS_=ElAKB*E&G`)HQjAHmNOsu}HC z#JR@wI(Q~Y3waN^%KGlVLvJF3X{KH%SN*x$3x>>clMTPM+9%{B0_Ap4f6~P?<)-K1 zs#Y^{GED3COJSTjHRW@8xZ|8T8Iv~3RJHJfnMAfaM{Cw~=@0)~j->}&8r!VeBM<>d zW-&QTjiNLx(O)-GjG0bSp9S-5LdZhO@i`eLtC+D2-dj5r3O<%3S<4#;?3V~kU!g(3 zWtRTyxJ!gfS4`>n*uy6PG^-WE;3Zdz*}`0_@;hS|qDC&OFE)h7OJ3Hk#6J6n2#u-qJ1yQ!WS7E(cRC2P=`UgMDC17_8L>Gs|M`jbB-RrhNvHi=$o8 z5)BKm*;HuRS`9r++GX^xXjAB6*YNS`FvLnJJrpgE9xg3{2j@wJJB5r)eBp>N45Tw? zpJAYYuTSV<*Ur(yrM*KBMSGndU@@YHUpqmM5MOvNi}0avSxnnchH-5VJ#w{2=#j7e z43CZV7ry?Duj*5*@jbP*wH-%J;y1k?ivs4Gm;bVov5lFoWZZ!@Qpx=?m%F&S>SnsS zsuaaS)rtY|2%f`@n9d(b^|<#j9l{0Tzry|5{m*mR#=T)@wi@1!)||v|%6HGknv=B~ zYfjXzujxtohb^wlKB4s@fR4LPu$Dg~w3{ikwvo^*O2>Q=4By)x_|e9efsJ>aeQ4VY z*i63E^c?6am9+(Mv99K9SIukdYToOrIlHdrwXT}?*44bjP2TOQd54?4yUe)ExUuGJ zt!56PA%{j{!R1J|i&*%s`00lp+SUm=&r40~@GEY>TUT?MhxT??&1oLm+v{r1aFe&X zYR+(zx7O9X&Q0Fzs(GE8yt%IC4Q|rcRr3Zn>04%9X5CnGx>h?#X`rnqnt-6V-AV_I zth^T)@2xpOiW_M1f=TAanqw%v)MaqTfO%o~X^kh)cg*YJT<#k>yr$&-O*A|{e+`|0Y1lo$~gBk)0o zY2TnQPw}FJFg=OELLc>HZ6;YgnX>xbh?PStB`bZScbaL-h?S%{$*L>mtALoP#o(8# zeFCcW{@YSkSBzNYX}x4MM_BPWgh%PP0XfBzb`J%js%|n3MqH=ycxI} z*aeIS$ZSTG*18aeiz&uFUYHoW7>2cZWTKDFFsaq9B!eg51oB`CseeOiyH-x>he(YP znuN84dnanOIx?ma3Vk=VJV=fEgLIR{N?|u@(0_w0{w*V{9uUZbt%Ab3BGWxzXUzDJ zD6|zmbPJvjGEOC9E%$ncLZsy{GPwro^uU67XL@G@!UcC|d>8j@D4qIjrK7cyVKzr` z`tXD0Xk|ZUq>S%=kb5kcE~(|?K>I3HWi9VQHdh-=d0>7dY2`bJ;gAnH*6layW_+0f zXX&=b*Hzl5m?@W=h9JAw-=Km#3773l+AaKg5L!B<#x-i9!{|n|&PXjOT0Wvq^e}RY zIN`Q`EhRX$!pKUK^Uw^lAN!iRU69B;d1YXtPjiuevClv&6WAHkb`)poc6~bEqss_; zAh5C3$(c9CA?9URy7L9kuX#_)NS(6w-_cbmxB5B~iPWils{Q;*vlvg3F55R&W7h&Q z71N#sgtLZ=oHM%Vkt7w%lLOTGRqc0puCF29pCC=MD4nQH^cX=;s$22(lx~Nifbl^% zZD$aa3-Ct+@o-B}dk2M%tf6WTzGck5!J2(yjy4-HK}MiVX#TVel^euRgh|ZsBtK3B zwN zpXc(F;u=0@dIr0(+M24Iis8me4firrWTN-dx=GwSqdka5071(+WMDtsSf%}kFd7N7 zlVcvp+V|_IB7W7Xf2eI#%5-FWELO;#) zP41qKheV=i(cV5|Ke4PTopETmB*ij;QcIF*K)dBbk}lVRYMf?^sSyG7#aE!@hbNjg zFtLsy;lfj0iQO?}tyO3_ml>KSY_L{+0?iZsknh0o{cGI@bKVDq6%{{X;=4)IGO&NU zjIBAMZ!U|Zlc3>*k|XVf7RHF;-kP)6X%hvvp48YL;oP`NXOO4oELvC=bqShy!UYA` z{L->vtrL0WsYe)t{SU)-_!(Rb%HMw^y6NN2-5^A;!|>+8x3aESe+`sZXCHjinEfKjlO$SON~F_hiil7JdaCqdM{OWg*|<)y z?E_MeS~fH7aRkv%9R_wHgCpafrfme7cdhmgxw%QWNi_*Cv|<^J%C6E5krUDVsc!Yl zN%=CH7yW}|&qLNLrlUtnRm(lFIb4TTO^k6fxR(lzl$aH5AQ;X$rhqk;Iw*508?X^e1q*`uz zEH9%yJX7-)#)5OmE0ryhC$`nxLeIy}bI;Vgot3fo4i^{?NiL8De8E+9SIt}fUrq%A zSqKRr8p7MzoWz<3&SfOM$xZ!rnPp?mxzv#^8f7KKZrTJPqj{XulHfZR?es;YTAP8a zAf$|Ts==6sa*B*6h1w|%ykEq!R5Yx&l_#%xE8U`gfe&yb&#!0R}27In4=M!FE6PibV@^>{2nXmxy<0Y$y88_-XJTFz=37^8_W zyN^H5X}$b8pq=2)3)(UM9MpR7M3A40$EV^kARhgAbkL%eBsGaKw3ta<_)2$p(pRx( zqJ@x-)Ew>!xYbknC@C@D`~^3vzB6~{bX7@ zPzdd>p-t}wrn<}Uq->HX--R6~85N;noUGH@(%uJ2+sL(aOXnmDsQ$E@b-j0Z(pN}d ztLvk~lNOV{TGt1MC*4l^O6c`TX=)o|2ECm@M>^};seo#=-v_YJB*B$TTea_f7`|D{ z2^8?J!RU#V=exA7Lj49A?OO2R>{|GzHc+WiMMJf(9rGUa4>1*^W#AK;Lo8h@dAk0{v(Y5sGbEeK>`lrf{7!$WU$m z87-E_Ek?|dI8y9Vc#Tod2T~&%z8>N?gpD2|-_S=$ltX?1SuL!wK?>PF4Hj$1rcF|F zgD6ZW6-W$ivdQ4SmrHjD0yTp3mpU~d2Yb)lEk8JHVT4vsy z=>rF@RHGw4sxhZ7fp27gxUm3Kl0PRu6~fOxdKZeKqFMRfdTw~q^-b3(c7JY%2Ohmq zYZx^(=e0jog!Et4zEihuL>{ZOGhE*DhP3~m8xl?F(laW(l1JABEy;LZD(OImC#p*8 zqCrPY#Lz%NPQx20pJ>sZ5*B>eQmPf5p$7RSZ+Az6SI-e6x+gl?Dixy)%)K2=OizGV?h%x?; zf*N@AX5{spuo?pdl9A$CMdH)TGANM~tlTgZVREY{RK%1X^RT-8dO7Vqh~XZ~wG!=a zzUz7cFMq598z>3`^^cy3hC_*8@^}281@N@-S0E4x8V;upT}O<6SryzDRp&e!kKf}7 z(G&Wr?wgo&MbIc+v|@@M?RBc~%X4}zwNrB|4k&q5MzwJxVGoku%opamCXfYb#=zEKn;?? z&zJdz7PhR@WmgUxS_6KKrw)6YC_@nz)z2P`E8I(JLt9zf1ox2W8@QuUYxXb022(FI zO~x@P%E;I_URJgivL^ZHFU>G^QT4Y5Ar zn*=Q{r4l$1-bOXcd_kJyVt-w4(RW#**o$=952`<$6-U`_ulos-yv^ex{%OHdBN`GE1|s|ckN{@ zFLn2f1fsu1MzaULM8i@70lWhTsQ@%2gA8dKQUvfaf2Zd@YOh$HgqgtO&&Z7%)kN;(z-!6z8+t?BwvIH}GP;_LFyDbcP$9 z5bUHQGq)4vH7BQ;>hNNCdO9~eX(hDU67og-p!e1szu4FD@|qLVO!%}k)7LsPd`%!< zMH9)_v5S2jE3Y|@qghLauk|&@@UnbIAKq^u8H2X*XQaQQ<{0)F?G)ZyXA#~4gjZg3 zY?|rYFiNKrZTWAn!gd#r?a2C?zH-xbs4q;6v~ttS6S?Yaxv5X6PM4eBClyws!;@Zx zJ8cl#xY{4M@7`_`%AH#5VQji18MBcLJZi+_GCbDT>_NTja{^v}fm9~u=pC~tNM*y|mQCO1Kd%5xPa??I;JV!TP$&HVdn_lF`59-EWg>m;i5J=>8 zGj~I|!iiwHNrOvl2=~yz4P0qfLsdrkgZ$miU z@e<+Z6lt!~V>k|t)(9~IN%I&L^dvU|(2|hyJY#2|tJU6`MA{xooAxo(!;|hnYP2D) zEJ7h`*2#E3V8*qWx?-k^mqTgBy5u~5v>kRK#< zb=`gci2A5$7ZOjQcRxI0+Fd<`TvO${9hv-%ey6KDho@hZTG@#DsA&o`i@iFTD%eVkVPLs#|3 z;bd5T0nMko8XvZ%U#~uDT>CeAOBDY)X4Jrjwe=n~J)drvRY)gU>OBSDd;NF-+FmbX z4-c^2huOxworhU(?zY41J?GZL_zM2WVRm13&tZJ`e&8^B%DDG1d(pV(FgvloZD;w( z{cR_|(7V5F!?@G?+q!y~w!e+-ynb`}-s?Ndk6nMEtoQn}W!m+}%LcFCQ`R+SYuT1L z8_IUhNtW)NbFLH=&859_PL^tOj+YM3*;Bf6?$*-1bCV^<=AJF-oqME2o4coEaPE$h zu6dhFw#?g5vUgsx_}ILY#q9LsZF{qhKi+mM>xsL1vxe@}vX0#`n6-ChS9aG|wq$Sn z%FgVkzqvPi|2L0ipWWNW*srGSnetkwFSOCJ*|Kh5+ndq*_qE;Qd0=1LuiX#sYa4L= zVqe>F_0fH87nFVb+IB04_OHj5A1I{~DM6`{@2Q+=aDof7@~A zq5W;In$MzaSoeo)zxv?-+wA)MJ$6CuJI6M;`e5<%^UV0!Id-4x&^yff!~omky8k1# zOFe&{^{8t;VuR{;&$DCd+5xsl{SQ==`r8lL0d@0->`C?KAF?OZ?|jIfQa|{B4XE$L zl>5%H9j+grXGhfiAF`dUEg!MCcAk~Iah@ff{*V=Xc#i#t>!tIo;=>PFyX(^rSyFxb zL)Pg!^&#tW-E*FuR6qNe9alg4n4M7H`k3{qFMrHVtAF^I^{J13%+9J0e9ScU?vL3y zwQqoJb)6hw+gvP*Zue)u-}0#?`>{p%W*=XxbCdJW9{v2ToyXC_$Y|bDe0KiK!3TeR z*YC(Ei|c>>(r3@C&VKI}7=Tlumf!99!KPn6VR-Qmy0;se7f)py|Nf(`-+pESuFsi8 z*9h}3*k9VS`84ToXik~@{)0CjxGQ^h&8!u;eg3t5zxlcGEGF!RYZkWFw1O@4y-(H+ zn2p!nvTSz!a@Kxi@POqN8aK#fZhf<0WParX-Q-60*8O+y&;BUo;zqi7yNNyD``sVk z`84DU`MPoT)wqh3GdX|vT*}|IxJr>5_4Sd_ocddFxm*28IA@#&`Z&2XELw5f<=W!{QPSphIH2}d-k)T$J^fKbs%a5H_);l zuYdV;YsV{an*GIwTX07vOa8uh&*~#@lIN?JHxa!uXUO;*n{F3Va6c5)&G-%ef`NPI zJecvy6oeShLOOBw3%a4;A5T2@xan6UpU8-kx@XIa-_1@^IMDGt3fAr|QsznOCLL+lfvq8ERWZg}kP z-ua2?Ln_DYpooi0Xsp;ab?xi$^U1lI8vM+^|xPHJDXy`KhrPUO%^rj zCSDC&6|ToX$AD_;75r(gyh`Y&-^ibaL%5w|Ir^-)1@kytdfV*!+d&;7^v4)1XDwV_ z*FZN=8jeESx@ZY5iZ?vNR@}b0L8!CoB9Hny+**ulJDaX*Y|(vNQGU2*6|N66D3=ob z`jFviwsPTe?$K;)YW^m_z=M-v7>>~89%SSA=qKOCorysZjr--09JJ>q2UGVQTIs?N zsh7#B1-J30;kJ5`rwntD_LWWbxXIH;{ z$7%=?bvB~VuinPh{b!hSTylqLZu7!LBCjmiWsu_*)nDk&!}aMNyXq-$=Y@)redf#S zmbEnD4r(|>5nh7@Z5>^HJQnne>x9YS!4Kmp*yz(m*eBcODag! z5_Egyvg{^jLC*9HQ(xpDs>@oHy(m;EE5@*@1m9;$(BU>l(mvg?ANrVGHhUbBq+SHY z;#Pfj2Rv2=^AVTF?683HJGt4#Z+1aXFsis7-sYuNj|9?%-L_UVe_M0Yc>D&N(8p1G zcjMzvy7m7uP>T5ckzm5*bGTKn2-_1&{?UEa%6eQij{tF1Hsy3Vv(3nGu){+RL?4aK>fD5(`Q(>x3;Be2}<$XDzDWc^(<~-S#SsQeZnAA zZ;h)JYQ?4Rv9gm)t%yy#{1kJmp1kC53omctL+(flw_zzeDuq8nfK-3~0AT}SjVW$9 zhKCQp`8h_f?7 zEc0Cy;&a4P0VCtN0jWCvF{hZMIfWI=2cg|a0kP=zEE;MCrl8sCn(yDEvh${pCJk)epnsCMXlh?@!|C|zr#NTw_gX* zD2o(#B<9bjWLhE?j}-F+lFyBYe7Kw!YN{3fE_hKL|DGrTP$m~xv>;oN!gkf0<1R2N zMwdmgIBlM2Lh+#Wg+#kc9+^m0%fmFN%a=A_R!i4qKZ+Nic_wd0aIJ1es@T=D-l-_2su=XPl_e`FPXRS zR)q62yq%{uLkXcm7x#g5-U&dJOE(k;|A-No)NQO{Syg5dNnupO7 zh*%V}3i6N$W+XYup&oX1?d5fKxEu`e%){Q-4(b)=ZEX$23}*16$;{(TM$j!_;e^hE z8;Prl2qGT}2%up#Oe7dc)lNeokxo^PH%Fu?5OJ5|we-Bf=9DV3o!K{fr`a#@6ohgkMfE2UY|Jz;WYsr zLy=0P@qsdDBKi8W{Azw$)Qt#{M!F^b-*C!P%bT(pH@(vYq?vky5F&z-Wp|rsfku(Q zA@vlPCHAy|YvmO9LC^??pJi7qttW~c^;49sx|nN*ReY&HIZ{ufmtsDsO3}as#jgha zrD_24MPKsg&tZ};YV#eqZRV6a!|G1qFXv|lDPV@oz>pGw#PBPA-x$ntT%mFPh;4%G za^)oo<71^D5U|9GW(3C-UFshb$`9s(Z7C*APL$h&(Hz<5fv@P8ii0d?vLzAAC(rRp zU%7jNZJ9I)tQF)T2jv|1=UT$afBYHq=DK=tlW?+*18sr`$h^0$UgvwT>C#g@Rtk9s zMmRVH*@JAes6w6p*QjUl_Pxh}vR-2!{3w*{{TNCwQa&kke*UqdtGs zF3DcI%Nq?uoKB<5?6#=tG@2xEh zS5g&(DyS*am@onHE)asGgp$`>$N6^NqvViirD`2gUC?gRt2hQVk{o@|phRuBgIx)8 zNv*2mj6tNMB#`ULPkwNUaiXnsBGi`=r5@2!ATvlsl$9CLu)2qMBU+i~Je&M1izb4F z{181=TLAYD?IiBQx|0~Q=( z?UnXYdlBZtQTwyZ9yaprguGMp(nNVpHO zNC7oQP*P-D_$0IWCB;Le46-{Mev#%t9@$m>Jj)r2i9AMh$!818agNp?R+x%DBxHaTFy+|L-q!0ELq#yq>j3PLOtWQpu? ze_Ri3yT>_l=9!RDv4ohQ59A!Iy?j92goZN90=SN@KRAD7>L&5GM0 z5RGj#la7iRk#RMr5Tb=ag3pbHut2?|i58K=>eJKpS<)-Gz8^gr1WZsYxRbemYH&vu zY%th=YCyM@3yPEX|AWUs+fMq5K^GckuON*{i-}b;c%Vb--4xaxEdH>;;qn!EkF#Kz zC1i=Xjxk%NCeafhRciQy7FBZ+CT zX?7dh>NJehk??q`r|=}%=L@*OBb9@>4c2Li6D)CG33QGV}X}^?Xx8;qAjZN<8GR$7M^45AR<<$x` ztT2e&L;eLp33zA=_QtSfqLB;;qtu(h0>zN_* zfi}@&zbI1S!zO_*c1fVfACe^uVJCjbLl-?q-7kX229$8^I>}t)ljnbExE8cmDCLD{ zK%au(0on1Lf@lin$hJU<67=O*T*hD|*NELNe=fE-PW;GlT^)_V`>){%9#(%Pyg3h{ z7r6ofc$6KUvB|?*QPv1`?6rEc#HRzio_=AFT^31#q{pw@BB5;uWq+*H>^DbZN8;}M?N*sc^%oYh2*dj8GDsuAkpBm;aS-O~~dNzcBxpDRcB&Yv6T@+vg1H+$r z_6lNu8|i3qk;-9p7_<@8T-F%k#YXgvXt6iX2LXvd7}IIFrw8H_W}Gi3{*yb^G-wMw)zi z&N1v;4VlE2zvm`zJHb7S37Vv<^kK=n0MXpUa|7LiKnPpl;uREb#P zf*G~-iazR&yv_)dc3qLnpd0S&@ zafFz`jB5;vy-y+K%*{>TLOH!LS5LuOgiR%Xzri`tU8d5)C>)AoQkvrp2NEW#hfENU>~7-n-j?Z6G?b8CEacsAqI5f<;Ds zpE6G{RN_lS@>E~ck7uqqBt?_jZwyH4!aI1Csr%=T>iEOzV)9K1O?CBQ^#&MGt?bUu zA6NN2D}RnxLh|m%3|J}(ibzASfjFRt)$9LFPlaEk0>c1$ncG+7FY`RZB)=_gQ>{-<=x>Ipwk!nQwB%aZc)qg-CI>tKtQk zyp&<{74sQuj5pRlJZ=yPQRgpUb+aMK)bG7FT(_G>VN5S{*4pMKn&vh(5vOHC(;euz z<|R#d3uRc{0LQ#HeFF+AykYR-Srm05wq^?DupKOm!9sKjZ6CE*QFLGankYJhcPWV8 zD`|~lr#40vKCG6D5Pe(GE&YYzusaV~93w{+w_BM|F8h3zTulA; zNdpAC2>caz3hH4Fndj471+(&R==HRmf~3}14+SP#5Tw{fe;)qtXu`=GoGyR`%BJ8` zgA~Cy6IP#P?jlE#8q5wlv1*hPU>^)yu=Q>6Ig6Dl+fvu7pwhC2=L77Ffv`Q~DV%tTrx<*rn1xeJ z);y=*U#3oR7eo?j*pXwu)Lr0@A>YN$G1$;ReW5f0fjk97XS6S9D^4CfW}r-9Z=x=> zeXtdbThzSO4&-YSmYlqU>SaA--XOL*%v)&B3L76dq(j-E7*@Z7f`X2pLrsTf0j=%E zK~XJMfZv32v%btLf*NI(-;3F*&0~tI31h^aHwK$$5qFN7>noR|IJt1z%mbHHKX=yUh(^ zNM{%Y{u5i?3(SiH98bP04?)JT*OMP8@|Bgo#C(@xPdW5FQ$oH=WsLv6aul22U+T

(3&a==lj8NFt0}UM(%pQN-B1<7`B$xS4gHAV8Y{`pHmmSG_dU4#=)Y5?QS#=;P z!9a%Hqi>>v(biNO!bHSP%yWc+A2DbTSt`IMTawgzF=1HREDj29Y=E@Jx>IAe&`s|% zcfK>4?0nTggrHY0BzivMxA<0$x*ox$;`j)jFg_Q)ZSbOH8~tNnVHK0?s?m$KiLExY zPhVh4Ae8-ea}SfFo+*+`DpY+ouWy3w{x4Az+4;mO4~oa-tIRmsJ!A|(gAoKa7S zJl>w8V3*7mw7DgJ@n?*-@0@uSpHkw^wYwtY6)(tbqyA#PtrtmDx$;!(e1x85kv}q5 zmDBH0m9RR=pYN@7|B3luVis#)Vq$FeEcrA;Q&Rp#TEa?x%i{)<%Y=PtKUxtY4!VP} zDaqu!22li@`p@`So7mF=UGtDyjMCWEMor$Wo&tlLvS#U0Lmq|N(xmi)_r z;h$-@tC02-?RE(DkwLpH2)EVcc!6a|ZS6y)P#zOc7`S9b`?Uq!MV=gN+s4&Ge?lH3 zMeWqGWur?PV|N-=?7w42O>)sbq76H3U~7JGwRzAW#qAZgE>rUCC%l7!aso00anvG? zc5MAY*?ot8{F0Ks>YHznY!+40K#AcZ!`#_M(gBsS^iJ9negUrd-r&Pf%%TBu8x+!= zbnKgdz+kaCPqT@yvTW6Ma<%zsgS#wr2=vv)uR3}dCKq|iB{-k^y5nV>z_@c^5VMa% zS-(METrt}-tId6ee5arU6 zrw^y8xq*bW*xADp6D|JW)67+A58J)mRU(xO8~MspO9J^A&?eh+Jd@QN3=I`LZ;!WG zKV)jIZG!EAR(q#4`OCYrs1hk(6GpPs*+zVu?fSSsQmLvP>EEE|l`bLnNl~H=sMUCs4Dc_5x=?8RirbFhobKJ{M*c&PWPI)#z3V zEna67EbmZTRPfJ6g$mOqFL;!rmS7+u#a)-dkKYn^RnVx%)%ogcEcgry9HGf!{uJj} z+dXaO2Mn$vcYd_ep63h)axjDvEjwOOG0Dko>$9-AOMAO0RW5=JQvGd>%~V3)Ud!sL zX;NSwT)mvS%x{pFPQA;#^I9rjXdh6EP4?%Z>T1ImDnsVvYP};JhS>rV&3vPo2JM3X zH1JX=QuD(V*wNz+#6=TAG>|xSGzhyWrzoF@#p}v7;%LyAFNByCYhFwpi$Hk`a(S8% zkjgVQP>MxpSV{!IwyWxy4B_k`0dDq>H)Ykd^0$Z5xtrIe=gxFb8`kb5qfTYyDVWL= z%00BrJHptt!&&1KH*k!vb9CL=lF_;$OU5S7rk=(NdouR22(;5Cg z4wrIB@8|0oh-T?LK)nGe(pJ-$_a&&dwJoC6)3MbJR1-&5H=qmg0c<`eM;cPA;Rphn zDm4P-@zr?spoif#spDI+=B=a|BE55h?kp82-`$e+rIy>UPBL3(Gv_NzElGC%kQ>c| znK~PyTtyhP>U@>?CnR?Y%d1kB$4_xf-;WLUfTtjsi*rXhIS|MMYT*ih?65DmnRWXw+j1g#_}$9A1{Eyh=@IL$Pj$XmC~|hH>{g@QhGG+ z;c15V_9<~V(w}l= zU~dvv%sc6P;Rx_A9=}wVWgV=+rM3VzfU1}^eqJhn_qeCKF9zvNBD_qIi(b2h%Rz?11D{9MZ#$?zVyV9bQ`JJHmhxOfb( z2ODv@3)O?2eSD_&HqT5G?$`W!u5ZM502i4t{ZNC44Xcv=HvI%CDW_*-6lNIzq}<@J zb|?56gA2*<^e7$f8L!h(M*Mju@VsNnw>}y#{CtFq*_du)!|>EEu(zM#n=PvxPv%Yh z)E%gIhGQ!*^@4xG|JS%M4&kZ)z=d**|HjDcUybNuhiQQEKk9g#`Kn z4{}*Onf`j0gnI&w@*n21&Sv}w9nbV4r`w|!Y6+irqWq*cvQhZmki#~FqvqI7_$P85 zBvp^+zNRZe1W&2 zyap!Uo*mE&>gz7U@7Ma7`W@<T*dt;c=qCPsPo4n@zaTX&q;+0i2p1XRW}~a|WI! zAIZ0Kl&;{P8E2Ifzk8fDjrixpiQY0_(ZdVltjP?=vC#|gWVrJu>935lZee`yI4i*C zpW=jH;t1b3gZc`SPT=d~taJkl{lRgT8*u6kaaQdXO<(vN8W*W2k?Sy&AMu_MaaK>} zbEnS7gRAO@&p*M-hCGNjUYEl&+2Bo&;tc@q+?@0u?OSkhW!*N0rt5%53_-<9)Y{Sv|>H2mPluPw;S0DPB* zDgVtw0FTo!%e(wcz~eQ%`mXQOTcDr=rf8V*zOM-I0~#j3?_LAASi|J^=RttyX?V%? zZ~iuz_4l-f=RcbDZ2{p$QFsjD=QT`u{?ZTd3JsILs=ok!L&Gd@Sqk8{HN0W&$YqcB z0lZejluy6GfIrgk^MCJg^^24rZ&XHowaMBwa1VT?0lZlm@X3kYUQu@d#%*haZ;ESw zddOXX@ohO_(%VdW-$vnMg#V@CzON5{umQ@;Kvd@0L6M8lN-mF)lz(=gj# zuTsFbXn1_DDK)>H1NaUNue|Q<9T1PzKP$niuCE{cmOriq)WPaMA;GGEy{TC4{`+ab z1Ey(w#{D1tO|zz3vMM&s;zX8g4w3yJ(;B=_$8EBl76lfDBQi9RF@g*vWR#$X5;5@- z#Yrw^!8K2A>)>?VG;53{1IyUVrdxXbiz9K3G`#@>B*KMex%pO))3JGrW9pa?P?kN1 z(=1a2P?b$2%o>66&f9gPIZwq7RfcdQHP)S-t)ssSFxxoE27gfk{HTT@zt3ne!kr)H z4zZ4)Q%BPhzSbHRLyfHHO$^-H5Q}LTq->^J4_dP5X4cE5S$f4s!bkyA7hJXg&$4wI zqgvM86v#bFQN$K2iD_DrTy`K|hPG3Ij_jNbgHQ)>V%8L?In0;2@XbNedlB{4M3hVG zfd0(LeC^|`%|;e`%?AT!!B{5oIaHPrY{N0LY!Jk^GLcVdqD$@A&=Iqt84$j0%E3mg z$U>|=rMsYw#((+wHeyO1KL>W6@|~c3hG_jifAKO8Fl1@}|MUNj z96%-Vm#N?2{cFD;uBcVTO8 z?7MM>QIX$=9DF>yFLW)^M+_tO^w767RpSCGa4a>vfn%++frkpaoMMAU}WjI$YFJr`pmjYT#)FtYU}I0 zWf%zXQk6j{e0CxT;*?@F?R0(gY~1X`Y?s;^$J25*>hp0G295%$WAbu92itk91$wjk z95@V#KoVyys^1*6J#jd*EipSmb-`D@Lhnb0SgMzS)c|=h6eDW5#&RX_2s&PErO)K9 zl{;Sa`GR$J2ju);ko6sx&S8W{p*#^}Trh*Pe8A~w`4`&nMK+;-dT~&G(+v`&Tb>&z zu`N%IrCW*-*65R)n>N`fPn@kJ=Yug1zR zREYx>{XSf48NDPt&_wLRQ@A8N_Lq`mjpeVeTmKxG&-uWOh0QxI|5#eZ((U)6di?1p zH{%pUNH)ElcNS(sc-~T4J8uXR^=L!2L`gfjnWy!RL5Ml2Sf8bcc>qi8#6P=EirOAL zeo3SzPvfm#&};c-o_%m zH<86jMG`I2qtW6pASzO{EK_Bg)NznPn<}6s#!-2?a&h#fXuNaM^gW0~D%?Hj1dD+m zY=TX*0k+ulOHHt8HV78;-O&V_CW&C0U@;|lr#xdtlZm3>CIMWeHmXs~^@yR+K1_%R z?M!@aAHEWJp+0e_Q4|N0CgeE1y}t5CVFAUmuS%kj`U9B-s!xSiF&bIp9oH%G%E&r( zKI}EmwCxj*6VT9gOHUBW!vSP-X@qf9{~B`rRYh`>E0CJqMnytse-aw#tAM?shcyGu!= zOv=K^?V@A^IY)kKsxAcmo@yI}{xQ`7B+-!SqlT)vV2*Tg2T-UMw>aI%f^;ja00!1O z$MWa?-}rTJlxDEUQsD_&BB5zM)a6KKfZJYruv5fwF_abWb7;@5isx$+skcE&BGLsK z3Fqj>;ZQz7zLZ^+oM0SBuJw()jB?xC5M>OioRcbOI4c=g{iB2g#@w^c-EA*HDsf4K z1t>^aYeo)nmt2<;TOZFF$(bWqp_INeydg}oN|l2{-lj8`Eu?2f_|rzg7i$=Ycj6dC z*b$$17JCdQ%TlA}zIIa+dRF`px5_0K2_t$fRgLABOLXWZG2`~$Cn~};%u+;VjWTwR z$Sk6WVnskaYaV z!MMzhZC#xU0?cC_TsL*E0WJYCqX`igkWAYootZYCJsm`H_FCL?tLn$o1~Z+QHClyyn=gpV_;wuOPqB!i8>tnfc{6xBiWcoJZ>*kJ5J3)Sfoao2WP-d=sT z@{0&_WY2M+WQLPbZGFw9e}97d02D-W%tX0x+zR=_wizu9@<(pMBXx3}J=(Z<*$Bf; z3d(CzU5)CL%W1rF&63E%Z{ji#r$!mzTpE;#251w>E4E9BS}(1#59|CJs_b}&DX|U( zSO>D!(D{lw#f29Eq}F%x&N>UP98V;GsJgtSG9(dj_hEbLNhV;p-FQsjnO~~ zV*>!?7wLqDf)YC6LBPShz?03bvHZP=-@O0D-`l`Df?wMfI?XvP&=0pUt+b6L+#7$Ich>zH*1a=3Al;!L1`9@(ToY(g(v3vQKfq-7 z7k&c&jLf^gUwS%Ewg{+7b`#me{6B?3FF|4eD)fb*=c@n*)#wF9H0EI|o%b?Xc5VbnA z{;GYNNJia(r|>xd6%yV_ac1c#I|GIKZ?v&=X}Cf^G|izi4RV*ucp5VNsuO<;;)SaA z8j?W-;Orp>(L0;m&=()?HG zV&<6%#r_pex#9UW*L5gN`HK4`$S4-^q0EE?^{~lDRhcXWddj52>|mC=y+u7LjJBrOQa&5q$8-7kzrPq)hxVD z%S==UbLE$4P~ZK{&QR=sVSBu-Wv_`bkBnXDM3Zr=MR+=1)$v-bjybS0MhdB_8_wDi zzu}O+)K4-&JxP1I(nP8ec%e{U!v$HoJ>BI*-DjeZL#&m;Xo8+J)F3tbaISlW*Dj9x zgC^}ZSf{u#6z53+x3@WyKrv;l%*+^Ejd%g*Q3~6>tzsG@DD9WV|+tj&&j23gVlM2yU&h)y-3RT6P zk6c*I9A2p9YO~B*baRk|U8;bn( z&efz?GGHUo<2`kQk>2CRFSVMT9#RhvzdpGlxRqSXU=JC>DC(;Kdm>ww9APDyyhFB4 zK&1;6pWK12!@&bD!9?@FUNfxIL%B_PjIKLv3*Aylo-fiZ`M{-H65`EB$)_z&I&7W3 z>JWLj`X%s2TDjtJn!X&W#LvVmVuXFRK4B}3Q+#aH<~l;m>d94|$91f6?hE=#&cMv< z#LGbGYI)akj&^jScUCt%vr|#?@1E2K;5>{ld9Mhz_zw~em-4$TG;N%uSEHV)= zYEi(e)+rHJ3QTwm_mpp1I}Y&)?P^^?===lLpP zk+Q{9ChUfpjs7fRike7;pJvJTmWi%E$FxOo4A$2zTTLpVrz<#YgM&XY-M4ohl zftOY7FUJGxon`*=Kz4%t3|1f25`${5Z41{RcW+rmj1YUx8YRBM%DW-1pU5x`?5ZpgIQg@{Rn=O!6jR%&*n~j zo{L+2{!@MaW=f_qaKfULz85L5&d!k#)Y&{_p^M1@u<9-0P=T8qgykZzazsXJZ=EFK zl0NN&y4{dhMNXoNJEM9ZGqmhafX)ii0&iGN>N$g@J~mYBXOS34Zj%1Op|KhlhN^EJ zlsiz4MwK%eL8fxdWb8#1SnG_8Vh(X?e{Et#q;5hjb&sSc5;zXTn)zh6dhlm9mDK_J z5@@BE6m*fR!ncB*`rK7&L>J0(b3o6|FC(iE|c8mbi-Vc(wm1^0eeWv@LnZ>v5kMEZ=??``<)F;GXmN83(Z* z=km^xrj8~5dfziAPhYfSdXwa>Ij%vp zZv8lE2JO|0HA7kGZiSPP6!S!DyIN!UTNCpu>Sm4Qk73JV-W_-q!kiz&@QyWNDWf<_ zxY;a}hl7OYMjUr<_!;IZ&N6P4QWuy4*jt?8Hu~QmHTk%9BR{~!YhgDy)FRT{Azyrl z1N&YP9~rt}#}kwSBRKZLlv!qi_jO#pHQWukh1W_$Z_j?L5`+76wd+jn<_$vA%kPt6 zi2=R>(K7P@zGw%o#7#tEG&^>MF}o8GJVQ0!3C&{j`XxKgG;=dN(<6OdXYgI!;Y%fN zG&WpOXBwLujVpT5(rkQ+U4Gnj!W*J}S7R+2LS6I3w*5mbQ; zDprD=RdQM6Ws%lP_9?M#J)m-&l8ik|48=9wbqR04Q_6ig%B=+w!@RZ>0mbX51#2Mh zhvuvYWi~@X(U;x@8w2C>xPjI44*Fe0x6~_6#5%mtK;xb1$NCv|3zdjMM-{T_%G z|7fA+@6QHSx5*0}ht-IHW;u!`P7!w5VbhPd;9RNXNF3*fV>xBd>f~9-eGMgkQN{zJ zjH87!pS_OCPB##_a9Ee$XCP__)GyS@or21|tEw`5sXCK9kG1$qc9Q)FUSb&4h9@Gn zft<;H&{pC_k7{BOQ3K@5U zZ-2Rzr(9eIGp|yvwTJdlmEfP9em0!0D%7ZUFsNpz3T-1^mx|U&3ZK`t-Z=e;bCLcL ziDO9|PR4@{*b@-G`5gd_FIWB(9S-V3;!DB=^BULr@O$@ zZ3a@~^8`7_$}Q;k>kZu;QIdJq_hy zsjxtgRnZ|~mq}@46nT}_VAJ0iGsdsssFj?(h3})D5sopT{W7k7RzuGhPSi*|WeMan zgob3ck<+o+zh*bHlMw_lqS}=*=yM(P`*2Y&kW%deyhv?h647LL}0u_V33-Mm75b;AT2|^dx=PvAW5T1PpeTy8Qwzf$R)PS?1p#uv6(q zJ9C&2LGLETSdP}aoM8tOK!DZQ6LSbyQ(FuQ1V`!>7?D3_GHIRRxu$pWhFF1m2GUfB zT4~Z8+KV>t%sYlE_g++i(E)BJ)_9o5NoL=LqXad)A_-Ss`m}ROStTkNfzYL;S zqZj{&*UOfUJ>=qj|7ngaCgNS%1sBZR-a-Xq!O721Z4x%&0FX#{TQFi`M>gWjQ7U&= z^k3?c3t3E`-2|o#ebL&lXss}z2iwa|EeVo%!l0~1WrRI{K=2)du=StVCJnA+p^3da z*$CKUKvM^UgHKanws)EY^I)rxfxD*`_4~MLGW;?SwCynF+8E%%GodxAjiAE&KuRa8 z0{X%PxGlB6d6(i|W_XZ=#B%_kQ0V{AcrX$`#{Epjop5h6t7J$$H`H_o2O={g&}g;5 zJjMm=r?xsW0*QHsp#?%h{D25w`!GbR&&|M+3&_cO%U1^bGe{d~s3UA{(9Iv7Nlf!+ z0^!Cf*W;k2To>uex}^p+mnnc-4KaZa(Wc%DwBMy25#d7(H^_V8uqmvSOWh}foWrzq zz-q3ES%DT7Zo{l!mJqjEXJYQa<+9;ZsAQ2;jCOrw5I)|I91a*@`Oat#1%HXDE`Mxw z(V=&wQhHtl@Oca9gGD5X30d`T&5nIBrf$RcgAJw&*uQOdswP5*Dz5>wUeqiZrnhDs zrWi4c+H&oNrVLoj=lYAah(6_}jO#QhX?4Hj=uLxJPE4+{miRN6cRuVi>z~y28k`xx z(L7-)wkvZCX6GyG5}ntFSjJEt4KNsz3y;znLtQXpV&|&Zg}`Q=XRzil$zKf6mPsy% zBtfw|GYLNpLy|iU)@@8uV1R?Lz2LE-%5{RF2ba>E3tDIZETA8oNqUc&w4ZI)GUxJ7 z?4%=l)kO6s2KfL0^@YI6E-GQC3GcVIPXJ5%V8_h#xBOL9Jsx_Qcf#>jQST={z z(&Ye5!FaDQ`-Fb*62o&NNYGXKscao;xj|`#xwJ69{{N%QJ~c?UGP8jZq$b|dtD>15 zF-Y6L1`@q(_+9R}rK};=IRTjX-{?*Z|+4 zUkjH}^qd3)IU5g~LMF0Ep zJ!4S1lInT`ytW1S6CzZhQS3ideGvaFY~E6z7{nj33&r{7P}@)r+D);J8KjF?XY4xG z%n)N_oIRQ=)#gfF^sA9$Ltn57)J5C5?LY+M;s+I)ckzR!0T7d;`{@`P*4vQ9A#U~R zaRdDFWwf`}{=jo4<_-4xNob_-me`4^cO}BDwi*Nl%NzBiz6NX2d}TgU?KYU5wm0f> zq(^uKDOAE$x~#L{mxQtK^g9~e4ZbYBk~j=qas3QCp?_W(<1m;i!e;=z z1E@qOBKI`?Hy5G@$OyfuhF-6$A+7=ck>eQ#Z5=!!^@0KHO#oI2;8yRMzyc8BAg{gt zteL71GunquGTg}!y7YF*QD(}9r}Yk`cni$*9)l`WV;TU>vJ*aPy8#n2y87 zDzhYErsYDF6&#@+f*)4w$M=7mFu?8B(Hr8-V|{KnSgGtdHC@xOv!V7OejO}26v}Il zw{#$?^~eAjL96N~C)fzd3YX)5wf{K&;~{HfTu(k4FgQ12Kw0Kb57;yDk{t)P;%i}Y zTfn}J^8}r*5sKGEC7$;8w7{Tc9+ChRGM|IyFE<wUbc>qkWH81ZG3_vr&6$rNM0fA&kU+G1m|& zeQosK)N-{$W2jn_0m8Dv?*J1y;YL1XW$KDfm#5F3z!}}A5U(;!%*7@~QqDk(R9kEw zR~gLPV=-}_nN{8bApteo#LqDCFL6Th;)aw&16XHbpSL2jeCl^WcNU^R6A;Z-?-^>J z8fxxLP&=TFu+f3SvyloKvKHM={ds`|?hV~)lDYb7N$+MdTK%Xd$@f|+*&uuj1a+!eJ1{diD%OA8vHk= zL7g@TZTe}cEdP_3eAGf0Z((mB8vS#NSEQ{U+nX^3iS`h*WBHukgfz2n>4%W0UB$8} zM|ZzV8gFM4kzJ!nnrc6R5YmL7FX#yq^JH%;i~Drp-c#mMZMPHC@3TthP( zQCXlydM+PWqoLQkPq-Q>6{iS)>qd-z!E`ZM-rt_v3hMMC;JAv#f zK*FU4=u~QgNr3RIFr8kB%{8$lF|lBf8=PZwk^BIRjL5@g0!0G2Fj2{g~(g0oG3xQ!oWoG?Dm6hy~j!LJr4V{w6PJ6FW(P<+C zPf9%GG$XRXaF1e&Ku0e>x4kQBil0IVO!0i=jy)2W`K__nz z{P^DGKl~WSUxz{Z>A?Rd&kdl1A8qj+S|-`)b}pw|aoU5Wy81;<*>3xMKf*E)rdx3u zN}?_|u~*oA85_qG!%bLE`!0qZhM802OqgX)W!P?n#ZbvJv1i+lGIl*vEHq&m_KOT# zfv_0CKFG{v0{z3*h-j}(@GJ^L7<{!8|W_L-y?)BNM@ z$C+628q2rA*J>So0A9B6as^W?ju=v@g10nM_7(OB#>(nPjS1^%{}W-*`a_1&=7Z=a zZwG;>EDPAq)G32d@)_3mps~7k#LfEz==N*mhvRu|E<= z8WO5g6v7a^!Qh=gNGF)Y9h1>v9cx!W&fO=i1EY5u#OB~yYh|*xbTH5~(9ApcPXN@T zg66irui!w>4y<=%d^2+v{rZ;DhTm;Gq1Q}`7Hb;Y{!rz9$Dkn-ob`h}x3r0&+E(5I z4%0%lt-S@y<)yQ?U^8B1(^bTeVxv)K;(|l2Nxj8Rc^5*;>uFL|=5;K&+y0E<6tt-U zSWPZFKpSoWhG@fm?7tq=_^QYW?T(5!)s<|YM4`%uA}XNfX+(SEb*A1ttgX9{gG2fs z>J5iT2uNzXPNBYaLI;wk^J7xD)DKSFKBh>zUYJ*{@Dvt5L;f-Lp7p0XXe9ei*cj7Q zm<_uzn6P{t4mtvsUHWQ2HKdws(-qZmkh#HC-!OXm^(bCe?VWd-4;&(2y094%7f!5?XAKT_&GyA$g56e82RZ2BV|KE7T0*hZJ?&j6{;LL3>m1~ARFfvoY*eL#uoo|2$*jD} zXXNTTC-N5)Y1v2qjJl5-tQGfB*dr9NWcVhtVUI&k?x;r~T$|*Ej+CyI$d`>6YLf$o z0)2L70=7;Xu@tXHd9`tITEaMFDTOU30|lA^^|%xI3{~=3!`4yMBgtla)Cv=HIVc)# z%tkpqEaaH?#9JtZ)NezKM*L#>B|Vm3e22LgcT!5jW*^peh!)Beb zb)0=U%Gj`U#ZGP&G(*)JlCx=(o87=d`|Labl4VoX zPJ-Na<(rW#%{TF(%5Bbsg*MsEy@i~@!cOuGd2G4@4`&SwR<2g19HxpdiTBO|M z#>440pi(z!Q1*+>5e?7NWm4~JR_k*&+bO7va6K@+Wxr_rleZ+OD$Th1mxH*;-f{yF zcf{ln9RomK->4%R)&3ZB;l_BI856K%Z1@>BQUfpz;vWJXy#^2jrUpBqFMyYb4Sxys z3-d5cBiZj#tM3!Qt!C=L`rJ+SuV9O5j&edJ`$l8rHxT;~gT2zh-fTZ62$*PDju*9B zN7$diJV1jQ41zw_iS5@BXS5~a*~@MSdiK#o;=lvM^cT#jG0j!}ow4=NGqyew0feTd zTR92(Sd=3FP6hWc14TZ8TR*8t9ngAa`*-RoiqQeBT}YOtrW>FInA77I87Ok?vc`O4 zp*{tsF(+uAk4Or9sEfw0)&P)xYHPHYH-&Rb1oh!C3}BVz#sBI|Hh97qIJvMdx3h*E znVAv`K6eBI3$q21&=*OVCgw1*k=cmVvR`^`}SD#~7 zEd(`I1m(7mqhmpfbJ;Wg0^yYXMH`==|Blc^djTIw_G5T7Z1wCH>!6$R=`1(4V1fvn zTw->179lVD=03=koe#go;nu|C^+S$gAG{Sj%)Re_(mbfPZyZKG zQ|#6 z?XDEvtu)`1RH||(#V2@S&Wk>#G}Kl@Kz(Bn?6WaWLXjJ?^t}^17X~FlJzDadh1{TB ziI47;dpNlVrvqVgk;5ed9|)-aPQ*{c&};{rV7m`Jp7|(ugu-8)sH=ygmZu{snvw42 zD9c=j?n1n&`?uNTr#+Zhc#C~9IeqCavC6+m{y4?rd*L5R$wY3bKo)i_4F*9UJ_lR z$*AuP^_N9rdJc_KW+&NH62iwMe{%cm%C}r*@ zH?}OZAv*>1XR_;6KT%n??fr!Yx8<$6SS~{1o4~f}uABSeAok9J;kN%#OZ@%@e+!`q z{^hqq{S)oIucKy??Cp3o_QBTBea614{l)%`FvXfx`KsqQx|A`mP)DF#^4*hBuC}_> zQE`T*l?+7>==Q$eFGcTajT96{_f{$BQGE9nFB7=Z!8`XTuNBi?!ACjsuAWDC^E{#svh}Q z>cpminu-_pY{x!;R5)cWpT9_;&+datRgXESOHAk;G`Y3e@%EQo5L<4d?cFdX^|?nO zs3qu#!n?Jlh=>3ds#pA9!Yx#oqOr%K*1}~Vrc!Uytlp<> z7K_mxK~jvXOx$@=3|OuH60<5`=VCmrh8alRZ4%g(EZV&e)Da}1MbiOO7|&q4Q$Q69 zu=Z1=2Jq*`p1S@ zb1;Ysvpc_p-ihrfTF$Z+A)Ck-oPg%b}a{}KRtr#B2&%(0XZighQDXy<4${-B9^amfJF+5H> z9Z_P_o&k@jxl1&v>hFXna_TP0K7uyea7Yj}ug=JzH8RIZ6PThXvCwvLhC+IAoUFv< z_c{N3HY*v3<@Xr?)x<#TA~MUlI=CsHTh_HzL}}z*)lj%^*$tTck40$WoOd zQ~P4bx8X3XfoqK~s`m5qX^hL*M8#*FALGEyCXLLynD2bu%o4nX+&nKIzw}30%J}ii zhp6QG-1+t!*j9p%U-+7f`8gi#z;;;guT+cgVzGexBXA+jq@{=$jTRbi3KWo+yyr#o zLASv1RJFex|Jmqu&#B!eAmfOL^l&$cB9vL|FE{(M=Q)(-8N-nCgE*Ka{&`Se@9P0~ z@o*ex)EF%;XCDG1h17ljyvDL9fGni!pE%`t2_f~l^X%8~l(NsWr(+_4WuF9th_Z*r zieUt8%-Q2RB<*Hs((=`^5PW8&5zzA^VM}|NB+j86ZBSC6VP?!h`-y0&KtphfYCg)O zK4TPuPl#M}hAq7zPE27C901OeQPx=gzA(>s@cbKo8}K`b-!c4lBdcxVsRh>C3wYL`Rd*Um`v1-V5@)lZTd-;6y^PsOxG6!Ux$ z1Wc~y9+n2*7_MYy=K(?op{{g7ccR^ezZ026oAP$RY^^gfu~qC}5XxJC6X+`(ihZ55 zz3u_UJVUX>3B4Yn)&5do%T|a|ny?=smJ$%Eh{H#LCu`s-(sD*VrrS^CsJ%>8PY5ws zyZ!P4dBj6*(OMKosM^1uDxty-a_VTQ4f`1RYHfgA^u1;N(tw=;3Jts6#>Yg+hon{h z%|0=E8E|a*ZPiw7_glda^%hWPt8h3d4w{Eybfz0P)WF_B$4Z#*@C=N~U^7L$b}*@~ zY7YL{^Uzk6_d8ntH2a^Zo-mh-BZQD}g0y$%-~i)5o7^-t+B$ln;zxakGMD)m1nfsB zfi_tN`f4;~mj+X*&O{hWlL_Ljh8e`=3{#@3WI)!9%%EJNs4IJ_$hdcKgqYLu@ zCfmZd2_=ryai|bF8g5h7#ERLlw3Vjeak{1Xk*Y%Xw?QJ%U1sQtc@wZ2B=p;>6(*lN zOseGPac-LC1|NePkE(#?PF#UhwF(sps8bZLFZubtQqJ^{w|W>_I3c)L*^v~d5}RK1!NE`89pB~#^I}ByRk^J zmDkG@P88W3aQy8?8mbGI7Mg~eYzjGZEXNp}=Rf*kEe$}x-v2CWo(|!i$Vv*E!FvA0 zfm)44&3=ZC1EaW;HBPF(F;yzOrJWAm^GsE5AeE|gAwvvpZGhaRk|;@aMSx`GR*3Fp zAk|M^HV5pE2u5``9IT!r)r7fnj8tO=tD%Z`!xWtL1-FCQj>4?8rRXR}e-dp4P-?iEX;Oa-om1-tXsrxGZ@a78vA4yH-|uKyJV7LXRsFbXdd^;epC8Xdf1V|3RVgCk`45x z7vP0cvcJJnp!0>wLTV|vXaXmTU_wz{?jYW55dU;9Xa||wNGEEFiBgOjttm8=7uyWv z1zw`^G7gJ+$fQ1jF_)adSnWSRHc))HG(462U5%mkm<;W>kDw>tnsmz-M+6!BX*_Jg zH84-=ei0$QV!xMloIalA2Gl1TP!A}oy#N~%vb)(^2GLDJt2oO+*+-P?94J2pHSpaX zyu*pN4n?-yz!jLC*`~;UQapsSy=zCN;69;oy1*x+2TxvchBX@BUd&-l;8e=C0HcxR z$ORknPezZWd=DWw)pt$?C6SsPuL4pI?712`9&GIwwg6oS$f%Jy)h<-I+F8KXJMN49 ztBd_B!QR>mbO2~aGNC(08Yw!bbYcIkD*v0PdBP=`PAS-kP;GBT8T}IZvJ`YyP>R<9 zMkB{ekW#!AEky_+=iw$DS(fw8VOv5zt}6c;czPQF0bH9}?XTn@0DD&IF#9E?Z6~G0 zdUP1&lifAy3((>cwfaV0)&%Sj^vzlF+poSyFef_d;5F%jz!2h$!4uxXJ3!qj8-{}` zox`-)#g_P2M!I+QA7onTO%|Yeh)Hk$z{S;5dXcU_I==!4>3UEso0^ zulYwZ_#lG-Kt`5YXOew1(J3%k1IwsyCqEXb#J^g`xvT4QSKC{NtBGn4l)S*8hzH6F zv8%*0^f~6X3&K!cSZM}d33B`kUecjirUJtUB@d%G5Z9TOb%q5UDa=6xjs>07PL2f~ zV+f&^@dmCiNt$M#HHl+khnC~b<9y9|z!5Wl%#r8L2_hYHtd^>oBtlb1@synlJ<(ic z5zV23{;QeJ30xIpbS(mBkCUouB^7k&Bx+AxFqt&g1k}}dVNLvmytI-Ev!?k-Vd=5ewnR8i;huUCG0 zJ2V1Ab0V$aEQHeZ?uU*g-KPa|D@URu3~(t)bHY#EqeC=J_%!wLf-%8_ z;5+C{Ffre?VQ|Ut<5vb!9^k>e?+ozy0(K@EKs~2okN5T;ow;4kep9)Uhue<355?PM zfH$9(S$IfS3of>iV;I)+|8^tqH_yqBGn_oQH!Z&pO2etl3A$7wWE_ieXQYsjXd5&H zY^rjk!H`gGzIP5iV5cUo##90w3Jntlbz2+cfyE^Wg@_m(ng$%Xq`+?hNUv*s7~pJaf}2SC3X&egZ6@u1hqv9P!zCtPnD2F^({jR$AfIZKBNPa z)Xx$akU&=sl*W_8g2UNqCoh;f7y=&X=Aa@A$!)j?I0@k-P^f%22m3k)`x*8qf)`1k zLDZET)A%t8ffA^pOrhCP1y1Vo!2*WklAf#X^CSYZFTbL_BEOdf26yi|5w{_Q{Z1L` zZUch~r6_8t28F-D{RU`W83i#bVXQV4*Z% z&|e#q+l-e>hSwJRA}juM$U~L2sI;}#NZN4i5lt3t^o6eQc+2!grxZP+z7;=U2gfAv0--FmH9?xj=tkc*(0X2Pd;V{e**)FJshu9gtBZinFGSV)xQ0RiciP zjjqTHvW1$*`%?n-m+oqhYcfB@4jpr2Q%oe#crf#;h?Ep)0Cl)@4|a+J4+Noc@FZq$ z!Od)7RT9Wf28D$e^Nxnupm0qh{Z0@#YNp?7*&V&k6<#=805ndmNzCbYyvyW^nO8GW z5Tdrez7h*M9hF>?aEVZ^{}x<@yiF%1uBGIW;_^etj;MEFhe)I+@|L-UTh{MPIrLoy z8jaUSIQhk;MvBT70$*#Ai+iT>6nCSe}Od7Gj$B=&%`uA3 zO{TLX*i^ItFXV0iG_q6R;_6tzIexNZ1?M3F2c~jtXnk%G=1@Qot67+(?M08&*{$=3 zLO;ZXscL@_lIUI(x>PD_fF=G?h)Pf1(XY`kcI`q{=)nM{7XKR)579NKB7}-QmWJ|5 zt=x6uhd%uec1QC9_M50O^6V{?P9x9f_Rgi39F`&Y$Ol|Y34oHfM`HU;KOCX_R>c&a$+aBS8$;) zZva=6&Ha$pCA;}U$ngvVsk7w;h#P?j&4att=_Z`UCcF*vLZK^A%HE(z zb3fO7t4n8hmr{udq z5f)g;>?uH3@reY8R(}Rq3jMUh^067B)t1`l5bltNvK=*$I_)6#LU5IT8%*(jZHfv%EmmzL^b~-)Q_KVe%|8&B{jE9OaaV zR7Aw+c#ML}vXcCRXO`dR3$zoc=$%l3bA~YJ^55)(KY4{l_)TIVe{pAIwVHo^Km19g0fx{1dBBWQU~P)Wlcfwe=95Uhx?$5dqfhU+x>>Ly5;M_tBd6Y#jQoK zE|~6IsqCt^gLbRDAj?#k$!dQ-B4s%@Tf7Fqk zeVjJsDEnRXpQK}yu^`%jmLoUtt?o9=sTz5KAO_@984J*R_V%aE_%xPb&i9o0^D#mK zJHiAjjJ=q*@Ot_{j>VNN_W6C*gBvK`OeAxvw@$kMi2sJJ{x1?se@<6#U%>F$@gIrc zEB;~i)=Kq?i#QvlmEpo178nfxhgr86JT{rd*2Bq;?%j{8T1?*-Ib2}85-RQ}1 zM0*hOVb9e&UW9?-V)78@1LFD`OEsHCddQ)iE$&VOsqylHY`#avB0=4O26yo)SCTCY*loa_TIoPz0Um&mfb?gZH1zhQgONER^Fi$&w(J9_lmzwq9y8r@KQl?q zZlWrLEQ<08LUbEW)@?Y_HYWjY*orfL)2&$dQI2+?@o|L|Dhz*MKAD3S+o(CC#nfvQ z+@-cUMcKoGUHgbu9W_i|&=3Y7m<^#}BhbyF9Aqu%{8QArJ4^~S*U+%XJR-eD3XtS7 z2-AZ!sNDoahWz;r_1XmDo~L~HtgitjrW_@H+8Q=+X^!MXEs!iRqtx_K(|(7e7eaD4 zikV1`k|wG&i9;3N2)-rxSN8F&}iG zv4G?bT~#DO;Af${phlN6&t(qu7%(9QU8|VMrHHcivCLt;u+4hZwhXJ!qp)ik2^`^TsRq+(H;;I@ zlGBG=Z^Oqtn{f)eEVeDe4yj^)zU~5w3r7Q`xNs!?hx$AoCq3>%>{OP6ynP{T8~C%- z-rZ~f>jU<=%#6zTp=4hkus_uy3F<2eDG1nm$@O;vAw>b3Ok(zL>L-R2D&!Qfcfq9t z*(SvlL^NEiCG^|?-&&Oek6c;)_WnK4`R@tCZTN(`gbugZ!m?W z4oh4?K)GhK#1PA{JCMX;0}n!WS?z+fbF!^g#%)w z#dmsr1Cc5!M@JB|bOx3h5+!5*X*M#L9}`d~;!<@i=!-GoJn-eZs-#n~Ja*OGCG z*xb1*Ch!xT;IJfsC|xDdVx3P`BGuc(&IN9n6eVDnXku>ViAnIQCf1ul)S4S&;#!x$ z_{ltWv#P=yAcDkdnVYV|Yjq)K|KZ?R)rGgQR+DLr37mA9*977K+wVF&(RoE*lkh>do(00bDjA3_Qe-p%+8R_ z(O}FpV!f7+zC8Q1y&t;La2-9HULihRJ_{NBJ_a+P_y#1wzO^(GYx+2*b7C`dSk4Fj z0EZ4ZCcx6p^ZPO}=Hv!ZpL%_l=>w0l#5nh$R2Ey*Hax|f{f-3#YK_|K1bq(T>WD!+ z<%HhLW(-Esv*YcB#As5c*KMMu-(a?X>)CL8F`d>MUsM!wPDyifr^8Jx2@KT))JQyq zmu6+`>@(m&YkQ4voUl#*420^86YNLv9{v{e^7Fa@ZBm3XcARS(w*f<~G?dpmq4yaY z?Xy$tC-{yMr>PB2^xI7IjY)LG3H{6@O2<6}JMk{V7@hK@gY!L8wwt4cdJdja5NnQR zne3&a~tP?-F<{z;h zJM1bwVl7QBI%3UEE;wTS(9=2X{A3tmzog1v(YaO2(toY8Vof};L zomDqCc>Fu7XkO6T_-t^~UaR)m;Ih3|(Zb;Tz1D(-!MZ)xiiN>Ld#p7JgM0T_8y5!G z@3CqY23PN~?1jNad#qaE?6!&)1rP1E7Ay*G+HI{^6kNUATC*s)Y`3*>QLtdQRkJ8~ ze3xY-c9&JVD7a{sRkS!*y31OyI9OL>tymn~TVt(R99&&vZCo6jUt`rQ4j$NP*^7hQ zc3QQIgNt@rMN5KpJFEpuf(Le3E0zQ+cUWtd1Xu2`HZBRy-(l4(2^Q?I>?OfN+pSu} zZnuh_3$EX8EqE@ta=W$SxnRL|Yt3`PL))y4&jl;DSvAiEmu<7`=Ypl%tXhPBWfheN z_kLw9C=XVCWvwU=F8az^Qywh%%Gy{SJhauSDGzSjYT4z%)myFF^5FcfR?*U6!B%U* z(%{}L){3RU$}QHKrNL!etc^>9$2VIwOM?eCTlUi6`ps7D(%|aNR?+jpWt*)9&j;(i zv{pPHT>quD1|eTs8=nuBereS_A3XGhWj`OR{KBe5IF>{0XM?3pewn$biQRW)ljW;} z>zm9g!G5Ss8(f<=xT=@AHZ60N6}#payJnrXicVXLzqgisZ(;r8XqEM0myKQ4x2$OS ziD$Ft<+xRGJ4%A5UHeLczkOvLED5e&5O=sF`0iyVN`h~{?>b!)-2S}lk<#F&@4Duc z24^>Usxryf-gSlda5kAVS#H& zS@7}Ste47yWo=(83s$}0dZ#S-OQGxivf#l5aaCo(f@k8sC<|^{5VxZ&`150~ePzLS zPgw`cg8!ZucepIr;zU_+`DfPYvf$>0u1DqsPgPiR<^-4Yd1_AZwX2uR39h^Fr8&W6 zEnk}x{BpkQ9lRE~-k%fP*QyHtKC!--6D%)@+c76t6^h$8CwTff*TFf#`cJIGbApF1 zI58(!chGfuPH@&+u1Dqucm86{nHzlbs;A}#YhH9MnHxNo^wQkmW1iRM23I^2_s-nl z>SyELp9}qVRm}~)v(oj&+~8B4cgzhIuX6318?@hW6`)aB`S`c#k+_Z4=7;0l;ZR)s zvF1IuwYuW153Q?rw&?ZNV{r*pA6gr%w`awDWc{$ss8?Se15+m5bHgZXdCq@o_g)tRa;6BpeKndd z;Ndw=$lrhX$Fq3}gC~u>`KFvH*6xoNZ+P$}Oynet7&U&}=z+Q8Mq3+}Y^uzwfWw`T zHD!ubT={fi+{^z$U+bE5ch;0i6D|9RR}Ut{Pnw)F4!l@vS1vh~_{=}p7f1f$giGt_ zvcvDph+B^x3p!vx*3^5fy6@IKGtCL{Ps_3D4wXDIJJHb)hjdy1Yl~wP(@j;%3v+l{UzNmX*-ORX}XCdb}6iZM(e;jRF z!{a87)!A6~D+VPOsg|C2XMbGW#upG2KWgIi$vIPUrcbt>Sn$o56&E4s?&&#MPQbG( zz)<{Hh{p+e_$7vno0xOS#ZFMo8zyK<)~NAL;5;t0#!nm<2`K)ASW~ld9E?}^u}b{Z z=~H7E*nSvcR{WnKg1)GPw@QlVxqkSVcnlhvb&n3(^8tbqZp_UYnl(o1`}6r9J)870 zzj#R)Hhppy#AU6S{lVeHccg+6L~FE6Hx;d^i~nvfa!DANHL>sL(bnAXH}=eLd043l z>2FoNc686or;C^gktU9|J}CYB&oh2~!aNXZHxOras^tyaXB|mw!S)6 zS(8+}$RzCtZN0buqzMQo?tvKU`f|oyQc^ml|@= zNnuFvo<3KjT{{3pI#TxSKl4tM8N6!;PZ~8^=UKYL2^#`5$@ASBCrFp#A8+m26Ssb= z2^4nsggz;H=r@NEQtLZq)BBDG!`!5lYsBAd8~a_a?}6SPk)5|Pu>51ZT(jAj~Dk@p=H(Gi2QCXUTfS{aVM zYs#RbL`J7i6~%4Y;)Lhktwr=5&s=BmZ_2&fX!FmH8l+)aQw?Vi?>9lWOfph>X+A>Y zuFJ`qVAZ_*_ajZ>SI|hr4IXuO)_5y1&Po_E>fS8fj(+@U?;daME?WI&lLQD(Q&{rkCwIKbh890Q>wZuSFJ19dlb^Z!K7P`~EbF5cTNXdK zlTFjQw*QTjJb32g=j&lv+`BS)zGbBYZaN_A{{De}mOO^(#}I2+7WH>@*7&KGhAw6SJmF1$p^v_RsnRPrIZR z-Zak{NzJ`2&HoObGwO<5-MU$)IG;T_VRY_<3DW`WtFIrO!XljVZNaN`UoI5!l&=c! z?wkiES*Mz%!Rp;K?m=R#MX2vVbSYMH(bErkymbp*>~KysaZj|oC#~c*H+~YIzC&2*f z*U2=uzF)1BPRZ>(zU1cargcvxNEJ?DUvMhHeb4w&Q>Oy^FW^fPsrRMeJ!Kk6klE>0 zvt3q7swc&Fe)8nxZXj_WVeq(#_geM7lc#|Q0y%i!iFY>>eTEk#O8Ln0Bzc-8HLELX z(r?nF@xvxvHxW6y+;>~a8!b=Mq!vld>t1exz+saZZ=FhXkF!$4mZw8P{rxI63D!3hg!~AIG=$c$++VO4eu;q6OYj2;XPq;*6%9 zQd@(IH{CakV~&YB$7WwRk!=up*zKPHDMQPF5k4h6rG8~K+ikg9Caw&2J8X44+taS@ zpUFc;O}V%4)ZtT+pqJ;1I8wp;4$%w?|BRBxO1XD2sr+M-$K)YSAo-pMK5nzgEX zv+2OBoMBlLCXW~eC6TJG&6{Z6+!N{jobvfmO~>;lf&TzVrs?Xxigm~8_de!I^0sK_ zNlWSI?H1o6epKRBp46l^@hNqSQs5Cm?$ffSO~zw}7VI-*Yns)n+Dhx;Zr<&RP8HS# z-Ouh+cQEzZ@snUHPPtjl?rEsvEml%;QfkxGl+N)f@y$|G;%`XA=Wd?5cbY*Srot1a zjk8WAyP;!=Gp1Q7yR0O4N@q_>YRmX$@%ZQi8F{kjp)dx#p|xVzgXv9 zl-jQO8Le9SGJ1V%`8s)0Jl<5F@2uvXeHqQ$`C9op`Oa$Ep>A;th)NWNP5@ez4-IP~ znqOkdm`PJ6KsvoC9g5_XZyBTm`e}u(v~xdvBTh)JORQU-)?a0@&xXJG$5c-F&aSH; zJp)uI`3`uetd3cpmd!I#ectru-8{{_om!vWyhW>S&0D5+_4aOcZu54{Tl%_sntRf{ zm$dEV@%qlGd!Y^TxZkKX7@RU`f^{ls1{U5rQEwo|e)2jI>TdWlcMDxTA86{jc|( zNmN59iG-Mb^RFO;^d}lH(_=%FnddsNQ=)iLAA5oBFjI|p>XomQG)OFj7c%pcA$H+* zEB)-&89lD{w&>A2Qo4PehU6OaQ14q1L-0X|U~h-u#ZiJ8=bqV>7`}eM3;CMkYTYTl3uNv)XOorEqG`+CKUl3U>+rGFysi7sZI8*L}}VqbH@w3ZQ`5PZ8{T~q8Bo1;PQ=zUsmt4VzU1yG83`n>g-z;y6$P2d~utz zkZ;N*Us`9J)#f9s>!mHap*hbx+kao~D92VN`b6tbxq?&Bry8ajlj-7+IZ!L|Xf@Y0ylsn4?vxI_F71uPB|Wa23QciR>!ufB zVh<9bIIV4%(59VJ+WFd~oB;!Hpa<+cY=D!>J#J!-Hb!x1vas@PPn!g(9VEfp^V$84 znld))k5ai)I2O?aa*-nmJnUkQsU1=;@Oa&wl6}av`~nae3QUu&+Z|2zFp4SG^OUcb zrqJp`Qt0MsnUZm4%OrPFi&ib;-K{(S5BAaAOSRp z5y^U@@xc244J1SagrKP4AW0MmhwHVhtF9>Ev8&>-ig+w23gQLgED<-jQx8bn(6K9N$q@e$Z_=(XPz}(>KUmH#)U4c2Zj(~n5I(Om62bNYvvi5{-Pvz+3?Iv zZy^^vI5fK8kl}X8xa%*g9|EdKRhuUW7V`#|k)M)T1`KGcpWB+85=8a)4bv6d6c8eF zF^bKQW|9g|oI^H9oZx~{aGaR!?P3JX!mwCRFNm<}Z4h(ut zrDhHPP!$gH=2Y%ezKr2}R4Hbf!g6mx<=4tbO}+Cdo(}{IPbsLcw_Wi;v~KP+C_yCR zCYxG=f+@GSjKaipZEd}C)R-yLYEOl6hA|kiw*Cd^x!PoV!!Frn-h-e?O7JEG0@tYI zSJVZIU7b%?!uKHt!1c($0P-()`O-WAf1WqX>-QD<{k|M;nK#>;#^GFV@629l!3%!x z%H62a^80_N(lc^PJO%LqkLk`$N$q_17>N8;w1_>Ja4l@0ggImeG+vIHC!qpOnR_aU z;?zKruk+!zup)w61jyQ`$fdIyXNoyE4bl2b1$QOFjZV%0#Mn>MWzI#A zr0XN4>lpQk${X%2arf5v@7#v<6+BHdxe7nPXK0*l`221oq3<%21WWn><;`G9%Z^A& zHcGudU+-X6YTi-rC?gQePR%PSH`0@m-9=`Bzp(SU9qPnsP?HeGtBCwJfDd*x;oFEH zs5)p~i2zK4)Xx>rCZ!h+^p~Xgj(HnKXlh~S9sj_ZZ_-q<;_K}KMWBQV{Ka+TcI7eB zdR=gr%af8?lv#$s;HM$#g=ls@wNo8`)>){a3I*+9IhT+$mLv5?d~nxj9HLUWHEDsO zKreq@u&0roRcxgB^9lwSnWufKvT~Dxo|N>A)cnrf@2Rt{nZZkKh)mt=i8EpInI`s52=s@cb;kZv8EK`1yuQ>je@<$CpwyRcW)u%g%SbOvEx?nP;tez^Cocy zt-byXs+cPm5P4|ir!G%HqCYv{HhZLY-tnP=sKGCD&^!bAx>50N43C56SKJ_0TSF0q zF_W9__Kt1Cw2_>el=-JjZ-$vyQt8Xg>}!~|`ijtvWjXzgVt-Gw zFe^WEsFPCS&oK*w#hy|sm*hzs>d!Xw@ zdnfrZsr>7JVvB=&=X6Xa^*n7RT+hml=FUdUoe9!clhL|bQgUY?!0lZFdt}BOv2HHM zSG};-K4@Nwz|?CfG3DMkkprHAjLv(%b0pzx0L4l|BT}?-??b4FpD74n?#YBm91Yn_ z_h%Ok3>H8zeBPW@S@8jMb5TJ_yf-CK&@(wJCC8JQ=*E9(@hL`*k>x9=+~n+no`6WF zT%CTTza+`y?(1=94bJSHosV$utX>*hPhSSgFfM{l&GsE>_%!rDuCJ#rD7f;AbzbkR zzTQl;D5EGPv;PMws~-v^r&aimLa`!3J7{FQH!)+-$mCpqS!}J$BL2qwwan&DP-XfIml|B%Xeb+J<^}VaE77IOA zcL|M{fVGUrf&Vk8$1@P9XN{dWfqJ&fT!0Tqung28!2NzP0ucV3y^8dRzq~S#1wE4G zV_h<6v?tHZG4coCw`7=+)~Bb()3Z-nFl!ieN>=CITU=OjpD}S-9Zjt?`zOwzTE+t> zYZez(ca6&Vrz#zgl%8G0xS^v4jm|0ZWTplEeNqdP(tzo%+X++kRCo>MlSI5G%}KQC@8I= zMuvY_;o$TEz5&&r152L`Dk-z`&nsO#zaKkm7M!zS?KQ-35X$G7Sud99^DKkIS?=4R6mz>`D@_jDBXIqEn_qbu+z`TmGTM$J1liyQCecYL5 zhWn@iM|-k6U%Foi5zn2=sJ&(yb~?_QP7D4Qbdk+!Y^w_}gYLF`LkWeX&5~ zuXnjqJX!DdDmkj>E|oplmv_vMDtk~;M%qAkp6N5vz3(WmX`~;EZ)pUIj__o=18K$n z{zwAhU{`KZW@@R~(=00*09aq3x7Wnu4fHYwQi{JY(9;;gA%CD3wDaiHKAvDyyxi<< z=D2e&+#GMbah(r&seSR3LFW4S2j*c>y-5|lqH-~vWcd3S{R#HsZSls-*ZIo4S*d-! zIjMboz5QkW0eRb$@0DoS0bEP(KyOSR8OM#ssS(^E+J9I(3dpeK8KpoGf>G zauDXmn%BwcPf9Ja#`y$*Smv^Yz8+!QuzD2XfEecoZwCwV?c(mY@ zb8&vZ9^=f9R9;{BGm%<^TFR1B{rM?{kmg`|y3w2e4yJG8ehJJz>URXr_vh<%MVT;Nc zYWk9bOl>ANc?3gdWYVB)bxG|b-&Orbqz+EL+&F^&4)#y1gl8Qi)-v^dn5g5VkZ3n^BfJpqTVZU_feyH!n5d zD?a8c73j~A^rS3bKZszOv4M&7=b=EamGx4TK)xpGi_I!}) zy${`gA({2}G4Eym1B%a^;T;5m{b*qt z#-`8Lr)UT!p?=9%Bo9h71BFIb4(R~DKj^qa)^Ka@;6m>Pfrj7 zJuS7wosNY-t{Y1v&(IIa|$b<5&UU|IfMHR#;Q2z?T3+nMA=rAU6Jh1D9t${ zv)s(cI-&@22ThXErrhV{y`;RE>AkWmjMDV%lzwh+{3URs=Z!E5GX|n?p*PR#OG?d# z!bFE9r|BN*mFP1vbA|#S;O%|v`wEfai1Z|ABNrv|(ab+~pqam;ouGuPYNufKj@Nns z?kKxiKkjv!m0&_KkW1bC8i_NY1zvWg1k)<}zoOFnWUp{xIoc8$a*xZ*GSY_pL#6jj z%IMtqgKI3$a?mzB34>D~ptLNlUqCH$CyHjdohq8lVV61is);jEnM&EK`oig-6D$n$ z3gia+C1v}ID_&N?oFq@O7t6l)J6+@v=N-_aihj zaP$Vy2?R~yTAa-|Xzu(Nwat>oZ$X$meP1fiV8aW==S?s1=O^WOij#9dvI*gPWMQ1% zYCmW`PvF`i_6ecUH7rG#==n_bhb3pG<@rp*EIY!J?g>=xgjl5aNzU$kVR4+c?7Ga^ zQsAIDmax#$s1kw3YnAz(@)Regr&zylUh%#GJX%?NeUJX8}TVF&@w78^A~3IODYb2uiV)7`%Ymg5&TNI{}w9! zObvZg6;uRz7af_DQ8a377fe!jy0@Tcls|_rMT;~j{=*Ov0?y1?J*F*WnY$&=`82FRU^O0%>qeDx8@1sgSq7^pNCe2Sz--2zMkh;a+%q106Iy*-CC z(wxAx3BiCKBAH$cHv_v0J-r!8>A6EQi_;1ahf$K?%j%zC z<`2#s;0|`)wmPmF%g@=^{3BVJsJarfYNzl9USD9$tDl4uL0yUF6%*&+$GBn&F=gk6 zOiNc{VA|{}lL_2gOOpSgYevG z;MetpXXbPqs0b`{88FuIpC>8Bom$Y}$nvBmWno#CHW(T($0&t1DD8aq!8mO3Pq_l8 zEsmQwizu#VVh@_Lfog)_N7n%YIy!L%Q4M2-sO~cRQEfCLrV`biUp^RDiqUh~<#O(j z&xYXqit^$-N)kXlc*A7(2RQM8fAkic7jHeii?|0bVQ!*doZ7AeizuJUd3;L!5pgfx z&U{{%qZg&TxF_r`g3nfJ3H=r*^%Q=+B}z5ZFJ9Mc#IJ(~XJV!j+!0D$sMD!_4_<|v zOX)`|HI{y>a2SUQ;UCj?vQlRu-8)XHQu@W^RC)Nd^F8O_+z=w(iDKPdfbv|E>DdT~+Cg$I$2mt$7} z-n#(5I-kqksMKGn+(NWJI(;$PPw7igUZ->WmZ5!!dvSlvSjxW>{EW`O2Xs;Xy=Xt> zuSWZIKGo-WK)3&4v>)l6?|0QwyFGsuK6cpgr<6)Wx`jBGdrsn>mlRzjpxSJ>t>{1C z*rFrRdcvkH@9n(COSChD&XtblkT>a^=Z%DUx^k$Mod8)KipS5=rNBeO&4`N+0M_ zbLn@ml&5kmpA|0ENa;tp)P?jrO3Hi2MDTFGjMep?=yJvZ(?8Co&O$lD$Mv1&Qh9{u zbeGykzvBhIFY+IK=rhm2X7KR>DyeGE&%aQ)(0sqpI_`)3 ztIxgVhNEz;%Gj4B9xi{;I}}V9O9yH-J*PGyPNysppY@M{70-e2v2+v@@t2=|?B5>~ z{D%^!_FOm+aXLqde2VAvL42RY$9(hG3yy9<{A-CHbK~=iGr-KT-%I?TyJuXUF&Ocm zB>v1JrylhX<;M}nRqf^PpVT)c196|kg9qR1sHJ$W#4q{Vy;J`Lz_9})-rV)TruCFR zOyaN1y5y`P=)H>`_8~a-j7WUst%#p1apK1X&@W>r zNqq0TqrNy6hp5M19?8F*_}3UIUwb0r*GZiClXpDgO%mTT{gUIag&rHbMB?|{-8?TF zdUPz_I;8fi6OP!lW)k9b2ov#!bzKt|HX?qn#2d}ycD;WC;txoi= zJk=lZ=OkW#(SVNwKy=*85~t$?1|HHQ=vL<+^@iv5ICYmEr%uMN1?H%0)EvcY1S}2^ zV=H``Vk3u)7PeN{#L(N3dcP9Tuu-EnM5jf8%CSPhZ7&cQ5!>~Y&S%%ik|sk%0IyNn z{^r^!Z;s;NHEKGA?Zbcibcp`34{Z=0J4|KC5j&Otz@p;v)X-@}G&hu&iF1@Dh$uj7 z%awR65X3q+HlZBFo!m%dn&K53tn&cY_RGT4=*=qgAG+jj#wh%oTx!K_J|E7 z(2-O8Mvl!Oq8;FLN)q_wgk_8o#%;kizFw#6RiC|O;A}#OD?RYgT4@>PvE^-jMe0rZRa4EXo5DV$DW{5v1dX?WgNYW^|! z{Rj`Np83`I#Xo#)t?Q#>DKw7;82;@}N>QfDRB_5H3ElptAfA9{x<0R*Rl)$Zi~P_H z&g?JN&NcsJ!Mby#1}AEPeG>7%L^!;I?K9FkfkhH|y`S zvG1pweChM!2(&M%!Mnoy_1mKk>lPD3AJ+wfsV+2*;BYVde%x#r$3^8czLd1c)aCUX z$Y^F0t~YD(P?K@lv&pyfQE`sexb^psa5*t9DFI%St^=O^1y=y@Xl(QO?i|9jj>LvP zs)G;KBFNvTWs3Q3j+P`Om2Y4G-0>3wz~8)2vOcyOgiLCX1-+%&$PLDgr})PC{?;?H z_@d)OxFQ0j_-;qOri}QYa2qwfh>bU``T8ERL6|?dGa??JAloQ$zVO)ob}jKiXWys6 zi4!C*lm&(|X2_1w)REM<0x=R|hSAp}p<mOy;t9tk8g z?vy}c<69JounqHv47(nSvXP`BBY69+3Rg1qSaltfhvq#xv!{>i!vm9=?iAmxLLI{t(LyC-!(Ja%o^)!DZF zqdgz&y639Iwq8`<`v8AGzO-pm{BB$>+((cd3VI((UWd2q=D?!D=Q8*s9CcK@+WkS5`Ce6gTmHpp6)}7P zCeKLvZl@z|8WEj-C|BOpTmj1S<(uuh5+;MGG@-AfkLTL;!j+`)x8;AAB$c*^B82cF zvler}#{%?zRXpfx!zx?Vez=RsyQ$yL<=ogE2TiY&F<;%5mb5wGS|%qh)rsDjHeKQ8y*lFpj^=1FeknXA>Z=u1#&q*(kz+Roj7$f4>eq$ zLErx%<7jDhXAM)$_b9uqQ8YB^f?|c6Nev4KC%K`OUPqv59&RAxi(RE3+wyNgLx@ZI zi(R;jG=9Es2@P0;LcV3UOQ{53%TR>uQuWEYl*|EcG)K+v>hdii38S`!(6(jgNm*PP zKgcP&>t7K8xpCxSlbef?EZuNDu1@UM4fmjGk`Uqq8w3z6hZSfaz5_s=k5Y6$;h!*o z$R6P@3+zhB_Sk)huH`u(T#nw0k@7#FG;Xy89vb3uzdWwYa9cMrU-?>;+ibK(xE(-R zT1_4$B#>MRSDsL@(@-qDm7qjW1WL~lGM2bKENwj8?O4seWsPj(S^%GHl&zyq4iv6H99HLkg3(Wk6d>oj z=wpWN52`yDzpefpQQ+xMe}h{tKtBpqQiss(Ml>)+;RhHnGC_0?NCTm2JL9>7~0Z1rwkLaNmnpW%I#UJZ|Z_uGK(y4fC zWu)1cw&O180Dtj->y@!=S`(>vY!wjIR9yWX(^OJ<)YS7tWYNCw+R#p?dAs%yZ6pCQ zR;YY*)3CbIZHPcRbeZ*Ub2bXuI_5Qew!smKD7s*Z#L#7T!A81&99{4%36tFg{1K4Y zE|}nS!Bno2@I}*kW`s_3!Q+P3N~KORvG!b(6Xy!YlE_mW3dQL#2+?b~%{NY9?=e-l+DaJDAa7Dg0Ol%21a9AEJ za~exxI4m`W2PA-P`Da7zb>l(lSKz_fT$F_rMMwH#ijriu<&U!yBkT*eAHqIrk_?q7 z_Pt?~YqRfuTq*f;?2GQzNQ>I?7uxkppGte&<{|Ali-8UAig3Kfhl0iDPNP&ycOvrD34=Ylb}4LwJ%#(PJs`y$igd6Lp&maVG==TgO!&cS@fZZ zox3k7MB*IN{eh+%-;;yEPJRGrDbNqnsTB%hzVa%d=px~E?8MuV0_nSY$Dt)oCVHQx z5+_8LcwI`&+`*q2I<(jyenheV98%Fir`RE+;a$$Il_l^4##S^8DNLGN>q*wk%CnFL zlL2l1;C!&;T8YwfWlTINq)#Vf3h%2qkxsJrw0g!)~|wGTN*4w zM&%eo7ogd`b+*wueCbtYD?YPw%+iqg*GFf^yEn}4&>+M>r)r1V#nq8{S5 z5KwikcuIouOJV!@6k&QOuS@^V*T0lzm!Z7-0uB#pMG!;PUChIqkW4)M9^;>Q_?6hH zzs$qs>7uo6VH9Hpvo0cYl;rSw<>#372QEyD!-lEWCI6wXy8ax8j3z6dK3&>GRYB0s z4T4E`psn`vCc^aG_8XoDgTxcC0?PvB6E2VgpSbW1v=VaA6xI?u&>1w_NNc$3IkPSQ zIZ!}3H)T4FZ#y~zvvynlKP2la?YV@Y>W1+mnLKQcSpg5vDDm)EH`-$qjrapGov4=JwC-4)TN0zOUahf)x?zQD z!KRNLS`a3(*x{OSgF!1d5OQ*0!jlR&4h6KgMc0Dc^~nznhP=r&Sk^zd1`A#?EQN3> zVG}dj(yQbea~&xre0#=B-Vlmg`tOV#HL~<|gakX! zO>Rg6!y=m+Zl|NAZiJ&-ijhx)Ft{UA_aQlu7FWeXN*Y`ZacIF6nQBtd3v1 z?jkp9-28du=dx7`RfXdcn7WDy1{gVo3vi?ri(bP;Uu=7|Doq2ls>S2F7V<LU3VbLN~!RNA~*iN;#>l&)u z+xNr>(resUTafm}I->ApV|*LK79{#49(>YpKT%V*$RW3k- zh_Yg{SHMykeUT7@#;8o_my55p*gg@51aaJulL+5rkS|FtrCk}i_cnYh1P^7`8^Dbc zE?(}+D8gEK02k`vYo;Xuz-$~>ag?^CXj{Q{gG&|o1}C|OXto#tD=|ETYv?>&4ft?E zw;CKOX}>Rg0Dr_gG+{3=ea5x^GOhT`K{Tytz7|t>(t9w z*wf@d-=2fmVEYV70rsd;l6)DCorVxDyLXlhjc!nie6(Ehy-gkYz82ZQfiT)7mg-3x zGONEBPHdWKZ#7254<9?ScSp5=PhM30g9r*j{5doSYs)`D2X;9s;U4%q8zmV8Dd2Fx z*K(PiV(S4xYMqoU4%^tetRD+Fxp_eMV(5S0i++4fxn;4Fg;@rY5WdDv5Hbv3%kg$f zY&ZIvw2PMXjs=sJJ|Z$mdykN`7fDO2;wd$Yypcsf(~x47=CcI8TII!lFP05j{wTx> z8!Z#zgml=u9aJuepGr$%Ot8jTkU`xgA{C@p!k?W^2kT8i%aE&3=&lX@1(3mDr9YcI0r@*NWn(~ zXuJZeTeRKEc(Mcl@I7W+rqu>OwWKjtt|}6MHU^;2A9M06I(eg%^E-&Km&O1OWJtMt z0kHCP9icli@qLDqK0^Q8gfL4RSXr5H5={a8!7hwKW_D%5xMG?X#xcR27#3u4l6oG8 zp@b$lDTY-^&OM%%;3>uau30$-+KZPUwH7|tMc)sjK^69+(sl0m9!{qnOPwYO(hsH5 zX=%P@Qa`8$p*}(a?&j9q!(>PkBp3!FXb=Dnx!mw2+0t+tO#lELx{wXv;_<(qbueSF z0f37!49O7;CC6S1TYGR~LD#SRI)b(s;|~ z1_aQu6kqez9O^*m3Q6<&T4-4a)*?i1*`Gx+iZcbX4P-6oDK*f@0I~nv4Pw(7u(J|d zl(uxdi1c-Ij78JGU>L*f#}vz8w7Uhu=lwDOSdEJuQ@qKgDZnLX-s-QxzWUx*>BZHKxI7w;Z z3`%N{QmY(TSf|jxXJk=oKctE)sf_Zmh`-9zE{~8I?eh=@&9d%(pT-u5#`z3`50^AF zS_?T5O+q3*i-NB^wU{u=q`f@u8m(HuL@$wqFU$y>d%-8chy@~FE?Z)fzTbt)mNNW4wskRL zXgp!T!kosD3j~I-h*=zHr$vFUStcgCEY`hr zK!m<90H>;juN$O_XNeYuUOArBaF$gEigbIOGgXmkl?icLmgM`NwAD*({XJ8%Kh`)W zMGWPK7DpS&3uOO#zkH_r8(+(*0@gHV02;|gvSZDQ{{21c(e|(#fGe9NqTAb!_7;dQ ziQDUv0dc-{bzArL!XrQphOE*8YVxA$1OLnJJR zF9}G+HPl$2?UYd)?2kzlwl|Ey15F*6oM{^Ds#w#9KD}VnSpS7*nCW6N^{0Vlb%6ds zqCHae7{ti9jroUmWwCEyNsbezk>_tc17+eX$GCk<8iZX?ny;;OPkik80A(2MI1APPC&=6zNdU2>c=1{37N)RMQ2YH?YcNQTaI!$|)-5(MYzjFYxgETgwfu%nR#Vq|=M>uVM> z-EiXKJE9gzr(X_u-}+woTbtx-x(L5qYcr*QZ?oLciwV{`?EbY9efaN8rw7BNuwd1% zDYUJ6lYnfizO(gAW-uqgvBw=Y-g@s{;Ii%eGtW7@6(@*RMYd9={*x4ZY7WO_PoO4bFHxOtm~*sX8bwUL{urphFD&3(~^dO{WHdloM3DXJ|Cxrc>l$h zT%bJ&=bVi#MY}DBYEVpvLv133>||eak&q*CK#1zss>_}(ueY|o0}|;q%~*Z9UrLL@ zZt4L1$4GHBXDT9H70*L+(jw%kFZB?V${fAO%1n+9VvfZ;DkqiZwHNx9kgV8ina5mN5)RE9MPUiH==t7ea-Awc(yfZn)I?;%)FI6Jd5m*tWug1j?OYZKK@pVK1y}?}1G++mg6R zXmBL)Sn2_`7|=H)_d?)zHHO|R*@xW}cv_GQ-x9f(d{{;yX47~FnIw!L(YI7gjsuX- zrPcdttZVmSr9itfC~I;PaHlvoVFF4uOtktFk!LZHaIZK-Hg_YE<{hd-Q(@f$|07t} zEN0*#6kfqg7KcLm7;QHS2M^H{w!v2xOW}8L?-7$ zK@R6&5pC>9;Kho^No=Z*FN)&XrN9@}ug$tjdb1H#W}r#{w+6qWEw>sod<0cbXHXpm zi5ibcmgsBE2+XV%6ENj6+q0}Mv38HDn(@krY+)vLA)fzZWjq3L`Q~0+>DK&&h)6 zu8BMN26vV{9L8w`HPHx?d`n7V<1OSoUZ>*YBJ3l%iJ~N4BjRd8)*YyZ`M(`fLi~R+ z7W^M@#L^Nj_}vkbe=AiG(?2rzM*8PsKrmmlA$?4A+~-?9*okA`x-EY!oM^N)%?_t1 zLNAb-!x;dte;`Z-z2mq>5>;Dq6qWo3v2bY@Fx?%TE{|KS8_0 zqSxNrGvTXXh%8>c!_Y@yAHdvrv8bo7>2}l(om*5vI``2ERp%eB>aN1`93C}7)t!Oo z&5^3^{UcS~z@t>%`FNJ#c^1!q@MKl0y1$~_|EcE))N|93q zh>oz++CmGh*_c?UuvrH(i2|zQGg91>txT%peS~e1k~-vsrfx@rOE<$$zK2JnklaT|>a2HO zL;4-Rf<%u2>rJ9_N)(cd2uZ!Ql#raR)A_}&Bbi6oj*PcvK-x$LlgfwGQPM@6G+S@N z)L4B&XP(F7wM_`Y0Lvdy;VJu`Rd~SYfp{;iatR z?}auF|5r%I8Uqt83{#`W7$asc_Pm_vy;#eBVWBKi&fdUooo%(w>p1dy-g#Y&t>cAb zN7L>rxln-K2Ae+@``oi%)(05E{e&2Tun#c&93mWOpn)6(DY!P!u>=Rd-bcqiwnbJM zw66OEu-i4p9i|WR*kW}v%_>u@4V%HtW|~Q8C*#*d_a$Qe*%}KE4>9Zap#t#kyKOW; zhDX)Xk7{YK&Zk-m4ylFOPW0#jXgvq9CE?jmodpA7Uc3E1AKqJYD5vWWFdrroPCA?z zOL-JdvXHDgjq~0^a4w6&xj=9}fsgWpuhQw=Mf>(GOr3ruiA8$>Cq+d2RK&Gt)0zE- zORNcmk+u|cJDH~C&@wevu>(vRHTc*tnKr(QFol6H1+X>2buOlwG9iO|PhF%rA2LdrochKLv$&hinH z9j$_$<)e;AmXEEQ(5cBOXem}KIE-Q9fnB?S_P=dxFzkCVc3m2ATKn_s5~z^QF*J1m z%}cO^c$8ulV>zo_OsptJOB(Dp*pn;y-7vY%9fipiclgx3Fk00Gj!|{qDpmI`o@K+-3dA9oSj~nIwPd$yO2M?d+{LE#~OJWJ150Q`N#Tw8Kxj0bMRZ$f<~(s z40xI?UakHNCCCdN9xdaAfQur)=V{<%4IIXGF*H|My)lp$RqttyxoMq785Z6?XIGRjnla@N$pan@yIfN{W zfYnC89@1dl8aENZkOFH4hJ!=(DM)l^d~sM65Q(RG(6$awPe7u>({qVz;^`iG%LEp!xKd2J=MQOaowXXbJFNUxnk)Rw zKm)rq{5&iY!au<(jurm}s5`pRv^Apz>DXhOM&BfB{isF{L7m|V0H)TQ3YF-z=42$I zHU4#2>~yt`+mrm-HHqKt+R^c!xE*_bQ-kWQcmIwC?M3x`d?H3HZov{FJOa&-{)d;M z5%on6U=lmlQ|zT!gwCPviboN&lLqbgkfG=%i)Bi~jEul@bpaN%xA3U z+`|aNG%NzmRBiBYRosE$Tado)tE5B##)|)e7ty*aj^)-JDuvU#HKz~ax9@)#(Z)TcZ<ajK0XWwZ$WNSFGn*LokB8DGAM5&~7m1EYBMk%HMb_5^ZBsr$K zg|mI2W4lS|<)}Ms(&FN)DDRml;0CMlc}U=`B7w2$K>R?Fd4;?!T8g?NQZxr19t^6M z$6zRTtN3edv4-gbr0c$SC3F-0>DG_Wq2l1!!wu|bso=#ZNY$}L`^y7+?F&Lfe-zOJ zyGVkLY{U-ikS>5>slwkv7`stEk_h+!=|licCfgB)VSGGj=7GJ8=!QFmE;NfBG9z^< zK4}-@TEkhjYVJ$weL1OCA$==UBEOdtmwYn5s6O&Sqha)GhF^1#$Z^nfG>|>ij(3nC zAKR59B+iBDjuQ-fHvcT#2aDE_9Kmo~GzJ5QMz+5HA$(~x8jLpamO<$Ch#n)=3hk&y z_5p-eRP$%JL&d^e^)F!>4H&70kmzbwjwXw`+6vSDW2~Hz{E@)Z0Y>ZsAUnQ+dL&AN zVhvfDFtL~pTzLVo^5)+OGM@V{w^lq05&K>B;Y950{X|rZQ_0x{hWsl zF*`^lj1xOZ%k_R6@)_fh6Ar=n#WRF4n$iU*9bLyvj_^n59@>16Obxb-w#tYw6MT)R_Z|KUq83AS}bd))ReRCPRdp*+?u*l^;a zyvVAwNp1}eKasUTv~!ZzaL%hLQB8v!`MD`hW3fcz<>d92^|ay6X|AGL(lhSXYJzV_HEyIJ-0c01k6C7b4zprR72O;dF%U zX?8z3br;akv)478(nJc~P7yn-8YxjNhBl@>V)Q$mXxKyhiqFMMopjXsK#k?cNduad zS0NcyFMkRkDonVyVEeu&FqosHk8F z9I(SVIrxF-Sc|2w152ck>Y)mn=&+>rxFCW<2t&Aa?#hI`0d!uA-k`uqi(~rpNek*o z2!MS!0qj%Zw_wbOSt@5Uu3(sbvcWQeBM=@(JrRnAD`7r?cpQ2kLfc@ijG{gEC{{KX zh4qNj2r#V&SW`=d_KN@wHlFY#N}ev2OJ&Wmm0=1OJtfs+63_CrOkfzA^o81fc9|#= zX&1yM5hvfvttGSt_3t=hFOiL*fb;OCb>%5S&>P4BLC-t^s0|1cH~wCQEo7V&I~}-$ z(KrNLYFFlPgXU?R9meYze;+ShUld(nCe>N-?=n&=hSf})nwLmrCsAc*Qa0^8xUGTX zgch24?T(dGiG!FTrwcF~_W?$lQ59If0a5~TGWgulJ5f25*wlfIHnHrf)y`E02o@<3fZ$9i9rmJwmVDe)j3uc_&Vx|DpL8lW zjYUy*mxz+C88{q;Yf8$kH{Jy+PJni7m~9<_`op-am-?fO!t6x7(#oYUIZ=`Bqi`0& zDF13zF0PQGBcyT|g)AG*(O#!XwPd~sNFf=YA0Y}PTh{`~4utvSx6^yK2rwVJft7&s z+C@l_4#C-M@^yDr^gdPk^C=Q5wvI3!_^4O8Rm^*B7-8?gdh#{XydlJ4L0yXoa}z0I zZJuGL&}@%$F;#9lG`Fl0$qh5D-bCYI2GK195}N*X3-8h`h0gsZ~3hcCJS;&I6NXd55 z7O6eu|Hp+nEZzFIaEIqGekoDYNX-LBFyh6!p*Y4nUhsjRN+`o2W9db};rQ)g(n(-x z+MG}ClxiP6SW0Uy))j1XQ7h?wvp}SJsKy-K}^$$PZqs z>U!yCI)3T-Q9l$u_cHjBQ747}jPR?#|03$7v{5L305njT9(S#(n}MfvQY7u+iK-3{ z?X%86TkNGp(*?{h(%2&NSxfDdOtF`-kj(nby9 zipE^(QyS_NtA?Pib%>D@eucEc)u-!7I-FFjLqrB6sd1#nsB!fh@yAkxPo}|ra#Wq) znzWC{%OQHUG#?=F?SFxF585Atq7ZgST`uf299TzQAE)O=a)g?K6)CmRfk*orlyuL2 z;#<09&{h_FCske-zhZ&yxjNJ&tekFLfH0NjyEempVQ^9DhM=_#TS?(;JDy=}pm;Lk zfEJNKPa+zLM>b&+se%u{3E?-0B;%xu`~Y&yC>=zFpLYPD%?03XSkzR%^))>3;XgS5 z+SKi;cxJo?*iHb~0s!s#!@~$qL-;q4b~(Y00c`A8km{GfQs?St5%xU6ek7GJe;al$ z!45<-V+~uuUVs%mV-FH`7Uk*I`wwYRzU^!gXpc*o**D;BN1Bgd)w&g4gBofr~;TPr(w&G}z zG@U|yT-q`pXl~vHUHB0mAM{}Xo^m`_;8}|2VmzCWcev*}oj&GV++#c4df`FT-v+#x z+1>$fp`qC^glI4Llu2O+ua>hj;l~BcYp4H5H|LL(KHvHl&M+#z7}0vVZO-~cr_A9L zOi$K!oiZ6IyAp6QseQ#5O{{`9d=jBk)*1~;({NYC!6IB0L9@MGz^c&Txtu@!-0t~7 zO(u=ZR9AQ{M)A6iX#e3oNC5|)djK4`1>xu(xKQ^%TSsgUoJy6Iw#1)DQ`OC9ou}$9 z!}CWx58_#m=Q})^m_IE1p71lz^*a5H^SBR=Bnrr}j8o^QLRN^0ZzEdYg+JCkaIA7S z^gt6y6+gvU$g`U4tdaDZ2C}#(Le}MyE8SL?a_02zprkK86vDKJB_6;eR6h z8@RZGU>_FP{|y%_wjP#?@iu|`(5Xz|3fjgz78MB>9X5L})Bsl#K#>FBuz48tDPuUB z0J<=H2nM)mga_HSR8F=(;J z{L&kd-BmI4A}uMeVIB_8q^hP{%Tb)#8QgP;Xt48Rt92N1?^kqbHgPT!Ark6_EbAk3 znDrq{oO7@}rg{8o0F|gk31OzaTG9QFeu0kbnla4E0Ub0a>b?>Whwvm)teF({wg2b5=*wHr4x*lMdwSRzHlVE39<;TrWhn97a%d_79h%?#_RiXu&4a061n&U=89x-as)zJC-$`t{_!s4(g&_cocer$$Sa6Mqv_u1EW6iRFQFjp?A>573Dk0wl8%k@H8aQ@ z>(2u6tOl715bok)D;+jPn5<-{A{^tWvYXEDr}O(Bv{d6FS=Jssfd=n_%L&%1^%w>Z zZ|!17Y#gnFc=DKT^+l~f+Zz0Uwqaq`?iaiw#b7ZRnnEfjHmsev25T5LgzQai3>GZZ zZT&&xoz7S2*Y4ZJ#f`F~B%^5#os6cAYnn3*p|8`a?5kBq64RVpBQ#eDj$a#jN255;pwb?%^I}ISdC*(+1Ft)y zJC)dcD+uFekqm(WT~Ln&{D>egX|^aG&nyTQ9@XF=+H!`;fzh(eQYisN$IhGQ6mq^&(aoUDXUe_kE<ZUaac z)*H}o$prol!aoPz)B1__Tek`Ld$%FHiNSxh4<9Ai6@r>opdKVEz?+zEy$lJ_4bQk- zH~dbKP^W{AWv=S}#RkU^#Ie{p14bn_E@JeO@-3xCHymS?5gA&g<|0g-q{}0CL}3+x zF^0JuZ_)o3K*;2`nO>xt=%|N1?LWd*V^C|wB4&VAEKnGg319I}C6-^9_y?%jxITBU zV;fKlWgwAKI<)L7Q)!noQWo66(t-{*Mq?rC#GyVs8syeLge0r_R_lEV(Biy#>;s)Fk_vmOB8faV8P=oUX+`F`LR8eB zfeSP|bPMp_im)@#etyu;BiK5jfi8pN8PawSOrXq@kcs1WxKcaAetDBsX)Z>?0HGjS z8Ra24s0l-_10@e4^tJ1^QS_hRqtZq&VO`hd^l2QKv*}o%P=QzMF$L>Lj<2OJBBbi( zJt}$`yjKk~tW`jR_IJ~?QT$7{rX67Z*@8NgOF)0VuQh%Rmb$-zg+~#=WPHX9Fxs)! zdLsuciHof((XOkuR=RF4uTOtfWZt?Nb-gVrIeL84aR3o^IgiqZYP{map^Z&5eG7KOuyHi0LqS=MWmy;aC`^i&h#7&cfGToY9gyQOf?)d?(H zPwoWYaynSGx!S^C{It_gxEKCliLr4HEOvto0DtQ^>&TP%bx7aSXL-yXFVW5^-c_Vi z2xK3eP+4t--k_6B&#xjmGQuN(W1S0zsXdHnM&eV!wiMGjUMSCFFr<@w3s_R8TR$vg zNp)IcpLO7YLstRHVHz3|jx;9umeSgXH_p-Hp|X~WKEJ`54k&^Y@GgG4S$LuId4`A{e6Zt7Dy8H@q7 zJ3NBdxxXr`#b{XgyjZgNXfrS9ZJv-d-c|7sR2XZy9NHNzMH;W?ZBFvMGTnN6DYL3I zxO^rL8(TBG!>iEf7&WR53x})Ig$}WxVNusOacA$IoHrPhl5}6v{{Cqa z<x&0oX`@lc(?+DwX-f+~UM%=~^wSu%3meGC8Q_+C3u&J^ZQ}$$J zv%ZG2>}y^X&I5AP^mWudV=qF=SSVYt%c}c}Z(g>CsP+*pXO16Zl>;+55okfQU+X_y z=!RPc@$U0}{gF(vgK!>*DB~0NYzOTmB{<#saxqAIoyIRWxzN}0N1-afZ$B*gjqN8a zBvY{s9F7#M6yj&npx=+aE~M+`;GZC~49*g!6z{PhC?xJDw~|&;tt+so zsZn52{NcDWLh!c+Z-Uk!?l9M?tU^wYaRNC$ofvtCX@iqL>AvM}KrST$c_%GEq|oph zc@+(>{!R*XiOlO<)v?x73v~yry;?}<35!B7;f^qEG4bglMr)6$CHcT;NAx%9_5pV) z4LI@0A8VZ}xUu`I!f*7j(He5v$u7L~3FI^!YxM_kc#Q)Ek65JgRC)EqF48g*mBamh z9UP?WNbIWE1?nNBb1@V_sXRC-=EPTYW=pCCT zn(KkjnGMK$#GK`s9M@FAWl7Thg=h_d!@FQ(oN_qR2TOu>((v5@ypFq%u4*0v?~sn_ z%bN?4LWqNQIitiXrWJV zUi>R~Ej9L+1^XAWna9}W)fK{ykz~CBSmGJIE+{=3=Ue&+A`pV!H$n(jQU(ilk+0=W zkm2OYwncA~Qs}KM-Y1X0dNcZzs~bn|PCnjUuN|5mH-H zq>pduIErZbTQbba3Hp|?;B!u#k1v{(GEnO`I%RtJmXg5=%wIPH^A%3{fzbnJkR17Q z*!(*w@^>n7lv4znIGZ9|B@h=0)E^0o%q*MArCMjqM+Q&G5g)a_{+{M;S$5;feq1<> zB{`qcJ_A_zO1u_oD3#T>kHShV;gn8Zy+c)#$<|fzG`1mOKUv4oM(N8)YB?#_LBx#%EM}+H zv|?tF8UQ(6vpcQLSIL=c7AD#*Kq8$IzP^Uj<<*=q);QpE?svdljNkx#4|L1!?Sh)v zhNJCZ256U~?Ii6Ch#WShaVe!8Cm`O`X77h^y~rl7+$l)NpuDl8O-l$V43$XN5z;mE z+@Hr=YZp*|QqPgWPFG*n+t5-TrYEUfO*JmkY^K$-rbYZNP|=Yp$V36Aa$q9INW(SO zIH`gLfL$>7hPWSMUwd+PD@bLN{R2EjSVAGt{g!B~yU=1qbsGBrpysw1}Bw*&{ zaf`zkAq8`R7=1zt)b&7(MGQ@i1szlsjpYbLk>OlMgb`!T`O-Q+E-x>x3}x2j z*I5gwRuW|3uS}?fBSucy*t~=V${j*hrHGPTB-%%cIASA81gEO^Ti?u&QX*5M%b_Dp z#5J+Guc7KwIF7s7+pRvDvLlhyaGhmckL-b5JR(=*@R!%>P~aT6p~Kjaun}(Ef?07= z$HkZE&p^;^`~9PI&=C}8b-3Dp`B1WpwQM@ z?Y0fy4qt~|Kd;lG?{($VDrgaV@gQUS8@$#Y-fpDE(!2fv&2ncI+u*l6SMzG3HF(Fh zYyc8F8J6n78jHUlgCy~WQ_^7;!~7ZubsGw?Z+tAm4Rfux=Yl6Aqtbbjl^1w$kNc)q zkxdqWXj{Az-2{G%6+hRy1%(@OtaF<*fuAB1YZWFC)bPd5Hi0p8Iaj_jtE4BeR+EaP zPmW}ocG>p(Q^DsYx)5z!WmI!24|DvwphD=38m z&=xB(jAeLYf`mFG|2elmb_Gys*TA+hPyc*2ReIN2@;a!<1B~wNinwN8hw91J}=CX3&v-_JXV0p3aEew3Rdsmpor5}A;s{p=7h4iSau zRwaS7@(p3jnH)q}tbhh3^1Hy*>dk zJRS%g(5Ez#8%DxVU$g{fg7ugY+kmc1A5b}FfJhlA{2f!M--^N-_A(SZJpTA7{BezY zoVpSk-_>FAjZvRawekWWnLKAeBWs;T7OUuVqFAGutQ=I1bwMZ72|U(Fdq1lGMwAB40H%Af81L7u&}>J$07`5)Mh{hmYm; ztIeWr^+%~+r)jKR(C>7zo(Br^TVoTM>DCDejr$HS5R^e5t_C(Bi@fC~Q;u*7?X|fp zUU<@^alEQS?E-^walTN4xQvUF5XZ>+({BG@X*7HP$tmhq)Fn+W;mpn*mH{Li)b}-p#A#J{#AT8|2 zRG{NcV33u)>`mH)CEH}e?-Svj_N)%s&^j-$2q&C0i@-)&;~=g#Gis~@QOGRC{V6&PjKu^F#`5RA^$T>Ogt0`_acU^mSpe!P zZ%DKTKMV%TMZ#EnVM0P#OdRlW)T089LJcQ|kBR84|7(5Vu!sAg#@a~^P-f3Y8KTiW zaUYWG%QeX=BfiqG;tMo2%i|mAE6~z(cyvk}rjp9w(*jO5Ja1SC={H;L5-m+OVoISh zGousOUpIkD@#hs$KXERh9x1ifS98!6uut!6B$o{ta9!mz0<4}LlmTW_w^={U7O?98 z22Hytj>=5qGH(8Op-ZnR>^;P}nt~{yoZ=*5Vu*R4fjrWTB(tlAG_Q#kr4?^0ol`|QRZ*1D#DTBj)XCK33m~Jtx$VA&v-^#~?X4!c> z`5IPl@SCRO3+#01U8oM3=g@6}C18K8i#{?-O9B3DZ8Oe~Lbyl;$l_2=oI*s4kOZv& zcy1eqpPMWk8iV8q#sn`)sWMoX*r){rFJNb3ulk~ZVZbojTldJn71 za%(Dbn&$28k~5~bwh$q~x~CGSFP0{94SRrEpojzbf~?QN?<8FCgTob7bi3;qEJ4s( zj3UIy-!oaKTWbU9t4yc7N&-g+KD7HVrv^R;L7z{S1w~Z8+w4|?B!(7f!G1j#GWzWu=FnB z(X-DwTIj{tA)h9k*>y8Xs@oyexZ>C*`xYcp>wE%Dpw@jjF%@a%P5Yypd8vl~XohYk z*>YE+0R5f^D>W=0B;l#;L3$W1wMln2QOHxp{Ap?Bkn=$m>JSk~tbM23MJXlPsv!p# z(&(b}4k7)(ODwFqD=JkcvUu{(JE zMWaMMwmZLTcAkh6DNx{G)E18LQ`hlq8sDG3FOgLl=UY~Va@~^2_m?M1iS&fdC3`9! zC6>yh&WJdTU4?uSz4;s=0yTvkBKX2G$CNofLdE#b{OONG79FpnokF7Idf*j0~CP_)18DRyf<1FfSQN_d*9Nsm2 z%{MW2Fo!Rhz>OWWVMA8zQoRhOdA0-HK-)3TbMvu~;?K13rF?9JD_Mb&A!YJ6co@Gd z?e)G5+=u8tT{Hp@?Ch$gl0>6k3O8+v5X$oLA$JW8*pTdN%->wS4`~n@QhYK7aVUoL z=+bHn&ptfuc<5Wmw2WN>!*?AiPkcOlpJ>loA3N%yf@_hEy^eU_GFm9FqiXu&{2Sai zOMHxde-Dbb+sABK31q>~6Bi!q6cu;T9?}=Lij`05m!Po6i4r*3K}^hLPH?sv~JvJ8I36o>V|!tNH}5kw@n+}tz!)cCjM*; z$Gv>B`t(asvh&`!-8ROkJnwcFLr4}=!Jp>BI1v|+ni z@j&RV?dq-vLi@I>2OkKjjz>e*>uTX+p|;o6ipN45URMu37FzMTTK8C}W2@ToSZL2y z)rRz~%6csH;8xXv+^uTi+R*&1YQ@@+^_qHcZD`wTYTeq9uIBUq8@xa^xzh??(xuyEo#f-p@myi+vB13&B_AIX4Ua{ zXzgaT@QKih&1%IHq4}HDgHMF^ysFkc5!&*q+VVu`!BozHZ&DW0Hz{@7v!Qi8maGbG>Cya5 zsI7;E_V;LBg|jg4zwX-ey6fQMuI49PKR)W3|CsBYRj#&GuH|>QZo9+vU5D!IPd=9ttq2Z!XLV@(!1q>%{^a@?g$I1TI@CJg>(!x$ z5`I`6y5mE&U`^X(nLjUaX&YIBOE92f<6S{qi`gl#~k*(_UHKCR}pdFFcN%$eJnnKNhR zEx%Lu%Omritk*C2+q}mc^()b0*jKOUyenYoWX8|l(^(E5W%kz^bqdpuDKD!Ev5u98 zpPj9Lvw%sDv4N^0_VuH?f1In6K6y1E7CE@+=9zkC%)7C=uyo?giU4c<;Fg#5O?6=3 zjEE2@^H&M4_ZE=XC1pjW)&4*g`=Mdy-{$^p8CW>@RRt%%wex2j$fLX~X6!h3Glt$F~F z^gPCkFFp3fT>av8C^Glp1?fC|b1S$${pFLVa`)QJPrU@W7;*=SLhP-`9WTt)*Haqf z1Yi>_*_!vzx%J40Cwud+D|btGN!b)hjm6JVR)|s!NG(4;yI-$wdjejD!m^nap~}$A z3U5}d6;{~B|RkkDg%Y3QFtG5 z&$1G&NL}5OvaDRqa0S(rp{%;Jl+FL}p0&nrjeG*kODgvu)>6qTbHKeK3Iv+f6a za=}nt<}X$=*&YEnrsK`=vhvV{rKROXtmWyy-8$3whd}7cQ1Lme>F4{F&sqpJ(Qrvw z@f9csYr6a1kIWxtA>H`GnlWS8m*3yoVJ7>_!mY)c}1uM0}*?E%>&)$r)V)6{kv$)<>eSCSUvy@!*%d2o(&{H%hBRlH=W}7>y1^? zw$oBoUR_xfxI(&(=xNN^@a(+AK90nMVTsAMA&E%|gDqZLf9pVNiX+vLX57sz9+TVA zC$+yN!<3etZOb%eniN;MNlCDq((F!UfXQX=<>=LGq$4N!9B)>lTNz|ec4WhxYH~%E z89`%Ei1p~ayx{=5d7zraK%pw?*3B&o%wXMCI~t4(sHuQue@~BJqRgyq%;|8Pl9p!A zbo5V5b7nfy9nPe)J!#G~XR5<#>l^vmG@+=ljP)qc>WpM8y-Alm*yT;|`g}fj@~g~! zS#le5q`F;>{s|s;T0*uv$Cl#Fi9Bc-Th6-8%H+TlV3{hhR4zm2c8;FaEAV>4!2IiG z5iy@U8iQCr`zgH!N8YqtUJ)o`2?IR+9Ul7to5!R?mRQG>mRALs^F3y=Sh8(O+7Mf! zYm|MMDIxN+Rkm;xA9E+V6ySo@^@l>N|INAti~Y3Jv_!8plN+}+&6>^K8PkN}6 zZJ0gLc0N#D=ahh`xr0)6K`BMW`o(TgBSc{tOLQ>>y})yp&1=c%-N%tW>;jk9oE7VGU*Jg4qpN>Z;2 zVD&m2nQyXF+nBO>cCRlD%A+%S9kw_;nYUC9dfI6p?nxQ(`{Yx->HTvYXGXU7k!2oN z0*kWZ}&d{NbBIB_Z@|k!bdGrhG@u995Il%afd*onTXPlCpTk9LkbN ziormlS|L#V7O;5DloG1$b^?-VQ*4<&pVet~dvZ94_G}4aVz30Q)hrU5c^X-}71Ys^ zd%JrL9BxmsIc$!|XE~RYl@Pu(4%QUI@)|OmO+}5|)3@J*P+`#xV*ZaANsqT;iefhW z>_StC4W)f=8^kV_1E>v?8Lf!z*o~n0>L2Y({-e`-%@WLOV`(oBn2>t}0>;uls&sG1 zQgkfsox*)#+k%dtDgN(;o2SPS%-BB)_u}4X&uT?xV`*nrrk{o~j-4Xh`ABQQY&#a; z|6l)TfZ+oJ)wF1HvKBEf^Z7m6_m6KO(&usjk=AIxmL7aWQti|*SQZMLg`d7`EDNyd z>^yckD}ybMRpP%KhWtY?Mf}%~_|dr0SeS~Bi#Hyy#^U> z8|TM_U(Rlbi+>s7PXzoL;BXaE1lSCA5&Wu=mM{{3QTSKFzZBt6B!Rf`ILC&Gye~pL z!bHT3#gp=#0DlUj@|VC}7MJsQ_{77H#q}ZyHy+n0o@0=68UD)w`*P4Dz@ZCV2#*PD zCadCfpN5)Ip-~Q@I4q9EnV=B`X2zr`1jPe@hIWqcbbP56h(7cuYJ@^2gQ`>5P=pn+ zVjiac%#j^+Z$ctdSPIiKhZ+?3?E@F}^?M|Lnu|V`M;L?;4K%69ml$hu=fYTG+d=+kfb%pOITlgVIEs5=u z5*Qk%>ZtgBi|hG-y^pJoxbyjrGej9{$+Nc*m#K4%g=a2pNh3;ND^Y`&y;xXn*yQfQ zqq+#wz~{rIIgD`B1?)em5O~xkyiV7Yhv(Epx_W{sjv6UzgR9Ph06IgXa2aWnh(vOB zwR4U#aST;Erw0iMdmgKu(2Gs<2~V`N6-R50dLAH8L%AJW$F-!OqZX;K)0n>~H`0?Y zOT!~f)dvye=XN0ikMr?f@Cs6O@UW@L(J1YG5d=}Vvx;;wk%$+9bE;RwtJSf9@LjG( zY9EheRPapo-f|R`afm+EAd+53c8k!(8UCvX_?Uov78?M4E`jj>;YT}341NXn7Q3rG zJ}L|f3c*jD`}c>7j%NIe=2)8MixmnWcYR1!EMLdl#&x@03*C4 z=u@M@tr}=V1ad?XZQpx-+d6Dg4{ycB`ND<`unGb{O=Nco+To!fNp`3N@`tf&5}2A5 z29N--4E_LixT%4Fo#u!AQYDbAA}=N z{eiTIyEDO?V$%FsOM^b@-N+%L+%ZL2q=@32^&fRkG=sD{G_{GHA zQ#%TJc&VS-2}fQ7{_r3p4GIdP!c%lT34qSYFam`km)*njMD5@nEYf3`!Km?levrmw z>MqdRk3w|vTPwA5zDE@5WAyH7Cr>F3$$de13iQK&(Kh~Rpc7ejE*fuNRBh3{9-aUU z7eyA%v3$QOdfGvmwP)f7mrKsgw})Q>iYE>R+U;nd;TO;h!w;ag zwQ3xOOsN{_WE_>aNmgQMq^IZDO5B5VY9-=Axj)>hSWD z;KfP2XmUW@HWEi~w~26Hcp%bKN2Qv@^wM+Ie6tvI+Ns&+DST|Fxq(`eC49dbdFDj( zl)|y|+o*?$!6WZr_+6kM4j`&l&QySpYp%uw(OefG8&Oj5^Rl_-B%q|wGq@lBX}?l~=7VllfcYMg@Hr2zIB2rJ zC0f*x^Gw7Dr^6ZUgCDg%9|h6FPY`XlfF7bg)lNwxKxeoX{ycAuq&ETw5>+7K37j+1 zw7ZN%`!9ySdJ3tAG#ja}=Y1)L3y`kotQ&waNvG=|8X;a48-j#X%N^lcr~;_RsT1?u z7+hyk3DT^n*~a{XUG+0j z6u1<)vR(Bz2v={o2D$356Rsg}{oYl7xp18aSAnbkLgBg?u7R%lGvR8%yaN&_ZB!YIa73?x)u(RsA)X`TKMJ0T6lfGs%JgLkc~IO z1u*NWX3=El*O1_(U%i!t6J=_~YZr3pd{{@Pg0@!bTX!X*kc6qkb85_7h7#+zG6KZA zAMx;c?bzs&cU+&y0zCR4BkbUhW_$AX|QjCUt)2>H|NdHs&k0?9x z8D*zt$aN>mG?){kX^ynNg?J*((e_tFnpH@H`H;tIBGmNl^y(v^eSi>5gf#fh=OM6U zwJ#EZ-y;w+U|e8rdzlDS9L$fYFD@{*9ZWNUJq>~AvSZ*1W&lbs8$Uh1Q}ElK1kV?< zLGPx`L7=iR7g-iRUi?_Gm5!xPl8QA+Ba3;ZjO?4}N$;V#Mo4t%ei*?HV{iD z@WDhUvQY5T<4eYGOCElBLRwYUjhYB2L`mO4FASE!9<0Jok8dV^Tjt^?CMx8LkVpLt z;1GvsQ{GQNjq012i-YJ#5>Y#ZSy~=dfehsNZGaQBA+E7@&QB=nix}R;1SOYegD~h% zWx;z8G57#}dVGJxkS-$U5{x-?>5ztLFb**@Qa|{#99DBnhKq9=*ScsSB_cM{d?6s6 z&mlodoAbCdm(W0T!ZC%eb|N;AlI5}hL*mu7J3A2j4C9hdPk04pFm382F;=_)6dV8y zf`jqX;~UPAiJeDDMp%{PiJM2;N$^l!a7F;;U{Tg>;7`D9)9i{l^eYI1s?&Ra49ej? zE=-wULO?BkdM6AYhHndi`ZWy4P!=Z8(+>;C+1WEJ*g@F-z_C3du*C{bO#dXrl?SOM znRi)C-q!#|_&No7-w>BKm&Gy$DOaAgD8p_D5KBQn;n77Ny12=JFLE)gS4Ud909?d7 z070!f%p|TmTOY#W)6eblWt%PuiWW7$QNXCVnX#V?i=BJ)jm{N0&7Orh^`7suBkp^9 z?{qIoUFqJJ5>eKs>{RYZ-li<|ELV0b9j=>|-L4}kJ6*f8SGvBlEOo82bUL3i9&kQv z*yKE-Z+3Q+E=%kzU1skpU2Kn(E_F0cV_j9viH)HS+pHwkOnT zW6P`8=^nkQP50LsyLDY)9G)mWl=WQJfT!-`?84{xWARjo13IC6)aAbY=m2@W_WBkQbd7vkhOrUaQl8S}olLY}LE# zKcdXXl@}G_yp=6}^2-$l{Rb35dKIwkPlX@C=DHAJY1#1ChB=0fGqAztFR5g$^WR!J z`>7mcV7$E4Plv;-d*{!0>HmpQz{n2(?|JX&J@eLK$*$+2;cvsQ>-F_WFaC_<3oG&q zD+{MVwuHn@o_zbQMfwlGFj0W?ThZ`yF={xpqzjaX*ovdCKdaZ_*qO>+_u7U%CNz)oqUtKXk-zNQ zt)t$=`H3Li*GnG10S$x5Sil}X@*^}2cY@41h~Nlm23;|wyu7S*COf?D(>rJflj);p z@NCn{Ti49fZSD;cywU9OU|#=2H?QnNU3$4T|l&qw^R2BQ!3w?*!`QHzI9$RsL4?*n-Z8< z&YpPm?Kft(()kfO9Gx-q?zR$b+c*}&1fc+gt0v5xCcGDsH$Mqmwd?b*6OgGC*dl?1 zDt7y~tLshgBR3-?7Oqx{O$S!o1EAu+kR72OtqWBaRtO21xH30W z;qq!KAQQqqdHU1$b>?>((}BROM8?KpL>Y#H(ix;roJ^<^D5{7J7pM`!HBzib zNZs%;K^4A12RpHd4Htun5wMXxQA*xW2bXXtAV%EgB*HWp54jZ1gh1u=64V2U(x82E z2^}GogM!5TnGWsJ1Yl@z^Baq3Cc?M`c^GMhm|_URO#xN1z)oYjI2~4~r*$hkxyT6# z?Nl=B;SKX_&V-D}powUDd|nGw4pry3ZUy{@-%^BV%$=-wCP;EfzKTvBz3A7}ln+i+7+kf4+x zf1(M*V(f1*r^|6_zu&vE`@Y3&DW~-9dqGaGtaEKPS1(&;sigMtopFKNYjW8#`uGNHWsx^+s$huWmzh)&QHY{x zM4HG<2roD~XHL@uMQZ25E@T&!bYxb06J{Eg{db+q=kxg7-a&4w($DSmjz~*(W-EOY zvlB91Hj~S#IFlXe{nGmMwhc=6_Q|rj60;I=B9A)rY63;o=%?N0wUBEgDUxp?0kGx< z%D=~~aLEd@y`r4t5!P@qv~J~n=rLGFJ_1$LfzDekq+6U%>a2>#ZFCxY**zH-n0*4E4l$v7par0Lm`r$6Od+;Fb5=zw5AJb26G4`(Up}z z%tbe?q-+>IDw67xC9f$2){_b$y4-Efm<-SUs02ZdqViIbn=%KfJzVRj zD2flEb`tfV_8uz6Sc9-@ih21_C`)4rgeL5v8<1|Nq z+mJ|;SH_Yx*++1%zBgpG`CdFkH{{gOydzYBLWrwRh=@xk!4Lu zAJ(gHVyf%Z5=s*@ww8_DsmkRJULY=I8~Hn zxH&;e1qr@ErfSK9D7omwc7f4U6{8bXh%dooPO)WMG9B6Gj9%wQ?nna;d1a!JM61OI z7#snAOtqNc8DA}v1Uiclz-#1(U!r(jtJMgvsN9Njh$d5wX!Uc=arMJTFpMPT;0)$@ z`2-YA8Tce_L|qExVu?Br?pUH;7lXVY>SyqgM9qX1)tvYZb66tpQ8wC= zWGMI|*%~d>dG`=pL_I)J4;>d3#73mTp8=07b+AzEvpngMMVVs*7;GTWWIx@L8F^H7 zQWEZ^8$y(WV5(jG>vs-N@=Jw381 zXQ6VCB{(sXYCyV*m2eh{F2x92OfE#Sv0Ug#h#5^|B=+Qo4>E(Okt)*l z@8ae0RI#yR1)pLCyMDdUR~9nQCIn*sXn&vn{++;+4{@ly4VCMK(R^*q+Yq%Y|BB8Y z|8f|z$C~(M1!E@@c0!tC|NMr3;<6z63I&V>Yy-xQYvh|P>0V9e_c3mqTTve4(18xXUxzWoBH@z%Z~XHckuVpT(!EOck6=;1 z-$D80GL`|n$nU@SU;nLm^K>-+sdRyr zt@{r3_bg-EP=8cU6XDkC3njCB-&1UaL6AT4T~BcrOeYMv56bTWeD}lbh1mnM8-~Jn z$Zs3ItuUKlvJfy9c?`#RzXtBru&;y}2ZNwr`*&QKsNL=VR+Ir&UY1(vR>$TFxDAgn zwg+XV${PVZhQUz$f%x`=$&&6=e8Vsbj2*@TV}xNan4*fizU?VK58n=a55k0DvH)lj z@)$lDdBD9J_H)p#ufZ2VzxMCAG7^AD2g>jOWO`&7;6?E?_{$OQ#+*9@?PV$Kl;$`7 z`Eekn{Q(BSDmLP0HsvAqQ~l@v_I62Var}ay z_c;i-RLFeP*Ekr4Ha`~MT$uA=I#Ayu@Ery-1ZE&iKbS0-4470HFN^|Xhq1sIVX~0N zMC5TA_^Hkgz(GFa;HJEP!yiu<+lPf<>3VQnnqa9W1>NR^rDHzkCX2UW8K<`7tWH7ON@K(wKYbZrco|joh+#~pwpk=4RJu?;?d+lLaD*K z;^L@BYsiRX4HvQEg?Ya~bplP3#f$QODX!bUueh%3Le~NU5aaV_*UclzXa1aDTA6D> zKWTp-c##AE`O}djjs0YYJi*P0WUrg^%k{2?<*-5>Y>ZIVBI9Vvx+gC}QHF`<7RY+; z^nb);3q(NkI7FsDt0Iv_A;^r7piMp%31Sol64P(x2!!hB!-PE9d?=7Yap$V~$!MlO zflez~4{`FM7FPrD>ve6lU{i6}_vJjI3r^lX+n=bUzY-NQigR_9L(N0Y$ce1 zV;})TE?*T7i3E^=YmoA2s-^7mgSg^|<}1aexok1GB3UBBuboOQ3YbJTRr3P1NvXL@ z9!3gTk&Ais2puqja&AZsMJWgIW{45tWLLruH6-h90DwFvLz}TN@(yBAA+$rFdb(FL1VxqWC;Sld`$B zi9#9|o49T<9(GKO;zeUM2*q`qDLUFBkw?0QRzG%3k}c@R7yxA>Xdt_22MZfIk-Tm* z{Q}4?0O?sz4&F)@iO?Dng}V_!P3tLT(`E+QfD?$#NjVz|&4-K(5|BvEOOQH@3prL+ zuBm~i;5kNr+VlQ>hJd~W(DCVqrC3}hF=9Sc7fg>Ka^pl0Df|EqOCfXE(D^f@jT*oU zladxuncGM$Cp27Hf``yvAc2fPO)S|SoP|u{JRyqPe5_w^HTI}vtndI%+)V)EQ}uWG zgU?2jgiVOB!GdcMi|(XY{MCtp=oP`0(MUor`r?HRYY_udmp$tV=`azkb`(yTNHCb# zpQet0lu(Bwu*HNYiT$D$I8`6UxZvkXW?C*s$f7$59DnFRS>*c@`9Q~s1;WzshN>wV zY*F99uW9odXjeKxH|Bz^P3t?6;G}VC=a3?7l8R6zG65cyK%UsfYU z6K!;>=>}j22#`h@0UIyP7Sr#^lj@f1>>_!`gQ!R-k3xqf9V#>tVfdHbbW7eLwk7Yd z?$*4+=j9y|y4IlEiA@DXA$-wA!w4q5eDn=ITOwX#-l3+vZvcmMvv^@3bP^MT%dIT# z4YVMRGBU5r)kL#b9hG;nh5LG;jYZW+*_d~@cFs2#LuR24Yv&vSQ3?@>vON(BHITCe z@?6-BSON&UorVttrBn5;zqSIIj%eZbMy&_(!%1it(c2hAATEO*ydFC|$M6T2k!%lG z2Hzj4X&@$-fPv_EaKtf@H& z*(^xyYRCpat*-WC%!U#gNVO~?ixFCciLm8{E_@fE~Wlb0?3qn+tMJ z?SY~@LsMSsiCeTQ@QP>@t&jwoHRYgUC_c6o?&pP$YlZJYzVqZ2XGdtXEXEPORK)0)g6;S4#m;#DtFMY3Vnsub6+3JpSyF*JwC2?!b!;da z`@^>*g7DLFLId=NCyAUMej4Ez=N~3d-k-v6AmrgB%ywH$z41$(=r>FI9U!rw!=9zd z-#MC-U$hB42JbzNl} zbgRp^>GsXpqdPDytlK@UOV>7~S--cqOTV*dwec2rv++Y^nQ>2Lqv_ol%S=0pBBm{& zz2;{^2hD%4jF`iP`xD-~vDMNsX}@Lhq&Dly>(|=0RWv5Ae zmN3>_!amHjypw5%ME^ILhJ{XOtAbnzsR%iVD4-C;+jnTst!Bgg+1T98FRzH*i+^DE z#vg84hIKKt+f)UQ3)zV7b0TTNePD(3v9UXDd-d}g2%N?E6|e`s*ttcgTQO;N^CW;d zM)PTOsV9mT(~UJQmij^MI`R!&o776n~?b{Emn#-0@_Wa04h-WUqcA}Is{AB&guvr(r&faz1 z?8tRBwFRNZg3{&!|I&g<%L=YtUU1Edf{7~&@>ds(TT^iH+Jdp`3UW6TY?`;JV8guD zf_3xS3f9g$a2;D*5Uek#K#`220|6-t+X}YGI0n*3tgdC(c2-9X_C&&fE=TBf9UCR=xO(@_&OT1Zpoqb;x{D~_b-!&n+=;5pq0Jc0w2fwH0ido0qpGC{v8 z4Y42?09hxVbkUw$?wG0HNoh$wjr;xW)jJN%)jy4xydP4#VJ|-NaMN6RRFpR(k@Wdj zyJqU^i5HC%Rs9(RLA(n?kQ#+d3?#vh{_=I6zLhF5>RG_%-~J-W#;NU!?P+`NeFmJh zcDC@LXI|2?=g{lo#9mjIsU9a0d+orWBl|(D*egeR+ozjfnXR8sJsCoWRsV<6LLqv! zZcp86!~57kGSYcw)PKp3OCGxE2Q+uRdd?}tW*6E+PbHS#pBQXRtce&ZIw5e4ei^E+ zETe{6C1fadv68d8>2zrM>AQD>jL4dO+aCGY@E|9jD#O{y+mevB<)W+Ka9XOOfh&OY zexNuBWW%-&7W<63KrRSgPhn)FV4%R@1X{P^!~>D=7{S08nZIM?0%OGgR5?G&w;Zzo z{!GvGF+m{}gv+u>ofThC7)ju^Tjwe*pK>824Y|f5M1@3K_2kQ|NqUD|{0#RBW___J zL5U3eLv}4dsS2>!1DIHi#&PIB2*;<)5&FS?GPxRP&+j5k9 z=Gp3Xz4}JJ)m>DIX@w^+%q?OG!yO*eZWg&!4-sD;#1h_Q7I)-6Jt%f@dHD@PWwsn4 z3-AR7_Ht%D$7G84E-J5t2psf!6+%3^+mK3=;uw-4 z{3j$TM7@~35SzOiN*GCwE`z4M(LAylFg=}YAXV8u4JMUb0?i22R9p?9SsKumD9}^_ zik!U_xRp>MBsV#c&QaU|*sTGaSV-b*_DI z*~ei+*NfON4-^&!xzIg{<)tI#>>x`xE5Q@FHE}F7|7n3VzF@dxueVM5Y~jbLsUA4| z*wQ3c4nyJp=1&&AfCf?O4JUy5ABtl5X}^OusBV?x^K}AA|MkEb-v0d%C)*1{_E@71 zyL9P8#<1@3I6oe{b6Y@yt>^{?EWB}Ew8_MfT- z1KW@>k+o-{ z-wQ@Iq~j#Gl_KqkM*0@#eN+G*3E&S>__sV98e{#pQi<>og+E9KZxZlknMN&97KPJw z{vKZn{Z`w9IMMV6^SBo;&aJUYZq3Wc2dz?}_QDIKBn2i=l53(#u9ivo?yE)tq{~7& zsir@s^fyy-+}u%-OqIzq_?h}^6#7Oq^cQT^YV{WUj6(7JmYQ~NT&Ru|7nt!Qix2&c z(X`?%3J90b)@ST4|0&W-Y|kP!-$@GgAz=NYz;2YlI4#A)4K%cQ4XVi+G)E{W|ZYxz-0#(aTM}{_fgapJnE%Xl^ju?2uw>a;@p_Y1Y8L(-@!7Irj6CXxiZEog6+>WYRYisp>OIvll zbz60(Wk+?Zbx$>8FU{y;t7kXrZmU_Q`+UY~U45ugzZ47l6`|+!D?>LMSBGBHuL<3! zUmJQph3X1i?0*K8K1=M(a63tpd3doJWCU>o0Vs;|*44%wH7W;Y^# zBbZDcZOyLxdukS7W7beLvkbfozpO@z3$T9UjFs3xPIoP8tBCc8-9`E;{PDV*;Dv25?QZ6>d8)@r7O8(kxVWsTtx@HMOac4gp_cVX&o`bv zY1(r894OdeI$Q?D9kn+<{~mY8h>!fZwmnT30!#YQiq5a8h}aRRoK{Ghj#=$HuiiS- z&}yrBKVj{>pUms#)mbOrVY~Jb>xOwdO&8y8n)I6ZZY^Xv2505mE6?B31_ce4w%ddLYFjQLHXBCC};w zHm)N&UIZWC;@`Wxj(@^E@ZFRbOyHCqV zFj`ItM(pdG=Irzo41Ff^PqiC4{;~Kn*F$ z)-H32pwb!4{2)$CTAzP zQwJL}4ED&=X37({jp$xkx9+BrGE@gFv*Plww=?_O%y8i!-eK7TQnHeiq*s`An9&CS z3oLveOs0=d=6i)DpX#pkof6q?xuTlZKU9jY>#MNjwx0C50<|H!grG-*8A}eN;lKaO zA3_IzSrX>)96Yx4PVk4FHe#&Vt+GA)C4R){!P~zd>pM))+)i%Q#58+NkQ!mf{zbWW zge(IbjhlzNG1iT7rUq`6yT?dPO43>oO%C*}50hQvnZf6ZW91g4lu`B|fmd@0F85r` z{hxEWm>N~ixMdFPg3BGO`EoAz4$Y}@xnK>&DIX4+G4Zq$YXPA-u;?+ubWq>Ms@q56 z<*_B$xr;3z4i`Jrd2AETA*BK|B_=T>@xUS+6mwm;2hWd@3`J!22eC6AWUD&pQKHVR zxu{fPl_2y$s(!ZN0Ytp0inok9IW0-lLrRZ;i&Uk^wwfk^6{UpXJHd2t-4f78sdB9- zqnN|Ll9!KgSV9}U&q@5PS$HmTaH4Kc; zYpZcIkCzL^m8YL9)6?-es$)yuFHDm5n0h(I)j$NRt^P%K!fJEXlej@Gq!X)OjW5Tk z)lVOX8AMgC6*-d54{kjEW2khwi5;?28DjG6bB#q;$5~5s(ygap_gY*5O-M{1Bz;m92dt-n7v_YL?iqY)H;oXL`kv@7XG)bTuz+_R5ksNxO)V%e%# zCMkxQis81%3N{;Top@72zM~J_<%k! zB^t+LJv-4AITgNqm)mB+p7B6aV&p9Npw&1IGrKG4l%(F^xBA(=9=AQkr`R1PxAT#? z_HT5NZXMzYWf_7WiNDy6-1)_J&kCI@&6R0SOFG5jcAx6%XVU4RI?d!)~P+))20vZejLh0oY`9E0H@BWYduZSE1ab zK~bxTx=bP(WEnyd&A6q2FSXC#Eqe377_>$82B{kVfAZz!;006BWLfyHfJ*Qxd`H31 z-w=H12A@z9FZ^lOgG{khe4d3gLaljh-19huthjhW33?V%s%qUuEQa)jPhZCF5{dZUl0j{k{cJnNA@ zmJtobxaF>-$_;6AYYc~^`Gt`OZAglJ1(o-cQqf>Pu}`bYNbhc6g2T`O-fylB@7Vw_X;f?-=Z)f%LjVQAEdid%PL2Qv)8%$})s5&B0S3YpJ=kne<; zWK*t^A3lpBNNwP!!X6%npLmpj9Eso87gKuh5OS}X$^q^=Mr$*KIb%1KNsKgxQSBmK zvnZLsxuczU4cCi#-`927Tn%nGraB;zDtT5eB1xf0q58$A2PERRH-k&nkODe%`GIt< z#a?xwI*dWHH9uU18DC2!Dufadlhs0$6j+erH6dVkI$9cug>tob3%5YPnpQ*c*Dllz zB$QgHgPsgXyc%go4AlsE0sxVskZZxklS;aaK-Bhw2$|{;wX_l(k8DKuz^c|w6ZfW_ z+3*5b!>jPqzK+uA{sY8XJ_N5W3PlY^D1ysDYPyCo6vO~F8lmyHXGi!6cye8@Q{4hD zJ4b-Cp*mQB7Zh9h!#_a6Tzk)UFAiU`OUQM@~N8ssRrw9k}L!?*Vf=(3RACE?R z2v&eMVD~Y67x(7HUIc6S3C%5ObUyHuGI0uPCY5yC%{xph&8tlZP4%Wv&9$c8#=XY3 zb$g6Y=vs}$wG;^78+f24$_6h^Lp%Dz(GTn~Zt91uz7`u1otL8SG zd$htp3lrp-9(=i*tDI6dd>}3!r%sE+9>r$b2{e8^PE6}D%GU0JU+nJN{a8T4Cx!<* zffBggh{Tn`olFVbc8b8|nYhk3$TNxUG`8}y=I4$2*NFjBH`vyFdhgxX%Zg$>4m_Uy*(ghlmj?%Tx{{? zJs%`IM6-Y(;i^OR&l&Z%P^QG$6|h}9KKy77`xy~*)1=gt5DdpO-@`{&V;~?)g(#;29OivH))uXTLJ{G0E7?V2PjU&0ecwc4oL;DVBuDa-B>9UUx!8fS4%Y<8L+=ft8gG zJTs>H3(l!qSqVmKb~VCrlIOR~V9su4O|mK8R9mXuZieP1v!Y;24gc@5v{n|`qnFue zN?OdRBwRpw%?7(^wwL0kqJoa!Lls~$&0g9TRDij;hVmIN^0A(;>}H9Xk%$WK$_hWJ zD(hB0CtePEaSkv~pUB+?nH{ORBRyA8hZGEyObHSt+C)rff||iaE1XMp-gHktN0KEg zDMx8#$pa$y7-OhH=_RHh1C$!k)?yUgy#gHRFrokn)Y`!u$3 zlxK|&pCd)dR_Hg))yLs64+Ekp4sS}|)IqkSq|-7^_w?yC!kPpXP#$v@)Y8};$%;26 z+nt#-d@%Hm*`t|pMVj6AQquG&vZ$f{aT79KZj$}xIl@-OK=JbqWJOUb(Acfs;?lw? zM7_zBL|4pt|88X(T+4LP&Xy|uF%kPUfikYD>@)b-(d#zoP^>i1cBWi<3Y4WO2_C!0 zs@U4{m&UGvPfy2vN4Xr@{pU4q!0D3__}Q$%{}lR9sPH{F{ac|^IQ zyd1*9T=sUT+I_o~O9{~;-jDHvEX{2!@@QOS8o@+g{TxCXh)lhd_ef^m&h(DRy13|< z(dm&?g112=u)f3e_Q*?d(MZv&IO*zEZV}NESL^Whq{VEv+7(Zt$LfgO?S`~vjP|qH z7;$*pQ^!kchj^w@HW#S56Ya*1H}R|&*cDr1v^_B zds5^*H$=-3@Ernpj1ROJiF=r1killTPC3`+uqH+B^IQ?|S3?XIl2xQliQqk^#l|Q# ztq>w)-!X^Bds;G{#IvU)SaQxbSS-`br`hZlPXZpP^L#kRwpDLQkKE%Gz$%AoKpzr7 zAp}=U5A9;`Q;$OU)`Jt(8p2?Fp1ohnFq_wwZ1Xw1^lwXcxEvn5jhW%-6M4^v*?^17 zf%hZbf6lL%ZFo{@@&HG&tzYEv*G0=QCzba=0;oV|Xzq zMGhzPJ%j-WRyfTQsN_WRT~IhdGcPEDp29>@p{!HH1?q6jhc~gobi7 zu9Bou22(29TFHSWM1x!gF91tisq^Gmd`YbM(Y&E0 zEhjF6(baTr->pmpklCdw-TtV8ybzXHkmEs5X{`9^2U!#o&sPu? zQk$qKcVyXsH~=`auHe`c58JKG6G^S#QrVLneZBothCo-}05jg2<$WHHktV*uZ2g?Q zZCTDNTQ6&$$ejb@Ao9w_SX)wDQdCG!GXv~c6{EwjC}=?#ySS23YbPhNlH)k#{I3}0 zl$ag^yq_%fU4!DXK&g+(;1G1Q@Y*{7OKb*-U+@gvXIhGq&PZ@a4#z_pQ&@H-78F3S z5tz;9_K76(Mq=PVV- z5D8?FE-BOIaP*2a4wuX=G~P-Z@}gN5o7X+c3UFFN!==t1Dy*EsCz+?wJux17p3#9p z-OIB2W_`-ChuU^BZ!dRm_dcd%Mm{+s3Klm~%Bpai1aP6JiQslC*_fwlXp*L!j&VN~jpojk@C6>u z{meVqVOP>UmzdvXk;CVZJk!w2r$) zc4#H?H_Tk(bWXa)|P_aoRH-82E>K2c~4Xax8A8LFc)5uKB1gvTfv; zU;r=q7SWg{m;&BXNjCmVR7(x9CXWd;t!KD~NA{1ry09d4g80r4QF?DLh}R@}R?jnc zu*h5Ik1H&ja#?u@gC_a{x2UTU3yOr*H1WVS)G8ID$OGp zo%YilRtsABD7k}>j1(1wXOJ2$b%E*d3DS(U9txZMr9`z{a5y#8PyT?gP!;$D*uOw9 zBzX8AZIaOg#V?=^=|SSP^o97H2%FxmV{om9Zy#Gyg|Bu3bT9G(?4W9>zn_PaWyi za>vl`Jh>wN*374-H4f<7<++qGJRjr#`xEA+pN@KWgy$;kCBfZ%?$|n0(uj*ZIMV+T z?hBSbfBK~9i|_VK#mTT6k5jGvIlbe%wYPXGvB`+=VW%y=WXgrl7(F=sZG^1i?(cWD zo%i+oQ#_4~U5WU!9=~keJ=mif+br^*^liWLN3f4P_I`;^`Nwyz9{gaE=P~F61w8-e zYjX-I{!1eKw({y%U#zxo_H2RJOeWqN`lxr#rIkPY=-JKKCd428=dG7=vmf$`s0-iv z?lW_8KE2HIrAR-#yzxS^UHA=mvpIXsq*9;t?ZK%l=<~rX8>jPdgP{7Mw8d9&w^g|R zY#a~DAiYbt%kD)JAa}BGhcDSaj=Osa_lV!WeLZ&%5bm2RFUjNXVZvRPFtoAS-GM%|QeUSiZugKwTgujN5UIC&5?r##VJ`5&jpP(5q=I))x+Mq%)>jEuSo zrf+Q2O$T7U%cE{ON%8%O*Dj|;Dy+WAdX_3_L63I%O7zSk-4KFjz6w1nmF|Azo}p(0 zrF$T`XY1LfuLOQW$c=X&RJsi#cVjgF5#+u*>OP0utA(2+Mb*Fl8};l`*#?LP{a-{x zj5qW{bnV}!XAPKr$W1ipzfI4c#kfdrqCx*1dNxkdjA+n*R}?3rLI3ykeB6VT(P2yf zkMt}{w$m(f?*mO#H?r;z=@aDy?HEyi{U5OnoSWpkSbV~t&cu8#CUWlOXEF0xK~!sQ z)KE@0LXzK69fBb_ek!Ku zT)T8ECt1LvGb!x+2ta-c7^FnYXN;|`D5d2FFXFpGr9cTd&{cCuMoBnHUEquZ6);m+oA6k;V2|s5lS}cwJn^=W zyroANVkpmMfD0~w2rEzB~e*9Up{DviqtXKO2FlzD*{F3m3Vzg zcdff(^=U#v zA^!{Lu!JGMSR>k8l_r^>N+_sb0&>is-vAz^5pyv4M?Qxx&i$B^F}~wG7PGS$YvfnW z3r_wQ>sIZtUq<8PLBMo?4>*9Yn(#M%d3qxf6HREmBeKxAMdR~+LKuI!a4$n%M86Fv z7x}>&i4Kq2 z$^xUn&{MuyFr?g$Sfz7da$zop0lUMlftdsogsFh3fvJUQglUFZ2D1WYHOyL=4KS@R z+hBIW?19-26Nc%4>4Kq#Zh=u?Xdb4ym+F(+&On&`IGLAq$XXAeeP-*~I((&{N_YCk z+NoqG{G)kr+-GQ$xzGpuKWLLANud4#w2B9Pi=~^sTwkvd`MSZQlm9^3=eXc;u z?NYCW!td6xpv1LnKiu^?7M6WFOzs*TTP?%)kb9brZII#H$URBNt~sV`RD=x(b7M_~ zKmUH%x$U?8Xcu~k=mbw1YFlhMU}y6cl4x@szdf&$=3_)YBd9!Bv*ORM{156%ZND*P z;{9aDKIFq!c+9`}|4}{)6@v1?nw_jWe>=^1dg>E2C#h{uEt7E{bW+1V@-gzldbtzd z*8fL&AsbG=X37hD2l(@^{V($(Aji}b@BjUf2MymD|AR3!HV=LkCp;FMk9PTnrYlwO z5mJP8Bt=M4JL*MRskPFFFj6I_kX)F!zYIY+yq-#TVuYSM3eL}H!oB1~jytpDgGOt7R=~$STip#jJClU3^$l%fTg}88xOFOC?7km`J(A)?o z2$~z=sU&%rDrD#&)P}sFyi%o{&@KwUI?@*&qvbO;4j0HI)wMizv=mfyaZ47raiU6F zqvbp<%>gy1dg>Kg9z-=EuG%~s-GeG7SLsjPhIC^mQ&gTiNm2rWrskCspD@tC((N)4 zR|BqM`K#jmp4SKTbP`tp*-F~n0{~PmTFRna`>CWaQ*$b(j<#rJJuc(Aw*AmpoYw)x z26oVxIQ#JLNsMtIY+LgV(4<3J1fbj;1woC4gYfYSm8epR_n=l(Ax+9NN7M)&m*5UpjTR!BB`I(R@{k~fr50tA7p_Hi)J8j_w53;$N%1HJx*D+QM-3DN z0CZ6ZIOWwYSubkKpjsv>K+{wJ)~!g&si$28vuw?!`X`D)OR8q0tb`x&?yyP8+_hAA zDHR;7A+b$_l1@YtiG@}!#EfWBhPUR^-!Zr9qbh7M7${t&tsE(m;pUR7&DV;i$0c%Q zPe?(vKnc4xtWaO1QAP%*@nC|@`!9_lptYU!Q0L=%8!X<1`8-Vx)%=~jP>M!kG;Rr~ z7a`FA<;8E|3c41K_E0zHATmFl5>jOlt^Dd3myRoVToZuZgsokY*``r!w7ng|qeMmx zj_?LP5Xx3F`aCuxLRB;iUgHS}b2ZSFOjNNL7_{;kdD{%zamR^dXL9JG6qnH*f2y0qAPc(G z$kF!d*M->j(*lVtxn2lKNBGDfx*OSfTM(X9D{6#{g`+bTRY#hpXDymzr>UkEK)zok zgKKGSS-60Hn;K{=M4yxr?dVmJp0yMrNm7v&rAI|ZU0ZF_dOmu7xiO1_j2-et0r#{I zMF>5w4%JXlYfp1lZBunB;G8rGk+xZk@*1Hy^)3V`pcFfCptti2dR(2osD(rk3oS4F zDB8e@$X&gW^5FBbHi**nC~(G5g??mNrqEzVL-j}3PZDm1%1}CNOA)9jnqh}dcfsIyM4p_z~3QftXnv~8jBx0dE6t`vD|9$$U8Pe6Lu@k_%1 z#s{HwWFjE)eq2inaSdx?Wg@&39M^Af1;FcCVnO0vbGq6S1T32R1T0L4G;DA^DYr<7 zO&lWWX#Rqh_SKy&XKC1@Yl>SB4WkgGUcZPVF&{?wxGPnbQ*L!M$<;UWd`~jh(8vU= zEL&@7mqByTc7x`iUMC$}YH1T+Bp?b%@2$18C!slLV_$R7uD<4=Eq(4#8z{fy!c{HR z=OTbwOU%4W%nxsOWWGhPWg6Q?b0=NRZJ?T7t82fUmjri#PROH>zWsX6Qb|}I zimtMN5?1w_d^G8DEp2T_Fw-hKh64g-5v`3zi060=O@~^d1eUKhOAI6E+Ff)ZJ;M2J z8pC)~-9i*ci0IIg%^<&A%Scl;>5vx8Dz5ze6STOy7=BzGt2IzfD!R2AP$EP=qQz$f#5_}z=lsT@^Vu0c_QkiaES+ztdj34MelC+C|;qCH2 zs-ANs!T7rxgE?7w6)yw~s-9F4P8>!~`X_5Z|Dr#}$G%W9oTw&4WTn z2B45A&`^jr!W#j6y(33sa2G8TYa_|caE_G7%#l8m$H&SDdj|D1=J5)U4JBKY2uYiA z?U>Curn14z_z?}}2azCd##9N{K%3yfH(Y2SZ@YL;)H z3_>;6%NfuHF_+U&4_|>DmOG%+$=M$oRp^gLi{YfekhG71KLG1p4RRXjsincYoiG$F zSM#TFyq(se@W(@Fg7dZX)KXWEouYW*`zFN}{!2VSgxop*cbg!tqNDOux5O4i6rCei*68i<@)P*6^SEN?6c zAWKXnSfnxP7AkfOm+q>UYl+&Laq99SPTi*px34c2E(DAPT$(0m0q~pQ&WeMJ2W)>m zzV$TR@bxst1pCG;xZh#bJ5#cM?m^EV%0b9*d=#|4|$U#$ky^bE8-i9)#sa#NyZW zkHi1PW7GFLQTmxY778X&AwF~wUyt#I{is$@vCGa!GBgCq>XWw9mTNR7xI?ZBT=fp3 z1m}3fP6XeBl^lfFI|=i76#J=I=*aaKDJ9^uCcKOWZ2Mr9d-gp)9UcCUnI`KyA>GAT z`KsX-1GZ+54?jp`phtn|wH&;Ah3oRP7``r5y<#608vz$_imPvDVezePn83d1%CPH6 zEOu1x3LXbk4{fhnt}&vU%U55;7ozG8iMp52AbPmv;cCd4prt&_@RhgXITcAqntU@* z=oSS{i7yDWEJjR;7i~b$LXQgbtmdt)?CWnv7-b*&m~T5~u+V$dD$f}o!b%Vu5E*2B zh3}$=UVu+=T}>7XJ$1s}FzH!sk8Y90sb1Jij8+w2{dNj2e`JFl&C%6R08gP`p%3t( zCzU!|-qf(&xu`)wv@J|0Hr}O+Nn-GmAR@;6wpzZ!wy2>QP_~GIx#};4gAc0M%Oy4s zyq9{iKwBZHyVAwx3a6OdkhVXI#4+Pej-0I*3qZvxA&fDH)?-cUDNYmjiUS-aaAq$ReGphsOvkl65cT(J zfm&N>=mR7r%@<2Wtv_qg`0AJMnbQbI3oRPqI%<0NF#ig*k==b7BB6eG@x2({~kr8XDZEbv?)9> zlb_(KgE0;gTb|I8a-xf2PJ0nj8|Kh7w3i_IZVK~OKntT3#?7a(Il-1ThzURU)GtA{-n1KONQPI3* z=A}$D5t)vbo$RFLIj@JK354c_qhMOVgMx(tWr`;=Pibn|$zy6-R9;X?$UH?#hDJ$7 zH6$4o71bcW@7nu$W(KrQ?|I+f|Nr^?KmXB(XW#eQYp=cb+Lvc7e)@!*(Dg>yALfDB zu4(hy&1&G&Jg`Ni*vmc5bRsgXdDRq1)6JwJaf$^d+pyAa@ty`QMAE}NX=6urBd-=9 zA6?x{8@pSEHxFxjP2SqC{&l&!U-f?ZM8CZU1na?cMfY zzFtK$YI`y7A6IMEPu-+heM_sR{D!@nXU0@&eAB$z%9~E;N@rFWe4e7veWSgG?aBGZ zhOBzyjtQ;C9nF@Fnv=@RpQf~$tL`ogt4}Elt4P@zw)KyD!&d*XGVD}J zZP@DZEn!;|>ns(A@`><@*JW%Z?w1=9HXe|x z6N(PXheo#?l%I6e9gH!U~rx@oI%?@iBG_TSWQJ27c}znV#3bgP|oEUs?S#ewyc{x+~-(l;@UlV0!c zowTlh^Q7Y5Et8H9Zk=>&P}?N0JOAc?b}PEMbx6t0E4!_}`MbVlH@|)L)?1#?Z@=Y$ ze#b3^hF!OOtlxW!PrLt?*os?T4moklMorBvkLzl0d6U)OQm0)r`Qu?5COCDeh2GYU`#d{uI`+Vc&ZODjRmMaP9fkf`|9fzAX#Z%c81>nY9k&) z3czd%4@zNg?e;!H<#33(Mi^Zk66oj-GgtX?bOekr5|MF-FTee%M|xBz2GpT7jB!zwP>T@gf?0s`q`wdH(_O?t8 zd)26D}K%NL&3yo3vBfjCuT$)|@mJ{?M?rnHwEP+92X=%Y zeUKfsbE&Fdv7;7f`jOSmdzWb+$DWQBkZ`@|55NEBPNH|kpTeFfKDs(jvm?>6KQU)} zB2rR=MDa)e{=`wewwgNIADF^^{&8(dE;}2Rc?i16?QU=T5J?A9x84 zOkpi2zWnBX&5r$Y&c^-34gP?S?iYg{1gBza&p-NB=nrT&s^!M`RMT!{TN~@{*Zx5L z>q(tMcw%LR?>!Zw`;-Qi|2q)2ulAjHh#>tTDePY#oqRM$Q+r6xsXT;={pQ>hYjJ)+ zSn>Be>h52M%C%FKuX5Ge*FXEztD)M{pblt>2hd!VyHE%Pc0ZdwO*q|jsv?98!HJ6ds zakFMCL!#Xf3pYN{5E1e45QK`?J$qs1GCuI}VQK$V&fGiM6vOA%^o24XiJ}BHUm2Lf zYr!Wj*{V_{{Sp+-(^}7dnHzDPbEF~CcbwgZ#@z>tjag~<#MHJFAi#DVTsgvC7BrYF zpik)E#MjsOt~hM9&gk$p&?i8cxq@onK=B#O_JSVDCBCP4YKa2cy-H-Q#%S}EXo5yL zbiIf;(^t&*sD|tn`x6>txH&o^!s3Q*m3Nu7 zm)RCQ(&%)Ic8xSSrM^)YnaOGG9o0u0;(Jlo33{ayvq;BDHcDHXt}1yAK+#M(m$E2) zw5ZSWGYgM)#6^zuwTjZ9IWKL|0->6vL;4sh2rXpF&XAJ@bvbuJHI&faa2y2zAExv8 z#vGs5Kc(lOc$Nk-w@bw$O^1XJ5TQ#5*4G}=Si8rLHbwf*i1hR=vN|cYOWz^A1>dJ- z(brAw(mf)(;Vkpji{v1Hq=02oC<~g+O^>!q{Y6q8%zvE|Nm1%z62xx8U|;+P8b6Ei zxfx1rr;q6AbM=$-3H=fxe%%n?d66qHfg%AkAM!5$5MS!}>&I8&VscS51*G#&lb}>a zN&J+?=M{;SFVGd`y@ps)idIB*;#+Hj1OhR*@in!tP-pD^Fo!MOsg;!Awo2an(HUyYLdilaDMt>k?G?&P-IhgP+;{Ff18K{GhB#(wrlH{S?F_|C zmMIDhZb66iByL&q!9+VJgh<0F=Gz^VJQzD2(pajM#-4O5K?A%a`QD)9YJ-vDJmJL8 zta>Qv$N63f<Hds;r+QElb%f zyj5c`8zK#1{GZk2u*Btk$XwvbCFfunygEyDkGhw?&4 z@Z*l@H4OVTy60t26AO=u9qZd70VaHbNcHm(TZ^XiuAfKH1iC(R5rEdj`9U${EFzwN zp5~TCBvOM|7ExQ4l8#0i6OT!ijez z(Z`Tf5C?}hIAbB#mJCJ!3{XuZ8iGG6&>{+d#%p zoWk|njU(+xDjJtA<~lW6N%<0H-4`_0D1*(n&p~olyY!L>j(P{d(C=-J>}zuQN+W`m zI4J@E{~lE^f)nazpzYE@l^)h{p&;J#WK7$jD zmY~^@w=Oi&x5w2*3(}i`~3jvx@Z1YMFGP-}1BBT<)YKI(sYPM4CiLCI-y``(O# zScEk$S6@R)m=tV$04J~!(ay{+d%QWqJTb)F)~FtXL~TZ! z*=39fs%Zdf+0v70xob{V24ovW_?KEx2CpvyrBZ!TEoPWhE>UhkoCPAJ072RTFHq7h zEm!JohlyQtIFQ`U8Wz>v7HbWUbot(nBhA7jp&;cJQF@0|jyowvKE?UKXS2Z8I;5qD zl$J2pC1$op!p^JJ7#STQUDe-chb9}FIXc`0SA=hOZ*G)ADe)p@Cq{KGFB;$|(0vPq z4k!&WD6VlBA!69SVp2D|(;jKGFZ+O*%;KMKbvy>cgn4sF-4oYey9LaVG(!dGLg=i; zbZ;7A4hwaetF_?#&q=+vsj^MH|TNqK$JA*1&s-HT5iB!M|dyC zaO?GEt1aB*GB^xh`OMn9%y3n(e11Zojkx#Z$`D8npPqtI| zWSe{s5pCi;e>lNpX0vYH<$$H*tkVn4&_Xp|90par+(|49xQ#lYshEjg-C! z>i}v2b%U5trBBcrF}c|)P-aB0@Oa-Fg9E!*?NT4qD^f$@B&Fy!(D%sIL3=g7GS;Q< zpvyy@yP=-g2IY7z_b}5UQ%{@A_wm&PA|H$MsgiVN8;cpz>RT~nBBo;=v6>1;7ChPtqbdE;!68H%<+eSj$37j51u##89^hTvf=MCB#DKlG_%eT84vd;#N7$oWoBsRwK<_A7E&FEDAMF~$A`LX zJ#4**&tOd%6-lmWYY($EVz_+_l#fMQVy;+#Dc1IPO-z4~T2y#ks3Ww8Z^L!U2D{pb zD8Qaf^6^yS4Y#97Tvc-()RmAPTurQ4Jzyb@fh6WD!XAoJGpddjC(85Mar6nR?=Q1YMFk253 z7=_Vnm}0omZ1*)@C-#KLa~3>}ARvx<3SSV@h>(uM0m8PQ<^*GPIl4j5?f_tQmSdP5 z%o%8MQ*pkXqeMX}4h|zDiH1@U99-+C32l6~VkW=|U&Y*!TMfj`k!n&kJ z-ay+((=698@cj=HX!}8J%s2SJnz!L~IFv4uEPgCIp5;Vpl0wacoW*c(T+9s=NY>5KRp_OUn5_@mEyWIU*uyr-hIZyFy77*TIq71b zirO7Kjn1MnsQKOD;JxOA1N!>Hnpv3JZ0|GHEL~H@2A^Px>#8@I@1+VRM!sih=EB8k zspA)=5yb|V8>W_94hqiUY)1MAxU9a1{YHJC=-$ysndxL+#0ibr4K1)?1{-*{os=+> zve9miZmwW|{9s#mhbtn!H?*R!s3eUonDrI>Y8Ku-Cu{z!OcBWSYAS$ar7j&xNFi~- zkeRv+9_bBeI^xY80tatyN*wfriBSQi>5dY}&JjIKjxa7nU{-WnVy_zQinqj=!$V_? zv8EpSZsrK7w>?%G0NN!s(9QHG!}Y!ojxoQ?<=)oeC2iQYxrZBxUaCAVvit2;9+~$PXBg{6?HrzDRb)z|a;5d`b7JJQ` zY~T^*bVUsEefN&4_9w9YQiihUkqomF4&M4vaAc~S^cr|Fh+##;0dCqMZT8FAhMByN z{<4U#;rbx~fQ&k=0rII6{Er*-Y&F@9Qp^nt&N5qf1woOaPUxMD>V9o>4_h5WC%WUW zGkuh2cwG}st%<>6qbD{@di1-l-`E~iEE3ynAHE0GL|hk=%0a$r64(>c^px2oCCr#j zOgS0trI=ly{qq&hq8wM?wMM~fBP@|7hdI*dmb%?p!9tzky`(uJtN|KLjCI^*KS_5EM+#5J-!bp50<# zlffDhOOmJ|BI|Re`zhD*H?1W$>mt)VC>x8Qp7KN1=|~D2r6`joXhQ~VXQa}`NeGF~ zVh<$^v8u4u6YhCSSa<_CwYyjU>x?ebgT(KBuYbe>`w}pZiy~@2S3u5#gNvDbqYRs3 zVb#p&^1a(B3o^V+88}|L9oIzma&(J|fmZtnSJbc(_86zL&lumi26V@)R5}*{rSqLA z0y{Guyc70#Nu)yfyVoe|2PkCa3gS)Pyv13|a0)9#hUPq4IH%8|Eqp^3&K<<=wV^TZ zK5?XD!>k`AMM{py?oqC&$SAk(yN?-PSn!%L;Q&&J_C(JO73&A-s3y91OkcA_>f;&_ z-CK$qIwaJAPCWhzyN&jwG{#wr?^Qr{Vl$i89t1u&wV||x?~$}i|3KNGUaaOr?GgQa zt-J(fK{FQ$r?PnVb}0pJMepk!aEk2_+YXJ?6FQP(qT^!vUOUD;I=c7OL&76XlCStP zpiZ3g(F#$3GYA=Ryu-oi3AaRQvpOUvoKCT2W5BYP)Rq1YLB=JtP>Wcn3AM*u<2w{6 zP=W3PsG-PIpnC^y#g0fNoQf80?0)gmb|XlXW_uFjGiHF)b1byN9{wDv%;@|_Dn$an zO_Jq-vX%tOl4b`Ax!y{)1X@IP1)3g#=xPiRsdt!U?=$E)^EG&REu`^H*_~3A)^Z!_qI@+Mn9vAI2VPy2!*cF9CzXp8 zb5gGbOfQcl!^||-nxNSn+l67{98tcO3(T*UwT+o#MN;k(exCV@jN!D$k4w#7J_87bXhHT(wX>Y{L5LP~&SPI-7aI6ZeFoctXAB#72 zNk@Lm9JDVu-vY*FpnPj4W1%FoAdbVA1>I(Fo0lo|Js{pFLf|(S_(HrD7Y7Q_FO%Ws z^%bD~a8o+&Ur8>ZCyT@V5b!|dmH=n;eoQHUt@2){yq^^LsSIAuX0#W2d;I<_&>I9l z>B{2q+dvPBULRi1bEpT~66PI37nB*7fO+^!%6p&kenq?qNM6pXz#s5Yh_dtuGanS; z)+3CK1PiksV{9P3-(oBY?{kRqB zEJh96tEA`c$3QEja_vHotu;c!n&G!bX;>q@V>PTEZ%eO$Ze30feKjnL@(sjcGrfmE zuP)wdedggBwu9O+O2cB6aNHqc=FuAFr1axNdFJuT8+wH~Jf1*3ynVleeqM!sc>dpO z*i- zcR&w#ry*?3{HHqTp-&)|0+&NR=-1bPD^FHk2z2Uj0 zd9CAP4XeU8o~-v%_r;AwdQy^z^jD`pT`FNvC4VFQxmx*gC`@3H8t&_*5@>n(#ONHTqBEBA5Pd`0tmLGrbL(GfGH6p(C-2K|E z-z5!j)CvEsRbT#@o}_bHmJC{Hy~Xg)Y#g{M~xbD7ZNa{&?YUTaY*Sj_csRR`?eu{&ZYR z@d?8J?3b_GzoPcuEc~zTEiap5g#UKoCwfZ2e4IQ(_>+uJ{_V>nZ}v~h(6LJ3|KWR2 zeo9YLrjCt3d%|1~*q(SpI`4o+C4$$zcK*b-%x^#9SgvF4>!G`TOZwP@QMJz|mFn1s znA^rQT^#w{P?Z0;NS~YWQSalJ_mgo~fbu`~+5=~5sC`?6|A~K$`*z%L_;(2ZhyBKs zw~&9g@Dn{8CjYC#pa0x*jqhF9{9V!!9g7FNDaC0MPbJpB;CNfdvPZDg1zYcX{dQ{K z8Iitb*337zK<-ICFZ?&X^FTw$-A}&YxS(UvSSY@6?bv@=$~O&jwCLD*eB^ii*yN^G zg11eipCJF)5JvTDh=Z}zyAK_UPVEN2P56`hM$8)$3xAC84;Z;^eILU2Rl?sRW82;j z2f{y6_^CbjQvZz?{-eK7pGZ&A6g?XQdi&W|`0n*HYwvgbNzcmhEmwW~`hJfPeWZ!> z_N;4X-%sOfp74*nF12^BA>00uv{=t#v3o@2KSJXH*Ov)ipV!{~W;l|Ih5ygty=E*S z{|4bd^SgBy$GYI(Cj5`tp2(g_@xokaYWe1M8~3HvZE(D*XPW>ImA{O}*HMw)6aJVj zkB<-GPcz-Jg`T9ddR7Tu7ddi#?#H z-#cpb0D6+H4q+DH^Ur@Dcaff?VIkP#=}65Ta_1W%AHVR3BSEC!GVtBhk7G>p9i9+2 z3h-SsU~}7Fh<DNyeYg@$KfiyQ@b}t!HKZokGWe(P`{8+2_~Q{5hljo+Lo=8Y56F|x$9P@# z3q^?eXo#5Sj)kzLAD~aFLs-^n$UDbFm>WFI`gRDPr>&=y_Zjh~!uY7cn|jyd73EMk z)#+&t_(1~9(-OkxeaUz3pPGL<+fgOg-r>3Fwt`P>_K63LquH#ZoD*3@W`HzQ>3e-c`bd3x6DTnKK0YA0R zbxWXJYM<-YfS+*hx-HzC%VL`ypVaOEz2vIzzkG?s9Gz3@QynvtJ>YE?%$B}lOL&?7};K$U>Tu%l3qsWiXOH>?kKj*}zH^{}l4SYG65ve=7M8iSoEa1%Di#zHbC* z2;NTg+4n628v}e0P0^3~p>K_WUEeP1&r^l}htn#F&gVO(|AK%2}w{w=TB|;fLu6w}70erNfk{A zT7Z8%ninQ+2MF^O8J*g<1m*_B?Z72|dk1Prr{X&W;$BEP!=EKAaGQYN;AH%7O3=>T zOf#Wu*<~=<^EpaXd(ENfvF#b+^T$SpuAIpHbGT4qWDfccH;@rfh|tH;Y@#MKbYP; znnSJNmhZr-=1Y{r2miGtek+tV))y`y>n6$uyXxR&1)ba@1$~Id@wgZsepDuUNcH`J z&Y8OGfKr&~3BOBNP{9Qgadxb{CcxgtVrr`Y4j&vrT}0t3vf$)(;Z0!jPb6UPL+RsA z_Z$OP0>l?j{;SL>%2~SdnlNj2MjEeQoa5pcC~%-FT)fIo$4?wbeh5@Y3L_UxxZsnJ zG=Az5xY$MfM0|Ibich4#As1wgM^NDNyPz+pg1^C22DgHJmFH#!*+zk7k~Ewp!3GLA zZ#uh&v+4P`Z_5O4p_A0W20NqOblOVio9BKq5q4OX5S8&;cu8H(_*En;mP)dPMe_wP z!UDcdR{~Wggxr2^B{-fSG%zGJiOLrJJ>t*6>laY-2H;CrT*je^;2vBpxCb{1V6qVQ z3c1mk)P?sgAUiW+b`UcKr%l17!Q}bZ7x-M0-IEOy#~Qv%nrt3E2XXU|l8Y1mDfYM8YQa*C%f^$g z7vEP!Vl9PVYCR4(=*`}OG3(=e4i|n3!$Tyt7!K7o%m4r8*!uq*KG3SJzf>Le3fk&~ zT-R8QGYG78i?Bwbgtg?yUeqY8+sI!@e(dFBoDJCZpmo7sgp>T*hV>k!`yc$cTubsM zbPMqxm9>%T#hQCP;G#eTak`~A{8aaEeWxpV{O>pfj6ogUv2Lfh6L6E`Km75$B$o%b zp{@#Tz&_w~;8JM=U#BcZxE1?lMZoEQSf84W=Z7*r|4)sWNp)b4G*yx3)$sq|-PI-s zFT!^Wrn&_f)1zzvSM8vUPtnup*RAN{f==r@a^AH7X2oaF0NE zIQI0W0}oz>cOm#c`SCtfVNmKwZF@t|PK)yP;!XV=OZ7JBSsie*3-14$lpTww zUho6N{I`F{Np8Ol8U-);rE_TP*c5|_Z?gWh) z|MNPjxK4CU0VgUjrh6FJ2-Kn0Nw8%iJRIi^m3UYGFV>levZtd=EzS^Vzbm*--yw`8 zob^=yFYzwIUGSXWi1Kycg|K?O)q06<6vFSq8P^oRHSvEo?_Y-Bc~s|z;DrGhjndG( z!z9G@!daW*Pc_0%p8w$ImjjY|e*MqZgD3}QuK4-esg%j<-H7<^${FVV|9mX+@>Tgj z#U}+89_0L)IzE=83=*? zInt-?w=0v+)l^fnn{d3yRjG14c)07qlj4k2D9Pg(zN`dj%!5IUE2I<}`$QW_Ex52M zgcE6)GLVAQ1w)HAbS!gwFdS0qO#IjLzi#SS=p~0CF44oKEnHzAhb7oeeMmYYodhlQ zLq}$u*FYAQxDgFC6l#rECB>meM62c^f)K=YlX44X!S=cmg$1N3tr-;+6^xY80rhQ! zB-H9xVwjPbn1}%1yA9Av+BJa{3Ilio^f44l4k9&to;G@2v6w(A5zSMol}$xi1hbno zJ7!3@x2g6huHU52)nybR0R;v19AS|o61HOVpDF z>*8r{vSd+8so)m2LyD)xCQPxYfw5dqA5z98Opz3$Y}4YnX&(f}Crp8n6OlcB)f6WI z9Y;VHRPHB}U!)%ve;@WpMbP!tL~`v7n7tou3nO5O~A2iOb3^sPvX*)##yMl@Rdlwv4BK>_{b* zwcceI{vEg0cX%2_Gtd(ygAi1ZTi?U}NFq{G-d!Yo26A5uoe4a50_7$~0bPoqvX+NE z&7e1~A^#afHQ}lrSxrMJtceC+a5bgj2n;-r`)?<5C+{s!uGvyMMI_m;gB?B6HtUe-@6DQ4ez7^J<$mz#R?UY*A1P-oHRvjERO}f3U3^bZGjCG zn%~60A$uyQ2zCtH)DS2^MvYLY9&FhVRYQq-uw_HQfO0^cJ9)361d#DF)TP<6ev^d{ zd*Z-JV7e?GKy+lz@ctb_N0p};$<+Sm13qyEv}%IVN@@K>@bZ8F!RP1HK(+A6E5sD! z)aY4uxj%*qiRDm`-epdQzPZFN00RLK3jk=Ob8JIn@>pE{g~267X)+j-aq~b}xDaz( zYv=hMQxu;z3P-C@>fdbuLzt_Xt3zc#k<9K?N+cm*uFDTQ(dNeq-L>Gm^f z5(k9gCZQ;LEUzn|jTZF@4ae~m5wI(_lI9jLZ$6_~zC;_ueBTC6P7PL6J$F(O&9Ua} z+{n2MVoL7hRiT|y(rk1qhPJM5P@x-w3#G{&fg*2Zu;rSr80Z8k zmGg(7a)N;N1J?3yOMuOxK=WuO6JYH9w;A7W56ajR89PZX;H`cj>Y8vtOGK+CK$OxI zDVDkbTH;j&;mGS<7F;@I7tFddet$Xp=wHiTe|haN#u%vG==~Xk(ckBE#b>TY)Lh;f zEkRbcmLV0$mJgTHAacyg1-UJlb688 zOtoAmtR2E|X^Rr9sRiH{ zK!LdZ5g~1Ii?J$E(TF6q!Z7)YQUZN@0ufb-v`g3ph=R(-E+gxhr=CGAev#+HW1f#R zTp}*@)L|AjdOaAyojc{1vd4<-KsDx<2C({7Bo9Caf>Z<nyW%=u$)7k-+;PHxm`q{wp?><{N2MD6MHS?)r(=3(E43&vS~Q8A%N6CZcDQBCPD~1d{D5 z#~~QpV+Cf$*TUJSYS?SL))1L!IDHWRT zOlbwVWHMGve^N&OV0fE^C?pZ->Ffo42rfLS-tReFkVaZFGH{udH}J1;H0AQvNW3-9 zuTi&srOJk;rpKcw@=VJMI zB-maCh!FhDse``sD@RGcoXhfyxm0rn?qhjHL%+YF_r3rHE{00sxXdZA15(v zgeap2u49P<$rfl;B5l@#px~P5cP0B>Bx5P^8JBQc{F0Oq+-RKEAa}vico2oa5(g$R zUKrc*BMx8z(7{N{0Ub(?#K}OOkn-|T52Svbm_U+7V5JV(U&k$_u1XrkvmwK%K}m@M zr|^szlr)AsqE&k-3#{IukRct2scXuk`Uy4wiOL0# zzp+|?qQHQqLklefOR?$$r3t`VmGxegrva6STAE?aWYsi4fr`k~$*O5}TX1spXuoms&W?D52V3BHXn+eGN}jJ;+mmDPPCC<-{OB zPaf))n&6n)Kn(HGM`;m4?VTt_k3xKk+~1VRt3+2O^XUcV3l)ll#h{@bnS-&w=7O8r ziLm+>YhNj(H=j2gGFcOG5m<2rQPQ--@eHfC6BPlS%+ar!l8pR(wb-hVVfMpB-U_?x zBG`1|3ti_M7?UHWD2ScRZu2>P7v}W9R8K?mHA-PWm^jeB<%oTSNDedHg6!hqc=%SS zXkvdjjwKEdn>-lH)46{j`3siLKs~g+6O8o{35=XJ&1N97IB|xUBow~Qt^IT{ii2cS ze?gl@HIqjoh>BLDw>Nr5$^Huqrmoo^_QXQAg1qKbtSi#QZuAbtsdX2bsI#Pa85~OA zpc!BbSo5H%Cf+B5>I0fjas zOu+^Ru6|%Eu0CN(oW1l<++D}F5$UtK;%T)BQ{47PlHgYMI0Pe9jMmf&VCmROQ19n1 z5)V(HZM;R;_IK8hnJ#4@rFKC{i-M9C6(!2bN1&voIB_cWWAcEKR*VtovKPZ1sG7Jc z31b~?XeJgw`>rJKOhZgEk0Cc_2hILj5XMc6tENmQxM**6DtBORpg|g7_h55i^tAME zfeUjg3@(Xb(Cn?l(Lee^5yNS6-5d+mcwq3Gc zVwaH`$lE_rCA8vcoY0bz|DQ*@z;OU~P+f}s)@C$}j%9#ab=0mL34eZWEMn+FqUh9z z6Z;n>5z|CBKAbq9C}}{GVEX8h{*)WcR9!XtH=TGt()80rdkQp@&>+LEt>Om`jtR8-&RGSlh}qhWk`hJ<>V=GauKHnLj1zi$i?i^ z*Lf4gw(5)AjS@%>UWLKRtAMz?YMPh3Nvd8otx*)n!yCv=%(J!WUV$t>3L%YgG|-lC z0_f=x`uI={q+Mh#GZA&EfwWtk;PKiYi3g~wyty$0GIZDh$jVgx8Q0B;*6epTq!=dyM9AoaeOG0#Vf?tI`1#qT9=w;D>c*L zC&`(}>QOQ3z!pUyHy`@Q(4dqgRFlQgNAbxi2b@xpEKPx;w>_MGgWHt-IB=^pf(u#7 z)~^r)n?$8tA|o{TXx}z*D3$==vTzN?+5mhJM!UF$Nr-R=6q29l42)f)Hv{qutthhh z`9-<8wCU+x2A0A{G6c0piU74@8WMZeQ~^Yw*p5thM<&=eu@Zh6_X*3OI#q=OAW(F9(;L}?4Urj7GMqn7FY>@qlt6V+q^ za5}-h7kRh@th7;0F51``jv}NDLRCR!vyurynD3b9D~(v6-33USXrtkn$E!|Ljpz>a z5;$kPm;@{HbH4&-Cbp2D>t)%>@m!JTE1rr<6e$F`!xS9^yqzMbFXlfYPsSy33r+E~ z{e^iIs2-z|Y$87v0#l&C0ZD?Jz@0cCiR5cFJXUohJdTW1dMsj9ZiE#}{k5lcr;%XQ zlrcO?x>8i4sCR%eR1yc!DUnjXCa7LbP`#R@K)o7%jLqTswKc1-j!E?SB?wpD^9&r7 z_(f{(a9Y*$CVCNvIYe7Qoo@85$8{lCBZWBU?@o1hu=$F6@YfmLi7nq*h3MAMoP$_ zBqyyw$|^W5D6}eP)hqsJNGMa z>~Eq_6{AYv2{527cLMxkk9W%q{s!@2!Z7kpy8yNiVV2|+07hga>}7w_m2qJ;K>gMW z+=w$Pi@2$A3kL#YVg})c?~?%yN@pSc-_XxZP@F=@c{njdu%0fR>GOUA{q{}WMXLOz z1|S)hfRM#VCzpkMYM@n8TN9sxm1Qi*6D-j(C<&uSOpEYJgXl=KAy6CV9t~74X9SJH z1!ks%k<3qgmYCqZ1jgTZ%~(_z`JjXY<+o7ZCZc4_%Wyyj5R-CiXTbo27*Mrz77UOV zfz6!-12MmQI|~LVlOqWh4E?5L75-fF@f8TY>uJQ5XIvt5f|~KWJ7Sq-;k~t#H24vB62T!C96`Hj+ck3gDN+144Q(CtyK(4BgCHPB2#ZOuO zaZ*X7xE#@tPq#e8-zr3dcm-D`Ogp#)@471!=3RFxb|GPk@;49qVBr8n~5E@F5q}bE2WewiqP^(6uqG0J1RpL(sn}I~s64=;DoC0!h8Z1)s(cGwPB{Xt* zN}LpkL4$F@b7!CD#|MQQI6%MF)JAHmro)xaVFTSZuA1V9ztLMn2QvR2SK1EO?N?#f znm#N44as#Kt~E%WpLhQ zLk4$)T*bJ81B?Q40iVmgrJfpWht}e$!&47h!pRJ+m^pm3#p^E4_FlGUPFumwD@O25 z;a|vsUG}a;DYflT$W&`zp#>Fg-iPj_$?X7t^AQ_2fXK8z{-QzHz^KGu^lc?TR;G`- z<+(giEIvE3E9tUXVCM@>=KFp__yw;(I4HKnG_LKm6U_VK@BnQ6SFbKQT#hylbDRMk-{QYQrmsBE}r&Lk2Y#^?} zY36FLj6gsHj$6}_UE7ge*O6WCr8An z@=jo?n6`@QI}acVYPdY8@$#Uq!$qNVZ;24NWWGy+($iH_Y;)XbXBiWcCUrpt9Kdm-Oq3l1+% z#+5>Kred#N<{mVjR;O2rat<1gZNMu= zNxz)SLb=FXv*{vWBB9MoJ0B%6@To1n?+Pt0zSa24;84^rfJ0Hg01ibd;26CFX!)ap zle1iz()bYs??g_7V4J?C+W}qR`Y$a$1MG<}GqGg=DyC&AwhY?Hr5tbI0vsrF*csFW z+4dQ{cq-77*x-Afs7E>Vpp^MY5e&#(cP_7-hp?dYdSY!E9_YJ6`VQ9@xMo4(O~$-y zltXU7no4%&Dch8cyx?Hk8qZj#hCBpE>B^U`%a+j{8?;xgR><9BF?nzaSDZPGfwvfP9pAae-H5_INIzGTLAmg{ zZfFqHa~(XG27`Ji;y)n^9C|r{hqEvn!tsFPh*bEqPz?7|v8ZuwB1FiH!Y-j5yYdmA zu|W+kg#(E@b`?_aZZ%jbqhnVQ1y=_L2g^US;d-xn8syi%Xg-XkCa3(u45f z;xUDN5mPW0@_pb!WSY7uZP}b~Z2+YnUTz`3&#V+xn8pXLxfVkMI~l`4-H~Mohb2Gdf)*Q7yk_STJ@g zibXR;n^V!AV1HVt`I2A9QP$1D^bsi{1g4z9n2HiHbi9g&5ef^%7NAH~C^p_fTm_?U zwXbv|S1qL1nOL!S@2oD$@D& zm$J&ymFo7rt6=PhXjK5?#1q87j(w!PQnaHqTk>~5X1Wae@{|Ce_RJryVnywC%M~D) zi<0yJlFBB4rw8@DxRBSWZwto$6U7F=0_1e}k%q-VJgKF*mRD&`{dOA!F%1f(C#VXr zExzGu+^mQGLWP$o2rBen01QTv;1k>2bf^cegAF#ldi{_e&SSFLvI=GKORStjVRs03 zzY+Wlf}vrJz!F`cuwii-*SIQl^LnH}vEm3z8P6ToeF&vFkZpMvu7a^&<1ZRXQb$$D zi{!zNPm)}!Rc|yYrEmTmDMW=w`QWJv=_mACAomYS?y3;IKg^xWc6D;w1sn&37U(s@dEfpmQ<9xW#lGEp)>17c>Y`l7!?X>cgU=bxSPb zim_nmjki*T!t>EOzHC@m5!^ohff%m%5pD!=&OGfOO$xHBLVj--*ee)&BgzHF?nd%r z>rL=LV=ZH+DvDiC!DC8_Ef~9gFi+B-m$>;bg2jHivgbMS9fWxQ>l~z(kdNU+GOBrG zIR$_69tF24!2(d~V9ZHKmg>EK1d%8{((rlVPXlDi{Z{Yy*ku)IC<5}p(bcP0|NSC7 z>?to>-^Bjaz;Hj{Km%*>vWB1XnoqJ5Kj*caWP5#ittVModtTc~wxd0-{1n@IDR2KN zwy`6xeH-Y zmE3xotuL0hpJBBn^8PbyZ>d~yhOK`@t~|q5KPuNDe6_ssENfUNx4pp{*U2?!nRlIh z;v{QcC;QH_wskV|?vxweU~N0)>Ni;Ri*orJtnNiQA0aQw)s<}hE_qiatKKEAuVi(* znJPVEpIx?>UPWdN11oG+;W7i-y=61VcYk} zyNwQ_?KDOu;dG*-!ugLjhx4$B{j46Lbt{YSRid-?K?iG3a z81E}`(U`VZ$p=z#c=P49h>GQMi*sYj z3D=2yxzSa=ORk9YUCOJA+`COKk7~G-R}=M(XNSA7J+Iom{bhMmbc-*qBD%@U# z&v|9tw*QP7X*aOJFln1*9yB?Bvhn7Di?+mSYNG=RrUm))dZ7r5t^}b>`KcuKc zE(zIDBG-g87t4RwG(Rf0>RKO_U)1H7$o2Zd68TY0{%W~IQ&J+I(XTF%&+E%dvaDGn zzcF~j8hK01Gi&6==zpw{0pp%E@}<$Qt&x9p9$6zdu;Xjw0|QU4k-ukW*T~1&`8Dz* zQD3Z)e~S4AuB(4qBf|*7inTKA!aaMHXN7C3CkR;R!F(KmI8+I%&C5vS(|zeY;dEJSnX3*w)t! znq5EVgMIMY?&tKCZxFZC2I=(5KXvF)4QdMnrLYg)UscC6&Fy&>UwdATx1H*R+O$9t zw(I1kw+-7l>(x$PID1ys!bPm)#m_hCw0jStN{x2H|7J$sJrmESnWCO&nJ?T~k!W2uLGCT|VhDu4G8+b@?K0x*2=)we>PoL?YMEG&?diwfk#k^*_Zyt+UJ zEMSE4{uMH7TOm)ucu*}%P9c1(*t2nC?tvkwS$K;oe+<>;V^@OvQ&`7_eeV%D{$UQG z`{i$1o_|35)f6=#g}qwv@IH{0CUwsIVI$ezOZzW{kbC4%R`5o7U5F-q4s_IQ-t*kU z%QW{aN?V3B?-w3k8^S%;k7S#_UH{Jz&EkxO_pyt6&#w(dx1{|wJ8i*iRQAKyP2Y!T zpT{B7zy?cEci3F!6{Ff3S@HEluaLT)wZ%a?YQh49Yc zO6rP!EPCyJ?Rrkw=pYJ9Vc%E&bRH7Bp4+W%_Em-cFdX%&`XgIjT-lhbZBC}3g{f)t zpzQeTCZ;X%2c)pa54J#g^lGe-w7*Zw23wg2%TlCiar?=0rAxIJIUl)c!fgvlnjea1 z7uGH_k$l9}c=Tw_9a%6>bb@e8?BrU?o0N%8S8QG=k=6~@##_sk)~-Nvm( z3}a#=?S>u3`LmWL&mn_%yT}R4g-UvD*22jP?*lU1rK24ksVnqZ3#Vmf!XH)mb)F;E z5oWZ8!nkLsJ=C7idyrjcjgah4goRnU=@vVBIr{2g1kGj9Sq-KLi*LOSmg%Q16o4u< z?37`9PDlI_rn1QDdZuc|N&=K-<5JfBl4c}~xyG4YmIzoJbQogIuB-Zm+Cq({QDzvz zGlkj6_^5bG{OvSF#k&W(!^68-bTHaXf6ZatV2(6A&KU!r5dcL*v_8=5MZI%as8Jtj zw&{BPF1CNTPP%rG!xGlhVMnN4*Lz@0w}`9bZtgRrk1jku9$|4jRd~;S$N?MT#t40U zsIAvv$)+=zhFQWLC_z^)8_%=IZU}P#=H8a@zIL5McR;qDXF5Cg!FH~*Z{$^y%@`gz zkp4#XiLk{-o1FG;5w>gNM#SlRSi)W5I-BoQL=eiLJC$seQb(T8C8LsAch6c38)LeL z+}W_Vq^rjZ=9hFI<<1_7mzxI91VXHo&T|?v$^61gL@;M8$*?U{BF-Mwu*rN^IrEr}w#$|HrHs_A|S!;1!GsM>2 z);)~!TS8%7);!48o!sU=L#tV2PfPF6?#@0oN5Tb$axHpSn2lm#g%ajcNQ1_>r!RpQzzI zoYAq}d#d=^lsn4z-@p%qp5K6<(W7I30YA>j?g9L)AFSeM^8X%!%s^20pEcI&qp$8Z z#L>grBg|pw9?{)lu~{vWBg|^C*sUOeP@|>0OTr+XVSS(VK`-lWi$2CM;9(Wl5oR)l zT6HdmJvPDYxNc!9Yux66BZg_wpqjR zmS9ZYF}Qyy3{yH>7H4c9i_>fijWJt80gEBrEEz1JFwbgm8sb99oVv>$6JgaEE%Cf5 ze=!V?c1u=_|6!3aaWZpqU#Kz>zSZy zLni536`W;%9vNBZ906~#)u?$rkI0^EZR3xW36XIQw`dq(7Dlj!sIx3?i0@=4FqA<; zteld>yv0WcdZV7W!yb9yCoC*nPXjpuZ=ef|p+608{mjte28-ota_fxx-#Jb&LwFcQ z2711i5;#3{Y}gGv@okRdFlHEPkK|GMs4$xz^b_OcEaC)n4o0eta?f^Vw&q_LUtfnVMS4%9yCv>z=6mxbG+SrRBEH}bG%&52(D>{}W?$IR24G+tM$0H&TJO`Mvhf4{ z#elpQYMEy#L^W<(Hc*jL$Gj_*je#KWu$YBEtg&{#zL{D3S#Hq%as24+y+R7*m~|Rc zAKx>l*-dlEEGvmb0vIWC77<2l08*NH3~s1hh8XTnu!Os#+%DbirqPz}-MV#)(M>cQ zWtJYoX$o?Vi|93c#PDG~`}%xm6zheCoH@+5=PZlABWu>|dttF0MmqTqVkNg@IQM(l z7r~A$Bzb0rxK3{i?%ic0oDx#HFvz12 zi(s=4x>6qy@fLi|tG1iRFULJ#=s&U)h;~|5c8OobSYjLEixv1w1MwVhk1@9B2gH{# zHVbc5DcZXp_@MA78G9XXs*B_0Y0(~X(-Za#V-YAHPDbA=ho7JJ#H0bxNw}3lSnA*F z|Mj;)zF!Em`{3Dv#$mV$XM+$$hGn0Tp*x*UvepYg_ zinK?t@yWs;dfPbw)1ZR^TzY7#5-<0MsgBH`#9FJ4BRRI5FT(Dh9@6!Y#h!i@q1C` zua2)|B|m>%u9F^v48TeJj{I?WCI|W9Wn`sy z>Fa~y$$z4Ye}5PMjxPR(}ZAR0u1GYz;{ zc5Y1klhgl%+i0t%S%R;2DOWXMeT<4l;fSxqF#O0%V{u;l zL2Ue!ICCv%iz97$e@b69)w7d87@3RQXDZJ4DBFi;o?2q41Fy#+cjt;bJgpqyQKAXi ztN2$s2PtJ~?#@?fh|qnLP7P21Y$Ad}{y^>N1v#FbEc*h^esPJ4G+&fZn$ni2j$4D1 z6(@Ukrmyl`M7kS1&iep2E*Yg4XJ1TTH6p2lG!o%+INW9pj;+#zL6nNqedRoRd1WK+ zGx)m#S1UT~h3G1Ls488u7xogac6(uzaB1x&)E>m*BQpV*vw&11mI_ZKFJUF!=tmQ2 zDsQ4AX|&|-~!WgJqcSFLP7t0s}-BRK9PM?DreBsvmVHMmtMu9ZCUtx5*h-~t=* zgNOP8l%{$Fa~djCsISAmvJUx!Xh3|DOjOu$tMgY8%*Xrmg0^tNAwG>+{!>13354oB zaHgiODx5|by<%VLalN`rF9GwMQm@l1ObjAqXWA{aB4l}POFmxqm48NO@eJ)shLt}9 zx9L?L_f4#cx{yc04kkxI0STXhmTG>zeRbV$2od>KVo}nCUR*DtOtoXL*gB{(?Ap4f zr6}iDFnV@=t4iCygw#@i^s7kSi3D{aeGQjYuA=s@N}~#Q0vJCcTZuR}A|!yGUxW1D zfeDL}zYgZ0Uk30dMDYo%Q%^5MPYcS729)SI&U;E}O$ZPFnyz5JQ>*Bw${=ZZRb^qC#A9 z!iPI@t*D5oRLvF9IhR_xV9q46s46qB56UEF=4L-b!lyYmOcM}h$E6n+a<-JdN`EKd z?BFUUPhmZCwU`y%xt{ombY1(AL)m31JWF zDL1|r0E6IC&M#C#f+bZl(OyUb1v#e&s_vV;Q;7`oN3MJf>xPSMDYyJqc?{dg84LaLOX3UWhUE zesQ`U;{dq3x#&sssCj= z@73c$F}g`bbfIpUB)ZU7(urdKS6!mL3b3f%Ye*=qpax$Sbtwz&AJ^g^n#7^dE9~oY zTTp{P*)3!Z_DUMsW!a!)Z;b9egmlKdsqF}Pqjn^_OH~fqQPPAC5?g}Af1E6!Y$mYNUam{MK1*_x3`7XfgA*&|L+>uJ5WNQez7x) zW)S%Q-SM6D(NxT+z*;!}WxJ0U-)Vdz)GO>iXMBel@h3Tl%8?;LlW}nOPpuh|wOgkw zRhE|M;W{!TtW#N>rjltMbai}4#O@7Gf~)%w?#>DIMmYLR!$Wk_`tbfXHYe3S4H~aG#X9yrlAL*1NYe_R9AKh*{(ms( zEZR;oV`$#NI*ZvKLf3`DQ|J|?!BZ?-GgVC}%w=Z&(98`V2r(*Ir|KdT594yo_U^+_ z==wo~Zb2s<|Ux> z?6c2eF+wv3SMqY$eX_*3a2o{+P|8cY6JMu`kZWpH{HMx?aR7CZHVKQgvNW-H?@$-- zZN9_pXLC4zWp|#?V0A<;GpllmPqFCk2;JwkKlC>&w?G`_SpIhVNAT>Z9tS|o@LZ!F z#U9Vrmr|ioN#ZL)4z^P12rSY;aiE4IsrAS~MlqLG`i%vRkCY+1tMAjCs@}U5q+s6j zV9Z}oqLCHVvJmwa=+)IeOJr`+%|m6{#<5(X}3>w`|8*qSv(jTpmEy``{ z!ayDB3ayld%G@qpC^yu}VY%6jAMAm&Z{X;yFbhYz+M2Rfs4gO{Dv)XEh`^A&F>dRj zHEO*^ukp}|nQ~!$N#+8cQ|sv{B4z7n0l=aB7RoRd8j^Fx2*OL#!R4xSf4~+#JC7ga(_Mz&*2$AK$t8Q6;o>f$0bv<`=_1Kp^N14v; z%%WDl>{0IN%0dT0*wEZISZD6ibm}pH>nk_Nv*nV)T|!bi)cBbV9;rQ zlhf-mH7?Np&|KN=7KW>#;O67uMTiAgT6=BZXgG5S4&n%tY$k`;OcvSc1fs}aCxLOk zJ1hM<-loBMCoct<>v@nCTd=R7$!(QmER1q+`-m1q45fRY0LM3?c~J!?!o{@+p?s4T z1rr=i8)8O`9G|6{v_s~+{ijE8SW59T-;oe$v7VzL*&I}wkbSity5^j}OXPzz%iXhUHc1r*H?E5uB3I<`g-TKoTwpH|Kfb?-=i zcpH9@HbTzKSuSy=MpL(ju3e6Q5mPF!vL9~mI(?xGB^pRfXRkglR2=r&v$(r!3yneQ zo|WkN5mPVMa}zSOI#)y>pD&SV98-}ah9T0?ZW|d8Agsr~gnFs6SWh%U*G9gKN=0Ld^19>YWcAl7~vzR>5$P;u3{+^rmD z&DOe9ZtWo4j_t4Ov!SEUJH*$Gpb2Vxw+n|g+Q!9OXp zR9a#U+LC*q`TTb!TYR?+I9&^2;dLK6jMS-9--*^6--a>rsk#svDq--+q_vtq+ z=iiJRww!+i5JdJy>iYl zVpDf-UjRHX5N3+nvrLwz(9_3>WoOq#lf=QJG8{b8=iV|%>_Bo8xlwpEWnCAQ3DAWE zicLWMyi=5lVjqZlEy*^^WWF_+DgmQHM(9zfeed&TFjSqEo)yZ(pw$1k0Tm4rpC0ANI~&Hhk1+903wI#D&$=wTL; zA|9lw!XP)41ZZcw=)3JQ%8Uq5-V=n?YC25jdz~LC zd+-vTKo`;rw@)U6>q|x1kd|m(m%CHc-SCDmN{U zN=GLA@Nx+(w2RCeTf30FI)+Aa0Be7z$=5`}2OJI2?@GLg9R5UM@ZD>*&}2yn(HG-_ zzg&HXFl0rkE7Yx@z#ZRULzLWRax>k#!^yrZ4KX+RFzun8%_HCxrVdLH{ zTk!3E>rXh#vWdFQchAmv_Au2&NMeCI|5T06Um?kHjZW4x!!hgo1(aCrEE>l0N$cHP zA^8ZB<~YwZKu!ss{~`PbV~Qd~j(Z?-98Uinv5%4IqP)tjKQ7RY+Fkispl0i!AhwZ* zw$^Oj>bH2~VCbtOfPibtzOUR0LyQ)f$;H>!b}bAZG4@$A+tv5^a~u0E8PU-9AH(bW zzCCDH{mt`M^jo`|E$???z_NZ14qVdj)!|kBw(2YTy>pNS`aY)V?)%w6*46jH zovgF(`k@_tzi(!%`>ou~R`%-K<9K@`5I9r>9lhRNATCRZyX;n6+Hj1ot0_cZD1 zJ*~PrPp58mL504dV7Y$vU90sCch&2c+|{UGepiz|@EgXyor24bC#K-G;o_;dQux4B z-2VIh)cu$LY3eimo}T(a!i!UJ({IDnmBZec`q<^$rs6{3o~bK!`==_0rs96w(W$tT zS9J$AH|}7sHZyHgGh3|x?jT!Z{Nx~8Ykc}3t2cguFe6MSl$5dus3tSqm*5jKc@(08FC7y6@uPX1%;D#j`i6LVX z`Ey3_-!j#{f^j-CeZ=hP#?(Lu6ZTF4ohiq*&JL6GJVYwFHh~Cc%LTFDpAl{P^&y!xI_6atdUyg5cQc7-%w5! zc60t5ewW#>p9TIVF>$F=#k_(pY>pHdLFFXw9a>69F#s!PS#8STz@wrCjfg-20v^Gk z3Sdd>dBBB6zS;G7SFVy+d;h2H+ywlZ2Rain-LPc~*NkKk} zr$@ORAmx;qcX=LUslCf|ae?n-5|IVgqZCsfrXdd(Q!%6DO#28pD1oChY*K-@6ZLt_ z{Cw%_<+L8UnA&5Qk8A2Yug4b_kyWD}s}WaWd5FbJ28|NF(AaRb-#Q8xV2ugmaaY`y zoM_XTo&C&8tR03Q=&rpr){>Oz9P2&6lH!wGN#~iZ_H$ybBgYKiueI-6Xdh?4*nXM) zQuDVAP4k3J^~^abZ5F)X)kfpGH3*h`Nga4)gfeQ%LkF1Toja4M)CWid!p_`F3d?jvSR zvbe0tiK+4NfsIa#2EvL_kEI+u614J`#*|`;hpB~hgE6KcZn)WMc9^Y3TVI!w95~>L zs3@5fMw%Ywb3A-oPK;Ozs6=4H1y`4g=in~9(t;=q3PI&^u%Yl0P?0CHTl+MLs$skv$Xh{$r}SGjr4pW!7bz)oL=rtp0~{7) z0!BDan~9{9z?aEHlWq)xF06Wx-4C9^6g7nuH3g9uO2GizPm~u$BxHf5iN2X5>_%I> z#cEbE5>gWawW(LQ-8WHd3@YE_`Y@OcD(}GoGz59^ovPFUI=!nDW~ZnaOo-y+{3!Hx7!yK^wq%?&(hdt1R33>+ zpduYvQb~S|TgSXO-lFTxlp$UapTh^k5T?Uwp4OyOo;a4w)N3kcwZIH#%Jh{6)12Y|GA>L_-PqYU%^~d#8PLHadN|6fW|0vhQJ-40Vr5e@Vbr)UJ4=Q=o zwt1fmDh>rx9THcTYGN&xzPgg6zLvBRXPKQyr+)&B62&E2?a6%-GBW!k3&YO82w6xo z^ckFyG0^IAq$eb~G7&!ftV-y|=uHPW!Yq{VJu@2DKiy@?#29f~mr}Ze; zf<#4$97z;vWbY+NLW{Nb6mzo45oXhlIMv|_a?&5i5iNc*v z#t`_3Ux*veG@tz*SMPbo(}YEbJ7!NKOAa1t^oS;l1-yyg2ztl^pAfI6<|-#dLo(f$ z4k|afWNp2ou{uqPlH%xNO>*_Orz#270XDl$(cNqq8+dwHZdfMB6H}^w-knHjE)r4% zPq3l_4hlIx$^{5_sxxxADgw=)ha|s86jevueVVwl5?sjxtyR%y(NE!E!7IZ%mD9g})~>IJdsu}Oj5 zBdAT209ssB1eT- zWUEU=T8=O!(Pjy(K3AqlKiS2_C>*`-P5?Gbz@P?ZO-#+qJ|xf(347y}xcd#b^(vee za27vAF0(Q4X(Z%i4%wsiO$Ye>D!7ioAJimf^c@v=Vq^pp0-86Yd(nu3%H&8Ck@wdk z5waI}32cxGrYFh|YZ8wza}x_3jRd_BZ5bs>vRV0^)IdLg9ek0>Nw}!gf-!`?g3wJs zuN@V^+T`BoD?;dRspw>1%JK(I;-}2`4;FYm5ZO{b1jKrQ$ zTtve<@m|8wlYlgzqi3t=WV^}rh$gX>nZ99x$3{o+ek0tdT#hf2{}{IKMe;foKbG*p zyujZVi9h)i{6|9gZ^OmQj!fXVey>UVgqhZB0+r`Qq#uDU*q;m}!G2{Vy5%8F;vr@{ z1`~~u=xF3o%%_GD&rz{WRPvRYSi8fKz>V1jzK)_GmWr4Ueyd8YLFFxM#&FJgxe$RK z*eG(qb`(TWQ((iGh#X8-3Fz(#6JXGaL=y-Qfp|&acqD<-;pd!!{{=gHt;YF}dz~Yl z7uxr+`2PJy1)jTrk1=9Ji=J+rKCO&w%5knMeB?5H6Le>lvWy?uhi-*cUr=44yE+38RsLsABrlX{0Zhnig`S6n|+qM@JDncy^~<9~o7Io{=O0qbU`k9mBEa@ZT zEXn8E>}ESm+$GzRtPY!V$Y^u_xO7{Fxvz7u2{y*8iE&QLK-b0bPNkpK2=j_A*8ppx z0b#ZQu&8J0Gs0v^9BxbCJPjOhfh_^n)6N3LWXs@qr%nmHx0B3t(8y0eQr=fuupB8T z6M}BcDziz=0)tg@ww+ABV%&#y4Yca(xRe8lUQV@Qjy1q;6?7kk`Ljt9F-#yIC(pe% zk(XKq`IK0Q5_^h;C}Aj}nHLi!enz3XUWJB^>RB|o#-h?`bJ6O=3hEWeTziVVLaeSM zfe|yt!=V{2B^3tOU^FW2?9?%kuaeE_=H$TByP2@E8a34oQm49Ps0jH)$)~zELcqP} zx>2y3z~T5@w=V=ICObSBBVwCi5GkRLtxuqGkD4q`olkf{<=9sOu7}TcA2H?Zz^Z6K zb+&t3h2*o{7tCM>?3QTQsQK2}wx` zEP5w84`TWoq5|^i@1RWRrD)hw=f4g$p&(pTl0AI>ds$=L%>=K9qe(=}f%oufXgLtY zH1d{8g66=Un0ps6%g377W0c|h_D1pCdnTL^qEQ}61L($e8lcxlqn|PrT7V_ylCdg2 zp9(*b$sdizKXopA2X7~eOmxG=%Yn~@FKc3VGm(YI-i^vaI)i&-%{M5Hv5h^1ZT{*dL*y5bI5v98bbJojpB)Y*XGEOJp|fiz0K{De}2f z$Y72oGGt8jH?bEgj=fl+kl7K~@(If= za)-el23>$TPcUn09E#f9-)M_XHzqp9xdvGJSe&*o#_6t6gU(G!u_Qs6nwWT&rN24O zYP8tn5^S&@c;R;D#2P%#W^=))Ckze--aEob!OGRy<(OtlNUK_eWD5Db)Q)u{t^CPq zuE8yoASb^B6Q#@sJEB%wDro$0gluW4isQUF#q$?{NV@=onL=w4=QY{tjLit_Y~{B1 zLb~r*q~)cwwh4I02aF64#yR6soEerO_H=W+QL*$B-xejcMw2uchAcDqcRyWn;2%dB zH;&$;JO&D0_ejvngR8`iYF2*FsZtnT<>o4EN3)thV&;gzhkxVP(Es-+SB3ELD!0TR z9l{TMA@FV6kfGFb0}r&ZNk!AVFdXRN*xw=^#S&<2>upYOKVq=o$qfoNz`a)WW9z&Q zZbb15&t~ixu9AK_Q%nX2m%(qwzD>Er;o&$&?WJ&ts%{BShX~_vh-e3jGY%(*CLlZx zXLfSv7yIFt;Foydd}P4b6#QpV8uMSffj-#-uq_CKQ87=i{f<7_ICU@`lEb9m`wq>` z8m@6*-w1zh+u9#rrVq~NuxzZ&S9#O7Yt7!-j;k5F18eCEpRE{6pX?hL+XMUz$Jvh2 z&#j#2xE)*ah`&R#?~9G~d!KU@FxDSEZJgiy@D^-V<&+5enSVTzLZ9q;Fan6O|9i{$ ztoPnqx!Z9scG8eO!M}&Ia5?u0_zS!1r~W|xM}&WU@r&PFJre$>g@0-G!OM$relh2H z;oo_y{~G#auM_?oKi)Q$KH0Ad|MliF$DBZ9MY_OTRuix_bhnD@Wr`&<<_KCxpyJyFS0U60JRys@?_Lzma-SvNe zgg)5`8din$?)Xhl7k#qRGo1}lEbsFQkJ2n;J-omd)7}}%>7e^KV%HBRQN;21gnI< zJ7`|T;ps*y{zAq9UljgpH!R~db;X;)PcUH@V}tg=qL@HuvGtCxYwbePmrI({4(|)Y$LM<;BwQPvi zpv$zZu}v6hBRn3K6UHMtgRT*NHEpoN22IeiJAg+x3V;UvUl_+p{#&%{VzeEKPbNR^ zU9JSL#E1Gf=uRzbK>sB_(H`W{vht(CPwBeK!ZbPm3k3fJPdvC5YZ-9T+5Ib ziJwgVKZNnq$p1vxpF#c?!v0M1zp7<=S)N14{}(MQ`AqPG?#EnPwQMBvOlhlsgSKng z*2p~U3G+yYGX@<9`+1%|4X4TT)E4&hJpCi==Xp92_VYX$bnFhv6VH=H$M&`g9y5@h z%b{aqWgd8*a1mv#jOTgkt7EIApXVu4$CgR|NWwoy$695*(z!_2a9yY`T|)i~bgUEU zW4Z|axh~Q1{eB9ddURc-WA&0pp63Z+8g!P&7$26BzH2qmWso}vmpQVbD4Q%)6QXkSLca3O=fFx$)LSFXo{5aP|1 zkZX$6ImjQ_6^0^Jij6`N<=?c;GX)1Nisyi(h*J{q$ek_W;(Njr#J4{pyiJKJ`6x{_88}>wd|8oG^*WeD4Df6L95rx6Gze3?em&sj0 z;*iI>i84dMGpJ|^N=Xd^%d#lQkR4dAZ4t^ezCQs)4>nci@P}CD%_;CA!=fsPNKvt@ zU*s#lke7oS234U?BR0qnJq|ggzK5I~8^K=AkoOv>m%xHdVfr*Y!h*dJH|)<&bMvOh z1T+60L6O^hL7XR4swNcTS>!u>JVumFZ+)6sh;BGwIGA&(FH!VruN1eFDd_j25e*(8{l zy$hdWHV@xdqJfklHlL3LyG&V)zl%|!`QDY{YC(Nt8dQ`0*WpQ47#I1ka~bY@y=-p<4`uN?VxsuAGG z*(?l6a~b`q=h?1G;a)es`6usS&^-Yk)vx~Yu3O4}u@PXNO7xdo2kWTI<-FX|3`68t zyOcnFrSr9Fx`dL6&tAlvu$I}5UkdvV{y4rK1Zdu+xi$kIKP8GkIN4g_r48#A@Fv3u z=YR2GSsGrFGmk|XuSVMfiC_B1acLbuvVUiEIdWOiOKD-f z-idVT{|jk#_eulFG9#q{odLsd(|;iiDp#_xL4Q;*Yd%EVAHbLg^vRz?{vpt>;FtVk z$PXRHO6kueKUTs4{AMBEiC-<&+#hR+@NPy!x&3h^ny z$BWN=e9G~uz^4kI`Mfm-gVb)8%RKAhCjZ9$q6}33ng~CIt%&ebKB^-86z}cjcSraM z{-y{&!RJKy;bmjsci@+Jp}$P&=j|JQXM{fke!aw}_$++7-Ve8bcv&0#M33Utc13&~ zK)43Fvcl7?`4Ina{J8@W<++*CZ`bfOE#<*Y{x8G+o5=sU@bmnW|8K%ie2pRhXW{rv z@*fHNo#a0phS!t-lW=@j6Z{8-pYqTKe`I+ckbbp1w@3KZ@*%!9B3uLAT%KH$6RltP z7b+jZUv+AFZUoPuyyqY;K0r{+ec(TnLx?7?19j|;%-ay8V;YS_^T%z)zrgszKtZ$(&<5vy)CBI`KPpWNDz7r2JT&=!?^hs_u zWoivB+#n9uVQaGVJF{r`!M!Kpq46i=$>5&PZ{NnR$^xWvEN+-lc4|90&?L)J1=P0j ztGGmhk&i>G510d(9xx9j1D8w#t~8!NZs385#wFJnalvXwmWi%lMNr`u7ItDLWgYbIPfbGs!O+`dGP=(?`3FVa;rse5Uj9+%MgyY(=4BICJnVaui3je17XV)6!fsafIb{o87>JEzD_Caq--b#I@e~g#74wa_W*y6U;%zsCBT5Jt zrD}5nd6Xp&fZTY@K1iwKYMG^i@>4w!J|tK%--67Mq0bQfa!t5)Rb9j=PI~DSnE?Z(b!9GGFWOR z8EYy?QM+_8eXAiPqAgua-{5*@1xai4N739vH7~Dt)AchdkBH>x0+8o1+`{lz^Hzci zLg@!!YM!bw8x<$q#--UtddrxF7`==zKP1eTwA8*}IfyVtqo6_zmgxO&oP!i6b$}3R z3%5=w>|CVTPJ?mnXWZ%uw>Qsgyc<^_sVngM?q0f_@*anPGNg>qqYdd9? zpkyQ6i?);D_1fy=_|Bsy1N!;6YF;x}Upv=bv(U0B3n8N#*Uos!*yxQJUv|9KFK;!X z2!)C0)@M-kvS)OMZY|nhtBN6RU=jLw zG*V63ad9;`5X|isWOopRUmKAsZg5VqS5vP$B?^h=Q0O%g;0Vj-kYTbfJ8Ft=t7-l(e}<0+?+CXGcgP~W%HuT{m9eT?ISpET@e|cgr`1MX1lhUDChB-4GjhtBO-K> z7PE8C-z7VRb=sdv+eWUqc3S;PnyV_&w3 zXBH-%VnPHfHgjq@_Uct?q`r4#zP;L~Mq+^hW~o(4%u;*xoob}EcjRs2PIE^U zPjd<~1_Ns$92tzUPLz|HnRjBS%gW5`0=b=hW7LuC4ZmO23A? z(fnfUmFXZ8%&a!XGWYW3Lu1*@i}4wc&t!aN#xl>&7&0Q^DZ2VX(baLw+Kbmf!Xto@Zc3vsJ`4`ReTj#niHPbA zLt6+MZGw7k7@CKoG5jAwiFQ=?0|J`D1!|NoqQ4>v4MEJYz|u!YVdi>SVuicCVD@*X zCJ$zR+Y6d!0?ba2g65%Mmga$8%2m{&it@t78M0)X&n zvuHaljCNL+c7eU<|9LDBrCRu9r+wzE*e-~Pxv9avApMqHfn1~Uva$&?ki0Ord1wK@8F-eY) zbZ?zcx-_}DRq+j@TA(H`u;?C(f*pRZwziGvO37^&Bcmv}mde(C+#;W4D4B|bIVUO9 zK+Z$|ZI7cIk>JFqM<8@#+J;?+vcC&4EltEjdIG#w%&TD+B&sstbjsJHP#U$~9Yz=` z*pvZ0@emZro1tuQnFl?KW&-fniyI8LROam~fvk!gG=O7R#YCTBug!voSe(>Vc_M?V zYwJ-x9+7H75mr&%)KYH+L+bNZ#8COp$nIPAXF&;K#ThBtC@u@H2tefQ>|H{9_?9p8 zbfQVz1cpfzwJ#eCw4YgMc*X%GQAJ~nC<$225j91Qp*-PUWz(AvwWd0Mc1=Z=TTRt+ zI#EEDK)?tW{b{g+aZPG2a9H>a;&PcfB+H@# zmn79o;F>aJ=|-L@g0&DV;&*~cs%VSqP+z)GVW{{|-&J6a@Mm?Ej(@8HI#qUamK)I> zx%?XH9T07zYojL17+oPWUW8LuYZK zG!)lnCFl7|Xn;i3W~D8?5`7sC%hD@(hvDt?MyjsPn!{4UkTyhXbC2bDCU#>{US<^Q zF>VV5D~5=~Cn>YCXsq@Ox6^t`0(x#1KK~eMXkb6fLhBre_8pZ$G0K05WsFjLN%tmN zW6k*Pc`*XRY9UY7tx~%Hj*5lHzVR->cc;Dja$X*%Ui(2&F#wbe4%0zk76{U0Sh*RgJqq;vTpxJka>FNn{o{Z(B?&a=%2`H*jom% z2#s;eJdpl5xkjrEmaXcY23~2}h9NjV@Eh6xcty!xB&$hEN@PDMs$L-4Y-43#NO`+` zI97LjS_x0Gr)f8}S($nM^~j1Uh%Tc}A% zki?eRxKfKQX@r+%ZL|`QzNtH+XlWj%WiclEM!ez#OMxOJUzE)*HGeO|F-!5x#En=_ z9lm(kzK_5&WO@krCk`3_8_7YiBr2P~K{cN#o8nm;;%V7VDO~aKf0GgU@o(=7VWJw> zc!S6Rx{2by-o)~`5Ewupf1j&{$A?>FZPi~HGLJ%5Y91!2Na@i34|JYd3JnUhH_6Qw zzR{b?jGclE3a*-y^IV40ekc(C5$dAq6eQI+mD{P-YFHiwyYcG_lvtuJzFdE;#xm)oiuibtiv9Jb$HI}%Wy=Sbr+#>VZ% zlhG*Bt@&Y17(x|PG?1OR8U{wflG}gJsd8Mkwu5DUPm{=n7-nGr2lQ@n61~paEPXZ0 z^Q?f8_=rA*HaUjUm$vS)%oj=`3P&=?b>;k#uz^bpzM8C&5uh`9m5+?hp_u=yoHvEE zgGxKKTM~xJBc)l&a+`hGw-`~$A^GNN)-~slu)^MqI5BVl9Yr8 zqDZ+X?R23;5dm4KQ!V5C%7q=FXynid1=!F${kTc64kkLv%voSj(nje*dT~OT1+GPM zu+1z*@_xunZSD_fd@`!@0q*OTe5nshenPDCr%j16nn9rbH?kbKe(nb3PCjE)7C^iA ztp8rLK08`2H{JzR+|wM0R>VjS{CFnd@N}r|R2><(g{;Umw`EU;lI6Dbs=2hRN?Pqp zIHgD>vlAH$jtplVTF9kZ=rji$mm~4*xF8Og+AIsQjGwS1FcyY*c@T?8I5i?Bu49W9fCt`MFjnx2PM^+495c2T=Wq=^HhxtPtFd{HY0ISWV5g>%nY2T6? zG&R~EZiLjeL>oenCd&mCo*dT{M^iv4*k79j#U0nUt5CC09J92wxhEr2>p*HJ2ho^i z-!dt<=qS0i9yRK=A@Layx7E?(CsIE>UGOlYX41)@#RKvC)})hB>~_!6gIztXQzHro zJp_G`RO~8a5YlED0f`kYT5h-)B_tM(OGnb+6Nc{&S%o`e5(jew2VvCo-^C$As9~JW za5`sV@NjN-G|tb@wYsRS&HXXYWB67!@|Q`p$_<2#>pd{>$0Zgm6ucD+e`IC*i9Ozz z!>i)j+!J}8-QP$8sQzdIcrW9GRQ5vQc!HJfI}?p1zl=r&Dy_0xV}FSDwB8Ut|l$S@j5zI%37hSbVDdV^4d z%+h!e;TGZa-IzBkjR*N(f*3=2<{A&k5H%B_j>j809)^j1Gbj0gr4al`X<{W|2e#mt57i{}FN! zcv)nxeiGrex&A!QhiY0)aB%LfNSArN77otcjcUkkaCq`n->1O%&$)xd1XgRaFl#M? zqd-JME`wPL@6^1$NHFDL&f4ldn3eN9X@X(@1yJ+VzDi-W zZ^8ynFsurowSMjajt-JdDxJN&Jl<9Fn?$*{^pm+C1Rq2+UX!V6pbL~}SwtA>o_ zAy`0Pp@v)whv!DsHxLepu)O&_C^FW876;Y%X&W7XphB7&2V6^KBjm(p`Q&A@XqNP< zy{H#tWM>vS6E$yor$LB>5E@%CvW`G7&nZOT4z=H7OviIIRSp?9sd-%9NcB;unIf(~ zk86%V@(>vU9ixI4U|g(yl?pkeaq-V-3$N>{hzMy7irZzC^EzHZGER+SNw!5kz+|j( z6<~)10}lqQYNAJTda%Ukuiy(%Rj&pOBAqXw%`;i+L>w1Ap%=GTkwQ(hp&^`iJWPoP z+(8swm}Er0?&Lq{Eyp_`rqaktqQxn2VTtcOz+peOcJ9d9H?zRlv$TMfr41JbPb}R< zEptjz-mZO>fcYNzNRCoTJO9$aygH!FLGqrf`^%O#3sg{_%g91dk8WWIz*iD>gOp@6<%0XPytktkTi=+Gg9Hv(M}D9RM7 zz)lX>{p_=+T~={Obp;Vx;QUXI}574seAAgrJ?kl8WBwb46%1W;Vuvk_>&yaYQ?8g1zpl+xZQfPk% z>tT9b{RB7bkNU&1Ypt39+Tq%luTr;)EJW+BC9MGdY;h=s@Go4xB2Khwwyf5o~eranPx% z(_FQ@W2(cFPzceg4(M`_Xb)mUgST@2FsS(I5a(&b{qWFY1H&WrY|@qut308XXH&9< z;Sfrm=KxaVko_^HVVQDL_0NJrIgIvq{S6-5*%CAfj&|JCr$mD#!#roJ5wUPY<7BH* zqq(EgbGsUF9ULMz6Nuvq`YKW**P{YZ={2f<1{|KpRNrAyN=vhc0ph9a5G@)&JyrA-caF@t6As`(^zaN+!*&4{ zd|asdv*7Stt@<_~md^&n>m)Ta503WBIj^V~g(Ltv#|Ho9UiP z`npS{F$@k~*uYBTdSxsQ(%J_R5UmqE>s82x2*?Z-G6TugW+^mN9~6N8mp+GJPzzL^ zMR`bq^r#SsvXpVzik%Cs5Lp4xn=dU{<)^v)XhdqKX8GP42@{kP3Vv82v zmGdncd6vj^9tH?VeZiO^Fm8dkomsSm69Z2g1TH$q;=#x5pEiJY$I+zIh`+2fa?>6N z28%SFFb$wWrPMpsYh7>skITa(!_SNN%9JcT@DZ7* zvMzoY0<|i16%B|+6WIc(W4zo%Ek+(2p%vjQjsHdw#>=J)n_*Z8Aj4fdvW%ME z^mWXR_ws~pt1A}O#NA`(jgg6m~<0H^%z0QFM zTvZF9PSAim=|VvJqahL^)ZMBeoy0a1AX6zK}0Zdp$9H8S2^BTN32avF^6qZ+83`fz6_ zN}pam4~9Im~ZNhq-VeEd6oM=1x5DOg$;Yz zOBZ&$!ydVC<2$VK!oVK(j|;Z%VUJv}Y!CbR!Xype%CJc-1)n9 zv2DB9nq91YP}MHh{e-W1Z0nQ0jf$+u+O+O@v5<2JtR>m0Xay>H{CZS}r}%j-AzTF=|K!PnBrIv@8P7`u6cucMLe z+TdeN*EF5iG`{Y<`fHb;*LZFB=%#D^qg$_S9=-g!U87mUTfTZtT~?!J%`3iE&FbfU zd$n73vU*+T*jDXd#@6ZH9kWKabWE3a%h?sWo!eQPw&k+by3hLgwNGEPLidrbTf1w$ zZ?o>lW>yumu8DQ)|Ioy`^cDNqc74M^RuOYzSd)IopayyorBi?6Bi5#WNWV+p^|Ehy z%;pz;D-FwD^i{>KdeP^PT|Qx#aYatEvGqE?vGKZY#ZN8$>+?Ly9K9JjLURLMpHt%}NcOY)%Rc&!gp7#af)_a<*yJz~X56tYg z?wzs3Ry$**?cMx3TWx-W?LGG{+j4ia?XBs4+sQk-ZCmbKVh>JRY2Q7q&i>Z42K&Zm zd`BCw#m)P;>mtx>n+_%&&^BX8*W}1|IbNv@lQ``i2vlKUGWd! z)EvL!DPL#&#tFL|t5*Bk91TzU_9m>pw$8cy+6HI+6TSn^h9`WC?Z2S;g2lEawvDTO zX&Ybg)#x_A;QO0y`wPAYbrmoB9@RIz;QLs+>wK_{xEa*mWsU26unV|-oe$;-cdhfmy5Qb*K3Mc@TIYj7%meFuum{<^ z&IcQaE$e-c4sTuW`)owpdf)L8{`I~mMs}?CeR^)^dSC6RuJyjxM|H3F?He6f?^}It zMZNE}kyZ7+FGnq@_q}}HvU*?TdCTj4C&sR*_iY%nvflUn*i~qz=dP~z9UZx*-uKw( zx_aN&=dG>x?H*BI@B8+`hF5$YZ1XF=z3kgpe6Z$r;uRkZ050C(gI%}>Hu!e7vfpp; z!9v}iHuzxc?&%Fa*wovO*3BC6RkIZr8xJzwE3l5t^myW7LNOVP#XB}-g(|e-U9**b`qg z?a*lISNqCWuSW4`IsV)J&yVO~d5Jv8Y2_z7#~vm|dF&MS#h$fYF)-*geZlm?g6ZR7 zdImOlUitK?WqJ)+UJ2QR`RdR0D`GSSu!=HsTH#fBa|&Q~_rA}ceNnF|ggKVNd>A<_ zm{!ET-gxv6v6|vLXN3?e|Ju+TqbXfb`U$ zg1SF`;=JPr!4}hU6EzLTc2{V$YjUK23VZg0S3kkJNh|CDvo(KP{)S$=IXe_Gg>5|g zr$Ndp7Rl`zO}?Rz98kV zL2`BYrAbwDWB#1E1=I0VihOMeVKI-4jfn{;^so}mrfy~0bZ(Ll-K=7rEwFl&3^>YR#;He1f@?mkImPW{ z_B89e%={$_>;z&ynVhr|JUFt#24~zQ*5TH(OeJ`C$CO}BGVf;QO9Rj7uB3;g_yba% zu$Bqi|Bkg9YwED!)>K;ubEL=i2|TaQDV~4=p+^VaCX1RNXtop;d$aRrkbxlEeK4Sm zXNUR(4(e~npItmR{|a8}0Dn?|C$+Gc9n73$e^z6RhppZThnU%pyZV*{FH;FLtBvVr!|v<=XFA6T+Ic!|di8<# zS~5-r>XF!&h2A?-jxr_P)F)7<@R@?cNks7=lG4I#ePP8lKE8k8m_lQ$01TCf7yWq$ zgOSsKa)o=2%o_N$or71`QO3Xg+2U@&qLha(%e;f)u< zj~jwU6B#~ShL04#A%4!o7zj9`OEk=5VbcKVgy>x?@h%m=#2fvE@UuiXEg0t<8~6|U zWMjDQz#~I1-|x7WKG`@Xf_v%i54TT<>ofUi(nZ5Nduodqh0(KZN*g68_O6jC6^F4TN;C66F!H+4(t-XSeDn@{+jX z8{xlZdF)PdUGcr}6D}=yK$6$32!-uF)RbBe6z4K)SRLrA@%)!MGFeqq$6P*U@NPme z+!uCCW9Y~{3@+}WI5{YbA3h_7oiO0Xhiv@v4xx4db>LU~XXMy}ejYtQh+Y;o1B8Yc zIT*wI9-lwMopM@uf-X>J-ogdQ={y*ED=jW8qxm}`<7Dj(M(z0UPbE|FR#Z8`^K)%o zQJp3NNiH@5gaW~@J?`C`u8ubZ@9fX&mA{pHr7|1FX2BLn>D za$plh`W5oqHEb8&Ip6~T{4|bGKIyL$r%*|Mp!!>T`I~zA8+-ZdBmA^G3Q}s>%pm%! z5#JyE34iWnq}>fa_x<}{A)62~9Zq4%@gPs90(8^S+velf`^(cHnx{>N`e`!gS}~Rx zkq@5uFaL5=zsB(h{)dxhx7_TnL{P}C1+-+_yZwNnQ{_u1;S^05bUQ+ULUu2tqK`D2 zOQAX;Wla^46l$2V&v^(A>Oz&P+O^>N6%K=oX*fXvH8@nPk;X4b??Zt&Cugx&r*d*o zQ}INg=(5Ni|MuHNLY!b8xuHbm=Ol2Sk}Gh;eM(|YT#%Nmb%So%QE2fweN1>r4fHuG zv7;ss;+nG)Buyz`Q4)aE^CKL~Xm|vxQq>sJSVO;ud5r7VFTw9qzk<04pvlq_Jkn+< z5h?q+h9)&SGw{@{fP3a1eC>=`jBf<9rzq|j`T}(-@>^~W?GZ<*uAnyzo_{~E{B9_y zamuH9Ah397ErtF{hGKC@p`N!Xut3#i(}_)f4*1AyOLICUcck?RamQNNI#G3){2YL) zJf*rJT3-{bY|tVPtmL@;=fflQY+T)n-IUAFw+{}>{I&lR#65K}4!t~cHNJMn%*Hne zvG)7%_0$~rL_I!pADk$qBSXR*EvEf89(H85@zaCEWaXe!f)<~RAOJL{uL21UL`quV z$+m;-BmY3K!Ow{xxWr_1!o2Q zcuO|8Bjy%@jA&70vZ0G#DZ^!J97IyLlH~H@hD^^;q(?Dc104Wng>PnVreuX3qH`eCPXB{ z0z>bxQ09nDqSUSrQ>q%nDdFNac6@MaUT3eS!#@0iFiunA3S}q?$7vxCs>T^8LOsHB z%gr#%0qS(n*DrVB25Kk~KkPGzWc@q?H8{^IO`j+=6P>*cpLBsf(w1i`zLthhFnXg1 zo%3*I8#~JK00pmnZulfJ4kkm$@Ck0JcM4MBVkW~U#0wb-=|!*%213SUN7~=m0SFjA ziAYu0FA(EyuPAP(M2;K$e8?>~%R*QQLl-D=+MM)1ZeaPhj%&h3b2KPT91{Emfbg9G zjeusMJUtP|T$TTkdKkJ{yBGVGUGXrJIGs2vj2h&rct7aDSC!%hr8KTVl$290cN zr;MXK<&%&l7-;6yjZij}L_=5Yz&QKK{v=IAj|1mpidiRO+(44n+ z>nmIBlJC&wjASb{mY1~HprZM(frN>6tS6Bb*oczYky)1{knL!iyj_bRn&~iSfQVam z*Fb0zTuHPK#B|vo(0AH9X4P4n?%Hc@C~UH>F5YEcQ+&W$SG>x)wz%2aP|WH|8_W%* z_2%Z%m1ckG5_5NHw`qyD)wI&P%T(vBH#K-yns#|BOwHbIqu=W{vX!MRnua+YnrG$( zG+*7bOxtwND(&XEYqe|UZq^={yH^`1YteQV2DHlx+jML1+NIxk7ar}Hz2C5W_LGL! zit3atMaqt%-&x-)dS3rgQPBQr(PrxxMGx4%E?N|Kyr|Q5vgjGzeZ>Lg!Qx}eM(nVy zj#nOxjjbG^-2Cmlp!y=j*3WE|6+ut`R5u-^~BUL!0hdiXkjo;rxM7hR{-pafS1rQSJJh zND;R7$#vVcm<7(LO@0lF&0fl6(x5>Dudb+et$w1RT*uX$FgEUG%kMk+<^1DV9*1y&Y343!DX=bis@Qye7vT^ui73xQ$RZafgM>)$86g2hItlJmMOtZ0Rw{I36hx zN}2Hxvkp-l#ybq>K_MFkmxP1L>qu6jG{RXwINL&tRV$%X)91YF$n zgOvkwU%THy!!zQS#NGQ~%$u$EWcO!mCgPW_d~`H@aAb=OhJRbigJXY}_3fwXdoee7 z-$)y9U0{1Q$-Th;Vg8{h^vS-8v2?(H^uk+*zV&tQapZ~k?~W~QB0h6|Bm5y<1=ct8 zw{XC|=jr!K3DWJRX{Qnle)L)L_gFiRK zVk#SVCvXR$xpiniO|m@eKu3r6u^N7w3sm5h2)CjgHA*-& z{1^O&*2aWeLFu7=ky2hwkLr2|!sF4-=i?VL73Jrb{)N(0>8pek$`ks^YW%8Uzwozr z8l0XU#MVMjYQ-6x<^P2=h&Oe;ADNeHkVZWEtPyD}{~wi=EElz$=vQ^isDJ%K<VW4YJ z#e2{rdpxQMr;yfTIW%CUe%-3FfUaV0g}!a>3jMBmEA(@sMj|yXw$VU zXwdr?u-5Vp4Qni~(scfIg{Gx!t)^mOm9}dBD(#wi6}rZ`ZMx>NUHW=&S4@K!biHSF zc`>1R&p9wRbISrv8wQS6e6;dWlbx?VwG&&u@X|gP=`=rBSF=Nh5I&ExXZIg(#pZT+ z`US5n0}EJEPo`l`p(?T96*%B~3&NY86Q_AS7~kYh=vBo<-d;2F%?0`MN?9JZkV_fl zjr_t=ywXyHZ8mJUm120ER#-ffLcDWm+XF$p{={?+$sC&G*f;wn#M{#hE=NCo-}H2S z|74dw_1sUG*1o7r=^^4RuY{`AA6i7RXICxOkiV-M3(snK9=KnD<0Ut4`I7LW99^d(~x4z z2z(WjJG;Ou)A|^yj6zDQN7)24V=;d1mhrtn>kbbGrVN{IRf;Qx# z{_-$mNy#bGosY*;f`%dVI~k5)#;oL9tH0Zxo;E2G!L}WIKMqg!oNW` z=?@yK%bpsa+~;gdLfY{3(Wd0&vyE|Om}s_IPJf>{FG8N3W~<>1pW`cL zc3K=ptI2Lq5Hiw;a1=oTAgl&#UK>6tcYdTZC-6{L;4}Ng{5cSog361OCf_OwDwo4; zfuuBtp6vlY=Mfu}tATJ(IVq`d6jH9@;qV|=1`c4j1Kg&(tVtb?$0E-&Ta$+q!zOF2 zIo4`0#>Sa0B+hg;+b(9b>aKOY$5MvcQ+c5(28(5Y(r@@UM7Rv~<<3@}(K_mqz}|$= zs1Pv>Xl}s~7Yr77=%+`aY0_JWJXB%cRO|M)aF>8*!yP63{b;2a0fof-6gWKK-Ei9+ z5iXShz8t_Ixoe1KdO>988vJ6Q`A;pO}<8 z@#Vae`+}zA=`3hUn=X8s3^97eH*2h!_CEY`mi3&ZvyD!C;*DmbS)ZVH#rJ{BZb^x8 z(#K}ADmI%@{j~>vOw5~;KLeGL@1~&){ARfGXIz8dH2mH|otRz=O`bh%J_RcHy#>Ec zJWo!33x45O-ZNv^pvvT<9X(Z^Igh1o*IEZ#hvK+JvOUujXHFe@j@d3*F5fgq69w?iGV3<=?{hKYNskkYbE; zF$b#C8i}kHe4UTRKw;dEb#Fa}s3F)kBflBTeka^U)enu4p0?ERM{~5<4)G4w*UV6p z`|(TRG(VdmqtFuCj9W(ZYt59ugT*g`LVrZZIs`%j(ZP29YDtGyj8^EGR#G^0olEd* zxgfk;B8{dQA|x~h%zT;r&5^%XiC@bE`HSsIg0tKd#^>qY3UMBEty3Ys%XB&4SpMQiNqsalzEAae?b0X*~buX{)6;CCVwI2@$#*c<^D2b zyRf}x*&yOA*qSH$^vCnJ1>5H+cXOk}|Ev7nBY*eF-vjdZp!l`o7%Gc4eyt}(xD{LyeudmVHN(o39&U52hE0_109C_cM-+cWAKFsIpZkSpZu`r1 zdsmOorUnN8UkV%lY)T#A$WGF*f1-Vz*K}OJ8&Np}MEsu7uMO-W{|Mn9)X)Fq_@@UB z%)V6k7x^ZSc`XL<^jzKD zc^gsTIkQE)t?8sTVbba<+>46Jd0zN0etp|(Ls4)!e-ZwQ=bvx;@Yqw|XKxjLgZ|~4 z?jU+p2%xuO|2NmRRJDGX{ho&HM?15%YHjm;+C{Q2fZ`uEgJ>@8=8^{EL~e(?Sj#|$mI0s`bU zJ?|f*Pj-oxC8Hf38uH2Ob;FNn9ndV^1)=Y<59&T^rutYU(?6^{`RMT*-_3qN%YF^` zklF^%eA1s%8Kj=Z20kjD%nYe%9vATk@884~HdoNON&FT4Y5pAgy#mjG(%(5pZlk?L zcE!40@UQoR-y-}Wwb0wbUpc_W6-rm^68=#7?+O2XbH?X#`jBYpFT_8d1f@Um&7CZ_ zP0NPhnm75-#96Li%T|1cr;|lA|E9*kYZgBG&HXOyCtA5U*r3LvnXz1J*w1OE2tT>i zzd?g^tP1InpTpoeP#Sya&xlVh_77FRh5Q$V{gHHXFAqQ2$?4<}2V&`6MR?bSd8sD< zjl!?;OTf9m(Xq7Nc}9m(VL08p!s&4SW{3Tpzv3`Fni3x06#l5PUKGaRH1E@~)#wl8 zR{wJG{2I>z0yxa?bWAZA#!DfXPs08* z^0(?(GH_HnysSRgF@IM$3}7r5#z2>#eXIE*DJ}QwFpp01cL~4R<~hud;daDfG(6XC zqPc=_%=*xrxsv>LJ!_U_wVM2{a6G&}|Bo--#23B!h&3qp2+>T)W%Kd8B42UMSAT>! zjJHX-e0(PpQuA~sO4|G&}+Rf z^(hjgWC6~YMyw`tit!HYokW5b{pxQXX%wz1o?a#rx;k1wmI?~F+6^sRaPVAeRw5QK zV&$i*%lXQjz9=D55~#l-LTU}vK$SDGBFV?2t1NnPLTqBey#T?&F@?KMvuwa_6IaZj z)S!T;1cai7{8D2Ra?q>2Tveq0;-sJ|+>?aQOLBT~A+9QrBFd9rFcYVmJ+zADtpL?a zoI`V8Jdv~;yj4*0ctLgn)cjP9Go~Rk^91I+0yh*b?gs%Hrtzx!jT5 zUG8#ElDqs5Ng(_c5fl{-Y6v;hzMv5aT5DAx2^S3^g#>~U2_&(>5SzBxmnvFNtW>E| zMT-_SXez0uik2c^)Tq(k)!3#bO2mWvelxqzb9YHVlz#8`eg~J^zq7NmyR*Bqv$IQ< z&Md_>gaSHcz$Q89(PFN{1GZWOxmg?WHYh8W^Ru*9mqT??$g7ZQfl@Yq0p5l!DqTj$ z3q{I8Pw~Rr@XP&rK5oS<6p}#d;vRbS7j3UBE0zw1P=dP{#mG2+sZzqxi?rzZ3l|nw zK&Hn%6#}%yv{~ie%Kest!@D$>I$+44Fudm&;yqof{I#+QXMlG8mN zq4|kE$x@#Anpo@?y@<6Df{QkP7AV?;FS$d%va6BU^Z&ZaRDwzaCtGldQ3H6Vyz?-VU;LnI`$a&P&wMS$RpRM6mgoLBEp;238CdUeSs1Rvr#$N`ru!wf{#7Q6#P!Y zxB3j=*8<*vw&!(t=ikJ7Y8EUpBFUM2!s^idw*WuiR}J`C*thS;?>>Cn&!BHXZ%O}T z0zUPDB!Z89y^3EOzEEZUuJz!)8%m?rPemPeeTp#%S-=kbUjNp9BOS!Bc~=*#CR+yYtN2n(3?2DHpi604A-!X+=#9v=L=C z!aaq`gbbk(zt?~Ju?GnHC#+7{fKM@LfSV4PgcHBr`0A;@y(0|1mYv#VH=cpDLynOT zzO03R$KNoz5uMt)MgO`UWn@7XvJ=1b>}>xTjPuYj;{RB{@B0|-0NF|pe%sHW?Hk1! zg7>W&Kcr)4dPxI1=ppa^{QgKZJ#7TVTf~LIJpd-Wk*n()pE~FoIFvkd-_wf{By(TxU)m%xFn6GL=pr2`H!1hFF@d z5b6WB!bUHeVO^Be%l2>rvaJFK+g2fa8_mW2H{C4F+mK}%nTKt#JcE8M?ZWht4uP;T zQV+>K>Ia2NGX8{dRaEr>H$?qt89^^lsZ$`V;}@u4O^1zwD0>kN`laHJ2R&G*Q{X<6@{ z0{H$y1BK_t*vV>EUy)H^v_#)m13ypWX(;D3{wV&DO{#Q5+4?_QUuzjK? zceXTPGPbF(lT4XRXe#W|Nj#S97ST19Zds(asU~eek>SO34k{+cNG%5oMZuQirwW8k zA&`LVxdctPz^;yXwn@~8tpF9;a#T%aAGT9)-2|Q2c648Kp6Td57_+YzX<=_n7$CWb z+C*!R!RhF+2I?DL{ZyuJj2ds`c9Q2+_dAO3 zZ*b6P6}?0bl>oha)5~psP;v?{Q#Sx>+cjRGA~=N?Npjo=iBnMEy$nkRIvVa0UN*=i z`+MjZgk{~ZF^JKJG1!eKap=ZIuE|0V536j$9R%c;d1`CkL6ZoEq_XvAvFISHVYHIS zvuOsO8r|;@AnFmo8J$DFyCIqu=r#=F@r~i6u`Xe+imDIoO&E45ND1%NsCLWtAW)$Y34kot|n9W!0KK$^|kffc>E;6 zJ!1S}I!z-K$A(2GIb`(Mrov2$&X&DoEdBPrikGQhb$r33xo# zkdf_>aj^}wa0)F*256w^YG$(-TF7t1z=e`6XoXU#>OoXhMwLRHS_Ty4)H47*qDK&U zkY6@ewnp9HgD0%~Dao7=O7p~8B62;{6R^M~+pU83n1|DdOfn0m`m}eI_kP%W|9kG< z!?VqrtICE&!lBkf{)2CQ(DmM-2bV`490f>4@1|wnj}CDIudI~v1o4^^`1RySMshXRVUmiU%`M^rEF! zehasG`yBU(E~8=?k5he;H#8|n4`(5yVq?nwD>tRIf3GWL+kf??te@4M+B>T!b>HkAX*;gkpSI!Z{GzLbfvdl)0e(|&bHw#*X|x(KX>2o^@V-IYp>fFSASi5M#s#~r1jVJXKcJqX)N`} zHs0D6yX)3Iwg1*l>bBdu9qqSuI1b*n-r>EiC#L_l{V|PY9Wfirw#Mu#TOZ>s^V|E& zdh8n)ciOit?yxJpa~mVJm3Bw8Ea;2yUfW`9FYPgQTw8DIp5rz3U9)f4`fGMYZZFsz z)p2#Lx%aAWbK_NQmTj}QTH9weMtA*JPjvl%b=ca9x7l01*J}4(zBy*!74?qp%e{`q z%iGlrmqWNZ_o;}kLc^DZ2UAZJew}dFya$~3%=>)UFXnYcJ~;1j+pp(!#6L0bL&vl8 zejoMXyx$vNo%iFEH|Fgec3@t>^8UPMqd%Q@-1v`qe==^k4ssTJ!_08?gZ-WKvJ%a9 z;g^+Qi0Vhs>3sRV$6v2GOoy&)DNERwc=+SjzW)jdJU9!V>HP7puNE<>HWBw0GYd>OO`m4@d&@ZRxI6hLS}TAl+Rw{+GRH(cY~c#XR08r$}3 zR<&G%!ZoW}wQ%piY(zJ_DzQkK3qMrMq4HN+zDTpGB~;3V{&+r{#o`pCDNZ#XplyCq z4Rc}I3+FfZ3~QMhKgmB_za|#B80zQHBBWL=+NVI-P`YtaCXnGPc+pQ6n&bUbaF)p4 z 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

o%#5O`FuB%1vN6 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

21`jl3uove66b!k*CSmKp_vDKg<%Yw5} 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

4Rmv8r(@P;X{t9PI9_WT{>*}H7@jPgyDgF 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 v8wcc78aZxcu#wwFW*a$eWPHBzadpe` diff --git a/new/_OpenBSD_/Host/Mod/Console.odc b/new/_OpenBSD_/Host/Mod/Console.odc index 74fe243379e4611ae4270cecc0e610cea1c43af7..2c44d6c7e78ca06bdb47f823db4a70e8ba54c55f 100644 GIT binary patch delta 65 zcmX@Faam(RJ>!Lm4RM@u!VC>9+<4lXwP{{fPsM@D0FCYDdSnj2b-Ol Vjxlo>8JJio=qea)=4Er@0|0)v5zhbs delta 61 zcmcbtab9CWJ>!{)4RM@O!VC>?wPF1XwP{}fPsM@D70^KDdSnjJDZ)E Rjxn= 0) & (fLen = 0) & (tLen >= 0) THEN to[0] := 0X - ELSE s[0] := 0X - END - ELSE s[0] := 0X - END - ELSE - i := 0; - WHILE (ss[i] > 0X) & (ss[i] < 80X) DO s[i] := ss[i]; INC(i) END; - IF ss[i] = 0X THEN s[i] := 0X - ELSE s[0] := 0X - END - END - ELSE s[0] := 0X - END - ELSE s[0] := 0X - END - END ReadLn; - - PROCEDURE Printf (IN s: ARRAY OF CHAR; len: INTEGER); - CONST - maxShortCharsPerChar = 4; - ssLen = 128; (* >= maxShortCharsPerChar + 1 *) - VAR - ss: ARRAY ssLen OF SHORTCHAR; - fR, fLen, tW, tLen, n: INTEGER; - res: INTEGER; - res1: Iconv.size_t; - from: Iconv.PtrLSTR; to: Iconv.PtrSTR; - BEGIN - fR := 0; from := s; - WHILE len > 0 DO - tW := 0; to := ss; - IF e # -1 THEN - tLen := LEN(ss) - 1; - n := MIN(len, tLen DIV maxShortCharsPerChar); - fLen := n * SIZE(CHAR) (* 2 *); - REPEAT - res1 := Iconv.iconv_encode(e, from, fLen, to, tLen); - IF ~((res1 >= 0) & (fLen = 0) & (tLen >= 0)) THEN - ASSERT(tLen >= 0, 100); - ASSERT(fLen >= SIZE(CHAR), 101); - ASSERT(ResetCodec(e), 102); - to[0] := defCh; to := SYSTEM.VAL(Iconv.PtrSTR, SYSTEM.VAL(INTEGER, to) + 1); - DEC(tLen); - from := SYSTEM.VAL(Iconv.PtrLSTR, SYSTEM.VAL(INTEGER, from) + SIZE(CHAR)); - DEC(fLen, SIZE(CHAR)) - END - UNTIL fLen = 0; - to[0] := 0X - ELSE - fLen := MIN(len, LEN(ss) - 1); n := fLen; - WHILE fLen > 0 DO - IF s[fR] < 80X THEN ss[tW] := SHORT(s[fR]) - ELSE ss[tW] := defCh - END; - INC(tW); - INC(fR); DEC(fLen) - END; - ss[tW] := 0X - END; - res := Libc.printf(ss); - res := Libc.fflush(Libc.NULL); - - len := len - n - END - END Printf; - - PROCEDURE (cons: Cons) WriteChar (c: CHAR); - VAR s: ARRAY 1 OF CHAR; - BEGIN - s[0] := c; - Printf(s, 1) - END WriteChar; - - PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR); - BEGIN - Printf(text, LEN(text$)) - END WriteStr; - - PROCEDURE (cons: Cons) WriteLn; - BEGIN - Printf(0AX, 1) - END WriteLn; - - PROCEDURE Init; - BEGIN - IF Kernel.littleEndian THEN - e := Iconv.iconv_open(HostLang.enc, "UCS-2LE"); - d := Iconv.iconv_open("UCS-2LE", HostLang.enc) - ELSE - e := Iconv.iconv_open(HostLang.enc, "UCS-2BE"); - d := Iconv.iconv_open("UCS-2BE", HostLang.enc) - END; - - NEW(cons); - Console.SetConsole(cons) - END Init; - - PROCEDURE Close; - VAR res: INTEGER; - BEGIN - IF e # -1 THEN res := Iconv.iconv_close(e); e := -1 END; - IF d # -1 THEN res := Iconv.iconv_close(d); d := -1 END - END Close; - -BEGIN - Init -CLOSE - Close -END HostConsole. diff --git a/new/_OpenBSD_/Host/Mod/Dates.txt b/new/_OpenBSD_/Host/Mod/Dates.txt deleted file mode 100644 index 1246d0a..0000000 --- a/new/_OpenBSD_/Host/Mod/Dates.txt +++ /dev/null @@ -1,92 +0,0 @@ -MODULE HostDates; - - (* THIS IS TEXT COPY OF Dates.odc *) - (* DO NOT EDIT *) - - IMPORT - SYSTEM, LinLibc, Dates; - - (* Dates Hook *) - - TYPE - DatesHook = POINTER TO RECORD (Dates.Hook) END; - - (* - - Some conversions are needed between the Linux and the BlackBox representations of dates. The following - table shows the differences: - -(!) Linux BlackBox - year from year 1900 from year 0000 - month range 0-11 range 1-12 - weekday 0:sunday - 6:satruday 0:monday - 6:sunday - (!) *) - - PROCEDURE (h: DatesHook) DateToString (d: Dates.Date; format: INTEGER; OUT str: ARRAY OF CHAR); - VAR tm: LinLibc.tmDesc; sstr: ARRAY 64 OF SHORTCHAR; res: LinLibc.size_t; - BEGIN - ASSERT(format IN {Dates.short, Dates.abbreviated, Dates.long, Dates.plainAbbreviated, Dates.plainLong}, 20); - tm.tm_year := d.year - 1900; (* Linux counts years from 1900 but BlackBox from 0000 *) - tm.tm_mon := d.month - 1; tm.tm_mday := d.day; - tm.tm_wday := (Dates.DayOfWeek(d) + 1) MOD 7; - IF format = Dates.short THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%x", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSIF format = Dates.abbreviated THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%a, %b %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSIF format = Dates.long THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%A, %B %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSIF format = Dates.plainAbbreviated THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%b %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSE (* format = Dates.plainLong *) - res := LinLibc.strftime(sstr, LEN(sstr), "%B %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - END; - IF res > 0 THEN str := sstr$ELSE str := "invalid date" END - END DateToString; - - PROCEDURE (h: DatesHook) GetTime (OUT d: Dates.Date; OUT t: Dates.Time); - VAR time: LinLibc.time_t; tm: LinLibc.tm; - BEGIN - time := LinLibc.time(NIL); - tm := LinLibc.localtime(time); - d.year := tm.tm_year + 1900; (* Linux counts years from 1900 but BlackBox from 0000 *) - d.month := tm.tm_mon + 1; d.day := tm.tm_mday; - t.hour := tm.tm_hour; t.minute := tm.tm_min; t.second := tm.tm_sec - END GetTime; - - PROCEDURE (h: DatesHook) GetUTCBias (OUT bias: INTEGER); - VAR time: LinLibc.time_t; tm: LinLibc.tm; - BEGIN - time := LinLibc.time(NIL); - tm := LinLibc.localtime(time); (* call to localtime needed to make sure that timezone is set *) - bias := tm.tm_gmtoff DIV 60; (* Shiryaev A. V.: OpenBSD *) - END GetUTCBias; - - PROCEDURE (h: DatesHook) GetUTCTime (OUT d: Dates.Date; OUT t: Dates.Time); - VAR time: LinLibc.time_t; tm: LinLibc.tm; - BEGIN - time := LinLibc.time(NIL); - tm := LinLibc.gmtime(time); - d.year := tm.tm_year + 1900; (* Linux counts years from 1900 but BlackBox from 0000 *) - d.month := tm.tm_mon + 1; d.day := tm.tm_mday; - t.hour := tm.tm_hour; t.minute := tm.tm_min; t.second := tm.tm_sec - END GetUTCTime; - - PROCEDURE (h: DatesHook) TimeToString (t: Dates.Time; OUT str: ARRAY OF CHAR); - VAR tm: LinLibc.tmDesc; sstr: ARRAY 64 OF SHORTCHAR; res: LinLibc.size_t; - BEGIN - tm.tm_hour := t.hour; tm.tm_min := t.minute; tm.tm_sec := t.second; - res := LinLibc.strftime(sstr, LEN(sstr), "%X", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))); - IF res > 0 THEN str := sstr$ELSE str := "invalid time" END - END TimeToString; - - - PROCEDURE Init; - VAR - datesHook: DatesHook; - BEGIN - NEW(datesHook); Dates.SetHook(datesHook); - END Init; - -BEGIN - Init -END HostDates. diff --git a/new/_OpenBSD_/Host/Mod/Files.txt b/new/_OpenBSD_/Host/Mod/Files.txt deleted file mode 100644 index e4baa8d..0000000 --- a/new/_OpenBSD_/Host/Mod/Files.txt +++ /dev/null @@ -1,1501 +0,0 @@ -MODULE HostFiles; - - (* THIS IS TEXT COPY OF Files.odc *) - (* DO NOT EDIT *) - - (* - A. V. Shiryaev, 2012.11: filenames encoding translation implemented - *) - - IMPORT SYSTEM, Kernel, Files, LinLibc, Iconv := LinIconv; - - CONST - tempName = "odcxxxxx"; - docType = "odc"; - - serverVersion = TRUE; - - pathLen* = 260; - - nofbufs = 4; (* max number of buffers per file *) - bufsize = 2 * 1024; (* size of each buffer *) - - invalid = LinLibc.NULL; - - temp = 0; new = 1; shared = 2; hidden = 3; exclusive = 4; closed = 5; (* file states *) - create = -1; - - ok = 0; - invalidName = 1; - invalidNameErr = MAX(INTEGER); (* On Windows this is 123 *) - notFound = 2; - fileNotFoundErr = LinLibc.ENOENT; - pathNotFoundErr = LinLibc.ENOENT; - existsAlready = 3; - fileExistsErr = LinLibc.EEXIST; - alreadyExistsErr = LinLibc.EEXIST; (* is alreadyExistsErr needed? *) - writeProtected = 4; - writeProtectedErr = LinLibc.EACCES; - ioError = 5; (* same as LinLibc.EIO *) - accessDenied = 6; - accessDeniedErr = LinLibc.EACCES; - sharingErr = LinLibc.EACCES; - netAccessDeniedErr = LinLibc.EACCES; - notEnoughMem = 80; - notEnoughMemoryErr = LinLibc.ENOMEM; - notEnoughDisk = 81; - diskFullErr = LinLibc.EDQUOT; - tooManyOpenFilesErr = LinLibc.EMFILE; - - noMoreFilesErr = 18; - - cancel = -8; retry = -9; - - TYPE - FullName* = ARRAY pathLen OF CHAR; - - Locator* = POINTER TO RECORD (Files.Locator) - path-: FullName; (* without trailing "/" *) - maxLen-: INTEGER; (* maximum name length *) - caseSens-: BOOLEAN; (* case sensitive file compares *) - rootLen-: INTEGER (* for network version *) - END; - - Buffer = POINTER TO RECORD - dirty: BOOLEAN; - org, len: INTEGER; - data: ARRAY bufsize OF BYTE - END; - - File = POINTER TO RECORD (Files.File) - state: INTEGER; - name: FullName; - ref: LinLibc.PtrFILE; - loc: Locator; - swapper: INTEGER; (* index into file table / next buffer to swap *) - len: INTEGER; - bufs: ARRAY nofbufs OF Buffer; - t: LONGINT (* time stamp of last file operation *) - END; - - Reader = POINTER TO RECORD (Files.Reader) - base: File; - org, offset: INTEGER; - buf: Buffer - END; - - Writer = POINTER TO RECORD (Files.Writer) - base: File; - org, offset: INTEGER; - buf: Buffer - END; - - Directory = POINTER TO RECORD (Files.Directory) - temp, startup: Locator - END; - - Identifier = RECORD (Kernel.Identifier) - name: FullName - END; - - Searcher = RECORD (Kernel.Identifier) - t0: INTEGER; - f: File - END; - - Counter = RECORD (Kernel.Identifier) - count: INTEGER - END; - - ShortName = ARRAY pathLen * 4 OF SHORTCHAR; - - Encoding = ARRAY 32 OF SHORTCHAR; - - VAR - MapParamString*: PROCEDURE(in, p0, p1, p2: ARRAY OF CHAR; OUT out: ARRAY OF CHAR); - dir: Directory; - wildcard: Files.Type; - startupDir: FullName; - startupLen: INTEGER; - res: INTEGER; - e, d: Iconv.iconv_t; - - (* debugging functions *) - - PROCEDURE Msg (IN str: ARRAY OF CHAR); - VAR ss: ARRAY 1024 OF SHORTCHAR; res, l: INTEGER; - BEGIN - ss := SHORT(str); - l := LEN(ss$); - ss[l] := 0AX; ss[l + 1] := 0X; - res := LinLibc.printf(ss); - res := LinLibc.fflush(0) - END Msg; - - PROCEDURE Int (x: LONGINT); - VAR j, k: INTEGER; ch: CHAR; a, s: ARRAY 32 OF CHAR; - BEGIN - IF x # MIN(LONGINT) THEN - IF x < 0 THEN s[0] := "-"; k := 1; x := -x ELSE k := 0 END; - j := 0; REPEAT a[j] := CHR(x MOD 10 + ORD("0")); x := x DIV 10; INC(j) UNTIL x = 0 - ELSE - a := "8085774586302733229"; s[0] := "-"; k := 1; - j := 0; WHILE a[j] # 0X DO INC(j) END - END; - ASSERT(k + j < LEN(s), 20); - REPEAT DEC(j); ch := a[j]; s[k] := ch; INC(k) UNTIL j = 0; - s[k] := 0X; - Msg(s); - END Int; - - (* end of debugging functions *) - - (* encoding translation *) - - PROCEDURE GetEnc (OUT enc: Encoding; OUT ok: BOOLEAN); - VAR env: LinLibc.PtrSTR; - i, j: INTEGER; - - PROCEDURE IsSLetter (c: SHORTCHAR): BOOLEAN; - BEGIN - RETURN (c >= 'a') & (c <= 'z') - END IsSLetter; - - PROCEDURE IsBLetter (c: SHORTCHAR): BOOLEAN; - BEGIN - RETURN (c >= 'A') & (c <= 'Z') - END IsBLetter; - - PROCEDURE IsValidEncChar (x: SHORTCHAR): BOOLEAN; - BEGIN - RETURN ((x >= 'A') & (x <= 'Z')) OR ((x >= '0') & (x <= '9')) OR (x = '-') OR (x = '_') - OR ((x >= 'a') & (x <= 'z')) - END IsValidEncChar; - - BEGIN - env := LinLibc.getenv("LANG"); - IF env # NIL THEN - IF env$ = "C" THEN - enc := "ASCII"; ok := TRUE - ELSE - IF IsSLetter(env[0]) & IsSLetter(env[1]) & (env[2] = '_') - & IsBLetter(env[3]) & IsBLetter(env[4]) & (env[5] = '.') THEN - i := 6; j := 0; - WHILE IsValidEncChar(env[i]) & (j < LEN(enc) - 1) DO - enc[j] := env[i]; - INC(j); INC(i) - END; - IF (env[i] = 0X) & (j < LEN(enc)) THEN - enc[j] := 0X; ok := TRUE - ELSE ok := FALSE - END - ELSE ok := FALSE - END - END - ELSE ok := FALSE - END - END GetEnc; - - PROCEDURE InitConv; - VAR enc: Encoding; ok: BOOLEAN; - BEGIN - GetEnc(enc, ok); - IF ok THEN - IF Kernel.littleEndian THEN - e := Iconv.iconv_open(enc, "UCS-2LE"); - d := Iconv.iconv_open("UCS-2LE", enc) - ELSE - e := Iconv.iconv_open(enc, "UCS-2BE"); - d := Iconv.iconv_open("UCS-2BE", enc) - END - ELSE e := -1; d := -1 - END - END InitConv; - - PROCEDURE CloseConv; - VAR res: INTEGER; - BEGIN - IF e # -1 THEN res := Iconv.iconv_close(e); e := -1 END; - IF d # -1 THEN res := Iconv.iconv_close(d); d := -1 END - END CloseConv; - - PROCEDURE ResetCodec (c: Iconv.iconv_t): BOOLEAN; - VAR res, fLen, tLen: Iconv.size_t; - BEGIN - ASSERT(c # -1, 20); - fLen := 0; tLen := 0; - res := Iconv.iconv(c, NIL, fLen, NIL, tLen); - RETURN res # -1 - END ResetCodec; - - PROCEDURE Short (IN f: FullName; OUT t: ShortName; OUT ok: BOOLEAN); - VAR fR, fLen, tLen: INTEGER; - from: Iconv.PtrLSTR; to: Iconv.PtrSTR; res: Iconv.size_t; - BEGIN - (* do not use encoder for basic set of chars *) - fR := 0; WHILE (f[fR] >= ' ') & (f[fR] <= '~') DO t[fR] := SHORT(f[fR]); INC(fR) END; - IF f[fR] = 0X THEN t[fR] := 0X; ok := TRUE - ELSIF (e # -1) & ResetCodec(e) THEN - from := f; to := t; fLen := LEN(f$) * SIZE(CHAR) (* 2 *); tLen := LEN(t) - 1; - res := Iconv.iconv_encode(e, from, fLen, to, tLen); - IF (res >= 0) & (fLen = 0) & (tLen >= 0) THEN to[0] := 0X; ok := TRUE - ELSE t[0] := 0X; ok := FALSE - END - ELSE t[0] := 0X; ok := FALSE - END - END Short; - - PROCEDURE Long (IN f: ShortName; OUT t: FullName; OUT ok: BOOLEAN); - VAR fR, fLen, tLen: INTEGER; - from: Iconv.PtrSTR; to: Iconv.PtrLSTR; res: Iconv.size_t; - BEGIN - (* do not use decoder for basic set of chars *) - fR := 0; WHILE (f[fR] >= ' ') & (f[fR] <= '~') & (fR < LEN(t) - 1) DO t[fR] := f[fR]; INC(fR) END; - IF f[fR] = 0X THEN - IF fR < LEN(t) THEN t[fR] := 0X; ok := TRUE - ELSE t[0] := 0X; ok := FALSE (* f is too long *) - END - ELSIF (d # -1) & ResetCodec(d) THEN - from := f; to := t; fLen := LEN(f$); tLen := (LEN(t) - 1) * SIZE(CHAR) (* 2 *); - res := Iconv.iconv_decode(d, from, fLen, to, tLen); - IF (res >= 0) & (fLen = 0) & (tLen >= 0) THEN to[0] := 0X; ok := TRUE - ELSE t[0] := 0X; ok := FALSE - END - ELSE t[0] := 0X; ok := FALSE - END - END Long; - - (* end of encoding translation *) - - - (* get error num from linux *) - PROCEDURE LinLibc_errno (): INTEGER; - VAR - addr, errno: INTEGER; - BEGIN - addr := LinLibc.__errno_location(); - SYSTEM.GET(addr, errno); - RETURN errno - END LinLibc_errno; - - PROCEDURE Error (n: INTEGER): INTEGER; - VAR res: INTEGER; - BEGIN - IF n = ok THEN res := ok - ELSIF n = invalidNameErr THEN res := invalidName - ELSIF (n = fileNotFoundErr) OR (n = pathNotFoundErr) THEN res := notFound - ELSIF (n = fileExistsErr) OR (n = alreadyExistsErr) THEN res := existsAlready - ELSIF n = writeProtectedErr THEN res := writeProtected - ELSIF (n = sharingErr) OR (n = accessDeniedErr) OR (n = netAccessDeniedErr) THEN res := accessDenied - ELSIF n = notEnoughMemoryErr THEN res := notEnoughMem - ELSIF (n = diskFullErr) OR (n = tooManyOpenFilesErr) THEN res := notEnoughDisk - ELSE res := -n - END; - RETURN res - END Error; - - PROCEDURE Diff (IN a, b: ARRAY OF CHAR; caseSens: BOOLEAN): INTEGER; - VAR i: INTEGER; cha, chb: CHAR; - BEGIN - i := 0; - REPEAT - cha := a[i]; chb := b[i]; INC(i); - IF cha # chb THEN - IF ~caseSens THEN - IF (cha >= "a") & ((cha <= "z") OR (cha >= 0E0X) & (cha <= 0FEX) & (cha # 0F7X)) THEN - cha := CAP(cha) - END; - IF (chb >= "a") & ((chb <= "z") OR (chb >= 0E0X) & (chb <= 0FEX) & (chb # 0F7X)) THEN - chb := CAP(chb) - END - END; - IF cha = "\" THEN cha := "/" END; - IF chb = "\" THEN chb := "/" END; - IF cha # chb THEN RETURN ORD(cha) - ORD(chb) END - END - UNTIL cha = 0X; - RETURN 0 - END Diff; - - PROCEDURE Stat (IN fname: FullName; VAR buf: LinLibc.stat_t; OUT res: INTEGER); - VAR s: ShortName; ok1: BOOLEAN; - BEGIN - Short(fname, s, ok1); - res := LinLibc.stat(s, buf); (* Shiryaev A. V.: OpenBSD *) - END Stat; - - PROCEDURE ModeToAttr (mode: SET; OUT attr: SET; OUT isDir: BOOLEAN); - CONST read = 8; write = 7; execute = 6; file = 15; (* bits for permissions for the current user (see man chmod) *) - BEGIN - attr := {}; - IF ~(write IN mode) THEN INCL(attr, Files.readOnly) END; - isDir := ~(file IN mode) (* see "man 2 stat" for details *) - END ModeToAttr; - - PROCEDURE NewLocator* (IN fname: ARRAY OF CHAR): Locator; - VAR loc: Locator; i: INTEGER; - BEGIN - NEW(loc); loc.path := fname$; i := 0; - WHILE loc.path[i] # 0X DO INC(i) END; - IF (loc.path[i-1] = "/") OR (loc.path[i-1] = "\") THEN loc.path[i-1] := 0X END; - loc.maxLen := LinLibc.NAME_MAX; loc.caseSens := TRUE; - RETURN loc - END NewLocator; - - PROCEDURE GetType (IN name: ARRAY OF CHAR; VAR type: Files.Type); - VAR i, j: INTEGER; ch: CHAR; - BEGIN - i := 0; j := 0; - WHILE name[i] # 0X DO INC(i) END; - WHILE (i > 0) & (name[i] # ".") DO DEC(i) END; - IF i > 0 THEN - INC(i); ch := name[i]; - WHILE (j < LEN(type) - 1) & (ch # 0X) DO - IF (ch >= "A") & (ch <= "Z") THEN ch := CHR(ORD(ch) + (ORD("a") - ORD("A"))) END; - type[j] := ch; INC(j); - INC(i); ch := name[i] - END - END; - type[j] := 0X - END GetType; - - PROCEDURE Append (IN path, name: ARRAY OF CHAR; type: Files.Type; max: INTEGER; - VAR res: ARRAY OF CHAR - ); - VAR i, j, n, m, dot: INTEGER; ch: CHAR; - BEGIN - i := 0; - WHILE path[i] # 0X DO res[i] := path[i]; INC(i) END; - IF path # "" THEN - ASSERT((res[i-1] # "/") & (res[i-1] # "\"), 100); - res[i] := "/"; INC(i) - END; - j := 0; ch := name[0]; n := 0; m := max; dot := -1; - IF max = 12 THEN m := 8 END; - WHILE (i < LEN(res) - 1) & (ch # 0X) DO - IF (ch = "/") OR (ch = "\") THEN - res[i] := ch; INC(i); n := 0; m := max; dot := -1; - IF max = 12 THEN m := 8 END - ELSIF (n < m) OR (ch = ".") & (n = 8) THEN - res[i] := ch; INC(i); INC(n); - IF ch = "." THEN dot := n; - IF max = 12 THEN m := n + 3 END - END - END; - INC(j); ch := name[j] - END; - IF (dot = -1) & (type # "") THEN - IF max = 12 THEN m := n + 4 END; - IF (n < m) & (i < LEN(res) - 1) THEN res[i] := "."; INC(i); INC(n); dot := n END - END; - IF n = dot THEN j := 0; - WHILE (n < m) & (i < LEN(res) - 1) & (type[j] # 0X) DO res[i] := type[j]; INC(i); INC(j) END - END; - res[i] := 0X - END Append; - - PROCEDURE CloseFileHandle (f: File; VAR res: INTEGER); - BEGIN - IF (f.ref = invalid) OR (LinLibc.fclose(f.ref) = 0) THEN res := ok (* !!! *) - ELSE res := LinLibc_errno() - END; - f.ref := invalid - END CloseFileHandle; - - PROCEDURE CloseFile (f: File; VAR res: INTEGER); - VAR s: INTEGER; n: ShortName; ok1: BOOLEAN; - BEGIN - IF f.state = exclusive THEN - f.Flush; - res := LinLibc.fflush(f.ref) - END; - s := f.state; f.state := closed; - CloseFileHandle (f, res); - IF (s IN {temp, new, hidden}) & (f.name # "") THEN - Short(f.name, n, ok1); - res := LinLibc.remove(n) - END - END CloseFile; - - PROCEDURE (f: File) FINALIZE; - VAR res: INTEGER; - BEGIN - IF f.state # closed THEN CloseFile(f, res) END - END FINALIZE; - - PROCEDURE (VAR id: Identifier) Identified (): BOOLEAN; - VAR f: File; - BEGIN - f := id.obj(File); - RETURN (f.state IN {shared, exclusive}) & (Diff(f.name, id.name, f.loc.caseSens) = 0) - END Identified; - - PROCEDURE ThisFile (IN name: FullName): File; - VAR id: Identifier; p: ANYPTR; - BEGIN - id.typ := SYSTEM.TYP(File); id.name := name$; - p := Kernel.ThisFinObj(id); - IF p # NIL THEN RETURN p(File) - ELSE RETURN NIL - END - END ThisFile; - - PROCEDURE (VAR s: Searcher) Identified (): BOOLEAN; - VAR f: File; - BEGIN - f := s.obj(File); - IF (f.ref # invalid) & ((s.f = NIL) OR (f.t < s.f.t)) THEN s.f := f END; - RETURN FALSE - END Identified; - - PROCEDURE SearchFileToClose; - VAR s: Searcher; p: ANYPTR; (* res: LONGINT; *) - BEGIN - s.typ := SYSTEM.TYP(File); s.f := NIL; - p := Kernel.ThisFinObj(s); - IF s.f # NIL THEN - res := LinLibc.fclose(s.f.ref); s.f.ref := invalid; - IF res = 0 THEN res := LinLibc_errno(); HALT(100) END - END - END SearchFileToClose; - - PROCEDURE ExistingFile (VAR n: ShortName): BOOLEAN; - VAR f: LinLibc.PtrFILE; ret: BOOLEAN; res: INTEGER; - BEGIN - f := LinLibc.fopen(n, "r"); - IF f # LinLibc.NULL THEN - res := LinLibc.fclose(f); - ret := TRUE - ELSE - ret := FALSE - END; - RETURN ret - END ExistingFile; - - PROCEDURE MoveFile (VAR old, new: ShortName; VAR res: INTEGER); (* as the WinApi.MoveFile *) - BEGIN - IF ExistingFile(new) THEN - res := fileExistsErr - ELSE - IF LinLibc.rename(old, new) = 0 THEN res := ok - ELSE res := LinLibc_errno(); - END - END - END MoveFile; - - PROCEDURE NewFileRef (state: INTEGER; VAR name: FullName; VAR ref, res: INTEGER); - VAR n: ShortName; ok1: BOOLEAN; - BEGIN - Short(name, n, ok1); - IF state = create THEN (* Create should fail if file already exists *) - IF ExistingFile(n) THEN - ref := invalid; res := fileExistsErr - ELSE - ref := LinLibc.fopen(n, "w+"); - IF ref = invalid THEN res := LinLibc_errno() ELSE res := ok END - END - ELSIF state = shared THEN - ref := LinLibc.fopen(n, "r"); - IF ref = invalid THEN res := LinLibc_errno() ELSE res := ok END - ELSE - ref := LinLibc.fopen(n, "r+"); - IF ref = invalid THEN res := LinLibc_errno() ELSE res := ok END - END - END NewFileRef; - - PROCEDURE OpenFile (state: INTEGER; VAR name: FullName; VAR ref, res: INTEGER); - BEGIN - NewFileRef(state, name, ref, res); - IF ref = invalid THEN - IF res = tooManyOpenFilesErr THEN - Kernel.Collect; - NewFileRef(state, name, ref, res); - IF ref = invalid THEN - res := LinLibc_errno(); - IF res = tooManyOpenFilesErr THEN - SearchFileToClose; - NewFileRef(state, name, ref, res); - END - ELSE res := ok - END - END - ELSE res := ok - END - END OpenFile; - - PROCEDURE GetTempFileName (IN path: FullName; OUT name: FullName; num: INTEGER); - VAR i: INTEGER; str: ARRAY 16 OF CHAR; - BEGIN - str := tempName; i := 7; - WHILE i > 2 DO - str[i] := CHR(num MOD 10 + ORD("0")); DEC(i); num := num DIV 10 - END; - Append(path, str, "", 8, name) - END GetTempFileName; - - PROCEDURE CreateFile (f: File; VAR res: INTEGER); - VAR num, n: INTEGER; - BEGIN - IF f.name = "" THEN - num := LinLibc.clock(); n := 200; - REPEAT - GetTempFileName(f.loc.path, f.name, num); INC(num); DEC(n); - OpenFile(create, f.name, f.ref, res) - UNTIL (res # fileExistsErr) OR (n = 0) - ELSE - OpenFile(f.state, f.name, f.ref, res) - END - END CreateFile; - - PROCEDURE Delete (IN fname, path: FullName; VAR res: INTEGER); - VAR num, n: INTEGER; f: File; new: FullName; attr: SET; fn, nn: ShortName; buf: LinLibc.stat_t; isDir: BOOLEAN; - ok1: BOOLEAN; - BEGIN - ASSERT(fname # "", 100); - f := ThisFile(fname); Short(fname, fn, ok1); - IF f = NIL THEN - IF LinLibc.remove(fn) = 0 THEN - res := ok - ELSE - res := LinLibc.fflush(0); - IF LinLibc.remove(fn) = 0 THEN res := ok ELSE res := LinLibc_errno() END - END - ELSE (* still in use => make it anonymous *) - IF f.ref # invalid THEN res := LinLibc.fclose(f.ref); f.ref := invalid END; (* !!! *) - Stat(f.name, buf, res); - ModeToAttr(buf.st_mode, attr, isDir); - IF (res = ok) & ~(Files.readOnly IN attr) THEN - num := LinLibc.clock(); n := 200; - REPEAT - GetTempFileName(path, new, num); INC(num); DEC(n); - Short(new, nn, ok1); - MoveFile(fn, nn, res); - UNTIL (res # fileExistsErr) OR (n = 0); - IF res = ok THEN - f.state := hidden; f.name := new$ - END - ELSE - res := writeProtectedErr - END - END - END Delete; - - PROCEDURE FlushBuffer (f: File; i: INTEGER); - VAR buf: Buffer; res: INTEGER; - BEGIN - buf := f.bufs[i]; - IF (buf # NIL) & buf.dirty THEN - IF f.ref = invalid THEN CreateFile(f, res) (* ASSERT(res = ok, 100) *) END; - IF f.ref # invalid THEN - res := LinLibc.fseek(f.ref, buf.org, LinLibc.SEEK_SET); - IF LinLibc.fwrite(SYSTEM.ADR(buf.data), 1, buf.len, f.ref) < buf.len THEN - res := LinLibc_errno(); HALT(101) - END; - res := LinLibc.fflush(f.ref); - buf.dirty := FALSE; f.t := Kernel.Time() - END - END - END FlushBuffer; - - (* File *) - - PROCEDURE (f: File) NewReader (old: Files.Reader): Files.Reader; - VAR r: Reader; - BEGIN (* portable *) - ASSERT(f.state # closed, 20); - IF (old # NIL) & (old IS Reader) THEN r := old(Reader) ELSE NEW(r) END; - IF r.base # f THEN - r.base := f; r.buf := NIL; r.SetPos(0) - END; - r.eof := FALSE; - RETURN r - END NewReader; - - PROCEDURE (f: File) NewWriter (old: Files.Writer): Files.Writer; - VAR w: Writer; - BEGIN (* portable *) - ASSERT(f.state # closed, 20); ASSERT(f.state # shared, 21); - IF (old # NIL) & (old IS Writer) THEN w := old(Writer) ELSE NEW(w) END; - IF w.base # f THEN - w.base := f; w.buf := NIL; w.SetPos(f.len) - END; - RETURN w - END NewWriter; - - PROCEDURE (f: File) Length (): INTEGER; - BEGIN (* portable *) - RETURN f.len - END Length; - - PROCEDURE (f: File) Flush; - VAR i: INTEGER; - BEGIN (* portable *) - i := 0; WHILE i # nofbufs DO FlushBuffer(f, i); INC(i) END - END Flush; - - PROCEDURE GetPath (IN fname: FullName; OUT path: FullName); - VAR i: INTEGER; - BEGIN - path := fname$; i := LEN(path$); - WHILE (i > 0) & (path[i] # "\") & (path[i] # "/") & (path[i-1] # ":") DO DEC(i) END; - path[i] := 0X - END GetPath; - - PROCEDURE CreateDir (VAR path: FullName; VAR res: INTEGER); - VAR (*sec: KERNEL32.SecurityAttributes;*) p: FullName; s: ShortName; ok1: BOOLEAN; - BEGIN - ASSERT(path # "", 100); - Short(path, s, ok1); - res := LinLibc.mkdir(s, {0..MAX(SET)}); (* full rights are masked with the umask, is this correct? *) - IF res # ok THEN - res := LinLibc_errno(); - IF (res = LinLibc.ENOTDIR) OR (res = LinLibc.ENOENT) THEN - GetPath(path, p); - CreateDir(p, res); (* recursive call *) - IF res = ok THEN - res := LinLibc.mkdir(s, {0..MAX(SET)}); (* full rights are masked with the umask, is this correct? *) - IF res # ok THEN res := LinLibc_errno() END - END - END - END - END CreateDir; - - PROCEDURE CheckPath (VAR path: FullName; ask: BOOLEAN; VAR res: INTEGER); - VAR s: ARRAY 300 OF CHAR; t: ARRAY 32 OF CHAR; - BEGIN - (*IF ask THEN - IF MapParamString # NIL THEN - MapParamString("#Host:CreateDir", path, "", "", s); - MapParamString("#Host:MissingDirectory", "", "", "", t) - ELSE - s := path$; t := "Missing Directory" - END; - res := Kernel.MessageBox(t, s, {Kernel.mbOk, Kernel.mbCancel}) - ELSE - res := Kernel.mbOk - END;*) - (*IF res = Kernel.mbOk THEN*) CreateDir(path, res) - (*ELSIF res = Kernel.mbCancel THEN res := cancel - END*) - END CheckPath; - - PROCEDURE CheckDelete (IN fname, path: FullName; ask: BOOLEAN; VAR res: INTEGER); - VAR s: ARRAY 300 OF CHAR; t: ARRAY 16 OF CHAR; - BEGIN - REPEAT - Delete(fname, path, res); - IF (res = writeProtectedErr) - OR (res = sharingErr) - OR (res = accessDeniedErr) - OR (res = netAccessDeniedErr) - THEN - (*IF ask THEN - IF MapParamString # NIL THEN - IF res = writeProtectedErr THEN - MapParamString("#Host:ReplaceWriteProtected", fname, 0DX, "", s) - ELSIF (res = accessDeniedErr) OR (res = netAccessDeniedErr) THEN - MapParamString("#Host:ReplaceAccessDenied", fname, 0DX, "", s) - ELSE - MapParamString("#Host:ReplaceInUse", fname, 0DX, "", s) - END; - MapParamString("#Host:FileError", "", "", "", t) - ELSE - s := fname$; t := "File Error" - END; - res := Kernel.MessageBox(t, s, {Kernel.mbRetry, Kernel.mbCancel}); - IF res = Kernel.mbCancel THEN res := cancel - ELSIF res = Kernel.mbRetry THEN res := retry - END - ELSE*) - res := cancel - (*END*) - ELSE - res := ok - END - UNTIL res # retry - END CheckDelete; - - PROCEDURE (f: File) Register (name: Files.Name; type: Files.Type; ask: BOOLEAN; OUT res: INTEGER); - VAR b: INTEGER; fname: FullName; fn, nn: ShortName; ok1: BOOLEAN; - BEGIN - ASSERT(f.state = new, 20); ASSERT(name # "", 21); - Append(f.loc.path, name, type, f.loc.maxLen, fname); - CheckDelete(fname, f.loc.path, ask, res); - ASSERT(res # 87, 100); - IF res = ok THEN - IF f.name = "" THEN - f.name := fname$; - OpenFile(create, f.name, f.ref, res); - IF res = ok THEN - f.state := exclusive; CloseFile(f, res); - Short(f.name, fn, ok1); - END - ELSE - f.state := exclusive; CloseFile(f, res); - Short(f.name, fn, ok1); Short(fname, nn, ok1); - MoveFile(fn, nn, res); - IF res = ok THEN - f.name := fname$; - Short(f.name, fn, ok1); - ELSE - ASSERT(res # 87, 101); - Short(f.name, fn, ok1); - b := LinLibc.remove(fn); - END - END - END; - res := Error(res) - END Register; - - PROCEDURE (f: File) Close; - VAR res: INTEGER; - BEGIN (* portable *) - IF f.state # closed THEN -(* - IF f.state = exclusive THEN - CloseFile(f, res) - ELSE - CloseFileHandle(f, res) - END -*) - CloseFile(f, res) - END - END Close; - - - (* Locator *) - - PROCEDURE (loc: Locator) This* (IN path: ARRAY OF CHAR): Locator; - VAR new: Locator; i: INTEGER; - BEGIN - IF path = "" THEN - NEW(new); new^ := loc^ - ELSIF path[0] = "/" THEN (* absolute path *) - new := NewLocator(path); - new.rootLen := 0 - ELSIF (path[0] = "\") OR (path[0] = "/") THEN - IF (path[1] = "\") OR (path[1] = "/") THEN (* network path *) - new := NewLocator(path); - new.rootLen := 0 - ELSE - NEW(new); new^ := dir.startup^; - new.res := invalidName; - RETURN new - END - ELSE - NEW(new); Append(loc.path, path, "", loc.maxLen, new.path); - i := 0; WHILE new.path[i] # 0X DO INC(i) END; - IF (new.path[i-1] = "/") OR (new.path[i-1] = "\") THEN new.path[i-1] := 0X END; - new.maxLen := loc.maxLen; - new.caseSens := loc.caseSens; - new.rootLen := loc.rootLen - END; - new.res := ok; - RETURN new - END This; - - (* Reader *) - - PROCEDURE (r: Reader) Base (): Files.File; - BEGIN (* portable *) - RETURN r.base - END Base; - - PROCEDURE (r: Reader) SetPos (pos: INTEGER); - VAR f: File; org, offset, i, count, res: INTEGER; buf: Buffer; - BEGIN - f := r.base; ASSERT(f # NIL, 20); ASSERT(f.state # closed, 25); - ASSERT(pos >= 0, 22); ASSERT(pos <= f.len, 21); - offset := pos MOD bufsize; org := pos - offset; - i := 0; WHILE (i # nofbufs) & (f.bufs[i] # NIL) & (org # f.bufs[i].org) DO INC(i) END; - IF i # nofbufs THEN - buf := f.bufs[i]; - IF buf = NIL THEN (* create new buffer *) - NEW(buf); f.bufs[i] := buf; buf.org := -1 - END - ELSE (* choose an existing buffer *) - f.swapper := (f.swapper + 1) MOD nofbufs; - FlushBuffer(f, f.swapper); buf := f.bufs[f.swapper]; buf.org := -1 - END; - IF buf.org # org THEN - IF org + bufsize > f.len THEN buf.len := f.len - org ELSE buf.len := bufsize END; - count := buf.len; - IF count > 0 THEN - IF f.ref = invalid THEN CreateFile(f, res) (* ASSERT(res = ok, 100) *) END; - IF f.ref # invalid THEN - IF LinLibc.fseek(f.ref, org, LinLibc.SEEK_SET) # 0 THEN - res := LinLibc_errno(); HALT(101) - END; - IF LinLibc.fread(SYSTEM.ADR(buf.data), 1, count, f.ref) < count THEN - res := LinLibc_errno(); HALT(102) - END; - f.t := Kernel.Time() - END - END; - buf.org := org; buf.dirty := FALSE - END; - r.buf := buf; r.org := org; r.offset := offset; r.eof := FALSE - (* 0<= r.org <= r.base.len *) - (* 0 <= r.offset < bufsize *) - (* 0 <= r.buf.len <= bufsize *) - (* r.offset <= r.base.len *) - (* r.offset <= r.buf.len *) - END SetPos; - - PROCEDURE (r: Reader) Pos (): INTEGER; - BEGIN (* portable *) - ASSERT(r.base # NIL, 20); - RETURN r.org + r.offset - END Pos; - - PROCEDURE (r: Reader) ReadByte (OUT x: BYTE); - BEGIN (* portable *) - IF (r.org # r.buf.org) OR (r.offset >= bufsize) THEN r.SetPos(r.org + r.offset) END; - IF r.offset < r.buf.len THEN - x := r.buf.data[r.offset]; INC(r.offset) - ELSE - x := 0; r.eof := TRUE - END - END ReadByte; - - PROCEDURE (r: Reader) ReadBytes (VAR x: ARRAY OF BYTE; beg, len: INTEGER); - VAR from, to, count, restInBuf: INTEGER; - BEGIN (* portable *) - ASSERT(beg >= 0, 21); - IF len > 0 THEN - ASSERT(beg + len <= LEN(x), 23); - WHILE len # 0 DO - IF (r.org # r.buf.org) OR (r.offset >= bufsize) THEN r.SetPos(r.org + r.offset) END; - restInBuf := r.buf.len - r.offset; - IF restInBuf = 0 THEN r.eof := TRUE; RETURN - ELSIF restInBuf <= len THEN count := restInBuf - ELSE count := len - END; - from := SYSTEM.ADR(r.buf.data[r.offset]); to := SYSTEM.ADR(x) + beg; - SYSTEM.MOVE(from, to, count); - INC(r.offset, count); INC(beg, count); DEC(len, count) - END; - r.eof := FALSE - ELSE ASSERT(len = 0, 22) - END - END ReadBytes; - - (* Writer *) - - PROCEDURE (w: Writer) Base (): Files.File; - BEGIN (* portable *) - RETURN w.base - END Base; - - PROCEDURE (w: Writer) SetPos (pos: INTEGER); - VAR f: File; org, offset, i, count, res: INTEGER; buf: Buffer; - BEGIN - f := w.base; ASSERT(f # NIL, 20); ASSERT(f.state # closed, 25); - ASSERT(pos >= 0, 22); ASSERT(pos <= f.len, 21); - offset := pos MOD bufsize; org := pos - offset; - i := 0; WHILE (i # nofbufs) & (f.bufs[i] # NIL) & (org # f.bufs[i].org) DO INC(i) END; - IF i # nofbufs THEN - buf := f.bufs[i]; - IF buf = NIL THEN (* create new buffer *) - NEW(buf); f.bufs[i] := buf; buf.org := -1 - END - ELSE (* choose an existing buffer *) - f.swapper := (f.swapper + 1) MOD nofbufs; - FlushBuffer(f, f.swapper); buf := f.bufs[f.swapper]; buf.org := -1 - END; - IF buf.org # org THEN - IF org + bufsize > f.len THEN buf.len := f.len - org ELSE buf.len := bufsize END; - count := buf.len; - IF count > 0 THEN - IF f.ref = invalid THEN CreateFile(f, res) (* ASSERT(res = ok, 100) *) END; - IF f.ref # invalid THEN - IF LinLibc.fseek(f.ref, org, LinLibc.SEEK_SET) # 0 THEN - res := LinLibc_errno(); HALT(101) - END; - IF LinLibc.fread(SYSTEM.ADR(buf.data), 1, count, f.ref) < count THEN - res := LinLibc_errno(); HALT(102) - END; - f.t := Kernel.Time() - END - END; - buf.org := org; buf.dirty := FALSE - END; - w.buf := buf; w.org := org; w.offset := offset - (* 0<= w.org <= w.base.len *) - (* 0 <= w.offset < bufsize *) - (* 0 <= w.buf.len <= bufsize *) - (* w.offset <= w.base.len *) - (* w.offset <= w.buf.len *) - END SetPos; - - PROCEDURE (w: Writer) Pos (): INTEGER; - BEGIN (* portable *) - ASSERT(w.base # NIL, 20); - RETURN w.org + w.offset - END Pos; - - PROCEDURE (w: Writer) WriteByte (x: BYTE); - BEGIN (* portable *) - ASSERT(w.base.state # closed, 25); - IF (w.org # w.buf.org) OR (w.offset >= bufsize) THEN w.SetPos(w.org + w.offset) END; - w.buf.data[w.offset] := x; w.buf.dirty := TRUE; - IF w.offset = w.buf.len THEN INC(w.buf.len); INC(w.base.len) END; - INC(w.offset) - END WriteByte; - - PROCEDURE (w: Writer) WriteBytes (IN x: ARRAY OF BYTE; beg, len: INTEGER); - VAR from, to, count, restInBuf: INTEGER; - BEGIN (* portable *) - ASSERT(beg >= 0, 21); ASSERT(w.base.state # closed, 25); - IF len > 0 THEN - ASSERT(beg + len <= LEN(x), 23); - WHILE len # 0 DO - IF (w.org # w.buf.org) OR (w.offset >= bufsize) THEN w.SetPos(w.org + w.offset) END; - restInBuf := bufsize - w.offset; - IF restInBuf <= len THEN count := restInBuf ELSE count := len END; - from := SYSTEM.ADR(x) + beg; to := SYSTEM.ADR(w.buf.data[w.offset]); - SYSTEM.MOVE(from, to, count); - INC(w.offset, count); INC(beg, count); DEC(len, count); - IF w.offset > w.buf.len THEN INC(w.base.len, w.offset - w.buf.len); w.buf.len := w.offset END; - w.buf.dirty := TRUE - END - ELSE ASSERT(len = 0, 22) - END - END WriteBytes; - - (* Directory *) - - PROCEDURE (d: Directory) This (IN path: ARRAY OF CHAR): Files.Locator; - BEGIN - RETURN d.startup.This(path) - END This; - - PROCEDURE (d: Directory) New (loc: Files.Locator; ask: BOOLEAN): Files.File; - VAR f: File; res: INTEGER; attr: SET; isDir: BOOLEAN; buf: LinLibc.stat_t; - BEGIN - ASSERT(loc # NIL, 20); f := NIL; res := ok; - WITH loc: Locator DO - IF loc.path # "" THEN - Stat(loc.path, buf, res); - IF res # ok THEN - IF loc.res = 76 THEN CreateDir(loc.path, res) - ELSE CheckPath(loc.path, ask, res) - END - ELSE - ModeToAttr(buf.st_mode, attr, isDir); - IF ~isDir THEN res := fileExistsErr END - END - END; - IF res = ok THEN - NEW(f); f.loc := loc; f.name := ""; - f.state := new; f.swapper := -1; f.len := 0; f.ref := invalid - END - ELSE res := invalidNameErr - END; - loc.res := Error(res); - RETURN f - END New; - - PROCEDURE (d: Directory) Temp (): Files.File; - VAR f: File; - BEGIN - NEW(f); f.loc := d.temp; f.name := ""; - f.state := temp; f.swapper := -1; f.len := 0; f.ref := invalid; - RETURN f - END Temp; - - PROCEDURE GetShadowDir (loc: Locator; OUT dir: FullName); - VAR i, j: INTEGER; - BEGIN - dir := startupDir$; i := startupLen; j := loc.rootLen; - WHILE loc.path[j] # 0X DO dir[i] := loc.path[j]; INC(i); INC(j) END; - dir[i] := 0X - END GetShadowDir; - - PROCEDURE (d: Directory) Old (loc: Files.Locator; name: Files.Name; shrd: BOOLEAN): Files.File; - VAR res: INTEGER; f: File; ref: LinLibc.PtrFILE; fname: FullName; type: Files.Type; s: BYTE; buf: LinLibc.stat_t; - BEGIN - ASSERT(loc # NIL, 20); ASSERT(name # "", 21); - res := ok; f := NIL; - WITH loc: Locator DO - Append(loc.path, name, "", loc.maxLen, fname); - f := ThisFile(fname); - IF f # NIL THEN - IF ~shrd OR (f.state = exclusive) THEN loc.res := Error(sharingErr); RETURN NIL - ELSE loc.res := ok; RETURN f - END - END; - IF shrd THEN s := shared ELSE s := exclusive END; - OpenFile(s, fname, ref, res); - IF ((res = fileNotFoundErr) OR (res = pathNotFoundErr)) & (loc.rootLen > 0) THEN - GetShadowDir(loc, fname); - Append(fname, name, "", loc.maxLen, fname); - f := ThisFile(fname); - IF f # NIL THEN - IF ~shrd OR (f.state = exclusive) THEN loc.res := Error(sharingErr); RETURN NIL - ELSE loc.res := ok; RETURN f - END - END; - OpenFile(s, fname, ref, res) - END; - IF res = ok THEN - NEW(f); f.loc := loc; - f.swapper := -1; - GetType(name, type); - f.InitType(type); - ASSERT(ref # invalid, 107); - f.ref := ref; f.name := fname$; f.state := s; f.t := Kernel.Time(); - Stat(f.name, buf, res); - f.len := SHORT(buf.st_size); (* A. V. Shiryaev: OpenBSD *) - res := LinLibc.fseek(ref, 0, LinLibc.SEEK_SET); - END - END; - loc.res := Error(res); - RETURN f - END Old; - - PROCEDURE (d: Directory) Delete* (loc: Files.Locator; name: Files.Name); - VAR res: INTEGER; fname: FullName; - BEGIN - ASSERT(loc # NIL, 20); - WITH loc: Locator DO - Append(loc.path, name, "", loc.maxLen, fname); - Delete(fname, loc.path, res) - ELSE res := invalidNameErr - END; - loc.res := Error(res) - END Delete; - - PROCEDURE (d: Directory) Rename* (loc: Files.Locator; old, new: Files.Name; ask: BOOLEAN); - VAR res, i: INTEGER; oldname, newname: FullName; f: File; on, nn, tn: ShortName; buf: LinLibc.stat_t; - ok1: BOOLEAN; tName: FullName; - BEGIN - ASSERT(loc # NIL, 20); - WITH loc: Locator DO - Append(loc.path, old, "", loc.maxLen, oldname); Append(loc.path, new, "", loc.maxLen, newname); - Short(oldname, on, ok1); Short(newname, nn, ok1); - Stat(oldname, buf, res); - IF res = ok THEN - f := ThisFile(oldname); - IF (f # NIL) & (f.ref # invalid) THEN res := LinLibc.fclose(f.ref); f.ref := invalid END; - IF Diff(oldname, newname, loc.caseSens) # 0 THEN - CheckDelete(newname, loc.path, ask, res); - IF res = ok THEN - IF LinLibc.rename(on, nn) = 0 THEN - IF f # NIL THEN (* still in use => update file table *) - f.name := newname$ - END - ELSE res := LinLibc_errno() - END - END - ELSE (* destination is same file as source *) - tName := oldname; i := LEN(tName$) - 1; - REPEAT - tName[i] := CHR(ORD(tName[i]) + 1); - Short(tName, tn, ok1); - MoveFile(on, tn, res); - UNTIL (res # fileExistsErr) & (res # alreadyExistsErr) & (res # 87); - IF res = ok THEN - MoveFile(tn, nn, res) - END - END - ELSE res := fileNotFoundErr - END - ELSE res := invalidNameErr - END; - loc.res := Error(res) - END Rename; - - PROCEDURE (d: Directory) SameFile* (loc0: Files.Locator; name0: Files.Name; - loc1: Files.Locator; name1: Files.Name - ): BOOLEAN; - VAR p0, p1: FullName; - BEGIN - ASSERT(loc0 # NIL, 20); ASSERT(loc1 # NIL, 21); - WITH loc0: Locator DO Append(loc0.path, name0, "", loc0.maxLen, p0) END; - WITH loc1: Locator DO Append(loc1.path, name1, "", loc1.maxLen, p1) END; - RETURN Diff(p0, p1, loc0(Locator).caseSens) = 0 - END SameFile; - - PROCEDURE (d: Directory) FileList* (loc: Files.Locator): Files.FileInfo; - VAR diff, res: INTEGER; first, last, info: Files.FileInfo; s: FullName; - ss, fname: ShortName; dirp: LinLibc.PtrDIR; dp: LinLibc.PtrDirent; buf: LinLibc.stat_t; tm: LinLibc.tm; - isDir: BOOLEAN; attr: SET; ok1: BOOLEAN; dName: FullName; - BEGIN - ASSERT(loc # NIL, 20); - first := NIL; last :=NIL; - WITH loc: Locator DO - Short(loc.path, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.stat(fname, buf); (* Shiryaev A. V.: OpenBSD *) - ModeToAttr(buf.st_mode, attr, isDir); - IF ~isDir THEN - info := first; last := NIL; s := dName; - WHILE (info # NIL) & (Diff(info.name, s, loc.caseSens) < 0) DO last := info; info := info.next END; - NEW(info); - info.name := dName$; - GetType(info.name, info.type); - info.length := SHORT(buf.st_size); (* A. V. Shiryaev: OpenBSD *) - tm := LinLibc.localtime(buf.st_mtime); - IF tm # NIL THEN - info.modified.year := tm.tm_year + 1900; - info.modified.month := tm.tm_mon + 1; - info.modified.day := tm.tm_mday; - info.modified.hour := tm.tm_hour; - info.modified.minute := tm.tm_min; - info.modified.second := tm.tm_sec - END; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END; - (* check startup directory *) - IF (loc.rootLen > 0) & ((res = ok) OR (res = fileNotFoundErr) OR (res = pathNotFoundErr)) THEN - GetShadowDir(loc, s); - Short(s, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.stat(fname, buf); (* Shiryaev A. V.: OpenBSD *) - ModeToAttr(buf.st_mode, attr, isDir); - IF ~isDir THEN - info := first; last := NIL; s := dName; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END; - WHILE (info # NIL) & (diff < 0) DO - last := info; info := info.next; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END - END; - IF (info = NIL) OR (diff # 0) THEN - NEW(info); - info.name := dName$; - GetType(info.name, info.type); - info.length := SHORT(buf.st_size); (* A. V. Shiryaev: OpenBSD *) - tm := LinLibc.localtime(buf.st_mtime); - IF tm # NIL THEN - info.modified.year := tm.tm_year + 1900; - info.modified.month := tm.tm_mon + 1; - info.modified.day := tm.tm_mday; - info.modified.hour := tm.tm_hour; - info.modified.minute := tm.tm_min; - info.modified.second := tm.tm_sec - END; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END - END; - loc.res := Error(res) - ELSE loc.res := invalidName - END; - RETURN first - END FileList; - - PROCEDURE (d: Directory) LocList* (loc: Files.Locator): Files.LocInfo; - VAR diff, res: INTEGER; first, last, info: Files.LocInfo; s: FullName; isDir: BOOLEAN; attr: SET; - ss, fname: ShortName; dirp: LinLibc.PtrDIR; dp: LinLibc.PtrDirent; buf: LinLibc.stat_t; - ok1: BOOLEAN; dName: FullName; - BEGIN - ASSERT(loc # NIL, 20); - first := NIL; last :=NIL; - WITH loc: Locator DO - Short(loc.path, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.stat(fname, buf); (* Shiryaev A. V.: OpenBSD *) - ModeToAttr(buf.st_mode, attr, isDir); - IF isDir THEN - info := first; last := NIL; s := dName; - WHILE (info # NIL) & (Diff(info.name, s, loc.caseSens) < 0) DO last := info; info := info.next END; - NEW(info); - info.name := dName$; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END; - (* check startup directory *) - IF (loc.rootLen > 0) & ((res = ok) OR (res = fileNotFoundErr) OR (res = pathNotFoundErr)) THEN - GetShadowDir(loc, s); - Short(s, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.stat(fname, buf); (* Shiryaev A. V.: OpenBSD *) - ModeToAttr(buf.st_mode, attr, isDir); - IF isDir THEN - info := first; last := NIL; s := dName; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END; - WHILE (info # NIL) & (diff < 0) DO - last := info; info := info.next; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END - END; - IF (info = NIL) OR (diff # 0) THEN - NEW(info); - info.name := dName$; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END - END; - loc.res := Error(res) - ELSE loc.res := invalidName - END; - RETURN first - END LocList; - - PROCEDURE (d: Directory) GetFileName (name: Files.Name; type: Files.Type; OUT filename: Files.Name); - BEGIN - Append("", name, type, LEN(filename), filename) - END GetFileName; - - (** Miscellaneous **) - - PROCEDURE (VAR id: Counter) Identified (): BOOLEAN; - VAR f: File; - BEGIN - f := id.obj(File); - IF f.state # closed THEN INC(id.count) END; - RETURN FALSE - END Identified; - - PROCEDURE NofFiles* (): INTEGER; - VAR p: ANYPTR; cnt: Counter; - BEGIN - cnt.typ := SYSTEM.TYP(File); - cnt.count := 0; p := Kernel.ThisFinObj(cnt); - RETURN cnt.count - END NofFiles; - - PROCEDURE GetModDate* (f: Files.File; VAR year, month, day, hour, minute, second: INTEGER); - VAR buf: LinLibc.stat_t; tm: LinLibc.tm; - BEGIN - ASSERT(f IS File, 20); - Stat(f(File).name, buf, res); - IF res = ok THEN - tm := LinLibc.localtime(buf.st_mtime); - IF tm # NIL THEN - year := tm.tm_year + 1900; month := tm.tm_mon + 1; day := tm.tm_mday; - hour := tm.tm_hour; minute := tm.tm_min; second := tm.tm_sec - ELSE - res := -1 - END - END; - IF res # ok THEN year := 0; month := 0; day := 0; hour := 0; minute := 0; second := 0 END - END GetModDate; - - PROCEDURE SetRootDir* (path: ARRAY OF CHAR); - VAR i: INTEGER; - BEGIN - dir.startup := NewLocator(path); - dir.startup.rootLen := 0; i := 0; - WHILE startupDir[i] # 0X DO INC(i) END; - startupLen := i - END SetRootDir; - -(* - PROCEDURE GetName (VAR p: ARRAY OF CHAR; VAR i: INTEGER; OUT name, opt: FullName); - VAR ch, tch: CHAR; j: INTEGER; - BEGIN - j := 0; ch := p[i]; tch := " "; - WHILE ch = " " DO INC(i); ch := p[i] END; - IF (ch = "'") OR (ch = '"') THEN tch := ch; INC(i); ch := p[i] END; - WHILE (ch >= " ") & (ch # tch) DO - name[j] := ch; - IF (ch >= "a") & (ch <= "z") OR (ch >= "à") & (ch <= "ö") OR (ch >= "ø") & (ch <= "þ") THEN ch := CAP(ch) - ELSIF ch = "-" THEN ch := "/" - END; - opt[j] := ch; INC(j); INC(i); ch := p[i] - END; - IF ch > " " THEN INC(i); ch := p[i] END; - WHILE (ch # 0X) & (ch <= " ") DO INC(i); ch := p[i] END; - name[j] := 0X; opt[j] := 0X - END GetName; - - PROCEDURE Init; - VAR res, i, slp: INTEGER; path, opt: FullName; attr: SET; p: LinLibc.PtrSTR; str: ARRAY 256 OF CHAR; - buf: LinLibc.stat_t; isDir: BOOLEAN; - BEGIN -(* - TODO: - Instead of using getcwd below to find the local path it would be better to use Kernel.bootinfo.argv[0]. - But this only works if the PATH variable of the shell is not set to hold the BlackBox directory. In that - case all directories in the PATH variable has to be searched for the blackbox executable: - if (argv[0][0] == '/') - s = argv[0] - else { - str = getenv( "PATH" ); len = strlen( str ); - for ( i = 0, s = 0; i < len; i++ ) - if ( str[i] == ':' ) { - str[i] = '\0'; - if ( checkpath( str + s, argv[0] ) ) break; - else s = i + 1; - } - } -*) - wildcard := "*"; NEW(dir); - str := Kernel.cmdLine$; - i := 0; slp := -1; - WHILE (str[i] # " ") & (str[i] # 0X) DO - startupDir[i] := str[i]; - IF str[i] = "/" THEN slp := i END; - INC(i) - END; - startupDir[i] := 0X; - IF slp < 0 THEN - appName := startupDir; - p := NIL; - p := LinLibc.getcwd(p, 0); - startupDir := p$; - LinLibc.free(SYSTEM.VAL(LinLibc.PtrVoid, p)); - i := 0; - WHILE startupDir[i] # 0X DO INC(i) END; - startupLen := i; - ELSE - i := slp + 1; - WHILE startupDir[i] # 0X DO appName[i - slp - 1] := startupDir[i]; INC(i) END; - startupDir[slp] := 0X; - startupLen := slp; - END; - dir.startup := NewLocator(startupDir); - dir.startup.rootLen := 0; -(* - p := NIL; - p := LinLibc.getcwd(p, 0); - startupDir := p$; LinLibc.free(SYSTEM.VAL(LinLibc.PtrVoid, p)); - dir.startup := NewLocator(startupDir); - dir.startup.rootLen := 0; i := 0; - WHILE startupDir[i] # 0X DO INC(i) END; - startupLen := i; - str := Kernel.cmdLine$; -*) -(* - i := 0; - WHILE (str[i] # " ") & (str[i] # 0X) DO appName[i] := str[i]; INC(i) END; - appName[i] := 0X; -*) - i := 0; res := 1; - REPEAT - GetName(str, i, path, opt); - IF opt = "/USE" THEN - GetName(str, i, path, opt); - Stat(path, buf, res); - IF res =ok THEN - ModeToAttr(buf.st_mode, attr, isDir); - IF isDir THEN res := ok ELSE res := invalidName END - END - END - UNTIL (res = 0) OR (str[i] < " "); - IF serverVersion & (res = 0) THEN - i := 0; WHILE path[i] # 0X DO INC(i) END; - IF (path[i-1] = "/") OR (path[i-1] = "\") THEN DEC(i); path[i] := 0X END; - dir.startup := NewLocator(path); - dir.startup.rootLen := SHORT(i) - END; - dir.temp := NewLocator(LinLibc.P_tmpdir); - Files.SetDir(dir) - END Init; -*) - - PROCEDURE Init; - CONST bbServerDir = "BB_PRIMARY_DIR"; bbWorkDir = "BB_SECONDARY_DIR"; - VAR res: INTEGER; attr: SET; p: LinLibc.PtrSTR; - buf: LinLibc.stat_t; isDir, def1: BOOLEAN; - ok1: BOOLEAN; fname: FullName; - BEGIN - InitConv; - - wildcard := "*"; NEW(dir); - - p := LinLibc.getenv(bbServerDir); (* p = NIL -> undefined *) - def1 := FALSE; - IF p # NIL THEN - Long(p$, fname, ok1); - IF ok1 THEN - Stat(fname, buf, res); - IF res = ok THEN - ModeToAttr(buf.st_mode, attr, isDir); - def1 := isDir - END - END; - IF ~def1 THEN Msg("HostFiles: Value of " + bbServerDir + " isn't directory, using cwd") END - END; - IF ~def1 THEN - p := NIL; - p := LinLibc.getcwd(p, 0); - Long(p$, fname, ok1); - IF ~ok1 THEN fname := "." END; - LinLibc.free(SYSTEM.VAL(LinLibc.PtrVoid, p)) - END; - startupDir := fname; startupLen := LEN(startupDir$); - dir.startup := NewLocator(startupDir); - dir.startup.rootLen := 0; - - p := LinLibc.getenv(bbWorkDir); (* p = NIL -> undefined *) - IF def1 & (p # NIL) THEN - Long(p$, fname, ok1); - IF ok1 THEN - Stat(fname, buf, res); - ok1 := res = ok; - IF ok1 THEN - ModeToAttr(buf.st_mode, attr, isDir); - ok1 := isDir - END - END; - IF ~serverVersion THEN - (* - *) - ELSIF ok1 THEN - dir.startup := NewLocator(fname); dir.startup.rootLen := LEN(fname$) - ELSE - Msg("HostFiles: Value of " + bbWorkDir + " isn't directory, server configuration isn't enabled") - END - END; - - dir.temp := NewLocator(LinLibc.P_tmpdir); - Files.SetDir(dir) - END Init; - -BEGIN - Init -CLOSE - CloseConv -END HostFiles. diff --git a/new/_OpenBSD_/Lin/Mod/Dl.txt b/new/_OpenBSD_/Lin/Mod/Dl.txt index 8213f44..79c595d 100644 --- a/new/_OpenBSD_/Lin/Mod/Dl.txt +++ b/new/_OpenBSD_/Lin/Mod/Dl.txt @@ -1,4 +1,4 @@ -MODULE LinDl ["libdlobsdwrap.so"]; +MODULE LinDl ["ld.so"]; (* A. V. Shiryaev, 2012.09 @@ -26,10 +26,10 @@ MODULE LinDl ["libdlobsdwrap.so"]; HANDLE* = PtrVoid; PtrSTR* = POINTER TO ARRAY [untagged] OF SHORTCHAR; - PROCEDURE [ccall] dlopen* ["__dlopen"] (file: PtrSTR; mode: INTEGER): HANDLE; - PROCEDURE [ccall] dlclose* ["__dlclose"] (handle: HANDLE): INTEGER; - PROCEDURE [ccall] dlsym* ["__dlsym"] (handle: HANDLE; symbol: PtrSTR): HANDLE; + PROCEDURE [ccall] dlopen* (file: PtrSTR; mode: INTEGER): HANDLE; + PROCEDURE [ccall] dlclose* (handle: HANDLE): INTEGER; + PROCEDURE [ccall] dlsym* (handle: HANDLE; symbol: PtrSTR): HANDLE; - PROCEDURE [ccall] dlerror* ["__dlerror"] (): PtrSTR; + PROCEDURE [ccall] dlerror* (): PtrSTR; END LinDl. diff --git a/new/_OpenBSD_/System/Mod/Kernel.txt b/new/_OpenBSD_/System/Mod/Kernel.txt deleted file mode 100644 index 2ae9304..0000000 --- a/new/_OpenBSD_/System/Mod/Kernel.txt +++ /dev/null @@ -1,2155 +0,0 @@ -MODULE Kernel; - - (* THIS IS TEXT COPY OF Kernel.odc *) - (* DO NOT EDIT *) - - (* A. V. Shiryaev, 2012.11 - OpenBSD Kernel - Based on 1.6-rc6 Windows Kernel - + 20120822 Marc changes - Some parts taken from OpenBUGS linKernel - - Most Windows-specific code removed - Some Windows-specific code commented and marked red - Windows COM-specific code re-marked from green to gray - OpenBSD(/Linux)-specific code marked green - - TODO: - handle stack overflow exceptions - Quit from TrapHandler - *) - - IMPORT S := SYSTEM, Libc := LinLibc, Dl := LinDl; - - CONST - strictStackSweep = TRUE; - - nameLen* = 256; - - littleEndian* = TRUE; - timeResolution* = 1000; (* ticks per second *) - - processor* = 10; (* i386 *) - - objType* = "ocf"; (* file types *) - symType* = "osf"; - docType* = "odc"; - - (* loader constants *) - done* = 0; - fileNotFound* = 1; - syntaxError* = 2; - objNotFound* = 3; - illegalFPrint* = 4; - cyclicImport* = 5; - noMem* = 6; - commNotFound* = 7; - commSyntaxError* = 8; - moduleNotFound* = 9; - - any = 1000000; - - CX = 1; - SP = 4; (* register number of stack pointer *) - FP = 5; (* register number of frame pointer *) - ML = 3; (* register which holds the module list at program start *) - - N = 128 DIV 16; (* free lists *) - - (* kernel flags in module desc *) - init = 16; dyn = 17; dll = 24; iptrs = 30; - - (* meta interface consts *) - mConst = 1; mTyp = 2; mVar = 3; mProc = 4; mField = 5; - - debug = FALSE; - - -(* - sigStackSize = MAX(Libc.SIGSTKSZ, 65536); -*) - - trapReturn = 1; (* Return value for sigsetjmp given from siglongjmp *) - - (* constants for the message boxes *) - mbClose* = -1; mbOk* = 0; mbCancel* =1; mbRetry* = 2; mbIgnore* = 3; mbYes* = 4; mbNo* = 5; - - TYPE - Name* = ARRAY nameLen OF SHORTCHAR; - Command* = PROCEDURE; - - Module* = POINTER TO RECORD [untagged] - next-: Module; - opts-: SET; (* 0..15: compiler opts, 16..31: kernel flags *) - refcnt-: INTEGER; (* <0: module invalidated *) - compTime-, loadTime-: ARRAY 6 OF SHORTINT; - ext-: INTEGER; (* currently not used *) - term-: Command; (* terminator *) - nofimps-, nofptrs-: INTEGER; - csize-, dsize-, rsize-: INTEGER; - code-, data-, refs-: INTEGER; - procBase-, varBase-: INTEGER; (* meta base addresses *) - names-: POINTER TO ARRAY [untagged] OF SHORTCHAR; (* names[0] = 0X *) - ptrs-: POINTER TO ARRAY [untagged] OF INTEGER; - imports-: POINTER TO ARRAY [untagged] OF Module; - export-: Directory; (* exported objects (name sorted) *) - name-: Name - END; - - Type* = POINTER TO RECORD [untagged] - (* record: ptr to method n at offset - 4 * (n+1) *) - size-: INTEGER; (* record: size, array: #elem, dyn array: 0, proc: sigfp *) - mod-: Module; - id-: INTEGER; (* name idx * 256 + lev * 16 + attr * 4 + form *) - base-: ARRAY 16 OF Type; (* signature if form = ProcTyp *) - fields-: Directory; (* new fields (declaration order) *) - ptroffs-: ARRAY any OF INTEGER (* array of any length *) - END; - - Object* = POINTER TO ObjDesc; - - ObjDesc* = RECORD [untagged] - fprint-: INTEGER; - offs-: INTEGER; (* pvfprint for record types *) - id-: INTEGER; (* name idx * 256 + vis * 16 + mode *) - struct-: Type (* id of basic type or pointer to typedesc/signature *) - END; - - Directory* = POINTER TO RECORD [untagged] - num-: INTEGER; (* number of entries *) - obj-: ARRAY any OF ObjDesc (* array of any length *) - END; - - Signature* = POINTER TO RECORD [untagged] - retStruct-: Type; (* id of basic type or pointer to typedesc or 0 *) - num-: INTEGER; (* number of parameters *) - par-: ARRAY any OF RECORD [untagged] (* parameters *) - id-: INTEGER; (* name idx * 256 + kind *) - struct-: Type (* id of basic type or pointer to typedesc *) - END - END; - - Handler* = PROCEDURE; - - Reducer* = POINTER TO ABSTRACT RECORD - next: Reducer - END; - - Identifier* = ABSTRACT RECORD - typ*: INTEGER; - obj-: ANYPTR - END; - - TrapCleaner* = POINTER TO ABSTRACT RECORD - next: TrapCleaner - END; - - TryHandler* = PROCEDURE (a, b, c: INTEGER); - - - (* meta extension suport *) - - ItemExt* = POINTER TO ABSTRACT RECORD END; - - ItemAttr* = RECORD - obj*, vis*, typ*, adr*: INTEGER; - mod*: Module; - desc*: Type; - ptr*: S.PTR; - ext*: ItemExt - END; - - Hook* = POINTER TO ABSTRACT RECORD END; - - LoaderHook* = POINTER TO ABSTRACT RECORD (Hook) - res*: INTEGER; - importing*, imported*, object*: ARRAY 256 OF CHAR - END; - - GuiHook* = POINTER TO ABSTRACT RECORD (Hook) END; (* Implemented by HostGnome *) - - Block = POINTER TO RECORD [untagged] - tag: Type; - last: INTEGER; (* arrays: last element *) - actual: INTEGER; (* arrays: used during mark phase *) - first: INTEGER (* arrays: first element *) - END; - - FreeBlock = POINTER TO FreeDesc; - - FreeDesc = RECORD [untagged] - tag: Type; (* f.tag = ADR(f.size) *) - size: INTEGER; - next: FreeBlock - END; - - Cluster = POINTER TO RECORD [untagged] - size: INTEGER; (* total size *) - next: Cluster; - max: INTEGER - (* start of first block *) - END; - - FList = POINTER TO RECORD - next: FList; - blk: Block; - iptr, aiptr: BOOLEAN - END; - - CList = POINTER TO RECORD - next: CList; - do: Command; - trapped: BOOLEAN - END; - - - PtrType = RECORD v: S.PTR END; (* used for array of pointer *) - Char8Type = RECORD v: SHORTCHAR END; - Char16Type = RECORD v: CHAR END; - Int8Type = RECORD v: BYTE END; - Int16Type = RECORD v: SHORTINT END; - Int32Type = RECORD v: INTEGER END; - Int64Type = RECORD v: LONGINT END; - BoolType = RECORD v: BOOLEAN END; - SetType = RECORD v: SET END; - Real32Type = RECORD v: SHORTREAL END; - Real64Type = RECORD v: REAL END; - ProcType = RECORD v: PROCEDURE END; - UPtrType = RECORD v: INTEGER END; - StrPtr = POINTER TO ARRAY [untagged] OF SHORTCHAR; - - (* Linux specific boot loader info. Record must be identical to struct in the loader. *) - BootInfo* = POINTER TO RECORD [untagged] - modList: Module; - argc-: INTEGER; - argv-: Libc.StrArray - END; - - VAR - baseStack: INTEGER; (* modList, root, and baseStack must be together for remote debugging *) - root: Cluster; (* cluster list *) - modList-: Module; (* root of module list *) - trapCount-: INTEGER; - err-, pc-, sp-, fp-, stack-, val-: INTEGER; - - free: ARRAY N OF FreeBlock; (* free list *) - sentinelBlock: FreeDesc; - sentinel: FreeBlock; - candidates: ARRAY 1024 OF INTEGER; - nofcand: INTEGER; - allocated: INTEGER; (* bytes allocated on BlackBox heap *) - total: INTEGER; (* current total size of BlackBox heap *) - used: INTEGER; (* bytes allocated on system heap *) - finalizers: FList; - hotFinalizers: FList; - cleaners: CList; - reducers: Reducer; - trapStack: TrapCleaner; - actual: Module; (* valid during module initialization *) - - res: INTEGER; (* auxiliary global variables used for trap handling *) - old: INTEGER; - - trapViewer, trapChecker: Handler; - trapped, guarded, secondTrap: BOOLEAN; - interrupted: BOOLEAN; - static, inDll, terminating: BOOLEAN; - restart: Command; - - told, shift: INTEGER; (* used in Time() *) - - loader: LoaderHook; - loadres: INTEGER; - - wouldFinalize: BOOLEAN; - - watcher*: PROCEDURE (event: INTEGER); (* for debugging *) - - -(* - sigStack: Libc.PtrVoid; -*) - - loopContext: Libc.sigjmp_buf; (* trap return context, if no Kernel.Try has been used. *) - currentTryContext: POINTER TO Libc.sigjmp_buf; (* trap return context, if Kernel.Try has been used. *) - isReadableContext: Libc.sigjmp_buf; (* for IsReadable *) - isReadableCheck: BOOLEAN; - - guiHook: GuiHook; - - (* !!! This variable has to be the last variable in the list. !!! *) - bootInfo-: BootInfo; - - (* code procedures for fpu *) - - PROCEDURE [1] FINIT 0DBH, 0E3H; - PROCEDURE [1] FLDCW 0D9H, 06DH, 0FCH; (* -4, FP *) - PROCEDURE [1] FSTCW 0D9H, 07DH, 0FCH; (* -4, FP *) - - (* code procedure for memory erase *) - - PROCEDURE [code] Erase (adr, words: INTEGER) - 089H, 0C7H, (* MOV EDI, EAX *) - 031H, 0C0H, (* XOR EAX, EAX *) - 059H, (* POP ECX *) - 0F2H, 0ABH; (* REP STOS *) - - (* code procedure for stack allocate *) - - PROCEDURE [code] ALLOC (* argument in CX *) - (* - PUSH EAX - ADD ECX,-5 - JNS L0 - XOR ECX,ECX - L0: AND ECX,-4 (n-8+3)/4*4 - MOV EAX,ECX - AND EAX,4095 - SUB ESP,EAX - MOV EAX,ECX - SHR EAX,12 - JEQ L2 - L1: PUSH 0 - SUB ESP,4092 - DEC EAX - JNE L1 - L2: ADD ECX,8 - MOV EAX,[ESP,ECX,-4] - PUSH EAX - MOV EAX,[ESP,ECX,-4] - SHR ECX,2 - RET - *); - - PROCEDURE (VAR id: Identifier) Identified* (): BOOLEAN, NEW, ABSTRACT; - PROCEDURE (r: Reducer) Reduce* (full: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (c: TrapCleaner) Cleanup*, NEW, EMPTY; - - - (* meta extension suport *) - - PROCEDURE (e: ItemExt) Lookup* (name: ARRAY OF CHAR; VAR i: ANYREC), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) Index* (index: INTEGER; VAR elem: ANYREC), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) Deref* (VAR ref: ANYREC), NEW, ABSTRACT; - - PROCEDURE (e: ItemExt) Valid* (): BOOLEAN, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) Size* (): INTEGER, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) BaseTyp* (): INTEGER, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) Len* (): INTEGER, NEW, ABSTRACT; - - PROCEDURE (e: ItemExt) Call* (OUT ok: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) BoolVal* (): BOOLEAN, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutBoolVal* (x: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) CharVal* (): CHAR, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutCharVal* (x: CHAR), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) IntVal* (): INTEGER, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutIntVal* (x: INTEGER), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) LongVal* (): LONGINT, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutLongVal* (x: LONGINT), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) RealVal* (): REAL, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutRealVal* (x: REAL), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) SetVal* (): SET, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutSetVal* (x: SET), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PtrVal* (): ANYPTR, NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutPtrVal* (x: ANYPTR), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) GetSStringVal* (OUT x: ARRAY OF SHORTCHAR; - OUT ok: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutSStringVal* (IN x: ARRAY OF SHORTCHAR; - OUT ok: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) GetStringVal* (OUT x: ARRAY OF CHAR; OUT ok: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (e: ItemExt) PutStringVal* (IN x: ARRAY OF CHAR; OUT ok: BOOLEAN), NEW, ABSTRACT; - - - (* -------------------- miscellaneous tools -------------------- *) - - PROCEDURE Msg (IN str: ARRAY OF CHAR); - VAR ss: ARRAY 1024 OF SHORTCHAR; res, l: INTEGER; - BEGIN - ss := SHORT(str); - l := LEN(ss$); - ss[l] := 0AX; ss[l + 1] := 0X; - res := Libc.printf(ss) - END Msg; - - PROCEDURE Int (x: LONGINT); - VAR j, k: INTEGER; ch: CHAR; a, s: ARRAY 32 OF CHAR; - BEGIN - IF x # MIN(LONGINT) THEN - IF x < 0 THEN s[0] := "-"; k := 1; x := -x ELSE k := 0 END; - j := 0; REPEAT a[j] := CHR(x MOD 10 + ORD("0")); x := x DIV 10; INC(j) UNTIL x = 0 - ELSE - a := "8085774586302733229"; s[0] := "-"; k := 1; - j := 0; WHILE a[j] # 0X DO INC(j) END - END; - ASSERT(k + j < LEN(s), 20); - REPEAT DEC(j); ch := a[j]; s[k] := ch; INC(k) UNTIL j = 0; - s[k] := 0X; - Msg(s); - END Int; - - PROCEDURE (h: GuiHook) MessageBox* ( - title, msg: ARRAY OF CHAR; buttons: SET): INTEGER, NEW, ABSTRACT; - PROCEDURE (h: GuiHook) Beep*, NEW, ABSTRACT; - - (* Is extended by HostGnome to show dialogs. If no dialog is present or - if the dialog is not closed by using one button, then "mbClose" is returned *) - PROCEDURE MessageBox* (title, msg: ARRAY OF CHAR; buttons: SET): INTEGER; - VAR res: INTEGER; - BEGIN - IF guiHook # NIL THEN - res := guiHook.MessageBox(title, msg, buttons) - ELSE - Msg(" "); - Msg("****"); - Msg("* " + title); - Msg("* " + msg); - Msg("****"); - res := mbClose; - END; - RETURN res - END MessageBox; - - PROCEDURE SetGuiHook* (hook: GuiHook); - BEGIN - guiHook := hook - END SetGuiHook; - - PROCEDURE SplitName* (name: ARRAY OF CHAR; VAR head, tail: ARRAY OF CHAR); - (* portable *) - VAR i, j: INTEGER; ch, lch: CHAR; - BEGIN - i := 0; ch := name[0]; - IF ch # 0X THEN - REPEAT - head[i] := ch; lch := ch; INC(i); ch := name[i] - UNTIL (ch = 0X) - OR ((ch >= "A") & (ch <= "Z") OR (ch >= "À") & (ch # "×") & (ch <= "Þ")) - & ((lch < "A") OR (lch > "Z") & (lch < "À") OR (lch = "×") OR (lch > "Þ")); - head[i] := 0X; j := 0; - WHILE ch # 0X DO tail[j] := ch; INC(i); INC(j); ch := name[i] END; - tail[j] := 0X; - IF tail = "" THEN tail := head$; head := "" END - ELSE head := ""; tail := "" - END - END SplitName; - - PROCEDURE MakeFileName* (VAR name: ARRAY OF CHAR; type: ARRAY OF CHAR); - VAR i, j: INTEGER; ext: ARRAY 8 OF CHAR; ch: CHAR; - BEGIN - i := 0; - WHILE (name[i] # 0X) & (name[i] # ".") DO INC(i) END; - IF name[i] = "." THEN - IF name[i + 1] = 0X THEN name[i] := 0X END - ELSIF i < LEN(name) - 4 THEN - IF type = "" THEN ext := docType ELSE ext := type$ END; - name[i] := "."; INC(i); j := 0; ch := ext[0]; - WHILE ch # 0X DO - IF (ch >= "A") & (ch <= "Z") THEN - ch := CHR(ORD(ch) + ORD("a") - ORD("A")) - END; - name[i] := ch; INC(i); INC(j); ch := ext[j] - END; - name[i] := 0X - END - END MakeFileName; - - PROCEDURE Time* (): LONGINT; - VAR t: INTEGER; - BEGIN - (* t := WinApi.GetTickCount(); *) - - (* A. V. Shiryaev: OpenBSD *) - ASSERT(Libc.CLOCKS_PER_SEC = 100); - t := 10 * Libc.clock(); - - IF t < told THEN INC(shift) END; - told := t; - RETURN shift * 100000000L + t - END Time; - - PROCEDURE Beep* (); - VAR ss: ARRAY 2 OF SHORTCHAR; - BEGIN - IF guiHook # NIL THEN - guiHook.Beep - ELSE - ss[0] := 007X; ss[1] := 0X; - res := Libc.printf(ss); res := Libc.fflush(Libc.NULL) - END - END Beep; - - PROCEDURE SearchProcVar* (var: INTEGER; VAR m: Module; VAR adr: INTEGER); - BEGIN - adr := var; m := NIL; - IF var # 0 THEN - m := modList; - WHILE (m # NIL) & ((var < m.code) OR (var >= m.code + m.csize)) DO m := m.next END; - IF m # NIL THEN DEC(adr, m.code) END - END - END SearchProcVar; - - - (* -------------------- system memory management --------------------- *) - - (* A. V. Shiryaev, 2012.10: NOTE: it seems that GC works correctly with positive addesses only *) - -(* - PROCEDURE HeapAlloc (adr: INTEGER; size: INTEGER; prot: SET): Libc.PtrVoid; - VAR - x: Libc.PtrVoid; - res: INTEGER; - BEGIN - x := Libc.calloc(1, size); (* calloc initialize allocated space to zero *) - IF x # Libc.NULL THEN - res := Libc.mprotect(x, size, prot); - IF res # 0 THEN - Libc.free(x); - x := Libc.NULL; - Msg("Kernel.HeapAlloc: mprotect failed!"); - HALT(100) - END - END; - RETURN x - END HeapAlloc; -*) - PROCEDURE HeapAlloc (adr: Libc.PtrVoid; size: INTEGER; prot: SET): Libc.PtrVoid; - VAR x: Libc.PtrVoid; - BEGIN - x := Libc.mmap(adr, size, prot, Libc.MAP_PRIVATE + Libc.MAP_ANON, -1, 0); - IF x = Libc.MAP_FAILED THEN - x := Libc.NULL - ELSE - ASSERT(size MOD 4 = 0, 100); - Erase(x, size DIV 4) - END; - RETURN x - END HeapAlloc; - -(* - PROCEDURE HeapFree (adr: Libc.PtrVoid; size: INTEGER); - VAR res: INTEGER; - BEGIN -(* - ASSERT(size MOD 4 = 0, 100); - Erase(adr, size DIV 4); - res := Libc.mprotect(adr, size, Libc.PROT_NONE); - ASSERT(res = 0, 101); -*) - Libc.free(adr) - END HeapFree; -*) - PROCEDURE HeapFree (adr: Libc.PtrVoid; size: INTEGER); - VAR res: INTEGER; - BEGIN -(* - ASSERT(size MOD 4 = 0, 100); - Erase(adr, size DIV 4); - res := Libc.mprotect(adr, size, Libc.PROT_NONE); - ASSERT(res = 0, 101); -*) - res := Libc.munmap(adr, size); - ASSERT(res = 0, 102) - END HeapFree; - - PROCEDURE AllocHeapMem (size: INTEGER; VAR c: Cluster); - (* allocate at least size bytes, typically at least 256 kbytes are allocated *) - CONST N = 65536; (* cluster size for dll *) - prot = Libc.PROT_READ + Libc.PROT_WRITE (* + Libc.PROT_EXEC *); - VAR adr: INTEGER; - allocated: INTEGER; - BEGIN - INC(size, 16); - ASSERT(size > 0, 100); adr := 0; - IF size < N THEN adr := HeapAlloc(65536, N, prot) END; - IF adr = 0 THEN adr := HeapAlloc(65536, size, prot); allocated := size ELSE allocated := N END; - IF adr = 0 THEN c := NIL - ELSE - c := S.VAL(Cluster, (adr + 15) DIV 16 * 16); c.max := adr; - c.size := allocated - (S.VAL(INTEGER, c) - adr); - INC(used, c.size); INC(total, c.size) - END - (* post: (c = NIL) OR (c MOD 16 = 0) & (c.size >= size) *) - END AllocHeapMem; - - PROCEDURE FreeHeapMem (c: Cluster); - BEGIN - DEC(used, c.size); DEC(total, c.size); - HeapFree(c.max, (S.VAL(INTEGER, c) - c.max) + c.size) - END FreeHeapMem; - - PROCEDURE AllocModMem* (descSize, modSize: INTEGER; VAR descAdr, modAdr: INTEGER); - CONST - prot = Libc.PROT_READ + Libc.PROT_WRITE (* + Libc.PROT_EXEC *); - BEGIN - descAdr := HeapAlloc(0, descSize, prot); - IF descAdr # 0 THEN - modAdr := HeapAlloc(0, modSize, prot); - IF modAdr # 0 THEN INC(used, descSize + modSize) - ELSE HeapFree(descAdr, descSize); descAdr := 0 - END - ELSE modAdr := 0 - END - END AllocModMem; - - PROCEDURE DeallocModMem* (descSize, modSize, descAdr, modAdr: INTEGER); - BEGIN - DEC(used, descSize + modSize); - HeapFree(descAdr, descSize); - HeapFree(modAdr, modSize) - END DeallocModMem; - - PROCEDURE InvalModMem (modSize, modAdr: INTEGER); - BEGIN - DEC(used, modSize); - HeapFree(modAdr, modSize) - END InvalModMem; - -(* - PROCEDURE IsReadable* (from, to: INTEGER): BOOLEAN; - (* check wether memory between from (incl.) and to (excl.) may be read *) - BEGIN - RETURN WinApi.IsBadReadPtr(from, to - from) = 0 - END IsReadable; -*) - - (* Alexander Shiryaev, 2012.10: I do not know other way that works in OpenBSD *) - (* This procedure can be called from TrapHandler also *) - PROCEDURE IsReadable* (from, to: INTEGER): BOOLEAN; - (* check wether memory between from (incl.) and to (excl.) may be read *) - VAR res: BOOLEAN; res1: INTEGER; - x: SHORTCHAR; - mask, omask: Libc.sigset_t; - BEGIN - (* save old sigmask and unblock SIGSEGV *) - res1 := Libc.sigemptyset(S.ADR(mask)); - ASSERT(res1 = 0, 100); - res1 := Libc.sigaddset(S.ADR(mask), Libc.SIGSEGV); - ASSERT(res1 = 0, 101); - res1 := Libc.sigprocmask(Libc.SIG_UNBLOCK, mask, omask); - ASSERT(res1 = 0, 102); - - res := FALSE; - res1 := Libc.sigsetjmp(isReadableContext, Libc.TRUE); - IF res1 = 0 THEN - isReadableCheck := TRUE; - (* read memory *) - REPEAT - S.GET(from, x); - INC(from) - UNTIL from = to; - res := TRUE - ELSE - ASSERT(res1 = 1, 103) - END; - isReadableCheck := FALSE; - - (* restore saved sigmask *) - res1 := Libc.sigprocmask(Libc.SIG_SETMASK, omask, NIL); - ASSERT(res1 = 0, 104); - - RETURN res - END IsReadable; - - (* --------------------- NEW implementation (portable) -------------------- *) - - PROCEDURE^ NewBlock (size: INTEGER): Block; - - PROCEDURE NewRec* (typ: INTEGER): INTEGER; (* implementation of NEW(ptr) *) - VAR size: INTEGER; b: Block; tag: Type; l: FList; - BEGIN - IF ODD(typ) THEN (* record contains interface pointers *) - tag := S.VAL(Type, typ - 1); - b := NewBlock(tag.size); - IF b = NIL THEN RETURN 0 END; - b.tag := tag; - l := S.VAL(FList, S.ADR(b.last)); (* anchor new object! *) - l := S.VAL(FList, NewRec(S.TYP(FList))); (* NEW(l) *) - l.blk := b; l.iptr := TRUE; l.next := finalizers; finalizers := l; - RETURN S.ADR(b.last) - ELSE - tag := S.VAL(Type, typ); - b := NewBlock(tag.size); - IF b = NIL THEN RETURN 0 END; - b.tag := tag; S.GET(typ - 4, size); - IF size # 0 THEN (* record uses a finalizer *) - l := S.VAL(FList, S.ADR(b.last)); (* anchor new object! *) - l := S.VAL(FList, NewRec(S.TYP(FList))); (* NEW(l) *) - l.blk := b; l.next := finalizers; finalizers := l - END; - RETURN S.ADR(b.last) - END - END NewRec; - - PROCEDURE NewArr* (eltyp, nofelem, nofdim: INTEGER): INTEGER; (* impl. of NEW(ptr, dim0, dim1, ...) *) - VAR b: Block; size, headSize: INTEGER; t: Type; fin: BOOLEAN; l: FList; - BEGIN - IF (nofdim < 0)OR(nofdim>1FFFFFFCH) THEN RETURN 0 END;(*20120822 Marc*) - headSize := 4 * nofdim + 12; fin := FALSE; - CASE eltyp OF -(* - | -1: eltyp := S.ADR(IntPtrType); fin := TRUE -*) - | -1: HALT(100) - | 0: eltyp := S.ADR(PtrType) - | 1: eltyp := S.ADR(Char8Type) - | 2: eltyp := S.ADR(Int16Type) - | 3: eltyp := S.ADR(Int8Type) - | 4: eltyp := S.ADR(Int32Type) - | 5: eltyp := S.ADR(BoolType) - | 6: eltyp := S.ADR(SetType) - | 7: eltyp := S.ADR(Real32Type) - | 8: eltyp := S.ADR(Real64Type) - | 9: eltyp := S.ADR(Char16Type) - | 10: eltyp := S.ADR(Int64Type) - | 11: eltyp := S.ADR(ProcType) - | 12: eltyp := S.ADR(UPtrType) - ELSE (* eltyp is desc *) - IF ODD(eltyp) THEN DEC(eltyp); fin := TRUE END - END; - t := S.VAL(Type, eltyp); - ASSERT(t .size> 0,100); - IF (nofelem < 0) OR( (7FFFFFFFH-headSize) DIV t.size < nofelem) THEN (* 20120822 Marc*) - RETURN 0 - END; - size := headSize + nofelem * t.size; - b := NewBlock(size); - IF b = NIL THEN RETURN 0 END; - b.tag := S.VAL(Type, eltyp + 2); (* tag + array mark *) - b.last := S.ADR(b.last) + size - t.size; (* pointer to last elem *) - b.first := S.ADR(b.last) + headSize; (* pointer to first elem *) - IF fin THEN - l := S.VAL(FList, S.ADR(b.last)); (* anchor new object! *) - l := S.VAL(FList, NewRec(S.TYP(FList))); (* NEW(l) *) - l.blk := b; l.aiptr := TRUE; l.next := finalizers; finalizers := l - END; - RETURN S.ADR(b.last) - END NewArr; - - - (* -------------------- handler installation (portable) --------------------- *) - - PROCEDURE ThisFinObj* (VAR id: Identifier): ANYPTR; - VAR l: FList; - BEGIN - ASSERT(id.typ # 0, 100); - l := finalizers; - WHILE l # NIL DO - IF S.VAL(INTEGER, l.blk.tag) = id.typ THEN - id.obj := S.VAL(ANYPTR, S.ADR(l.blk.last)); - IF id.Identified() THEN RETURN id.obj END - END; - l := l.next - END; - RETURN NIL - END ThisFinObj; - - PROCEDURE InstallReducer* (r: Reducer); - BEGIN - r.next := reducers; reducers := r - END InstallReducer; - - PROCEDURE InstallTrapViewer* (h: Handler); - BEGIN - trapViewer := h - END InstallTrapViewer; - - PROCEDURE InstallTrapChecker* (h: Handler); - BEGIN - trapChecker := h - END InstallTrapChecker; - - PROCEDURE PushTrapCleaner* (c: TrapCleaner); - VAR t: TrapCleaner; - BEGIN - t := trapStack; WHILE (t # NIL) & (t # c) DO t := t.next END; - ASSERT(t = NIL, 20); - c.next := trapStack; trapStack := c - END PushTrapCleaner; - - PROCEDURE PopTrapCleaner* (c: TrapCleaner); - VAR t: TrapCleaner; - BEGIN - t := NIL; - WHILE (trapStack # NIL) & (t # c) DO - t := trapStack; trapStack := trapStack.next - END - END PopTrapCleaner; - - PROCEDURE InstallCleaner* (p: Command); - VAR c: CList; - BEGIN - c := S.VAL(CList, NewRec(S.TYP(CList))); (* NEW(c) *) - c.do := p; c.trapped := FALSE; c.next := cleaners; cleaners := c - END InstallCleaner; - - PROCEDURE RemoveCleaner* (p: Command); - VAR c0, c: CList; - BEGIN - c := cleaners; c0 := NIL; - WHILE (c # NIL) & (c.do # p) DO c0 := c; c := c.next END; - IF c # NIL THEN - IF c0 = NIL THEN cleaners := cleaners.next ELSE c0.next := c.next END - END - END RemoveCleaner; - - PROCEDURE Cleanup*; - VAR c, c0: CList; - BEGIN - c := cleaners; c0 := NIL; - WHILE c # NIL DO - IF ~c.trapped THEN - c.trapped := TRUE; c.do; c.trapped := FALSE; c0 := c - ELSE - IF c0 = NIL THEN cleaners := cleaners.next - ELSE c0.next := c.next - END - END; - c := c.next - END - END Cleanup; - - (* -------------------- meta information (portable) --------------------- *) - - PROCEDURE (h: LoaderHook) ThisMod* (IN name: ARRAY OF SHORTCHAR): Module, NEW, ABSTRACT; - - PROCEDURE SetLoaderHook*(h: LoaderHook); - BEGIN - loader := h - END SetLoaderHook; - - PROCEDURE InitModule (mod: Module); (* initialize linked modules *) - VAR body: Command; - res: INTEGER; errno: INTEGER; - BEGIN - IF ~(dyn IN mod.opts) & (mod.next # NIL) & ~(init IN mod.next.opts) THEN InitModule(mod.next) END; - IF ~(init IN mod.opts) THEN - body := S.VAL(Command, mod.code); - INCL(mod.opts, init); - actual := mod; - - (* A. V. Shiryaev: Allow execution on code pages *) - res := Libc.mprotect(mod.code, mod.csize, - Libc.PROT_READ + Libc.PROT_WRITE + Libc.PROT_EXEC); - IF res = -1 THEN - S.GET( Libc.__errno_location(), errno ); - Msg("ERROR: Kernel.InitModule: mprotect failed!"); - Msg(mod.name$); Int(mod.code); Int(mod.csize); Int(errno); - HALT(100) - ELSE ASSERT(res = 0) - END; - - body(); actual := NIL - END - END InitModule; - - PROCEDURE ThisLoadedMod* (IN name: ARRAY OF SHORTCHAR): Module; (* loaded modules only *) - VAR m: Module; - BEGIN - loadres := done; - m := modList; - WHILE (m # NIL) & ((m.name # name) OR (m.refcnt < 0)) DO m := m.next END; - IF (m # NIL) & ~(init IN m.opts) THEN InitModule(m) END; - IF m = NIL THEN loadres := moduleNotFound END; - RETURN m - END ThisLoadedMod; - - PROCEDURE ThisMod* (IN name: ARRAY OF CHAR): Module; - VAR n : Name; - BEGIN - n := SHORT(name$); - IF loader # NIL THEN - loader.res := done; - RETURN loader.ThisMod(n) - ELSE - RETURN ThisLoadedMod(n) - END - END ThisMod; - - PROCEDURE LoadMod* (IN name: ARRAY OF CHAR); - VAR m: Module; - BEGIN - m := ThisMod(name) - END LoadMod; - - PROCEDURE GetLoaderResult* (OUT res: INTEGER; OUT importing, imported, object: ARRAY OF CHAR); - BEGIN - IF loader # NIL THEN - res := loader.res; - importing := loader.importing$; - imported := loader.imported$; - object := loader.object$ - ELSE - res := loadres; - importing := ""; - imported := ""; - object := "" - END - END GetLoaderResult; - - PROCEDURE ThisObject* (mod: Module; name: ARRAY OF SHORTCHAR): Object; - VAR l, r, m: INTEGER; p: StrPtr; - BEGIN - l := 0; r := mod.export.num; - WHILE l < r DO (* binary search *) - m := (l + r) DIV 2; - p := S.VAL(StrPtr, S.ADR(mod.names[mod.export.obj[m].id DIV 256])); - IF p^ = name THEN RETURN S.VAL(Object, S.ADR(mod.export.obj[m])) END; - IF p^ < name THEN l := m + 1 ELSE r := m END - END; - RETURN NIL - END ThisObject; - - PROCEDURE ThisDesc* (mod: Module; fprint: INTEGER): Object; - VAR i, n: INTEGER; - BEGIN - i := 0; n := mod.export.num; - WHILE (i < n) & (mod.export.obj[i].id DIV 256 = 0) DO - IF mod.export.obj[i].offs = fprint THEN RETURN S.VAL(Object, S.ADR(mod.export.obj[i])) END; - INC(i) - END; - RETURN NIL - END ThisDesc; - - PROCEDURE ThisField* (rec: Type; name: ARRAY OF SHORTCHAR): Object; - VAR n: INTEGER; p: StrPtr; obj: Object; m: Module; - BEGIN - m := rec.mod; - obj := S.VAL(Object, S.ADR(rec.fields.obj[0])); n := rec.fields.num; - WHILE n > 0 DO - p := S.VAL(StrPtr, S.ADR(m.names[obj.id DIV 256])); - IF p^ = name THEN RETURN obj END; - DEC(n); INC(S.VAL(INTEGER, obj), 16) - END; - RETURN NIL - END ThisField; - - PROCEDURE ThisCommand* (mod: Module; name: ARRAY OF SHORTCHAR): Command; - VAR x: Object; sig: Signature; - BEGIN - x := ThisObject(mod, name); - IF (x # NIL) & (x.id MOD 16 = mProc) THEN - sig := S.VAL(Signature, x.struct); - IF (sig.retStruct = NIL) & (sig.num = 0) THEN RETURN S.VAL(Command, mod.procBase + x.offs) END - END; - RETURN NIL - END ThisCommand; - - PROCEDURE ThisType* (mod: Module; name: ARRAY OF SHORTCHAR): Type; - VAR x: Object; - BEGIN - x := ThisObject(mod, name); - IF (x # NIL) & (x.id MOD 16 = mTyp) & (S.VAL(INTEGER, x.struct) DIV 256 # 0) THEN - RETURN x.struct - ELSE - RETURN NIL - END - END ThisType; - - PROCEDURE TypeOf* (IN rec: ANYREC): Type; - BEGIN - RETURN S.VAL(Type, S.TYP(rec)) - END TypeOf; - - PROCEDURE LevelOf* (t: Type): SHORTINT; - BEGIN - RETURN SHORT(t.id DIV 16 MOD 16) - END LevelOf; - - PROCEDURE NewObj* (VAR o: S.PTR; t: Type); - VAR i: INTEGER; - BEGIN - IF t.size = -1 THEN o := NIL - ELSE - i := 0; WHILE t.ptroffs[i] >= 0 DO INC(i) END; - IF t.ptroffs[i+1] >= 0 THEN INC(S.VAL(INTEGER, t)) END; (* with interface pointers *) - o := S.VAL(S.PTR, NewRec(S.VAL(INTEGER, t))) (* generic NEW *) - END - END NewObj; - - PROCEDURE GetObjName* (mod: Module; obj: Object; VAR name: Name); - VAR p: StrPtr; - BEGIN - p := S.VAL(StrPtr, S.ADR(mod.names[obj.id DIV 256])); - name := p^$ - END GetObjName; - - PROCEDURE GetTypeName* (t: Type; VAR name: Name); - VAR p: StrPtr; - BEGIN - p := S.VAL(StrPtr, S.ADR(t.mod.names[t.id DIV 256])); - name := p^$ - END GetTypeName; - - PROCEDURE RegisterMod* (mod: Module); - VAR i: INTEGER; - t: Libc.time_t; tm: Libc.tm; - BEGIN - mod.next := modList; modList := mod; mod.refcnt := 0; INCL(mod.opts, dyn); i := 0; - WHILE i < mod.nofimps DO - IF mod.imports[i] # NIL THEN INC(mod.imports[i].refcnt) END; - INC(i) - END; - - t := Libc.time(NIL); - tm := Libc.localtime(t); - mod.loadTime[0] := SHORT(tm.tm_year + 1900); (* Linux counts years from 1900 but BlackBox from 0000 *) - mod.loadTime[1] := SHORT(tm.tm_mon + 1) (* Linux month range 0-11 but BB month range 1-12 *); - mod.loadTime[2] := SHORT(tm.tm_mday); - mod.loadTime[3] := SHORT(tm.tm_hour); - mod.loadTime[4] := SHORT(tm.tm_min); - mod.loadTime[5] := SHORT(tm.tm_sec); - tm := NIL; - - IF ~(init IN mod.opts) THEN InitModule(mod) END - END RegisterMod; - - PROCEDURE^ Collect*; - - PROCEDURE UnloadMod* (mod: Module); - VAR i: INTEGER; t: Command; - BEGIN - IF mod.refcnt = 0 THEN - t := mod.term; mod.term := NIL; - IF t # NIL THEN t() END; (* terminate module *) - i := 0; - WHILE i < mod.nofptrs DO (* release global pointers *) - S.PUT(mod.varBase + mod.ptrs[i], 0); INC(i) - END; -(* - ReleaseIPtrs(mod); (* release global interface pointers *) -*) - Collect; (* call finalizers *) - i := 0; - WHILE i < mod.nofimps DO (* release imported modules *) - IF mod.imports[i] # NIL THEN DEC(mod.imports[i].refcnt) END; - INC(i) - END; - mod.refcnt := -1; - IF dyn IN mod.opts THEN (* release memory *) - InvalModMem(mod.data + mod.dsize - mod.refs, mod.refs) - END - END - END UnloadMod; - - (* -------------------- dynamic procedure call --------------------- *) (* COMPILER DEPENDENT *) - - PROCEDURE [1] PUSH (p: INTEGER) 050H; (* push AX *) - PROCEDURE [1] CALL (a: INTEGER) 0FFH, 0D0H; (* call AX *) - PROCEDURE [1] RETI (): LONGINT; - PROCEDURE [1] RETR (): REAL; - - (* - type par - 32 bit scalar value - 64 bit scalar low hi - var scalar address - record address tag - array address size - open array address length .. length - *) - - PROCEDURE Call* (adr: INTEGER; sig: Signature; IN par: ARRAY OF INTEGER; n: INTEGER): LONGINT; - VAR p, kind, sp, size: INTEGER; typ: Type; r: REAL; - BEGIN - p := sig.num; - WHILE p > 0 DO (* push parameters from right to left *) - DEC(p); - typ := sig.par[p].struct; - kind := sig.par[p].id MOD 16; - IF (S.VAL(INTEGER, typ) DIV 256 = 0) OR (typ.id MOD 4 IN {0, 3}) THEN (* scalar *) - IF (kind = 10) & ((S.VAL(INTEGER, typ) = 8) OR (S.VAL(INTEGER, typ) = 10)) THEN (* 64 bit *) - DEC(n); PUSH(par[n]) (* push hi word *) - END; - DEC(n); PUSH(par[n]) (* push value/address *) - ELSIF typ.id MOD 4 = 1 THEN (* record *) - IF kind # 10 THEN (* var par *) - DEC(n); PUSH(par[n]); (* push tag *) - DEC(n); PUSH(par[n]) (* push address *) - ELSE - DEC(n, 2); (* skip tag *) - S.GETREG(SP, sp); sp := (sp - typ.size) DIV 4 * 4; S.PUTREG(SP, sp); (* allocate space *) - S.MOVE(par[n], sp, typ.size) (* copy to stack *) - END - ELSIF typ.size = 0 THEN (* open array *) - size := typ.id DIV 16 MOD 16; (* number of open dimensions *) - WHILE size > 0 DO - DEC(size); DEC(n); PUSH(par[n]) (* push length *) - END; - DEC(n); PUSH(par[n]) (* push address *) - ELSE (* fix array *) - IF kind # 10 THEN (* var par *) - DEC(n, 2); PUSH(par[n]) (* push address *) - ELSE - DEC(n); size := par[n]; DEC(n); - S.GETREG(SP, sp); sp := (sp - size) DIV 4 * 4; S.PUTREG(SP, sp); (* allocate space *) - S.MOVE(par[n], sp, size) (* copy to stack *) - END - END - END; - ASSERT(n = 0); - IF S.VAL(INTEGER, sig.retStruct) = 7 THEN (* shortreal *) - CALL(adr); - RETURN S.VAL(INTEGER, SHORT(RETR())) (* return value in fpu register *) - ELSIF S.VAL(INTEGER, sig.retStruct) = 8 THEN (* real *) - CALL(adr); r := RETR(); - RETURN S.VAL(LONGINT, r) (* return value in fpu register *) - ELSE - CALL(adr); - RETURN RETI() (* return value in integer registers *) - END - END Call; - - (* -------------------- reference information (portable) --------------------- *) - - PROCEDURE RefCh (VAR ref: INTEGER; VAR ch: SHORTCHAR); - BEGIN - S.GET(ref, ch); INC(ref) - END RefCh; - - PROCEDURE RefNum (VAR ref: INTEGER; VAR x: INTEGER); - VAR s, n: INTEGER; ch: SHORTCHAR; - BEGIN - s := 0; n := 0; RefCh(ref, ch); - WHILE ORD(ch) >= 128 DO INC(n, ASH(ORD(ch) - 128, s) ); INC(s, 7); RefCh(ref, ch) END; - x := n + ASH(ORD(ch) MOD 64 - ORD(ch) DIV 64 * 64, s) - END RefNum; - - PROCEDURE RefName (VAR ref: INTEGER; VAR n: Name); - VAR i: INTEGER; ch: SHORTCHAR; - BEGIN - i := 0; RefCh(ref, ch); - WHILE ch # 0X DO n[i] := ch; INC(i); RefCh(ref, ch) END; - n[i] := 0X - END RefName; - - PROCEDURE GetRefProc* (VAR ref: INTEGER; VAR adr: INTEGER; VAR name: Name); - VAR ch: SHORTCHAR; - BEGIN - S.GET(ref, ch); - WHILE ch >= 0FDX DO (* skip variables *) - INC(ref); RefCh(ref, ch); - IF ch = 10X THEN INC(ref, 4) END; - RefNum(ref, adr); RefName(ref, name); S.GET(ref, ch) - END; - WHILE (ch > 0X) & (ch < 0FCX) DO (* skip source refs *) - INC(ref); RefNum(ref, adr); S.GET(ref, ch) - END; - IF ch = 0FCX THEN INC(ref); RefNum(ref, adr); RefName(ref, name) - ELSE adr := 0 - END - END GetRefProc; - - (* A. V. Shiryaev, 2012.11 *) - PROCEDURE CheckRefVarReadable (ref: INTEGER): BOOLEAN; - VAR ok: BOOLEAN; ch: SHORTCHAR; - p: INTEGER; (* address *) - - PROCEDURE Get; - BEGIN - IF ok THEN - IF IsReadable(ref, ref+1) THEN (* S.GET(ref, ch); INC(ref) *) RefCh(ref, ch) - ELSE ok := FALSE - END - END - END Get; - - PROCEDURE Num; - BEGIN - Get; WHILE ok & (ORD(ch) >= 128) DO Get END - END Num; - - PROCEDURE Name; - BEGIN - Get; WHILE ok & (ch # 0X) DO Get END - END Name; - - BEGIN - ok := TRUE; - Get; (* mode *) - IF ok & (ch >= 0FDX) THEN - Get; (* form *) - IF ok & (ch = 10X) THEN - IF IsReadable(ref, ref + 4) THEN (* desc *) - S.GET(ref, p); INC(ref, 4); - ok := IsReadable(p + 2 * 4, p + 3 * 4) (* desc.id *) - ELSE ok := FALSE - END - END; - Num; Name - END; - RETURN ok - END CheckRefVarReadable; - - PROCEDURE GetRefVar* (VAR ref: INTEGER; VAR mode, form: SHORTCHAR; VAR desc: Type; - VAR adr: INTEGER; VAR name: Name); - BEGIN - IF CheckRefVarReadable(ref) THEN - S.GET(ref, mode); desc := NIL; - IF mode >= 0FDX THEN - mode := SHORT(CHR(ORD(mode) - 0FCH)); - INC(ref); RefCh(ref, form); - IF form = 10X THEN - S.GET(ref, desc); INC(ref, 4); form := SHORT(CHR(16 + desc.id MOD 4)) - END; - RefNum(ref, adr); RefName(ref, name) - ELSE - mode := 0X; form := 0X; adr := 0 - END - ELSE - Msg("Kernel.GetRefVar failed!"); Int(ref); - mode := 0X; form := 0X; adr := 0 - END - END GetRefVar; - - PROCEDURE SourcePos* (mod: Module; codePos: INTEGER): INTEGER; - VAR ref, pos, ad, d: INTEGER; ch: SHORTCHAR; name: Name; - BEGIN - ref := mod.refs; pos := 0; ad := 0; S.GET(ref, ch); - WHILE ch # 0X DO - WHILE (ch > 0X) & (ch < 0FCX) DO - INC(ad, ORD(ch)); INC(ref); RefNum(ref, d); - IF ad > codePos THEN RETURN pos END; - INC(pos, d); S.GET(ref, ch) - END; - IF ch = 0FCX THEN INC(ref); RefNum(ref, d); RefName(ref, name); S.GET(ref, ch) END; - WHILE ch >= 0FDX DO (* skip variables *) - INC(ref); RefCh(ref, ch); - IF ch = 10X THEN INC(ref, 4) END; - RefNum(ref, d); RefName(ref, name); S.GET(ref, ch) - END - END; - RETURN -1 - END SourcePos; - - (* -------------------- dynamic link libraries --------------------- *) - -(* - PROCEDURE DlOpen (name: ARRAY OF SHORTCHAR): Dl.HANDLE; - CONST flags = Dl.RTLD_LAZY + Dl.RTLD_GLOBAL; - VAR h: Dl.HANDLE; - i: INTEGER; - BEGIN - h := Dl.NULL; - i := 0; WHILE (i < LEN(name)) & (name[i] # 0X) DO INC(i) END; - IF i < LEN(name) THEN - h := Dl.dlopen(name, flags); - WHILE (h = Dl.NULL) & (i > 0) DO - DEC(i); - WHILE (i > 0) & (name[i] # '.') DO DEC(i) END; - IF i > 0 THEN - name[i] := 0X; - h := Dl.dlopen(name, flags); - (* IF h # Dl.NULL THEN Msg(name$) END *) - END - END - END; - RETURN h - END DlOpen; -*) - - PROCEDURE LoadDll* (IN name: ARRAY OF SHORTCHAR; VAR ok: BOOLEAN); - VAR h: Dl.HANDLE; - BEGIN - ok := FALSE; - h := Dl.dlopen(name, Dl.RTLD_LAZY + Dl.RTLD_GLOBAL); - IF h # Dl.NULL THEN ok := TRUE END - END LoadDll; - - PROCEDURE ThisDllObj* (mode, fprint: INTEGER; IN dll, name: ARRAY OF SHORTCHAR): INTEGER; - VAR ad: INTEGER; h: Dl.HANDLE; - BEGIN - ad := 0; - IF mode IN {mVar, mProc} THEN - h := Dl.dlopen(dll, Dl.RTLD_LAZY+ Dl.RTLD_GLOBAL); - IF h # Dl.NULL THEN - ad := Dl.dlsym(h, name); - END - END; - RETURN ad - END ThisDllObj; - - (* -------------------- garbage collector (portable) --------------------- *) - - PROCEDURE Mark (this: Block); - VAR father, son: Block; tag: Type; flag, offset, actual: INTEGER; - BEGIN - IF ~ODD(S.VAL(INTEGER, this.tag)) THEN - father := NIL; - LOOP - INC(S.VAL(INTEGER, this.tag)); - flag := S.VAL(INTEGER, this.tag) MOD 4; - tag := S.VAL(Type, S.VAL(INTEGER, this.tag) - flag); - IF flag >= 2 THEN actual := this.first; this.actual := actual - ELSE actual := S.ADR(this.last) - END; - LOOP - offset := tag.ptroffs[0]; - IF offset < 0 THEN - INC(S.VAL(INTEGER, tag), offset + 4); (* restore tag *) - IF (flag >= 2) & (actual < this.last) & (offset < -4) THEN (* next array element *) - INC(actual, tag.size); this.actual := actual - ELSE (* up *) - this.tag := S.VAL(Type, S.VAL(INTEGER, tag) + flag); - IF father = NIL THEN RETURN END; - son := this; this := father; - flag := S.VAL(INTEGER, this.tag) MOD 4; - tag := S.VAL(Type, S.VAL(INTEGER, this.tag) - flag); - offset := tag.ptroffs[0]; - IF flag >= 2 THEN actual := this.actual ELSE actual := S.ADR(this.last) END; - S.GET(actual + offset, father); S.PUT(actual + offset, S.ADR(son.last)); - INC(S.VAL(INTEGER, tag), 4) - END - ELSE - S.GET(actual + offset, son); - IF son # NIL THEN - DEC(S.VAL(INTEGER, son), 4); - IF ~ODD(S.VAL(INTEGER, son.tag)) THEN (* down *) - this.tag := S.VAL(Type, S.VAL(INTEGER, tag) + flag); - S.PUT(actual + offset, father); father := this; this := son; - EXIT - END - END; - INC(S.VAL(INTEGER, tag), 4) - END - END - END - END - END Mark; - - PROCEDURE MarkGlobals; - VAR m: Module; i, p: INTEGER; - BEGIN - m := modList; - WHILE m # NIL DO - IF m.refcnt >= 0 THEN - i := 0; - WHILE i < m.nofptrs DO - S.GET(m.varBase + m.ptrs[i], p); INC(i); - IF p # 0 THEN Mark(S.VAL(Block, p - 4)) END - END - END; - m := m.next - END - END MarkGlobals; - -(* This is the specification for the code procedure following below: - - PROCEDURE Next (b: Block): Block; (* next block in same cluster *) - VAR size: INTEGER; - BEGIN - S.GET(S.VAL(INTEGER, b.tag) DIV 4 * 4, size); - IF ODD(S.VAL(INTEGER, b.tag) DIV 2) THEN INC(size, b.last - S.ADR(b.last)) END; - RETURN S.VAL(Block, S.VAL(INTEGER, b) + (size + 19) DIV 16 * 16) - END Next; - -*) - PROCEDURE [code] Next (b: Block): Block (* next block in same cluster *) - (* - MOV ECX,[EAX] b.tag - AND CL,0FCH b.tag DIV * 4 - MOV ECX,[ECX] size - TESTB [EAX],02H ODD(b.tag DIV 2) - JE L1 - ADD ECX,[EAX,4] size + b.last - SUB ECX,EAX - SUB ECX,4 size + b.last - ADR(b.last) - L1: - ADD ECX,19 size + 19 - AND CL,0F0H (size + 19) DIV 16 * 16 - ADD EAX,ECX b + size - *) - 08BH, 008H, - 080H, 0E1H, 0FCH, - 08BH, 009H, - 0F6H, 000H, 002H, - 074H, 008H, - 003H, 048H, 004H, - 029H, 0C1H, - 083H, 0E9H, 004H, - 083H, 0C1H, 013H, - 080H, 0E1H, 0F0H, - 001H, 0C8H; - - PROCEDURE CheckCandidates; - (* pre: nofcand > 0 *) - VAR i, j, h, p, end: INTEGER; c: Cluster; blk, next: Block; - BEGIN - (* sort candidates (shellsort) *) - h := 1; REPEAT h := h*3 + 1 UNTIL h > nofcand; - REPEAT h := h DIV 3; i := h; - WHILE i < nofcand DO p := candidates[i]; j := i; - WHILE (j >= h) & (candidates[j-h] > p) DO - candidates[j] := candidates[j-h]; j := j-h - END; - candidates[j] := p; INC(i) - END - UNTIL h = 1; - (* sweep *) - c := root; i := 0; - WHILE c # NIL DO - blk := S.VAL(Block, S.VAL(INTEGER, c) + 12); - end := S.VAL(INTEGER, blk) + (c.size - 12) DIV 16 * 16; - WHILE candidates[i] < S.VAL(INTEGER, blk) DO - INC(i); - IF i = nofcand THEN RETURN END - END; - WHILE S.VAL(INTEGER, blk) < end DO - next := Next(blk); - IF candidates[i] < S.VAL(INTEGER, next) THEN - IF (S.VAL(INTEGER, blk.tag) # S.ADR(blk.last)) (* not a free block *) - & (~strictStackSweep OR (candidates[i] = S.ADR(blk.last))) THEN - Mark(blk) - END; - REPEAT - INC(i); - IF i = nofcand THEN RETURN END - UNTIL candidates[i] >= S.VAL(INTEGER, next) - END; - IF (S.VAL(INTEGER, blk.tag) MOD 4 = 0) & (S.VAL(INTEGER, blk.tag) # S.ADR(blk.last)) - & (blk.tag.base[0] = NIL) & (blk.actual > 0) THEN (* referenced interface record *) - Mark(blk) - END; - blk := next - END; - c := c.next - END - END CheckCandidates; - - PROCEDURE MarkLocals; - VAR sp, p, min, max: INTEGER; c: Cluster; - BEGIN - S.GETREG(FP, sp); nofcand := 0; c := root; - WHILE c.next # NIL DO c := c.next END; - min := S.VAL(INTEGER, root); max := S.VAL(INTEGER, c) + c.size; - WHILE sp < baseStack DO - S.GET(sp, p); - IF (p > min) & (p < max) & (~strictStackSweep OR (p MOD 16 = 0)) THEN - candidates[nofcand] := p; INC(nofcand); - IF nofcand = LEN(candidates) - 1 THEN CheckCandidates; nofcand := 0 END - END; - INC(sp, 4) - END; - candidates[nofcand] := max; INC(nofcand); (* ensure complete scan for interface mark*) - IF nofcand > 0 THEN CheckCandidates END - END MarkLocals; - - PROCEDURE MarkFinObj; - VAR f: FList; - BEGIN - wouldFinalize := FALSE; - f := finalizers; - WHILE f # NIL DO - IF ~ODD(S.VAL(INTEGER, f.blk.tag)) THEN wouldFinalize := TRUE END; - Mark(f.blk); - f := f.next - END; - f := hotFinalizers; - WHILE f # NIL DO IF ~ODD(S.VAL(INTEGER, f.blk.tag)) THEN wouldFinalize := TRUE END; - Mark(f.blk); - f := f.next - END - END MarkFinObj; - - PROCEDURE CheckFinalizers; - VAR f, g, h, k: FList; - BEGIN - f := finalizers; g := NIL; - IF hotFinalizers = NIL THEN k := NIL - ELSE - k := hotFinalizers; - WHILE k.next # NIL DO k := k.next END - END; - WHILE f # NIL DO - h := f; f := f.next; - IF ~ODD(S.VAL(INTEGER, h.blk.tag)) THEN - IF g = NIL THEN finalizers := f ELSE g.next := f END; - IF k = NIL THEN hotFinalizers := h ELSE k.next := h END; - k := h; h.next := NIL - ELSE g := h - END - END; - h := hotFinalizers; - WHILE h # NIL DO Mark(h.blk); h := h.next END - END CheckFinalizers; - - PROCEDURE ExecFinalizer (a, b, c: INTEGER); - VAR f: FList; fin: PROCEDURE(this: ANYPTR); - BEGIN - f := S.VAL(FList, a); - IF f.aiptr THEN (* ArrFinalizer(S.VAL(ANYPTR, S.ADR(f.blk.last))) *) - ELSE - S.GET(S.VAL(INTEGER, f.blk.tag) - 4, fin); (* method 0 *) - IF (fin # NIL) & (f.blk.tag.mod.refcnt >= 0) THEN fin(S.VAL(ANYPTR, S.ADR(f.blk.last))) END; -(* - IF f.iptr THEN RecFinalizer(S.VAL(ANYPTR, S.ADR(f.blk.last))) END -*) - END - END ExecFinalizer; - - PROCEDURE^ Try* (h: TryHandler; a, b, c: INTEGER); (* COMPILER DEPENDENT *) - - PROCEDURE CallFinalizers; - VAR f: FList; - BEGIN - WHILE hotFinalizers # NIL DO - f := hotFinalizers; hotFinalizers := hotFinalizers.next; - Try(ExecFinalizer, S.VAL(INTEGER, f), 0, 0) - END; - wouldFinalize := FALSE - END CallFinalizers; - - PROCEDURE Insert (blk: FreeBlock; size: INTEGER); (* insert block in free list *) - VAR i: INTEGER; - BEGIN - blk.size := size - 4; blk.tag := S.VAL(Type, S.ADR(blk.size)); - i := MIN(N - 1, (blk.size DIV 16)); - blk.next := free[i]; free[i] := blk - END Insert; - - PROCEDURE Sweep (dealloc: BOOLEAN); - VAR cluster, last, c: Cluster; blk, next: Block; fblk, b, t: FreeBlock; end, i: INTEGER; - BEGIN - cluster := root; last := NIL; allocated := 0; - i := N; - REPEAT DEC(i); free[i] := sentinel UNTIL i = 0; - WHILE cluster # NIL DO - blk := S.VAL(Block, S.VAL(INTEGER, cluster) + 12); - end := S.VAL(INTEGER, blk) + (cluster.size - 12) DIV 16 * 16; - fblk := NIL; - WHILE S.VAL(INTEGER, blk) < end DO - next := Next(blk); - IF ODD(S.VAL(INTEGER, blk.tag)) THEN - IF fblk # NIL THEN - Insert(fblk, S.VAL(INTEGER, blk) - S.VAL(INTEGER, fblk)); - fblk := NIL - END; - DEC(S.VAL(INTEGER, blk.tag)); (* unmark *) - INC(allocated, S.VAL(INTEGER, next) - S.VAL(INTEGER, blk)) - ELSIF fblk = NIL THEN - fblk := S.VAL(FreeBlock, blk) - END; - blk := next - END; - IF dealloc & (S.VAL(INTEGER, fblk) = S.VAL(INTEGER, cluster) + 12) THEN (* deallocate cluster *) - c := cluster; cluster := cluster.next; - IF last = NIL THEN root := cluster ELSE last.next := cluster END; - FreeHeapMem(c) - ELSE - IF fblk # NIL THEN Insert(fblk, end - S.VAL(INTEGER, fblk)) END; - last := cluster; cluster := cluster.next - END - END; - (* reverse free list *) - i := N; - REPEAT - DEC(i); - b := free[i]; fblk := sentinel; - WHILE b # sentinel DO t := b; b := t.next; t.next := fblk; fblk := t END; - free[i] := fblk - UNTIL i = 0 - END Sweep; - - PROCEDURE Collect*; - BEGIN - IF root # NIL THEN - CallFinalizers; (* trap cleanup *) - IF debug & (watcher # NIL) THEN watcher(1) END; - MarkGlobals; - MarkLocals; - CheckFinalizers; - Sweep(TRUE); - CallFinalizers - END - END Collect; - - PROCEDURE FastCollect*; - BEGIN - IF root # NIL THEN - IF debug & (watcher # NIL) THEN watcher(2) END; - MarkGlobals; - MarkLocals; - MarkFinObj; - Sweep(FALSE) - END - END FastCollect; - - PROCEDURE WouldFinalize* (): BOOLEAN; - BEGIN - RETURN wouldFinalize - END WouldFinalize; - - (* --------------------- memory allocation (portable) -------------------- *) - - PROCEDURE OldBlock (size: INTEGER): FreeBlock; (* size MOD 16 = 0 *) - VAR b, l: FreeBlock; s, i: INTEGER; - BEGIN - IF debug & (watcher # NIL) THEN watcher(3) END; - s := size - 4; - i := MIN(N - 1, s DIV 16); - WHILE (i # N - 1) & (free[i] = sentinel) DO INC(i) END; - b := free[i]; l := NIL; - WHILE b.size < s DO l := b; b := b.next END; - IF b # sentinel THEN - IF l = NIL THEN free[i] := b.next ELSE l.next := b.next END - ELSE b := NIL - END; - RETURN b - END OldBlock; - - PROCEDURE LastBlock (limit: INTEGER): FreeBlock; (* size MOD 16 = 0 *) - VAR b, l: FreeBlock; s, i: INTEGER; - BEGIN - s := limit - 4; - i := 0; - REPEAT - b := free[i]; l := NIL; - WHILE (b # sentinel) & (S.VAL(INTEGER, b) + b.size # s) DO l := b; b := b.next END; - IF b # sentinel THEN - IF l = NIL THEN free[i] := b.next ELSE l.next := b.next END - ELSE b := NIL - END; - INC(i) - UNTIL (b # NIL) OR (i = N); - RETURN b - END LastBlock; - - PROCEDURE NewBlock (size: INTEGER): Block; - VAR tsize, a, s: INTEGER; b: FreeBlock; new, c: Cluster; r: Reducer; - BEGIN - ASSERT(size>=0,20); - IF size >7FFFFFECH THEN RETURN NIL END; (*20120822 Marc*) - tsize := (size + 19) DIV 16 * 16; - b := OldBlock(tsize); (* 1) search for free block *) - IF b = NIL THEN - FastCollect; b := OldBlock(tsize); (* 2) collect *) - IF b = NIL THEN - Collect; b := OldBlock(tsize); (* 2a) fully collect *) - END; - IF b = NIL THEN - AllocHeapMem(tsize + 12, new); (* 3) allocate new cluster *) - IF new # NIL THEN - IF (root = NIL) OR (S.VAL(INTEGER, new) < S.VAL(INTEGER, root)) THEN - new.next := root; root := new - ELSE - c := root; - WHILE (c.next # NIL) & (S.VAL(INTEGER, new) > S.VAL(INTEGER, c.next)) DO c := c.next END; - new.next := c.next; c.next := new - END; - b := S.VAL(FreeBlock, S.VAL(INTEGER, new) + 12); - b.size := (new.size - 12) DIV 16 * 16 - 4 - ELSE - RETURN NIL (* 4) give up *) - END - END - END; - (* b # NIL *) - a := b.size + 4 - tsize; - IF a > 0 THEN Insert(S.VAL(FreeBlock, S.VAL(INTEGER, b) + tsize), a) END; - IF size > 0 THEN Erase(S.ADR(b.size), (size + 3) DIV 4) END; - INC(allocated, tsize); - RETURN S.VAL(Block, b) - END NewBlock; - - PROCEDURE Allocated* (): INTEGER; - BEGIN - RETURN allocated - END Allocated; - - PROCEDURE Used* (): INTEGER; - BEGIN - RETURN used - END Used; - - PROCEDURE Root* (): INTEGER; - BEGIN - RETURN S.VAL(INTEGER, root) - END Root; - - - (* -------------------- Trap Handling --------------------- *) - - PROCEDURE^ InitFpu; - - PROCEDURE Start* (code: Command); - BEGIN - restart := code; - S.GETREG(SP, baseStack); (* save base stack *) - res := Libc.sigsetjmp(loopContext, Libc.TRUE); - code() - END Start; - - PROCEDURE Quit* (exitCode: INTEGER); - VAR m: Module; term: Command; t: BOOLEAN; - res: INTEGER; - BEGIN - trapViewer := NIL; trapChecker := NIL; restart := NIL; - t := terminating; terminating := TRUE; m := modList; - WHILE m # NIL DO (* call terminators *) - IF ~static OR ~t THEN - term := m.term; m.term := NIL; - IF term # NIL THEN term() END - END; -(* - ReleaseIPtrs(m); -*) - m := m.next - END; - CallFinalizers; - hotFinalizers := finalizers; finalizers := NIL; - CallFinalizers; -(* - IF ~inDll THEN - RemoveExcp(excpPtr^); - WinApi.ExitProcess(exitCode) (* never returns *) - END -*) - - res := Libc.fflush(0); - Libc.exit(exitCode) - END Quit; - - PROCEDURE FatalError* (id: INTEGER; str: ARRAY OF CHAR); - VAR res: INTEGER; title: ARRAY 16 OF CHAR; text: ARRAY 256 OF SHORTCHAR; - BEGIN - title := "Error xy"; - title[6] := CHR(id DIV 10 + ORD("0")); - title[7] := CHR(id MOD 10 + ORD("0")); -(* - res := WinApi.MessageBoxW(0, str, title, {}); -*) - text := SHORT(str$); - res := MessageBox(title$, SHORT(str), {mbOk}); -(* - IF ~inDll THEN RemoveExcp(excpPtr^) END; -*) -(* - WinApi.ExitProcess(1) -*) - Libc.exit(1) - (* never returns *) - END FatalError; - - PROCEDURE DefaultTrapViewer; - VAR len, ref, end, x, a, b, c: INTEGER; mod: Module; - name: Name; out: ARRAY 1024 OF SHORTCHAR; - - PROCEDURE WriteString (s: ARRAY OF SHORTCHAR); - VAR i: INTEGER; - BEGIN - i := 0; - WHILE (len < LEN(out) - 1) & (s[i] # 0X) DO out[len] := s[i]; INC(i); INC(len) END - END WriteString; - - PROCEDURE WriteHex (x, n: INTEGER); - VAR i, y: INTEGER; - BEGIN - IF len + n < LEN(out) THEN - i := len + n - 1; - WHILE i >= len DO - y := x MOD 16; x := x DIV 16; - IF y > 9 THEN y := y + (ORD("A") - ORD("0") - 10) END; - out[i] := SHORT(CHR(y + ORD("0"))); DEC(i) - END; - INC(len, n) - END - END WriteHex; - - PROCEDURE WriteLn; - BEGIN - IF len < LEN(out) - 1 THEN out[len] := 0AX (* 0DX on Windows *); INC(len) END - END WriteLn; - - BEGIN - len := 0; - IF err = 129 THEN WriteString("invalid with") - ELSIF err = 130 THEN WriteString("invalid case") - ELSIF err = 131 THEN WriteString("function without return") - ELSIF err = 132 THEN WriteString("type guard") - ELSIF err = 133 THEN WriteString("implied type guard") - ELSIF err = 134 THEN WriteString("value out of range") - ELSIF err = 135 THEN WriteString("index out of range") - ELSIF err = 136 THEN WriteString("string too long") - ELSIF err = 137 THEN WriteString("stack overflow") - ELSIF err = 138 THEN WriteString("integer overflow") - ELSIF err = 139 THEN WriteString("division by zero") - ELSIF err = 140 THEN WriteString("infinite real result") - ELSIF err = 141 THEN WriteString("real underflow") - ELSIF err = 142 THEN WriteString("real overflow") - ELSIF err = 143 THEN WriteString("undefined real result") - ELSIF err = 200 THEN WriteString("keyboard interrupt") - ELSIF err = 202 THEN WriteString("illegal instruction: "); - WriteHex(val, 4) - ELSIF err = 203 THEN WriteString("illegal memory read [ad = "); - WriteHex(val, 8); WriteString("]") - ELSIF err = 204 THEN WriteString("illegal memory write [ad = "); - WriteHex(val, 8); WriteString("]") - ELSIF err = 205 THEN WriteString("illegal execution [ad = "); - WriteHex(val, 8); WriteString("]") - ELSIF err < 0 THEN WriteString("exception #"); WriteHex(-err, 2) - ELSE err := err DIV 100 * 256 + err DIV 10 MOD 10 * 16 + err MOD 10; - WriteString("trap #"); WriteHex(err, 3) - END; - a := pc; b := fp; c := 12; - REPEAT - WriteLn; WriteString("- "); - mod := modList; - WHILE (mod # NIL) & ((a < mod.code) OR (a >= mod.code + mod.csize)) DO mod := mod.next END; - IF mod # NIL THEN - DEC(a, mod.code); - IF mod.refcnt >= 0 THEN - WriteString(mod.name); ref := mod.refs; - REPEAT GetRefProc(ref, end, name) UNTIL (end = 0) OR (a < end); - IF a < end THEN - WriteString("."); WriteString(name) - END - ELSE - WriteString("("); WriteString(mod.name); WriteString(")") - END; - WriteString(" ") - END; - WriteString("(pc="); WriteHex(a, 8); - WriteString(", fp="); WriteHex(b, 8); WriteString(")"); - IF (b >= sp) & (b < stack) THEN - S.GET(b+4, a); (* stacked pc *) - S.GET(b, b); (* dynamic link *) - DEC(c) - ELSE c := 0 - END - UNTIL c = 0; - out[len] := 0X; - x := MessageBox("BlackBox", out$, {mbOk}) - END DefaultTrapViewer; - - PROCEDURE TrapCleanup; - VAR t: TrapCleaner; - BEGIN - WHILE trapStack # NIL DO - t := trapStack; trapStack := trapStack.next; t.Cleanup - END; - IF (trapChecker # NIL) & (err # 128) THEN trapChecker END - END TrapCleanup; - - PROCEDURE SetTrapGuard* (on: BOOLEAN); - BEGIN - guarded := on - END SetTrapGuard; - - PROCEDURE Try* (h: TryHandler; a, b, c: INTEGER); - VAR res: INTEGER; context: Libc.sigjmp_buf; oldContext: POINTER TO Libc.sigjmp_buf; - BEGIN - oldContext := currentTryContext; - res := Libc.sigsetjmp(context, Libc.TRUE); - currentTryContext := S.ADR(context); - IF res = 0 THEN (* first time around *) - h(a, b, c); - ELSIF res = trapReturn THEN (* after a trap *) - ELSE - HALT(100) - END; - currentTryContext := oldContext; - END Try; - - (* -------------------- Initialization --------------------- *) - - PROCEDURE InitFpu; (* COMPILER DEPENDENT *) - (* could be eliminated, delayed for backward compatibility *) - VAR cw: SET; - BEGIN - FINIT; - FSTCW; - (* denorm, underflow, precision, zero div, overflow masked *) - (* invalid trapped *) - (* round to nearest, temp precision *) - cw := cw - {0..5, 8..11} + {1, 2, 3, 4, 5, 8, 9}; - FLDCW - END InitFpu; - - (* A. V. Shiryaev: Show extended trap information (OpenBSD) *) - PROCEDURE ShowTrap (sig: INTEGER; siginfo: Libc.Ptrsiginfo_t; context: Libc.Ptrucontext_t); - - PROCEDURE WriteChar (c: SHORTCHAR); - VAR s: ARRAY [untagged] 2 OF SHORTCHAR; - BEGIN - s[0] := c; s[1] := 0X; - res := Libc.printf(s) - END WriteChar; - - PROCEDURE WriteString (s: ARRAY OF SHORTCHAR); - VAR res: INTEGER; - BEGIN - res := Libc.printf(s) - END WriteString; - - PROCEDURE WriteHex (x, n: INTEGER); - VAR i, y: INTEGER; - s: ARRAY 9 OF SHORTCHAR; - BEGIN - s[n] := 0X; - i := 0 + n - 1; - WriteChar("$"); - WHILE i >= 0 DO - y := x MOD 16; x := x DIV 16; - IF y > 9 THEN y := y + (ORD("A") - ORD("0") - 10) END; - s[i] := SHORT(CHR(y + ORD("0"))); - DEC(i) - END; - WriteString(s) - END WriteHex; - - PROCEDURE WriteLn; - BEGIN - WriteChar(0AX) - END WriteLn; - - PROCEDURE KV (name: ARRAY OF SHORTCHAR; x: INTEGER); - BEGIN - WriteString(name); WriteString(" = "); WriteHex(x, 8) - END KV; - - BEGIN - WriteString("================================"); WriteLn; - WriteString("TRAP:"); WriteLn; - WriteString("--------------------------------"); WriteLn; - - KV("sig", sig); WriteString(", "); - KV("baseStack", baseStack); WriteLn; - - KV("GS ", context.sc_gs); WriteString(", "); - KV("FS ", context.sc_fs); WriteString(", "); - KV("ES ", context.sc_es); WriteString(", "); - KV("DS ", context.sc_ds); WriteLn; - - KV("EDI", context.sc_edi); WriteString(", "); - KV("ESI", context.sc_esi); WriteString(", "); - KV("EBP", context.sc_ebp); WriteString(", "); - KV("EBX", context.sc_ebx); WriteLn; - - KV("EDX", context.sc_edx); WriteString(", "); - KV("ECX", context.sc_ecx); WriteString(", "); - KV("EAX", context.sc_eax); WriteString(", "); - KV("EIP", context.sc_eip); WriteLn; - - KV("CS", context.sc_cs); WriteString(", "); - KV("EFLAGS", context.sc_eflags); WriteString(", "); - KV("ESP", context.sc_esp); WriteString(", "); - KV("SS", context.sc_ss); WriteLn; - - KV("ONSTACK", context.sc_onstack); WriteString(", "); - KV("MASK", context.sc_mask); WriteString(", "); - KV("TRAPNO", context.sc_trapno); WriteString(", "); - KV("ERR", context.sc_err); WriteLn; - - WriteString("---- siginfo: ------------------"); WriteLn; - - KV("signo", siginfo.si_signo); WriteString(", "); - KV("code", siginfo.si_code); WriteString(", "); - KV("errno", siginfo.si_errno); WriteLn; - KV("fault.addr", siginfo._data._fault._addr); WriteString(", "); - KV("fault.trapno", siginfo._data._fault._trapno); WriteLn; - - WriteString("================================"); WriteLn - END ShowTrap; - - PROCEDURE [ccall] TrapHandler (sig: INTEGER; siginfo: Libc.Ptrsiginfo_t; context: Libc.Ptrucontext_t); - BEGIN - IF isReadableCheck THEN - isReadableCheck := FALSE; - Msg("~IsReadable"); - Libc.siglongjmp(isReadableContext, 1) - END; - - (* - S.GETREG(SP, sp); - S.GETREG(FP, fp); - *) - stack := baseStack; - - (* A. V. Shiryaev *) - (* - sp := context.uc_mcontext.gregs[7]; (* TODO: is the stack pointer really stored in register 7? *) - fp := context.uc_mcontext.gregs[6]; (* TODO: is the frame pointer really stored in register 6? *) - pc := context.uc_mcontext.gregs[14]; (* TODO: is the pc really stored in register 14? *) - *) - (* val := siginfo.si_addr; *) - (* OpenBSD *) - ShowTrap(sig, siginfo, context); - sp := context.sc_esp; fp := context.sc_ebp; pc := context.sc_eip; - val := siginfo._data._fault._addr; - - (* - Int(sig); Int(siginfo.si_signo); Int(siginfo.si_code); Int(siginfo.si_errno); - Int(siginfo.si_status); Int(siginfo.si_value); Int(siginfo.si_int); - *) - err := sig; - IF trapped THEN DefaultTrapViewer END; - CASE sig OF - Libc.SIGINT: - err := 200 (* Interrupt (ANSI). *) - | Libc.SIGILL: (* Illegal instruction (ANSI). *) - err := 202; val := 0; - IF IsReadable(pc, pc + 4) THEN - S.GET(pc, val); - IF val MOD 100H = 8DH THEN (* lea reg,reg *) - IF val DIV 100H MOD 100H = 0F0H THEN - err := val DIV 10000H MOD 100H (* trap *) - ELSIF val DIV 1000H MOD 10H = 0EH THEN - err := 128 + val DIV 100H MOD 10H (* run time error *) - END - END - END - | Libc.SIGFPE: - CASE siginfo.si_code OF - 0: (* TODO: ?????? *) - (* A. V. Shiryaev: OpenBSD *) - (* - IF siginfo.si_int = 8 THEN - err := 139 - ELSIF siginfo.si_int = 0 THEN - err := 143 - END - *) - err := 143; - | Libc.FPE_INTDIV: err := 139 (* Integer divide by zero. *) - | Libc.FPE_INTOVF: err := 138 (* Integer overflow. *) - | Libc.FPE_FLTDIV: err := 140 (* Floating point divide by zero. *) - | Libc.FPE_FLTOVF: err := 142 (* Floating point overflow. *) - | Libc.FPE_FLTUND: err := 141 (* Floating point underflow. *) - | Libc.FPE_FLTRES: err := 143 (* Floating point inexact result. *) - | Libc.FPE_FLTINV: err := 143 (* Floating point invalid operation. *) - | Libc.FPE_FLTSUB: err := 134 (* Subscript out of range. *) - ELSE - END - | Libc.SIGSEGV: (* Segmentation violation (ANSI). *) - err := 203 - ELSE - END; - INC(trapCount); - InitFpu; - TrapCleanup; - IF err # 128 THEN - IF (trapViewer = NIL) OR trapped THEN - DefaultTrapViewer - ELSE - trapped := TRUE; - - trapViewer(); - - trapped := FALSE - END - END; - IF currentTryContext # NIL THEN (* Try failed *) - Libc.siglongjmp(currentTryContext, trapReturn) - ELSE - IF restart # NIL THEN (* Start failed *) - Libc.siglongjmp(loopContext, trapReturn) - END; - Quit(1); (* FIXME *) - END; - trapped := FALSE - END TrapHandler; - - PROCEDURE InstallSignals*; - VAR sa, old: Libc.sigaction_t; res, i: INTEGER; -(* - sigstk: Libc.sigaltstack_t; - errno: INTEGER; -*) - BEGIN -(* - (* A. V. Shiryaev: Set alternative stack on which signals are to be processed *) - sigstk.ss_sp := sigStack; - sigstk.ss_size := sigStackSize; - sigstk.ss_flags := 0; - res := Libc.sigaltstack(sigstk, NIL); - IF res # 0 THEN Msg("ERROR: Kernel.InstallSignals: sigaltstack failed!"); - S.GET( Libc.__errno_location(), errno ); - Int(errno); - Libc.exit(1) - END; -*) - - sa.sa_sigaction := TrapHandler; -(* - res := LinLibc.sigemptyset(S.ADR(sa.sa_mask)); -*) - res := Libc.sigfillset(S.ADR(sa.sa_mask)); - sa.sa_flags := (* Libc.SA_ONSTACK + *) Libc.SA_SIGINFO; (* TrapHandler takes three arguments *) - (* - IF LinLibc.sigaction(LinLibc.SIGINT, sa, old) # 0 THEN Msg("failed to install SIGINT") END; - IF LinLibc.sigaction(LinLibc.SIGILL, sa, old) # 0 THEN Msg("failed to install SIGILL") END; - IF LinLibc.sigaction(LinLibc.SIGFPE, sa, old) # 0 THEN Msg("failed to install SIGFPE") END; - IF LinLibc.sigaction(LinLibc.SIGSEGV, sa, old) # 0 THEN Msg("failed to install SIGSEGV") END; - IF LinLibc.sigaction(LinLibc.SIGPIPE, sa, old) # 0 THEN Msg("failed to install SIGPIPE") END; - IF LinLibc.sigaction(LinLibc.SIGTERM, sa, old) # 0 THEN Msg("failed to install SIGTERM") END; - *) - (* respond to all possible signals *) - FOR i := 1 TO Libc._NSIG - 1 DO - IF (i # Libc.SIGKILL) - & (i # Libc.SIGSTOP) - & (i # Libc.SIGWINCH) - & (i # Libc.SIGTHR) (* A. V. Shiryaev: OpenBSD -pthread *) - THEN - IF Libc.sigaction(i, sa, old) # 0 THEN Msg("failed to install signal"); Int(i) END; - END - END - END InstallSignals; - - PROCEDURE Init; - VAR i: INTEGER; - BEGIN -(* - (* for sigaltstack *) - sigStack := Libc.calloc(1, sigStackSize); - IF sigStack = Libc.NULL THEN - Msg("ERROR: Kernel.Init: calloc(1, sigStackSize) failed!"); - Libc.exit(1) - END; -*) - - isReadableCheck := FALSE; - - InstallSignals; (* init exception handling *) - currentTryContext := NIL; - - allocated := 0; total := 0; used := 0; - sentinelBlock.size := MAX(INTEGER); - sentinel := S.ADR(sentinelBlock); - -(* - S.PUTREG(ML, S.ADR(modList)); -*) - - i := N; - REPEAT DEC(i); free[i] := sentinel UNTIL i = 0; - - IF inDll THEN -(* - baseStack := FPageWord(4); (* begin of stack segment *) -*) - END; - InitFpu; - IF ~static THEN - InitModule(modList); - IF ~inDll THEN Quit(1) END - END; - told := 0; shift := 0 - END Init; - -BEGIN - IF modList = NIL THEN (* only once *) - S.GETREG(SP, baseStack); (* TODO: Check that this is ok. *) - IF bootInfo # NIL THEN - modList := bootInfo.modList (* boot loader initializes the bootInfo struct *) - ELSE - S.GETREG(ML, modList) (* linker loads module list to BX *) - END; - static := init IN modList.opts; - inDll := dll IN modList.opts; - Init - END -CLOSE - IF ~terminating THEN - terminating := TRUE; - Quit(0) - END -END Kernel. diff --git a/new/_OpenBSD_/libBB.so b/new/_OpenBSD_/libBB.so index 5066baa2f314c0742db5804677c32dba08906533..300bfe31104f7b37cf9b249aec5fb0b40c12773f 100644 GIT binary patch delta 5420 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 delta 5411 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 diff --git a/new/_OpenBSD_/libBB0.so b/new/_OpenBSD_/libBB0.so index 351327c3a45217ab3a57255abe3e69a585b03808..6782d14aeec1032fa727fc56eeaa86eb669bd283 100644 GIT binary patch literal 1454168 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

qpc% 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

}_Ue3I;k3+3yX_FSlwgBPWsDw`liK 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

pFJsHk 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 x5Q|?| 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 z½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ÆzH;jhYa2WJ;yqF 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

  • RN24j^8Oq)WZlTl71yK)IFNA0fE8e1|&i#O+w* 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 KJbQC$9Q*$Un|0y< delta 287825 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 0 *) - - VAR - cons: Cons; - out, in: WinApi.HANDLE; - - ss: ARRAY 1024 OF SHORTCHAR; - - inBuf: ARRAY [untagged] inBufLen OF SHORTCHAR; - inBufW, inBufR: INTEGER; (* 0 <= inBufR <= inBufW <= inBufLen *) - - PROCEDURE (cons: Cons) ReadLn (OUT text: ARRAY OF CHAR); - VAR - W: INTEGER; - res: WinApi.BOOL; - i: INTEGER; - done: BOOLEAN; - res1: INTEGER; - BEGIN - (* ReadLine -> ss, W *) - W := 0; - done := FALSE; - REPEAT - i := inBufR; - WHILE (i < inBufW) & (inBuf[i] # 0AX) & (W < LEN(ss)) DO - ss[W] := inBuf[i]; - INC(W); - INC(i) - END; - IF i = inBufW THEN - inBufW := 0; inBufR := 0; - res := WinApi.ReadFile(in, SYSTEM.ADR(inBuf[0]), inBufLen, i, NIL); - IF res # 0 THEN (* TRUE *) - inBufW := i - ELSE - (* W := 0; *) done := TRUE - END - ELSIF inBuf[i] = 0AX THEN - ss[W] := 0AX; INC(W); done := TRUE; - inBufR := i + 1 - ELSE (* ss is too small *) - W := 0; done := TRUE - END - UNTIL done; - - IF W > 0 THEN - res1 := WinApi.MultiByteToWideChar(WinApi.CP_OEMCP, {}, ss, W, text, LEN(text) - 1); - IF (res1 > 0) & (res1 < LEN(text)) THEN - text[res1] := 0X - ELSE - text[0] := 0X - END - ELSE - text[0] := 0X - END - END ReadLn; - - PROCEDURE Print (IN s: ARRAY OF CHAR; len: INTEGER); - VAR res, written: INTEGER; - BEGIN - IF len > 0 THEN - res := WinApi.WideCharToMultiByte(WinApi.CP_OEMCP, {}, s, len, ss, LEN(ss), NIL, NIL); - IF (res > 0) & (res <= LEN(ss)) THEN - res := WinApi.WriteFile(out, SYSTEM.ADR(ss[0]), res, written, NIL) - END - END - END Print; - - PROCEDURE (cons: Cons) WriteChar (c: CHAR); - VAR ss: ARRAY 1 OF CHAR; - BEGIN - ss[0] := c; - Print(ss, 1) - END WriteChar; - - PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR); - BEGIN - Print(text, LEN(text$)) - END WriteStr; - - PROCEDURE (cons: Cons) WriteLn; - BEGIN - Print(0DX + 0AX, 2) - END WriteLn; - - PROCEDURE Init; - VAR res: WinApi.BOOL; - BEGIN - NEW(cons); - - res := WinApi.AllocConsole(); (* Open console on module load time *) - - out := WinApi.GetStdHandle(WinApi.STD_OUTPUT_HANDLE); - in := WinApi.GetStdHandle(WinApi.STD_INPUT_HANDLE); - - inBufW := 0; inBufR := 0; - - Console.SetConsole(cons) - END Init; - -BEGIN - Init -END HostConsole. diff --git a/new/__Interp/Host/Mod/Dialog.odc b/new/__Interp/Host/Mod/Dialog.odc new file mode 100644 index 0000000000000000000000000000000000000000..e30056adff1f1b5025e721e6fd4d175486da0355 GIT binary patch literal 2225 zcmbVO&2G~`5Z;vEKrJ|Ms5qciLBffms4Z}5L28Iy5-EuzJ8dbIkV0#ch%~P3jS3Qn zs(k@&2#FJ%5GU>&cmtk+H)wO}0SRVy*0G(YQedUcj_2pwZzdB@iiYJeSO>?3x7FWq zdm_j?Vmo{=++d5vOi6vw>xpKk=lVf@t>f;IGfJ`NBS(0?i=c2w54;Z7CD{4PQap@Z zQT4XnEh?5E{2;p~L^o1KFGr6lGZmN@| zP{^{GBPpPJnt3HX27#tty^|O znR6UEAn>{_Vl+1Drj||*-5>F~RjxHmn>Q?On?=huxE{hP%nUbc1_sw{t7salw#hNR z-t?P0)u5H-db!2};ph179PD}63yZv9+l38ot?**0U}u)#(zSvOZlUGD{6c62<74wl zxduK3$1&}O4ru%~pPkL|g*k}TvtTN(g!u+=d*Fzs=m)$}GBHkOBpHz&5#oF@;A2)C zQ-k_|x5}{E+*L7tr`H;d$pKqQJgo|tU-vu0b%YO|nWeC-q^B)UX=M_6J`>bPuLz|2gF-z^c#WiELUlfN9ri8OC#qDe^K0h19y&mCg}=e*ryW_T3Iwhxy7;6aq3E5F z*XX5)1HkvXU7RrR@+b;lO$L0?#*LADYI2M-g_t9@;oQLYC@!2Gv6UiLc0VK}CAtwA zDMO?koKw+X;l%0jnVxBcL^zIk)1~1kXUotKY6moVC>TfPGZNM8Q2uAl4&}@4pg`jS zgt>17(*BiVGw>e(4WV)JK|mt}fpJZr(0=%3lU+Sw%kh5|qqV+HA;VAlCjgJK=*yb{ VV;?@T{ohyQ{_(uc_CLO7>@P4kPUips literal 0 HcmV?d00001 diff --git a/new/__Interp/Host/Mod/Dialog.txt b/new/__Interp/Host/Mod/Dialog.txt deleted file mode 100644 index 6dc303e..0000000 --- a/new/__Interp/Host/Mod/Dialog.txt +++ /dev/null @@ -1,52 +0,0 @@ -MODULE HostDialog; - - (* for StdLog and Dialog.SetShowHook *) - - IMPORT Dialog, Console; - - TYPE - ShowHook = POINTER TO RECORD (Dialog.ShowHook) END; - - PROCEDURE ShowParamMsg* (IN str, p0, p1, p2: ARRAY OF CHAR); - VAR st: ARRAY 512 OF CHAR; - BEGIN - ASSERT(str # "", 20); -(* - IF Dialog.showsStatus THEN - ShowParamStatus(str, p0, p1, p2) - ELSE -*) - Dialog.MapParamString(str, p0, p1, p2, st); - Console.WriteStr(st); Console.WriteLn -(* - END -*) - END ShowParamMsg; - - PROCEDURE ShowParamStatus* (IN str, p0, p1, p2: ARRAY OF CHAR); - VAR st: ARRAY 513 OF CHAR; - BEGIN - Dialog.MapParamString(str, p0, p1, p2, st); - Console.WriteStr(st); Console.WriteLn - END ShowParamStatus; - - PROCEDURE (h: ShowHook) ShowParamMsg (IN str, p0, p1, p2: ARRAY OF CHAR); - BEGIN - ShowParamMsg(str, p0, p1, p2) - END ShowParamMsg; - - PROCEDURE (h: ShowHook) ShowParamStatus (IN str, p0, p1, p2: ARRAY OF CHAR); - BEGIN - ShowParamStatus(str, p0, p1, p2) - END ShowParamStatus; - - PROCEDURE Init; - VAR - showHook: ShowHook; - BEGIN - NEW(showHook); Dialog.SetShowHook(showHook) - END Init; - -BEGIN - Init -END HostDialog. diff --git a/new/__Interp/Host/Mod/Fonts.odc b/new/__Interp/Host/Mod/Fonts.odc new file mode 100644 index 0000000000000000000000000000000000000000..f6e822b6aafc06a796a6ce9afba27a4c4db84823 GIT binary patch literal 2620 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 literal 0 HcmV?d00001 diff --git a/new/__Interp/System/Mod/Init.txt b/new/__Interp/System/Mod/Init.txt deleted file mode 100644 index 0d56a57..0000000 --- a/new/__Interp/System/Mod/Init.txt +++ /dev/null @@ -1,28 +0,0 @@ -MODULE Init; - - IMPORT - HostConsole, (* Console.SetHook *) - - HostFonts (* Fonts.SetHook; required for Texts *), - HostWindows (* Windows.SetHook *), - HostDates (* Dates.SetHook *), - HostDialog (* Dialog.SetShowHook *), - StdInterpreter, (* Dialog.SetCallHook *) - StdDialog (* Views.SetViewHook *), - - StdLog, ConsLog, (* Log.Hook *) - - Converters (* .odc *), - Dialog; - - PROCEDURE Init; - VAR res: INTEGER; - BEGIN - Converters.Register("Documents.ImportDocument", "Documents.ExportDocument", "", "odc", {}); - Dialog.Call("Config.Setup", " ", res); - Dialog.Call("ConsInterp.Run", " ", res) - END Init; - -BEGIN - Init -END Init. diff --git a/new/build b/new/build index d0e5223..6592f02 100755 --- a/new/build +++ b/new/build @@ -1,123 +1,54 @@ #!/bin/sh ./run-dev0 <

  • D&4G{hVoJ}z99 z%j#2iD(&Lfem;H$1A0c&n1%owxClrPOmMdBOHX~C@8vqinp?~`>|};{7O}}3=aYBI zJLoZT0sRDLX|aSsW+lMUbyUxi0&eOsgomP#Qiy0VL>Ln)yr8x{!m}zoIWwoQk^VlA zJrA!lI6r0FFolZ+oZ}GqQZiiB!U^Xu(teRcxI}kyv6VU2Td@$B^M0I?Y^ll^OqpYf z3t$O;NWg-2Gy4J$Nmp!mzB_z3d}dVqqvd=2cKHSR4ipXq3e*qhB_V%m5z>6+imkKk z9TF66r0GCu?JHsB6yOARbxknp}kolp2AcxqX{lYY#=9~ST_xmkS#(^lVOL+nno22+m z6I-J$;V+v5weS_vY2G}9O`on!lT;Lc%a*j3h^YI1JeY$VbFr3rY~R1&WQl#8CNp7n zw5n`zJD=zldtL2!VQjT$TtXR*XTM=N+CvPAEWrQ`N^}XQ5V-&)h_p}T0pmbRqpBe& zT&n1;9iwV%zpt<0mHM+BH@8zFkk(SHR&8w^Ck4k}AP!fPp^tS5BD@||Bx!zlQi2AN zPBsKkh<>b>*497&amE=OqEkmF>k-cIX>TXxBb`g0v%D=nKdr9 z@z1I`AdX)V5jv<6w*e=?z2T(SIi*To_UEk8YhyLpYu_kGkEbxpOJ+1XV#hkvzPsph zW#lhX^hj=^eGVLcaJPcqZ`eCRJNVAdn805Sn>W?mJ{sWueB2d@1eY)aAB8HGu9pKj zIgg{XE;irUTu+I4POG7#D!Gif{xMmqs$i1FPSUT+5^!e3nAz%%a?oPXNI&>64u@HE zBV4H<%$>lF)>Q>xkyx%@$wWm^CwI0$pg>y9$RJfJRXD)!+@t_hlnkH=)Z{D; z?_kiU@M)B~h#7#fom~5m?x8MHMO&}?Hv|08w7@yc@zuw1BLU4d1yvyA*?Z^PWwHTr zE}EC${mve?d)K3~#`XIXMXYV)#X)T@vn*)&e8=HDcW$`CFSBd{kmDoGd-x+Y`|}b1 zt^2S4EWP{iL;l#p?~mc{>-PTjhadI~{(Jy`Kj-i7KKv view # NIL, view.context # NIL, view.seq # NIL **) - front-, mark-: BOOLEAN; - state: BYTE; - x, y: INTEGER; (* origin in coordinates of environment *) - gx0, gy0: INTEGER; (* global origin w/o local scrolling compensation *) - sx, sy: INTEGER; (* cumulated local sub-pixel scrolling compensation *) - next, down, up, focus: Frame; - level: INTEGER (* used for partial z-ordering *) - END; - - - Message* = ABSTRACT RECORD - view-: View (** view # NIL **) - END; - - NotifyMsg* = EXTENSIBLE RECORD (Message) - id0*, id1*: INTEGER; - opts*: SET - END; - - NotifyHook = POINTER TO RECORD (Dialog.NotifyHook) END; - - UpdateCachesMsg* = EXTENSIBLE RECORD (Message) END; - - ScrollClassMsg* = RECORD (Message) - allowBitmapScrolling*: BOOLEAN (** OUT, preset to FALSE **) - END; - - - (** property messages **) - - PropMessage* = ABSTRACT RECORD END; - - - (** controller messages **) - - CtrlMessage* = ABSTRACT RECORD END; - - CtrlMsgHandler* = PROCEDURE (op: INTEGER; f, g: Frame; VAR msg: CtrlMessage; VAR mark, front, req: BOOLEAN); - - UpdateMsg = RECORD (Message) - scroll, rebuild, all: BOOLEAN; - l, t, r, b, dx, dy: INTEGER - END; - - - Rect = RECORD - v: View; - rebuild: BOOLEAN; - l, t, r, b: INTEGER - END; - - Region = POINTER TO RECORD - n: INTEGER; - r: ARRAY maxN OF Rect - END; - - RootFrame* = POINTER TO RECORD (Frame) - flags-: SET; - update: Region (* allocated lazily by SetRoot *) - END; - - StdFrame = POINTER TO RECORD (Frame) END; - - - (* view producer/consumer decoupling *) - - QueueElem = POINTER TO RECORD - next: QueueElem; - view: View - END; - - GetSpecHook* = POINTER TO ABSTRACT RECORD (Kernel.Hook) END; - ViewHook* = POINTER TO ABSTRACT RECORD (Kernel.Hook) END; - MsgHook* = POINTER TO ABSTRACT RECORD (Kernel.Hook) END; - - - - VAR - HandleCtrlMsg-: CtrlMsgHandler; - - domainGuard: INTEGER; (* = TrapCount()+1 if domain is addressee of ongoing domaincast *) - - actView: View; - actFrame: RootFrame; - actOp: INTEGER; - - copyModel: Models.Model; (* context for (View)CopyFrom; reset by TrapCleanup *) - - queue: RECORD - len: INTEGER; - head, tail: QueueElem - END; - - getSpecHook: GetSpecHook; - viewHook: ViewHook; - msgHook: MsgHook; - - - PROCEDURE Overwritten (v: View; mno: INTEGER): BOOLEAN; - VAR base, actual: PROCEDURE; - BEGIN - SYSTEM.GET(SYSTEM.TYP(View) - 4 * (mno + 1), base); - SYSTEM.GET(SYSTEM.TYP(v) - 4 * (mno + 1), actual); - RETURN actual # base - END Overwritten; - - (** Hooks **) - - PROCEDURE (h: GetSpecHook) GetExtSpec* (s: Stores.Store; VAR loc: Files.Locator; - VAR name: Files.Name; VAR conv: Converters.Converter), NEW, ABSTRACT; - PROCEDURE (h: GetSpecHook) GetIntSpec* (VAR loc: Files.Locator; VAR name: Files.Name; - VAR conv: Converters.Converter), NEW, ABSTRACT; - - PROCEDURE SetGetSpecHook*(h: GetSpecHook); - BEGIN - getSpecHook := h - END SetGetSpecHook; - - PROCEDURE (h: ViewHook) OldView* (loc: Files.Locator; name: Files.Name; - VAR conv: Converters.Converter): View, NEW, ABSTRACT; - PROCEDURE (h: ViewHook) Open* (s: View; title: ARRAY OF CHAR; - loc: Files.Locator; name: Files.Name; conv: Converters.Converter; - asTool, asAux, noResize, allowDuplicates, neverDirty: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (h: ViewHook) RegisterView* (s: View; loc: Files.Locator; - name: Files.Name; conv: Converters.Converter), NEW, ABSTRACT; - - PROCEDURE SetViewHook*(h: ViewHook); - BEGIN - viewHook := h - END SetViewHook; - - PROCEDURE (h: MsgHook) Omnicast* (VAR msg: ANYREC), NEW, ABSTRACT; - PROCEDURE (h: MsgHook) RestoreDomain* (domain: Stores.Domain), NEW, ABSTRACT; - - PROCEDURE SetMsgHook*(h: MsgHook); - BEGIN - msgHook := h - END SetMsgHook; - - - (** Model protocol **) - - PROCEDURE (v: View) CopyFromSimpleView- (source: View), NEW, EMPTY; - PROCEDURE (v: View) CopyFromModelView- (source: View; model: Models.Model), NEW, EMPTY; - - PROCEDURE (v: View) ThisModel* (): Models.Model, NEW, EXTENSIBLE; - BEGIN - RETURN NIL - END ThisModel; - - - (** Store protocol **) - - PROCEDURE (v: View) CopyFrom- (source: Stores.Store); - VAR tm, fm: Models.Model; c: Models.Context; - BEGIN - tm := copyModel; copyModel := NIL; - WITH source: View DO - v.era := source.era; - actView := NIL; - IF tm = NIL THEN (* if copyModel wasn't preset then use deep copy as default *) - fm := source.ThisModel(); - IF fm # NIL THEN tm := Stores.CopyOf(fm)(Models.Model) END - END; - actView := v; - IF Overwritten(v, copyFromModelView) THEN (* new View *) - ASSERT(~Overwritten(v, copyFromSimpleView), 20); - c := v.context; - v.CopyFromModelView(source, tm); - ASSERT(v.context = c, 60) - ELSE (* old or simple View *) - (* IF tm # NIL THEN v.InitModel(tm) END *) - c := v.context; - v.CopyFromSimpleView(source); - ASSERT(v.context = c, 60) - END - END - END CopyFrom; - - PROCEDURE (v: View) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE; - VAR thisVersion: INTEGER; - BEGIN - v.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxVersion, thisVersion) - END Internalize; - - PROCEDURE (v: View) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE; - BEGIN - v.Externalize^(wr); - wr.WriteVersion(maxVersion) - END Externalize; - - - (** embedding protocol **) - - PROCEDURE (v: View) InitContext* (context: Models.Context), NEW, EXTENSIBLE; - BEGIN - ASSERT(context # NIL, 21); - ASSERT((v.context = NIL) OR (v.context = context), 22); - v.context := context - END InitContext; - - PROCEDURE (v: View) GetBackground* (VAR color: Ports.Color), NEW, EMPTY; - PROCEDURE (v: View) ConsiderFocusRequestBy- (view: View), NEW, EMPTY; - PROCEDURE (v: View) Neutralize*, NEW, EMPTY; - - - (** Frame protocol **) - - PROCEDURE (v: View) GetNewFrame* (VAR frame: Frame), NEW, EMPTY; - PROCEDURE (v: View) Restore* (f: Frame; l, t, r, b: INTEGER), NEW, ABSTRACT; - PROCEDURE (v: View) RestoreMarks* (f: Frame; l, t, r, b: INTEGER), NEW, EMPTY; - - - (** handlers **) - - PROCEDURE (v: View) HandleModelMsg- (VAR msg: Models.Message), NEW, EMPTY; - PROCEDURE (v: View) HandleViewMsg- (f: Frame; VAR msg: Message), NEW, EMPTY; - PROCEDURE (v: View) HandleCtrlMsg* (f: Frame; VAR msg: CtrlMessage; VAR focus: View), NEW, EMPTY; - PROCEDURE (v: View) HandlePropMsg- (VAR msg: PropMessage), NEW, EMPTY; - - - (** Alien **) - - PROCEDURE (a: Alien) Externalize- (VAR wr: Stores.Writer); - BEGIN - HALT(100) - END Externalize; - - PROCEDURE (a: Alien) Internalize- (VAR rd: Stores.Reader); - BEGIN - HALT(100) - END Internalize; - - PROCEDURE (a: Alien) CopyFromSimpleView- (source: View); - BEGIN - a.store := Stores.CopyOf(source(Alien).store)(Stores.Alien); Stores.Join(a, a.store) - END CopyFromSimpleView; - - PROCEDURE (a: Alien) Restore* (f: Frame; l, t, r, b: INTEGER); - VAR u, w, h: INTEGER; - BEGIN - u := f.dot; a.context.GetSize(w, h); - f.DrawRect(0, 0, w, h, Ports.fill, Ports.grey25); - f.DrawRect(0, 0, w, h, 2 * u, Ports.grey75); - f.DrawLine(0, 0, w - u, h - u, u, Ports.grey75); - f.DrawLine(w - u, 0, 0, h - u, u, Ports.grey75) - END Restore; - - - (** TrapAlien **) - - PROCEDURE (v: TrapAlien) Internalize (VAR rd: Stores.Reader); - BEGIN - v.Internalize^(rd); - rd.TurnIntoAlien(3) - END Internalize; - - PROCEDURE (v: TrapAlien) Externalize (VAR rd: Stores.Writer); - END Externalize; - - PROCEDURE (v: TrapAlien) CopyFrom (source: Stores.Store), EMPTY; - - - (** Frame **) - - PROCEDURE (f: Frame) Close* (), NEW, EMPTY; - - - (* Rect, Region *) - - PROCEDURE Union (VAR u: Rect; r: Rect); - BEGIN - IF r.v # u.v THEN u.v := NIL END; - IF r.rebuild THEN u.rebuild := TRUE END; - IF r.l < u.l THEN u.l := r.l END; - IF r.t < u.t THEN u.t := r.t END; - IF r.r > u.r THEN u.r := r.r END; - IF r.b > u.b THEN u.b := r.b END - END Union; - - PROCEDURE Add (rgn: Region; v: View; rebuild: BOOLEAN; gl, gt, gr, gb: INTEGER); - (* does not perfectly maintain invariant of non-overlapping approx rects ... *) - VAR q: Rect; i, j, n: INTEGER; x: ARRAY maxN OF BOOLEAN; - BEGIN - q.v := v; q.rebuild := rebuild; q.l := gl; q.t := gt; q.r := gr; q.b := gb; - n := rgn.n + 1; - i := 0; - WHILE i < rgn.n DO - x[i] := (gl < rgn.r[i].r) & (rgn.r[i].l < gr) & (gt < rgn.r[i].b) & (rgn.r[i].t < gb); - IF x[i] THEN Union(q, rgn.r[i]); DEC(n) END; - INC(i) - END; - IF n > maxN THEN - (* n = maxN + 1 -> merge q with arbitrarily picked rect and Add *) - Union(q, rgn.r[maxN - 1]); Add(rgn, v, q.rebuild, q.l, q.t, q.r, q.b) - ELSE - i := 0; WHILE (i < rgn.n) & ~x[i] DO INC(i) END; - rgn.r[i] := q; INC(i); WHILE (i < rgn.n) & ~x[i] DO INC(i) END; - j := i; WHILE (i < rgn.n) & x[i] DO INC(i) END; - WHILE i < rgn.n DO (* ~x[i] *) - rgn.r[j] := rgn.r[i]; INC(j); INC(i); - WHILE (i < rgn.n) & x[i] DO INC(i) END - END; - rgn.n := n - END - END Add; - - PROCEDURE AddRect (root: RootFrame; f: Frame; l, t, r, b: INTEGER; rebuild: BOOLEAN); - VAR rl, rt, rr, rb: INTEGER; i: INTEGER; - BEGIN - INC(l, f.gx); INC(t, f.gy); INC(r, f.gx); INC(b, f.gy); - rl := root.l + root.gx; rt := root.t + root.gy; rr := root.r + root.gx; rb := root.b + root.gy; - IF l < rl THEN l := rl END; - IF t < rt THEN t := rt END; - IF r > rr THEN r := rr END; - IF b > rb THEN b := rb END; - IF (l < r) & (t < b) THEN - Add(root.update, f.view, rebuild, l, t, r, b); - i := 0; - WHILE (i < root.update.n) - & (~root.update.r[i].rebuild OR (root.update.r[i].v # NIL)) DO INC(i) END; - IF i < root.update.n THEN Add(root.update, root.view, TRUE, rl, rt, rr, rb) END - END - END AddRect; - - - (** miscellaneous **) - - PROCEDURE RestoreDomain* (domain: Stores.Domain); - BEGIN - ASSERT(msgHook # NIL, 100); - msgHook.RestoreDomain(domain) - END RestoreDomain; - - PROCEDURE MarkBorder* (host: Ports.Frame; view: View; l, t, r, b: INTEGER); - VAR s: INTEGER; - BEGIN - IF view # NIL THEN - s := markBorderSize * host.dot; - host.MarkRect(l - s, t - s, r + s, b + s, s, Ports.dim50, Ports.show) - END - END MarkBorder; - - - - (** views **) - - PROCEDURE SeqOf (v: View): Sequencers.Sequencer; - VAR (*c: Models.Context;*) d: Stores.Domain; seq: Sequencers.Sequencer; any: ANYPTR; - BEGIN - d := v.Domain(); seq := NIL; - IF d # NIL THEN - any := d.GetSequencer(); - IF (any # NIL) & (any IS Sequencers.Sequencer) THEN - seq := any(Sequencers.Sequencer) - END - END; - RETURN seq - END SeqOf; - - - PROCEDURE Era* (v: View): INTEGER; - (** pre: v # NIL *) - (** post: - v.ThisModel() # NIL - in-synch(v) iff Era(v) = Models.Era(v.ThisModel()) - **) - BEGIN - ASSERT(v # NIL, 20); - RETURN v.era - END Era; - - PROCEDURE BeginScript* (v: View; name: Stores.OpName; OUT script: Stores.Operation); - (** pre: v # NIL *) - (** post: (script # NIL) iff (v.seq # NIL) **) - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); - IF seq # NIL THEN seq.BeginScript(name, script) - ELSE script := NIL - END - END BeginScript; - - PROCEDURE Do* (v: View; name: Stores.OpName; op: Stores.Operation); - (** pre: v # NIL, op # NIL, ~op.inUse **) - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); ASSERT(op # NIL, 21); (* ASSERT(~op.inUse, 22); *) - seq := SeqOf(v); - IF seq # NIL THEN seq.Do(v, name, op) ELSE op.Do END - END Do; - - PROCEDURE LastOp* (v: View): Stores.Operation; - (** pre: v # NIL **) - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); - IF seq # NIL THEN RETURN seq.LastOp(v) ELSE RETURN NIL END - END LastOp; - - PROCEDURE Bunch* (v: View); - (** pre: v # NIL **) - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); ASSERT(seq # NIL, 21); - seq.Bunch(v) - END Bunch; - - PROCEDURE StopBunching* (v: View); - (** pre: v # NIL **) - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); - IF seq # NIL THEN seq.StopBunching END - END StopBunching; - - PROCEDURE EndScript* (v: View; script: Stores.Operation); - (** pre: (script # NIL) iff (v.seq # NIL) **) - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); - IF seq # NIL THEN ASSERT(script # NIL, 21); seq.EndScript(script) - ELSE ASSERT(script = NIL, 22) - END - END EndScript; - - - PROCEDURE BeginModification* (type: INTEGER; v: View); - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); - IF seq # NIL THEN seq.BeginModification(type, v) END - END BeginModification; - - PROCEDURE EndModification* (type: INTEGER; v: View); - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); - IF seq # NIL THEN seq.EndModification(type, v) END - END EndModification; - - PROCEDURE SetDirty* (v: View); - VAR seq: Sequencers.Sequencer; - BEGIN - ASSERT(v # NIL, 20); - seq := SeqOf(v); - IF seq # NIL THEN seq.SetDirty(TRUE) END - END SetDirty; - - - PROCEDURE Domaincast* (domain: Stores.Domain; VAR msg: Message); - VAR g: INTEGER; seq: ANYPTR; - BEGIN - IF domain # NIL THEN - seq := domain.GetSequencer(); - IF seq # NIL THEN - msg.view := NIL; - g := Kernel.trapCount + 1; - IF domainGuard > 0 THEN ASSERT(domainGuard # g, 20) END; - domainGuard := g; - seq(Sequencers.Sequencer).Handle(msg); - domainGuard := 0 - END - END - END Domaincast; - - PROCEDURE Broadcast* (v: View; VAR msg: Message); - VAR seq: Sequencers.Sequencer; g: INTEGER; - BEGIN - ASSERT(v # NIL, 20); - msg.view := v; - seq := SeqOf(v); - IF seq # NIL THEN - g := Kernel.trapCount + 1; - IF v.guard > 0 THEN ASSERT(v.guard # g, 21) END; - v.guard := g; - seq.Handle(msg); - v.guard := 0 - END - END Broadcast; - - - PROCEDURE Update* (v: View; rebuild: BOOLEAN); - VAR upd: UpdateMsg; - BEGIN - ASSERT(v # NIL, 20); - upd.scroll := FALSE; upd.rebuild := rebuild; upd.all := TRUE; - Broadcast(v, upd) - END Update; - - PROCEDURE UpdateIn* (v: View; l, t, r, b: INTEGER; rebuild: BOOLEAN); - VAR upd: UpdateMsg; - BEGIN - ASSERT(v # NIL, 20); - upd.scroll := FALSE; upd.rebuild := rebuild; upd.all := FALSE; - upd.l := l; upd.t := t; upd.r := r; upd.b := b; - Broadcast(v, upd) - END UpdateIn; - - PROCEDURE Scroll* (v: View; dx, dy: INTEGER); - VAR scroll: UpdateMsg; - BEGIN - ASSERT(v # NIL, 20); ASSERT(v.Domain() # NIL, 21); - RestoreDomain(v.Domain()); - scroll.scroll := TRUE; scroll.dx := dx; scroll.dy := dy; - Broadcast(v, scroll) - END Scroll; - - PROCEDURE CopyOf* (v: View; shallow: BOOLEAN): View; - VAR w, a: View; op: INTEGER; b: Alien; - BEGIN - ASSERT(v # NIL, 20); - IF ~(handler IN v.bad) THEN - a := actView; op := actOp; actView := NIL; actOp := handler; - IF shallow THEN copyModel := v.ThisModel() END; - actView := v; - w := Stores.CopyOf(v)(View); - actView := a; actOp := op - ELSE - NEW(b); w := b; w.bad := {handler..externalize} - END; - IF shallow THEN Stores.Join(w, v) END; - RETURN w - END CopyOf; - - PROCEDURE CopyWithNewModel* (v: View; m: Models.Model): View; - VAR w, a: View; op: INTEGER; b: Alien; fm: Models.Model; - BEGIN - ASSERT(v # NIL, 20); - fm := v.ThisModel(); ASSERT(fm # NIL, 21); - ASSERT(m # NIL, 22); - ASSERT(Services.SameType(m, fm), 23); - IF ~(handler IN v.bad) THEN - a := actView; op := actOp; actView := v; actOp := handler; - copyModel := m; - w := Stores.CopyOf(v)(View); - actView := a; actOp := op - ELSE - NEW(b); w := b; w.bad := {handler..externalize} - END; - RETURN w - END CopyWithNewModel; - - PROCEDURE ReadView* (VAR rd: Stores.Reader; OUT v: View); - VAR st: Stores.Store; a: Alien; - BEGIN - rd.ReadStore(st); - IF st = NIL THEN - v := NIL - ELSIF st IS Stores.Alien THEN - NEW(a); - a.store := st(Stores.Alien); Stores.Join(a, a.store); - v := a - ELSE - v := st(View) - END - END ReadView; - - PROCEDURE WriteView* (VAR wr: Stores.Writer; v: View); - VAR a: TrapAlien; av: View; op: INTEGER; - BEGIN - IF v = NIL THEN wr.WriteStore(v) - ELSIF externalize IN v.bad THEN NEW(a); wr.WriteStore(a) - ELSIF v IS Alien THEN wr.WriteStore(v(Alien).store) - ELSE - av := actView; op := actOp; actView := v; actOp := externalize; - wr.WriteStore(v); - actView := av; actOp := op - END - END WriteView; - - - (* frames *) - - PROCEDURE SetClip (f: Frame; l, t, r, b: INTEGER); - VAR u: INTEGER; - BEGIN - ASSERT(f.rider # NIL, 20); ASSERT(l <= r, 21); ASSERT(t <= b, 22); - u := f.unit; - f.rider.SetRect((l + f.gx) DIV u, (t + f.gy) DIV u, (r + f.gx) DIV u, (b + f.gy) DIV u); - f.l := l; f.t := t; f.r := r; f.b := b - END SetClip; - - PROCEDURE Close (f: Frame); - BEGIN - f.Close; - f.state := closed; - f.up := NIL; f.down := NIL; f.next := NIL; f.view := NIL; - f.ConnectTo(NIL) - END Close; - - PROCEDURE AdaptFrameTo (f: Frame; orgX, orgY: INTEGER); - VAR g, p, q: Frame; port: Ports.Port; - w, h, pl, pt, pr, pb, gl, gt, gr, gb, gx, gy: INTEGER; - BEGIN - (* pre: environment (i.e. parent frame / port) has already been set up *) - ASSERT(f.view # NIL, 20); ASSERT(f.view.context # NIL, 21); - f.x := orgX; f.y := orgY; (* set new origin *) - g := f.up; - IF g # NIL THEN (* parent frame is environment *) - f.gx0 := g.gx + orgX; f.gy0 := g.gy + orgY; - f.SetOffset(f.gx0 - f.sx, f.gy0 - f.sy); - pl := g.gx + g.l; pt := g.gy + g.t; pr := g.gx + g.r; pb := g.gy + g.b - ELSE (* port is environment *) - f.gx0 := orgX; f.gy0 := orgY; - f.SetOffset(f.gx0 - f.sx, f.gy0 - f.sy); - port := f.rider.Base(); - port.GetSize(w, h); - pl := 0; pt := 0; pr := w * f.unit; pb := h * f.unit - END; - (* (pl, pt, pr, pb) is parent clipping rectangle, in global coordinates, and in units *) - gx := f.gx; gy := f.gy; f.view.context.GetSize(w, h); - gl := gx; gt := gy; gr := gx + w; gb := gy + h; - (* (gl, gt, gr, gb) is desired clipping rectangle, in global coordinates, and in units *) - IF gl < pl THEN gl := pl END; - IF gt < pt THEN gt := pt END; - IF gr > pr THEN gr := pr END; - IF gb > pb THEN gb := pb END; - IF (gl >= gr) OR (gt >= gb) THEN gr := gl; gb := gt END; - SetClip(f, gl - gx + f.sx, gt - gy + f.sy, gr - gx + f.sx, gb - gy + f.sy); - (* (f.l, f.t, f.r, f.b) is final clipping rectangle, in local coordinates, and in units *) - g := f.down; f.down := NIL; p := NIL; - WHILE g # NIL DO (* adapt child frames *) - q := g.next; g.next := NIL; - AdaptFrameTo(g, g.x, g.y); - IF g.l = g.r THEN (* empty child frame: remove *) - Close(g) - ELSE (* insert in new frame list *) - IF p = NIL THEN f.down := g ELSE p.next := g END; - p := g - END; - g := q - END - (* post: frame is set; child frames are set, nonempty, and clipped to frame *) - END AdaptFrameTo; - - PROCEDURE SetRoot* (root: RootFrame; view: View; front: BOOLEAN; flags: SET); - BEGIN - ASSERT(root # NIL, 20); ASSERT(root.rider # NIL, 21); - ASSERT(view # NIL, 22); ASSERT(view.context # NIL, 23); - ASSERT(view.Domain() # NIL, 24); - ASSERT(root.state IN {new, open}, 25); - root.view := view; - root.front := front; root.mark := TRUE; root.flags := flags; - root.state := open; - IF root.update = NIL THEN NEW(root.update); root.update.n := 0 END - END SetRoot; - - PROCEDURE AdaptRoot* (root: RootFrame); - BEGIN - ASSERT(root # NIL, 20); ASSERT(root.state = open, 21); - AdaptFrameTo(root, root.x, root.y) - END AdaptRoot; - - PROCEDURE UpdateRoot* (root: RootFrame; l, t, r, b: INTEGER; rebuild: BOOLEAN); - BEGIN - ASSERT(root # NIL, 20); ASSERT(root.state = open, 21); - AddRect(root, root, l, t, r, b, rebuild) - END UpdateRoot; - - PROCEDURE RootOf* (f: Frame): RootFrame; - BEGIN - ASSERT(f # NIL, 20); ASSERT(f.state = open, 21); - WHILE f.up # NIL DO f := f.up END; - RETURN f(RootFrame) - END RootOf; - - PROCEDURE HostOf* (f: Frame): Frame; - BEGIN - ASSERT(f # NIL, 20); - RETURN f.up - END HostOf; - - PROCEDURE IsPrinterFrame* (f: Frame): BOOLEAN; - VAR p: Ports.Port; - BEGIN - ASSERT(f # NIL, 20); ASSERT(f.state = open, 21); - p := f.rider.Base(); - RETURN Ports.IsPrinterPort(p) - END IsPrinterFrame; - - PROCEDURE InstallFrame* (host: Frame; view: View; x, y, level: INTEGER; focus: BOOLEAN); - VAR e, f, g: Frame; w, h, l, t, r, b: INTEGER; m: Models.Model; std: StdFrame; - msg: UpdateCachesMsg; a: View; op: INTEGER; - BEGIN - ASSERT(host # NIL, 20); ASSERT(host.state = open, 21); - ASSERT(view # NIL, 22); ASSERT(view.context # NIL, 23); - ASSERT(view.Domain() # NIL, 24); - e := NIL; g := host.down; WHILE (g # NIL) & (g.view # view) DO e := g; g := g.next END; - IF g = NIL THEN (* frame for view not yet in child frame list *) - view.context.GetSize(w, h); - IF w > MAX(INTEGER) DIV 2 THEN w := MAX(INTEGER) DIV 2 END; - IF h > MAX(INTEGER) DIV 2 THEN h := MAX(INTEGER) DIV 2 END; - l := x; t := y; r := x + w; b := y + h; - (* (l, t, r, b) is child frame rectangle, in local coordinates, and in units *) - IF (l < host.r) & (t < host.b) & (r > host.l) & (b > host.t) THEN (* visible *) - g := NIL; view.GetNewFrame(g); - IF g = NIL THEN NEW(std); g := std END; - ASSERT(~(g IS RootFrame), 100); - e := NIL; f := host.down; WHILE (f # NIL) & (f.level <= level) DO e := f; f := f.next END; - IF e = NIL THEN g.next := host.down; host.down := g ELSE g.next := e.next; e.next := g END; - g.down := NIL; g.up := host; g.level := level; - g.view := view; - g.ConnectTo(host.rider.Base()); - g.state := open; - AdaptFrameTo(g, x, y); - IF ~(handler IN view.bad) THEN - a := actView; op := actOp; actView := view; actOp := handler; - view.HandleViewMsg(g, msg); - actView := a; actOp := op - END; - m := view.ThisModel(); - IF m # NIL THEN view.era := Models.Era(m) END; - END - ELSE - IF g.level # level THEN (* adapt to modified z-order *) - IF e = NIL THEN host.down := g.next ELSE e.next := g.next END; - e := NIL; f := host.down; WHILE (f # NIL) & (f.level <= level) DO e := f; f := f.next END; - IF e = NIL THEN g.next := host.down; host.down := g ELSE g.next := e.next; e.next := g END; - g.level := level - END; - AdaptFrameTo(g, x, y) (* may close g, leaving g.state = closed *) - (* possibly optimize: don't call Adapt if x=g.x, y=g.y, "host.era=g.era" *) - END; - IF (g # NIL) & (g.state = open) THEN - IF focus THEN - g.front := host.front; g.mark := host.mark - ELSE - g.front := FALSE; g.mark := FALSE - END - END - END InstallFrame; - - PROCEDURE RemoveAll (f: Frame); - VAR g, p: Frame; - BEGIN - g := f.down; WHILE g # NIL DO p := g.next; RemoveAll(g); Close(g); g := p END; - f.down := NIL - END RemoveAll; - - PROCEDURE RemoveFrame* (host, f: Frame); - VAR g, h: Frame; - BEGIN - ASSERT(host # NIL, 20); ASSERT(host.state = open, 21); - ASSERT(f # NIL, 22); ASSERT(f.up = host, 23); - g := host.down; h := NIL; - WHILE (g # NIL) & (g # f) DO h := g; g := g.next END; - ASSERT(g = f, 24); - IF h = NIL THEN host.down := f.next ELSE h.next := f.next END; - RemoveAll(f); Close(f) - END RemoveFrame; - - PROCEDURE RemoveFrames* (host: Frame; l, t, r, b: INTEGER); - VAR f, g: Frame; gl, gt, gr, gb: INTEGER; - BEGIN - ASSERT(host # NIL, 20); ASSERT(host.state = open, 21); - IF l < host.l THEN l := host.l END; - IF t < host.t THEN t := host.t END; - IF r > host.r THEN r := host.r END; - IF b > host.b THEN b := host.b END; - IF (l < r) & (t < b) THEN - gl := l + host.gx; gt := t + host.gy; gr := r + host.gx; gb := b + host.gy; - f := host.down; - WHILE f # NIL DO - g := f; f := f.next; - IF (gl < g.r + g.gx) & (g.l + g.gx < gr) & (gt < g.b + g.gy) & (g.t + g.gy < gb) THEN - RemoveFrame(host, g) - END - END - END - END RemoveFrames; - - PROCEDURE ThisFrame* (host: Frame; view: View): Frame; - VAR g: Frame; - BEGIN - ASSERT(host # NIL, 20); ASSERT(host.state = open, 21); - g := host.down; WHILE (g # NIL) & (g.view # view) DO g := g.next END; - RETURN g - END ThisFrame; - - PROCEDURE FrameAt* (host: Frame; x, y: INTEGER): Frame; - (** return frontmost sub-frame of host that contains (x, y) **) - VAR g, h: Frame; - BEGIN - ASSERT(host # NIL, 20); ASSERT(host.state = open, 21); - g := host.down; h := NIL; INC(x, host.gx); INC(y, host.gy); - WHILE g # NIL DO - IF (g.gx + g.l <= x) & (x < g.gx + g.r) & (g.gy + g.t <= y) & (y < g.gy + g.b) THEN - h := g - END; - g := g.next - END; - RETURN h - END FrameAt; - - PROCEDURE ShiftFrames (f: Frame; dx, dy: INTEGER); - VAR g, h: Frame; - BEGIN - g := f.down; - WHILE g # NIL DO - h := g; g := g.next; - AdaptFrameTo(h, h.x + dx, h.y + dy); - IF h.l = h.r THEN RemoveFrame(f, h) END - END - END ShiftFrames; - - PROCEDURE UpdateExposedArea (f: Frame; dx, dy: INTEGER); - VAR root: RootFrame; - BEGIN - root := RootOf(f); - IF dy > 0 THEN - AddRect(root, f, f.l, f.t, f.r, f.t + dy, keepFrames); - IF dx > 0 THEN - AddRect(root, f, f.l, f.t + dy, f.l + dx, f.b, keepFrames) - ELSE - AddRect(root, f, f.r + dx, f.t + dy, f.r, f.b, keepFrames) - END - ELSE - AddRect(root, f, f.l, f.b + dy, f.r, f.b, keepFrames); - IF dx > 0 THEN - AddRect(root, f, f.l, f.t, f.l + dx, f.b + dy, keepFrames) - ELSE - AddRect(root, f, f.r + dx, f.t, f.r, f.b + dy, keepFrames) - END - END - END UpdateExposedArea; - - PROCEDURE ScrollFrame (f: Frame; dx, dy: INTEGER); - VAR g: Frame; u, dx0, dy0: INTEGER; bitmapScrolling: BOOLEAN; msg: ScrollClassMsg; - BEGIN - g := f.up; - bitmapScrolling := TRUE; - IF (g # NIL) THEN - WHILE bitmapScrolling & (g.up # NIL) DO - msg.allowBitmapScrolling := FALSE; g.view.HandleViewMsg(g, msg); - bitmapScrolling := bitmapScrolling & msg.allowBitmapScrolling; - g := g.up - END - END; - IF bitmapScrolling THEN - u := f.unit; dx0 := dx; dy0 := dy; - INC(dx, f.sx); INC(dy, f.sy); DEC(f.l, f.sx); DEC(f.t, f.sy); DEC(f.r, f.sx); DEC(f.b, f.sy); - f.sx := dx MOD u; f.sy := dy MOD u; - DEC(dx, f.sx); DEC(dy, f.sy); INC(f.l, f.sx); INC(f.t, f.sy); INC(f.r, f.sx); INC(f.b, f.sy); - f.SetOffset(f.gx0 - f.sx, f.gy0 - f.sy); - ShiftFrames(f, dx0, dy0); - f.Scroll(dx, dy); - UpdateExposedArea(f, dx, dy) - ELSE AddRect(RootOf(f), f, f.l, f.t, f.r, f.b, rebuildFrames) - END - END ScrollFrame; - - PROCEDURE BroadcastModelMsg* (f: Frame; VAR msg: Models.Message); - VAR v, a: View; send: BOOLEAN; op: INTEGER; - BEGIN - ASSERT(f # NIL, 20); ASSERT(f.state = open, 21); - v := f.view; - IF ~(handler IN v.bad) THEN - a := actView; op := actOp; actView := v; actOp := handler; - IF msg.model # NIL THEN - IF (msg.model = v.ThisModel()) & (msg.era > v.era) THEN - send := (msg.era - v.era = 1); - v.era := msg.era; - IF ~send THEN - Log.synch := FALSE; - HALT(100) - END - ELSE send := FALSE - END - ELSE send := TRUE - END; - IF send THEN - WITH msg: Models.NeutralizeMsg DO - v.Neutralize - ELSE - v.HandleModelMsg(msg) - END - END; - actView := a; actOp := op - END; - f := f.down; WHILE f # NIL DO BroadcastModelMsg(f, msg); f := f.next END - END BroadcastModelMsg; - - PROCEDURE HandleUpdateMsg (f: Frame; VAR msg: UpdateMsg); - VAR root: RootFrame; g: Frame; l, t, r, b, dx, dy: INTEGER; - BEGIN - root := RootOf(f); - IF msg.scroll THEN - IF root.update.n = 0 THEN - ScrollFrame(f, msg.dx, msg.dy) - ELSE - AddRect(root, f, f.l, f.t, f.r, f.b, msg.rebuild) - END - ELSE - IF msg.all THEN - IF f # root THEN g := f.up ELSE g := root END; - dx := f.gx - g.gx; dy := f.gy - g.gy; - AddRect(root, g, f.l + dx, f.t + dy, f.r + dx, f.b + dy, msg.rebuild) - ELSE - l := msg.l; t := msg.t; r := msg.r; b := msg.b; - IF l < f.l THEN l := f.l END; - IF t < f.t THEN t := f.t END; - IF r > f.r THEN r := f.r END; - IF b > f.b THEN b := f.b END; - AddRect(root, f, l, t, r, b, msg.rebuild) - END - END - END HandleUpdateMsg; - - PROCEDURE BroadcastViewMsg* (f: Frame; VAR msg: Message); - VAR v, a: View; op: INTEGER; - BEGIN - ASSERT(f # NIL, 20); ASSERT(f.state = open, 21); - v := f.view; - IF (msg.view = v) OR (msg.view = NIL) THEN - WITH msg: UpdateMsg DO - HandleUpdateMsg(f, msg) - ELSE - IF ~(handler IN v.bad) THEN - a := actView; op := actOp; actView := v; actOp := handler; - v.HandleViewMsg(f, msg); - actView := a; actOp := op - END - END - END; - IF msg.view # v THEN - f := f.down; WHILE f # NIL DO BroadcastViewMsg(f, msg); f := f.next END - END - END BroadcastViewMsg; - - PROCEDURE ForwardCtrlMsg* (f: Frame; VAR msg: CtrlMessage); - CONST pre = 0; translate = 1; backoff = 2; final = 3; - VAR v, focus, a: View; g, h: Frame; op: INTEGER; req: BOOLEAN; - BEGIN - ASSERT(f # NIL, 20); ASSERT(f.state = open, 21); - v := f.view; - focus := NIL; g := f.up; req := FALSE; - HandleCtrlMsg(pre, f, g, msg, f.mark, f.front, req); - IF ~(handler IN v.bad) THEN - a := actView; op := actOp; actView := v; actOp := handler; - v.HandleCtrlMsg(f, msg, focus); - actView := a; actOp := op - END; - IF focus # NIL THEN (* propagate msg to another view *) - IF (f.focus # NIL) & (f.focus.view = focus) THEN (* cache hit *) - h := f.focus - ELSE (* cache miss *) - h := f.down; WHILE (h # NIL) & (h.view # focus) DO h := h.next END - END; - IF h # NIL THEN - HandleCtrlMsg(translate, f, h, msg, f.mark, f.front, req); - f.focus := h; ForwardCtrlMsg(h, msg); - HandleCtrlMsg(backoff, f, g, msg, f.mark, f.front, req) - END - ELSE - HandleCtrlMsg(final, f, g, msg, f.mark, f.front, req) - END; - IF req & (g # NIL) THEN g.view.ConsiderFocusRequestBy(f.view) END - END ForwardCtrlMsg; - - - PROCEDURE RestoreFrame (f: Frame; l, t, r, b: INTEGER); - VAR rd: Ports.Rider; g: Frame; v, a: View; op: INTEGER; - u, w, h, cl, ct, cr, cb, dx, dy: INTEGER; col: Ports.Color; - BEGIN - IF l < f.l THEN l := f.l END; - IF t < f.t THEN t := f.t END; - IF r > f.r THEN r := f.r END; - IF b > f.b THEN b := f.b END; - IF (l < r) & (t < b) THEN (* non-empty rectangle to be restored *) - v := f.view; rd := f.rider; u := f.unit; - rd.GetRect(cl, ct, cr, cb); (* save clip rectangle *) - rd.SetRect((f.gx + l) DIV u, (f.gy + t) DIV u, (f.gx + r) DIV u, (f.gy + b) DIV u); - IF ~(restore IN v.bad) THEN - a := actView; op := actOp; actView := v; actOp := restore; - col := transparent; v.GetBackground(col); - IF col # transparent THEN f.DrawRect(l, t, r, b, Ports.fill, col) END; - v.Restore(f, l, t, r, b); - g := f.down; - WHILE g # NIL DO (* loop over all subframes to handle overlaps *) - dx := f.gx - g.gx; dy := f.gy - g.gy; - RestoreFrame(g, l + dx, t + dy, r + dx, b + dy); - g := g.next - END; - v.RestoreMarks(f, l, t, r, b); - actView := a; actOp := op - END; - IF v.bad # {} THEN - IF externalize IN v.bad THEN - u := f.dot; v.context.GetSize(w, h); - f.DrawLine(0, 0, w - u, h - u, u, Ports.grey75); - f.DrawLine(w - u, 0, 0, h - u, u, Ports.grey75) - END; - f.MarkRect(l, t, r, b, Ports.fill, Ports.dim25, Ports.show) - END; - rd.SetRect(cl, ct, cr, cb) (* restore current clip rectangle *) - END - END RestoreFrame; - - PROCEDURE RestoreRoot* (root: RootFrame; l, t, r, b: INTEGER); - VAR port: Ports.Port; rd: Ports.Rider; - u, gl, gt, gr, gb: INTEGER; col: Ports.Color; - BEGIN - ASSERT(root # NIL, 20); ASSERT(root.state = open, 21); - ASSERT(root.update.n = 0, 22); - IF l < root.l THEN l := root.l END; - IF t < root.t THEN t := root.t END; - IF r > root.r THEN r := root.r END; - IF b > root.b THEN b := root.b END; - IF (l < r) & (t < b) THEN - u := root.unit; - gl := l + root.gx; gt := t + root.gy; gr := r + root.gx; gb := b + root.gy; - rd := root.rider; port := rd.Base(); - actFrame := root; - IF ~IsPrinterFrame(root) THEN port.OpenBuffer(gl DIV u, gt DIV u, gr DIV u, gb DIV u) END; - col := transparent; root.view.GetBackground(col); - ASSERT(col # transparent, 100); - RestoreFrame(root, l, t, r, b); - IF ~IsPrinterFrame(root) THEN port.CloseBuffer END; - actFrame := NIL - END - END RestoreRoot; - - PROCEDURE ThisCand (f: Frame; v: View): Frame; - (* find frame g with g.view = v *) - VAR g: Frame; - BEGIN - WHILE (f # NIL) & (f.view # v) DO - g := ThisCand(f.down, v); - IF g # NIL THEN f := g ELSE f := f.next END - END; - RETURN f - END ThisCand; - - PROCEDURE ValidateRoot* (root: RootFrame); - VAR rgn: Region; f: Frame; v: View; i, n: INTEGER; - BEGIN - ASSERT(root # NIL, 20); ASSERT(root.state = open, 21); - rgn := root.update; n := rgn.n; rgn.n := 0; i := 0; - WHILE i < n DO - IF rgn.r[i].rebuild THEN - v := rgn.r[i].v; - IF v # NIL THEN f := ThisCand(root, v) ELSE f := NIL END; - IF f = NIL THEN f := root END; - RemoveFrames(f, rgn.r[i].l - f.gx, rgn.r[i].t - f.gy, rgn.r[i].r - f.gx, rgn.r[i].b - f.gy) - END; - INC(i) - END; - i := 0; - WHILE i < n DO - RestoreRoot(root, rgn.r[i].l - root.gx, rgn.r[i].t - root.gy, rgn.r[i].r - root.gx, rgn.r[i].b - root.gy); - INC(i) - END - END ValidateRoot; - - PROCEDURE MarkBordersIn (f: Frame); - VAR g: Frame; w, h: INTEGER; - BEGIN - g := f.down; - WHILE g # NIL DO - g.view.context.GetSize(w, h); - MarkBorder(f, g.view, g.x, g.y, g.x + w, g.y + h); - MarkBordersIn(g); - g := g.next - END - END MarkBordersIn; - - PROCEDURE MarkBorders* (root: RootFrame); - BEGIN - MarkBordersIn(root) - END MarkBorders; - - PROCEDURE ReadFont* (VAR rd: Stores.Reader; OUT f: Fonts.Font); - VAR version: INTEGER; - fingerprint, size: INTEGER; typeface: Fonts.Typeface; style: SET; weight: INTEGER; - BEGIN - rd.ReadVersion(0, 0, version); - rd.ReadInt(fingerprint); - rd.ReadXString(typeface); rd.ReadInt(size); rd.ReadSet(style); rd.ReadXInt(weight); - f := Fonts.dir.This(typeface, size, style, weight); ASSERT(f # NIL, 60); - IF f.IsAlien() THEN - Stores.Report("#System:AlienFont", typeface, "", "") - END - END ReadFont; - - PROCEDURE WriteFont* (VAR wr: Stores.Writer; f: Fonts.Font); - BEGIN - ASSERT(f # NIL, 20); - wr.WriteVersion(0); - wr.WriteInt(0); - wr.WriteXString(f.typeface); wr.WriteInt(f.size); wr.WriteSet(f.style); wr.WriteXInt(f.weight) - END WriteFont; - - - (** view/file interaction **) - - PROCEDURE Old* (ask: BOOLEAN; - VAR loc: Files.Locator; VAR name: Files.Name; VAR conv: Converters.Converter): View; - VAR v: View; - BEGIN - ASSERT(ask OR (loc # NIL), 20); - ASSERT(ask OR (name # ""), 21); - IF ask THEN - ASSERT(getSpecHook # NIL, 101); - getSpecHook.GetIntSpec(loc, name, conv) - END; - IF (loc # NIL) & (name # "") THEN - ASSERT(viewHook # NIL, 100); - v := viewHook.OldView(loc, name, conv) - ELSE v := NIL - END; - RETURN v - END Old; - - PROCEDURE OldView* (loc: Files.Locator; name: Files.Name): View; - VAR conv: Converters.Converter; - BEGIN - conv := NIL; - RETURN Old(dontAsk, loc, name, conv) - END OldView; - - PROCEDURE Register* (view: View; ask: BOOLEAN; - VAR loc: Files.Locator; VAR name: Files.Name; VAR conv: Converters.Converter; OUT res: INTEGER); - BEGIN - ASSERT(viewHook # NIL, 100); - ASSERT(getSpecHook # NIL, 101); - ASSERT(view # NIL, 20); - ASSERT(ask OR (loc # NIL), 22); ASSERT(ask OR (name # ""), 23); - IF ask OR (loc = NIL) OR (name = "") OR (loc.res = 77) THEN - getSpecHook.GetExtSpec(view, loc, name, conv) - END; - IF (loc # NIL) & (name # "") THEN - viewHook.RegisterView(view, loc, name, conv); res := loc.res - ELSE res := 7 - END - END Register; - - PROCEDURE RegisterView* (view: View; loc: Files.Locator; name: Files.Name); - VAR res: INTEGER; conv: Converters.Converter; - BEGIN - conv := NIL; - Register(view, dontAsk, loc, name, conv, res) - END RegisterView; - - (** direct view opening **) - - PROCEDURE Open* (view: View; loc: Files.Locator; name: Files.Name; conv: Converters.Converter); - BEGIN - ASSERT(view # NIL, 20); ASSERT((loc = NIL) = (name = ""), 21); - ASSERT(viewHook # NIL, 100); - viewHook.Open(view, name, loc, name, conv, FALSE, FALSE, FALSE, FALSE, FALSE) - END Open; - - PROCEDURE OpenView* (view: View); - BEGIN - ASSERT(view # NIL, 20); - Open(view, NIL, "", NIL) - END OpenView; - - PROCEDURE OpenAux* (view: View; title: Title); - BEGIN - ASSERT(view # NIL, 20); ASSERT(viewHook # NIL, 100); - IF title = "" THEN title := "#System:untitled" END; - viewHook.Open(view, title, NIL, "", NIL, FALSE, TRUE, FALSE, TRUE, TRUE) - END OpenAux; - - - (** view producer/consumer decoupling **) - - PROCEDURE Deposit* (view: View); - VAR q: QueueElem; - BEGIN - ASSERT(view # NIL, 20); - NEW(q); q.view := view; - IF queue.head = NIL THEN queue.head := q ELSE queue.tail.next := q END; - queue.tail := q; INC(queue.len) - END Deposit; - - PROCEDURE Fetch* (OUT view: View); - VAR q: QueueElem; - BEGIN - q := queue.head; ASSERT(q # NIL, 20); - DEC(queue.len); queue.head := q.next; - IF queue.head = NIL THEN queue.tail := NIL END; - view := q.view - END Fetch; - - PROCEDURE Available* (): INTEGER; - BEGIN - RETURN queue.len - END Available; - - PROCEDURE ClearQueue*; - BEGIN - queue.len := 0; queue.head := NIL; queue.tail := NIL; - actView := NIL (* HACK! prevents invalidation of view due to trap in Dialog.Call *) - END ClearQueue; - - - (** attach controller framework **) - - PROCEDURE InitCtrl* (p: CtrlMsgHandler); - BEGIN - ASSERT(HandleCtrlMsg = NIL, 20); HandleCtrlMsg := p - END InitCtrl; - - PROCEDURE (h: NotifyHook) Notify (id0, id1: INTEGER; opts: SET); - VAR msg: NotifyMsg; - BEGIN - ASSERT(msgHook # NIL, 100); - msg.id0 := id0; msg.id1 := id1; msg.opts := opts; - msgHook.Omnicast(msg) - END Notify; - - PROCEDURE Omnicast* (VAR msg: ANYREC); - BEGIN - msgHook.Omnicast(msg) - END Omnicast; - - PROCEDURE HandlePropMsg* (v: View; VAR msg: PropMessage); - VAR a: View; op: INTEGER; - BEGIN - IF ~(handler IN v.bad) THEN - a := actView; op := actOp; actView := v; actOp := handler; - v.HandlePropMsg(msg); - actView := a; actOp := op - END - END HandlePropMsg; - - - (* view invalidation *) - - PROCEDURE IsInvalid* (v: View): BOOLEAN; - BEGIN - RETURN v.bad # {} - END IsInvalid; - - PROCEDURE RevalidateView* (v: View); - BEGIN - v.bad := {}; - Update(v, keepFrames) - END RevalidateView; - - PROCEDURE TrapCleanup; - BEGIN - copyModel := NIL; - IF actView # NIL THEN - INCL(actView.bad, actOp); - IF actFrame # NIL THEN - UpdateRoot(actFrame, actFrame.l, actFrame.t, actFrame.r, actFrame.b, keepFrames); - actFrame := NIL - END; - Update(actView, keepFrames); - actView := NIL - END - END TrapCleanup; - - PROCEDURE Init; - VAR h: NotifyHook; - BEGIN - NEW(h); Dialog.SetNotifyHook(h); - domainGuard := 0; ClearQueue; - Kernel.InstallTrapChecker(TrapCleanup) - END Init; - -BEGIN - Init -END Views. diff --git a/new/System/Mod/Windows.odc b/new/System/Mod/Windows.odc new file mode 100644 index 0000000000000000000000000000000000000000..425806c7d5631baa029b9c59aa854e3b11a41ae2 GIT binary patch literal 27620 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 J_@||X{{c&%AOZjY literal 0 HcmV?d00001 diff --git a/new/System/Mod/Windows.txt b/new/System/Mod/Windows.txt deleted file mode 100644 index abe145d..0000000 --- a/new/System/Mod/Windows.txt +++ /dev/null @@ -1,855 +0,0 @@ -MODULE Windows; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Windows.odc *) - (* DO NOT EDIT *) - - IMPORT - Kernel, Ports, Files, Services, - Stores, Sequencers, Models, Views, Controllers, Properties, - Dialog, Converters, Containers, Documents; - - CONST - (** Window.flags **) - isTool* = 0; isAux* = 1; - noHScroll* = 2; noVScroll* = 3; noResize* = 4; - allowDuplicates* = 5; neverDirty* = 6; - - (** Directory.Select lazy **) - eager* = FALSE; lazy* = TRUE; - - notRecorded = 3; - - TYPE - Window* = POINTER TO ABSTRACT RECORD - port-: Ports.Port; - frame-: Views.RootFrame; - doc-: Documents.Document; - seq-: Sequencers.Sequencer; - link-: Window; (* ring of windows with same sequencer *) - sub-: BOOLEAN; - flags-: SET; - loc-: Files.Locator; - name-: Files.Name; - conv-: Converters.Converter - END; - - Directory* = POINTER TO ABSTRACT RECORD - l*, t*, r*, b*: INTEGER; - minimized*, maximized*: BOOLEAN - END; - - - OpElem = POINTER TO RECORD - next: OpElem; - st: Stores.Store; - op: Stores.Operation; - name: Stores.OpName; - invisible, transparent: BOOLEAN - END; - - Script = POINTER TO RECORD (Stores.Operation) - up: Script; - list: OpElem; - level: INTEGER; (* nestLevel at creation time *) - name: Stores.OpName - END; - - StdSequencer = POINTER TO RECORD (Sequencers.Sequencer) - home: Window; - trapEra: INTEGER; (* last observed TrapCount value *) - modLevel: INTEGER; (* dirty if modLevel > 0 *) - entryLevel: INTEGER; (* active = (entryLevel > 0) *) - nestLevel: INTEGER; (* nesting level of BeginScript/Modification *) - modStack: ARRAY 64 OF RECORD store: Stores.Store; type: INTEGER END; - lastSt: Stores.Store; - lastOp: Stores.Operation; - script: Script; - undo, redo: OpElem; (* undo/redo stacks *) - noUndo: BOOLEAN; (* script # NIL and BeginModification called *) - invisibleLevel, transparentLevel, notRecordedLevel: INTEGER - END; - - SequencerDirectory = POINTER TO RECORD (Sequencers.Directory) END; - - Forwarder = POINTER TO RECORD (Controllers.Forwarder) END; - - RootContext = POINTER TO RECORD (Models.Context) - win: Window - END; - - Reducer = POINTER TO RECORD (Kernel.Reducer) END; - - Hook = POINTER TO RECORD (Views.MsgHook) END; - - CheckAction = POINTER TO RECORD (Services.Action) - wait: WaitAction - END; - - WaitAction = POINTER TO RECORD (Services.Action) - check: CheckAction - END; - - LangNotifier = POINTER TO RECORD (Dialog.LangNotifier) END; - - VAR dir-, stdDir-: Directory; - - PROCEDURE ^ Reset (s: StdSequencer); - - - PROCEDURE CharError; - BEGIN - Dialog.Beep - END CharError; - - - - (** Window **) - - PROCEDURE (w: Window) Init* (port: Ports.Port), NEW; - BEGIN - ASSERT(w.port = NIL, 20); ASSERT(port # NIL, 21); - w.port := port - END Init; - - PROCEDURE (w: Window) SetTitle* (title: Views.Title), NEW, ABSTRACT; - PROCEDURE (w: Window) GetTitle* (OUT title: Views.Title), NEW, ABSTRACT; - PROCEDURE (w: Window) RefreshTitle* (), NEW, ABSTRACT; - - PROCEDURE (w: Window) SetSpec* (loc: Files.Locator; name: Files.Name; conv: Converters.Converter), NEW, EXTENSIBLE; - VAR u: Window; - BEGIN - u := w; - REPEAT - u := u.link; - u.loc := loc; u.name := name$; u.conv := conv - UNTIL u = w - END SetSpec; - - PROCEDURE (w: Window) Restore* (l, t, r, b: INTEGER), NEW; - VAR f: Views.Frame; u, pw, ph: INTEGER; - BEGIN - f := w.frame; - IF f # NIL THEN - w.port.GetSize(pw, ph); u := w.port.unit; - IF r > pw THEN r := pw END; - IF b > ph THEN b := ph END; - l := l * u - f.gx; t := t * u - f.gy; r := r * u - f.gx; b := b * u - f.gy; - (* only adds to the BlackBox region, but doesn't draw: *) - Views.UpdateRoot(w.frame, l, t, r, b, Views.keepFrames) - END - END Restore; - - PROCEDURE (w: Window) Update*, NEW; - BEGIN - ASSERT(w.frame # NIL, 20); - (* redraws the whole accumulated BlackBox region: *) - Views.ValidateRoot(w.frame) - END Update; - - PROCEDURE (w: Window) GetSize*(OUT width, height: INTEGER), NEW, EXTENSIBLE; - BEGIN - w.port.GetSize(width, height) - END GetSize; - - PROCEDURE (w: Window) SetSize* (width, height: INTEGER), NEW, EXTENSIBLE; - VAR c: Containers.Controller; w0, h0: INTEGER; - BEGIN - w.port.GetSize(w0, h0); - w.port.SetSize(width, height); - IF w.frame # NIL THEN Views.AdaptRoot(w.frame) END; - c := w.doc.ThisController(); - IF c.opts * {Documents.winWidth, Documents.winHeight} # {} THEN - w.Restore(0, 0, width, height) - END - END SetSize; - - PROCEDURE (w: Window) BroadcastModelMsg* (VAR msg: Models.Message), NEW, EXTENSIBLE; - BEGIN - IF w.frame # NIL THEN - Views.BroadcastModelMsg(w.frame, msg) - END - END BroadcastModelMsg; - - PROCEDURE (w: Window) BroadcastViewMsg* (VAR msg: Views.Message), NEW, EXTENSIBLE; - BEGIN - IF w.frame # NIL THEN - Views.BroadcastViewMsg(w.frame, msg) - END - END BroadcastViewMsg; - - PROCEDURE (w: Window) ForwardCtrlMsg* (VAR msg: Controllers.Message), NEW, EXTENSIBLE; - BEGIN - IF w.frame # NIL THEN - WITH msg: Controllers.CursorMessage DO - DEC(msg.x, w.frame.gx); DEC(msg.y, w.frame.gy) - ELSE - END; - Views.ForwardCtrlMsg(w.frame, msg) - END - END ForwardCtrlMsg; - - PROCEDURE (w: Window) MouseDown* (x, y, time: INTEGER; modifiers: SET), NEW, ABSTRACT; - - PROCEDURE (w: Window) KeyDown* (ch: CHAR; modifiers: SET), NEW, EXTENSIBLE; - VAR key: Controllers.EditMsg; - BEGIN - IF ch = 0X THEN - CharError - ELSE - key.op := Controllers.pasteChar; key.char := ch; - key.modifiers:= modifiers; - w.ForwardCtrlMsg(key) - END - END KeyDown; - - PROCEDURE (w: Window) Close*, NEW, EXTENSIBLE; - VAR u: Window; f: Views.Frame; s: Sequencers.Sequencer; msg: Sequencers.RemoveMsg; - BEGIN - u := w.link; WHILE u.link # w DO u := u.link END; - u.link := w.link; - f := w.frame; s := w.seq; - IF ~w.sub THEN s.Notify(msg) END; - WITH s: StdSequencer DO - IF s.home = w THEN s.home := NIL END - ELSE - END; - w.port.SetSize(0, 0); Views.AdaptRoot(w.frame); - w.port := NIL; w.frame := NIL; w.doc := NIL; w.seq := NIL; w.link := NIL; w.loc := NIL; - f.Close - END Close; - - - (** Directory **) - - PROCEDURE (d: Directory) NewSequencer* (): Sequencers.Sequencer, NEW; - VAR s: StdSequencer; - BEGIN - NEW(s); Reset(s); RETURN s - END NewSequencer; - - - PROCEDURE (d: Directory) First* (): Window, NEW, ABSTRACT; - PROCEDURE (d: Directory) Next* (w: Window): Window, NEW, ABSTRACT; - - PROCEDURE (d: Directory) New* (): Window, NEW, ABSTRACT; - - PROCEDURE (d: Directory) Open* (w: Window; doc: Documents.Document; - flags: SET; name: Views.Title; - loc: Files.Locator; fname: Files.Name; - conv: Converters.Converter), - NEW, EXTENSIBLE; - VAR v: Views.View; c: RootContext; s: Sequencers.Sequencer; f: Views.Frame; any: ANYPTR; - BEGIN - ASSERT(w # NIL, 20); ASSERT(doc # NIL, 21); ASSERT(doc.context = NIL, 22); - v := doc.ThisView(); ASSERT(v # NIL, 23); - ASSERT(w.doc = NIL, 24); ASSERT(w.port # NIL, 25); - IF w.link = NIL THEN w.link := w END; (* create new window ring *) - w.doc := doc; w.flags := flags; - IF w.seq = NIL THEN - ASSERT(doc.Domain() # NIL, 27); - any := doc.Domain().GetSequencer(); - IF any # NIL THEN - ASSERT(any IS Sequencers.Sequencer, 26); - w.seq := any(Sequencers.Sequencer) - ELSE - w.seq := d.NewSequencer(); - doc.Domain().SetSequencer(w.seq) - END - END; - s := w.seq; - WITH s: StdSequencer DO - IF s.home = NIL THEN s.home := w END - ELSE - END; - NEW(c); c.win := w; doc.InitContext(c); - doc.GetNewFrame(f); w.frame := f(Views.RootFrame); - w.frame.ConnectTo(w.port); - Views.SetRoot(w.frame, w.doc, FALSE, w.flags); - w.SetSpec(loc, fname, conv) - END Open; - - PROCEDURE (d: Directory) OpenSubWindow* (w: Window; doc: Documents.Document; flags: SET; name: Views.Title), NEW, EXTENSIBLE; - VAR u: Window; title: Views.Title; - BEGIN - ASSERT(w # NIL, 20); ASSERT(doc # NIL, 21); - u := d.First(); WHILE (u # NIL) & (u.seq # doc.Domain().GetSequencer()) DO u := d.Next(u) END; - IF u # NIL THEN - w.sub := TRUE; - w.link := u.link; u.link := w; - w.seq := u.seq; w.loc := u.loc; w.name := u.name; w.conv := u.conv; - u.GetTitle(title); - d.Open(w, doc, flags, title, u.loc, u.name, u.conv) - ELSE - d.Open(w, doc, flags, name, NIL, "", NIL) - END - END OpenSubWindow; - - PROCEDURE ^ RestoreSequencer(seq: Sequencers.Sequencer); - - PROCEDURE (d: Directory) Focus* (target: BOOLEAN): Window, NEW, ABSTRACT; - PROCEDURE (d: Directory) GetThisWindow* (p: Ports.Port; px, py: INTEGER; OUT x, y: INTEGER; OUT w: Window), NEW, ABSTRACT; - PROCEDURE (d: Directory) Select* (w: Window; lazy: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (d: Directory) Close* (w: Window), NEW, ABSTRACT; - - PROCEDURE (d: Directory) Update* (w: Window), NEW; - VAR u: Window; - BEGIN - (* redraws the BlackBox region of a given window, or of all windows *) - u := d.First(); - WHILE u # NIL DO - ASSERT(u.frame # NIL, 101); - IF (u = w) OR (w = NIL) THEN RestoreSequencer(u.seq) END; - u := d.Next(u) - END - END Update; - - PROCEDURE (d: Directory) GetBounds* (OUT w, h: INTEGER), NEW, ABSTRACT; - - - (* RootContext *) - - PROCEDURE (c: RootContext) GetSize (OUT w, h: INTEGER); - BEGIN - c.win.port.GetSize(w, h); - w := w * c.win.port.unit; h := h * c.win.port.unit - END GetSize; - - PROCEDURE (c: RootContext) SetSize (w, h: INTEGER); - END SetSize; - - PROCEDURE (c: RootContext) Normalize (): BOOLEAN; - BEGIN - RETURN TRUE - END Normalize; - - PROCEDURE (c: RootContext) ThisModel (): Models.Model; - BEGIN - RETURN NIL - END ThisModel; - - - (* sequencing utilities *) - - PROCEDURE Prepend (s: Script; st: Stores.Store; IN name: Stores.OpName; op: Stores.Operation); - VAR e: OpElem; - BEGIN - ASSERT(op # NIL, 20); - NEW(e); e.st := st; e.op := op; e.name := name; - e.next := s.list; s.list := e - END Prepend; - - PROCEDURE Push (VAR list, e: OpElem); - BEGIN - e.next := list; list := e - END Push; - - PROCEDURE Pop (VAR list, e: OpElem); - BEGIN - e := list; list := list.next - END Pop; - - PROCEDURE Reduce (VAR list: OpElem; max: INTEGER); - VAR e: OpElem; - BEGIN - e := list; WHILE (max > 1) & (e # NIL) DO DEC(max); e := e.next END; - IF e # NIL THEN e.next := NIL END - END Reduce; - - PROCEDURE (r: Reducer) Reduce (full: BOOLEAN); - VAR e: OpElem; n: INTEGER; w: Window; - BEGIN - IF dir # NIL THEN - w := dir.First(); - WHILE w # NIL DO - IF w.seq IS StdSequencer THEN - IF full THEN - n := 1 - ELSE - n := 0; e := w.seq(StdSequencer).undo; - WHILE e # NIL DO INC(n); e := e.next END; - IF n > 20 THEN n := n DIV 2 ELSE n := 10 END - END; - Reduce(w.seq(StdSequencer).undo, n) - END; - w := dir.Next(w) - END - END; - Kernel.InstallReducer(r) - END Reduce; - - PROCEDURE Reset (s: StdSequencer); - BEGIN - s.trapEra := Kernel.trapCount; - IF (s.entryLevel # 0) OR (s.nestLevel # 0) THEN - s.modLevel := 0; - s.entryLevel := 0; - s.nestLevel := 0; - s.lastSt := NIL; - s.lastOp := NIL; - s.script := NIL; - s.noUndo := FALSE; - s.undo := NIL; s.redo := NIL; - s.invisibleLevel := 0; - s.transparentLevel := 0; - s.notRecordedLevel := 0 - END - END Reset; - - PROCEDURE Neutralize (st: Stores.Store); - VAR neutralize: Models.NeutralizeMsg; - BEGIN - IF st # NIL THEN (* st = NIL for scripts *) - WITH st: Models.Model DO - Models.Broadcast(st, neutralize) - | st: Views.View DO - st.Neutralize - ELSE - END - END - END Neutralize; - - PROCEDURE Do (s: StdSequencer; st: Stores.Store; op: Stores.Operation); - BEGIN - INC(s.entryLevel); s.lastSt := NIL; s.lastOp := NIL; - Neutralize(st); op.Do; - DEC(s.entryLevel) - END Do; - - PROCEDURE AffectsDoc (s: StdSequencer; st: Stores.Store): BOOLEAN; - VAR v, w: Window; - BEGIN - w := s.home; - IF (w = NIL) OR (st = w.doc) OR (st = w.doc.ThisView()) THEN - RETURN TRUE - ELSE - v := w.link; - WHILE (v # w) & (st # v.doc) & (st # v.doc.ThisView()) DO v := v.link END; - RETURN v = w - END - END AffectsDoc; - - - (* Script *) - - PROCEDURE (s: Script) Do; - VAR e, f, g: OpElem; - BEGIN - e := s.list; f := NIL; - REPEAT - Neutralize(e.st); e.op.Do; - g := e.next; e.next := f; f := e; e := g - UNTIL e = NIL; - s.list := f - END Do; - - - (* StdSequencer *) - - PROCEDURE (s: StdSequencer) Handle (VAR msg: ANYREC); - (* send message to all windows attached to s *) - VAR w: Window; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - WITH msg: Models.Message DO - IF msg IS Models.UpdateMsg THEN - Properties.IncEra; - IF s.entryLevel = 0 THEN - (* updates in dominated model bypassed the sequencer *) - Reset(s); (* panic reset: clear sequencer *) - INC(s.modLevel) (* but leave dirty *) - END - END; - w := dir.First(); - WHILE w # NIL DO - IF w.seq = s THEN w.BroadcastModelMsg(msg) END; - w := dir.Next(w) - END - | msg: Views.Message DO - w := dir.First(); - WHILE w # NIL DO - IF w.seq = s THEN w.BroadcastViewMsg(msg) END; - w := dir.Next(w) - END - ELSE - END - END Handle; - - - PROCEDURE (s: StdSequencer) Dirty (): BOOLEAN; - BEGIN - RETURN s.modLevel > 0 - END Dirty; - - PROCEDURE (s: StdSequencer) SetDirty (dirty: BOOLEAN); - BEGIN - IF dirty THEN INC(s.modLevel) ELSE s.modLevel := 0 END - END SetDirty; - - PROCEDURE (s: StdSequencer) LastOp (st: Stores.Store): Stores.Operation; - BEGIN - ASSERT(st # NIL, 20); - IF s.lastSt = st THEN RETURN s.lastOp ELSE RETURN NIL END - END LastOp; - - - PROCEDURE (s: StdSequencer) BeginScript (IN name: Stores.OpName; VAR script: Stores.Operation); - VAR sop: Script; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - INC(s.nestLevel); - IF (s.nestLevel = 1) & (s.invisibleLevel = 0) & (s.transparentLevel = 0) & (s.notRecordedLevel = 0) THEN - INC(s.modLevel) - END; - s.lastSt := NIL; s.lastOp := NIL; - NEW(sop); sop.up := s.script; sop.list := NIL; sop.level := s.nestLevel; sop.name := name; - s.script := sop; - script := sop - END BeginScript; - - PROCEDURE (s: StdSequencer) Do (st: Stores.Store; IN name: Stores.OpName; op: Stores.Operation); - VAR e: OpElem; - BEGIN - ASSERT(st # NIL, 20); ASSERT(op # NIL, 21); - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - Do(s, st, op); - IF s.noUndo THEN (* cannot undo: unbalanced BeginModification pending *) - s.lastSt := NIL; s.lastOp := NIL - ELSIF (s.entryLevel = 0) (* don't record when called from within op.Do *) - & AffectsDoc(s, st) THEN (* don't record when Do affected child window only *) - s.lastSt := st; s.lastOp := op; - s.redo := NIL; (* clear redo stack *) - IF s.script # NIL THEN - Prepend(s.script, st, name, op) - ELSE - IF (s.invisibleLevel = 0) & (s.transparentLevel = 0) & (s.notRecordedLevel = 0) THEN INC(s.modLevel) END; - NEW(e); e.st := st; e.op := op; e.name := name; - e.invisible := s.invisibleLevel > 0; e.transparent := s.transparentLevel > 0; - IF (s.notRecordedLevel=0) THEN Push(s.undo, e) END - END - END - END Do; - - PROCEDURE (s: StdSequencer) Bunch (st: Stores.Store); - VAR lastOp: Stores.Operation; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - ASSERT(st # NIL, 20); ASSERT(st = s.lastSt, 21); - lastOp := s.lastOp; - Do(s, st, lastOp); - IF s.noUndo THEN - s.lastSt := NIL; s.lastOp := NIL - ELSIF (s.entryLevel = 0) (* don't record when called from within op.Do *) - & AffectsDoc(s, st) THEN (* don't record when Do affected child window only *) - s.lastSt := st; s.lastOp := lastOp - END - END Bunch; - - PROCEDURE (s: StdSequencer) EndScript (script: Stores.Operation); - VAR e: OpElem; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - ASSERT(script # NIL, 20); ASSERT(s.script = script, 21); - WITH script: Script DO - ASSERT(s.nestLevel = script.level, 22); - s.script := script.up; - IF s.entryLevel = 0 THEN (* don't record when called from within op.Do *) - IF script.list # NIL THEN - IF s.script # NIL THEN - Prepend(s.script, NIL, script.name, script) - ELSE (* outermost scripting level *) - s.redo := NIL; (* clear redo stack *) - IF ~s.noUndo THEN - NEW(e); e.st := NIL; e.op := script; e.name := script.name; - e.invisible := s.invisibleLevel > 0; e.transparent := s.transparentLevel > 0; - IF s.notRecordedLevel=0 THEN Push(s.undo, e) END - END; - s.lastSt := NIL; s.lastOp := NIL - END - ELSE - IF (s.script = NIL) & (s.modLevel > 0) & (s.invisibleLevel = 0) & (s.transparentLevel = 0) THEN - DEC(s.modLevel) - END - END - END - END; - DEC(s.nestLevel); - IF s.nestLevel = 0 THEN ASSERT(s.script = NIL, 22); s.noUndo := FALSE END - END EndScript; - - PROCEDURE (s: StdSequencer) StopBunching; - BEGIN - s.lastSt := NIL; s.lastOp := NIL - END StopBunching; - - PROCEDURE (s: StdSequencer) BeginModification (type: INTEGER; st: Stores.Store); - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - IF s.nestLevel < LEN(s.modStack) THEN s.modStack[s.nestLevel].store := st; s.modStack[s.nestLevel].type := type END; - INC(s.nestLevel); - IF type = Sequencers.notUndoable THEN - INC(s.modLevel); (* unbalanced! *) - s.noUndo := TRUE; s.undo := NIL; s.redo := NIL; - s.lastSt := NIL; s.lastOp := NIL; - INC(s.entryLevel) (* virtual entry of modification "operation" *) - ELSIF type = Sequencers.invisible THEN - INC(s.invisibleLevel) - ELSIF type = Sequencers.clean THEN - INC(s.transparentLevel) - ELSIF type = notRecorded THEN - INC(s.notRecordedLevel) - END - END BeginModification; - - PROCEDURE (s: StdSequencer) EndModification (type: INTEGER; st: Stores.Store); - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - ASSERT(s.nestLevel > 0, 20); - IF s.nestLevel <= LEN(s.modStack) THEN - ASSERT((s.modStack[s.nestLevel - 1].store = st) & (s.modStack[s.nestLevel - 1].type = type), 21) - END; - DEC(s.nestLevel); - IF type = Sequencers.notUndoable THEN - DEC(s.entryLevel) - ELSIF type = Sequencers.invisible THEN - DEC(s.invisibleLevel) - ELSIF type = Sequencers.clean THEN - DEC(s.transparentLevel) - ELSIF type = notRecorded THEN - DEC(s.notRecordedLevel) - END; - IF s.nestLevel = 0 THEN ASSERT(s.script = NIL, 22); s.noUndo := FALSE END - END EndModification; - - PROCEDURE (s: StdSequencer) CanUndo (): BOOLEAN; - VAR op: OpElem; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - op := s.undo; - WHILE (op # NIL) & op.invisible DO op := op.next END; - RETURN op # NIL - END CanUndo; - - PROCEDURE (s: StdSequencer) CanRedo (): BOOLEAN; - VAR op: OpElem; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - op := s.redo; - WHILE (op # NIL) & op.invisible DO op := op.next END; - RETURN op # NIL - END CanRedo; - - PROCEDURE (s: StdSequencer) GetUndoName (VAR name: Stores.OpName); - VAR op: OpElem; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - op := s.undo; - WHILE (op # NIL) & op.invisible DO op := op.next END; - IF op # NIL THEN name := op.name$ ELSE name[0] := 0X END - END GetUndoName; - - PROCEDURE (s: StdSequencer) GetRedoName (VAR name: Stores.OpName); - VAR op: OpElem; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - op := s.redo; - WHILE (op # NIL) & op.invisible DO op := op.next END; - IF op # NIL THEN name := op.name$ ELSE name[0] := 0X END - END GetRedoName; - - PROCEDURE (s: StdSequencer) Undo; - VAR e: OpElem; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - IF s.undo # NIL THEN - REPEAT - Pop(s.undo, e); Do(s, e.st, e.op); Push(s.redo, e) - UNTIL ~e.invisible OR (s.undo = NIL); - IF ~e.transparent THEN - IF s.modLevel > 0 THEN DEC(s.modLevel) END - END - END - END Undo; - - PROCEDURE (s: StdSequencer) Redo; - VAR e: OpElem; - BEGIN - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - IF s.redo # NIL THEN - Pop(s.redo, e); Do(s, e.st, e.op); Push(s.undo, e); - WHILE (s.redo # NIL) & s.redo.invisible DO - Pop(s.redo, e); Do(s, e.st, e.op); Push(s.undo, e) - END; - IF ~e.transparent THEN - INC(s.modLevel) - END - END - END Redo; - - - (* Forwarder *) - - PROCEDURE (f: Forwarder) Forward (target: BOOLEAN; VAR msg: Controllers.Message); - VAR w: Window; - BEGIN - w := dir.Focus(target); - IF w # NIL THEN w.ForwardCtrlMsg(msg) END - END Forward; - - PROCEDURE (f: Forwarder) Transfer (VAR msg: Controllers.TransferMessage); - VAR w: Window; h: Views.Frame; p: Ports.Port; sx, sy, tx, ty, pw, ph: INTEGER; - BEGIN - h := msg.source; p := h.rider.Base(); - (* (msg.x, msg.y) is point in local coordinates of source frame *) - sx := (msg.x + h.gx) DIV h.unit; - sy := (msg.y + h.gy) DIV h.unit; - (* (sx, sy) is point in global coordinates of source port *) - dir.GetThisWindow(p, sx, sy, tx, ty, w); - IF w # NIL THEN - (* (tx, ty) is point in global coordinates of target port *) - w.port.GetSize(pw, ph); - msg.x := tx * w.port.unit; - msg.y := ty * w.port.unit; - (* (msg.x, msg.y) is point in coordinates of target window *) - w.ForwardCtrlMsg(msg) - END - END Transfer; - - - (** miscellaneous **) - - PROCEDURE SetDir* (d: Directory); - BEGIN - ASSERT(d # NIL, 20); - IF stdDir = NIL THEN stdDir := d END; - dir := d - END SetDir; - - PROCEDURE SelectBySpec* (loc: Files.Locator; name: Files.Name; conv: Converters.Converter; VAR done: BOOLEAN); - VAR w: Window; - BEGIN - Kernel.MakeFileName(name, ""); - w := dir.First(); - WHILE (w # NIL) & ((loc = NIL) OR (w.loc = NIL) OR (loc.res = 77) OR (w.loc.res = 77) OR - (name = "") OR (w.name = "") OR - ~Files.dir.SameFile(loc, name, w.loc, w.name) OR (w.conv # conv)) DO - w := dir.Next(w) - END; - IF w # NIL THEN dir.Select(w, lazy); done := TRUE ELSE done := FALSE END - END SelectBySpec; - - PROCEDURE SelectByTitle* (v: Views.View; flags: SET; title: Views.Title; VAR done: BOOLEAN); - VAR w: Window; t: Views.Title; n1, n2: ARRAY 64 OF CHAR; - BEGIN - done := FALSE; - IF v # NIL THEN - IF v IS Documents.Document THEN v := v(Documents.Document).ThisView() END; - Services.GetTypeName(v, n1) - ELSE n1 := "" - END; - w := dir.First(); - WHILE w # NIL DO - IF ((w.flags / flags) * {isAux, isTool} = {}) & ~(allowDuplicates IN w.flags) THEN - w.GetTitle(t); - IF t = title THEN - Services.GetTypeName(w.doc.ThisView(), n2); - IF (n1 = "") OR (n1 = n2) THEN dir.Select(w, lazy); done := TRUE; RETURN END - END - END; - w := dir.Next(w) - END - END SelectByTitle; - - - PROCEDURE (h: Hook) Omnicast (VAR msg: ANYREC); - VAR w: Window; - BEGIN - w := dir.First(); - WHILE w # NIL DO - IF ~w.sub THEN w.seq.Handle(msg) END; - w := dir.Next(w) - END - END Omnicast; - - PROCEDURE RestoreSequencer (seq: Sequencers.Sequencer); - VAR w: Window; - BEGIN - w := dir.First(); - WHILE w # NIL DO - ASSERT(w.frame # NIL, 100); - IF (seq = NIL) OR (w.seq = seq) THEN - w.Update (* causes redrawing of BlackBox region *) - END; - w := dir.Next(w) - END - END RestoreSequencer; - - PROCEDURE (h: Hook) RestoreDomain (d: Stores.Domain); - VAR seq: ANYPTR; - BEGIN - IF d = NIL THEN - RestoreSequencer(NIL) - ELSE - seq := d.GetSequencer(); - IF seq # NIL THEN - RestoreSequencer (seq(Sequencers.Sequencer)) - END - END - END RestoreDomain; - - - (* SequencerDirectory *) - - PROCEDURE (d: SequencerDirectory) New (): Sequencers.Sequencer; - BEGIN - RETURN dir.NewSequencer() - END New; - - (** CheckAction **) - - PROCEDURE (a: CheckAction) Do; - VAR w: Window; s: StdSequencer; - BEGIN - Services.DoLater(a.wait, Services.resolution); - w := dir.First(); - WHILE w # NIL DO - s := w.seq(StdSequencer); - IF s.trapEra # Kernel.trapCount THEN Reset(s) END; - ASSERT(s.nestLevel = 0, 100); - (* unbalanced calls of Views.BeginModification/EndModification or Views.BeginScript/EndScript *) - w := dir.Next(w) - END - END Do; - - PROCEDURE (a: WaitAction) Do; - BEGIN - Services.DoLater(a.check, Services.immediately) - END Do; - - - PROCEDURE (n: LangNotifier) Notify; - VAR w: Window; pw, ph: INTEGER; - BEGIN - w := dir.First(); - WHILE w # NIL DO - w.port.GetSize(pw, ph); - w.Restore(0, 0, pw, ph); - w.RefreshTitle; - w := dir.Next(w) - END - END Notify; - - PROCEDURE Init; - VAR f: Forwarder; r: Reducer; sdir: SequencerDirectory; - a: CheckAction; w: WaitAction; h: Hook; ln: LangNotifier; - BEGIN - NEW(sdir); Sequencers.SetDir(sdir); - NEW(h); Views.SetMsgHook(h); - NEW(f); Controllers.Register(f); - NEW(r); Kernel.InstallReducer(r); - NEW(a); NEW(w); a.wait := w; w.check := a; Services.DoLater(a, Services.immediately); - NEW(ln); Dialog.RegisterLangNotifier(ln) - END Init; - -BEGIN - Init -END Windows. diff --git a/new/Text/Mod/Cmds.txt b/new/Text/Mod/Cmds.txt deleted file mode 100644 index 1966552..0000000 --- a/new/Text/Mod/Cmds.txt +++ /dev/null @@ -1,860 +0,0 @@ -MODULE TextCmds; - - (* THIS IS TEXT COPY OF BlackBox Text/Mod/Cmds.odc *) - (* DO NOT EDIT *) - -(* could eliminate ReplList/ReplOp and use Models.Begin/EndScript instead (as already done for shifting) *) -(* move ListAlienViews to StdCmds and generalize accordingly? *) - - - IMPORT - Strings, Ports, Stores, Models, Views, Controllers, Properties, Dialog, Containers, - TextModels, TextMappers, TextRulers, TextSetters, TextViews, TextControllers; - - CONST - (* ShiftOp.left *) - left = TRUE; right = FALSE; - - (* PreparePat, FindPat *) - leftTerm = 3X; rightTerm = 4X; - - (* DoReplace mode *) - replace = 0; replaceAndFind = 1; replaceAll = 2; - - (* FindIn first *) - first = TRUE; again = FALSE; - - mm = Ports.mm; point = Ports.point; maxPat = 256; - viewcode = TextModels.viewcode; - tab = TextModels.tab; line = TextModels.line; para = TextModels.para; - nbspace = TextModels.nbspace; digitspace = TextModels.digitspace; - hyphen = TextModels.hyphen; - nbhyphen = TextModels.nbhyphen; softhyphen = TextModels.softhyphen; - - posKey = "#Text:Position"; - searchAliensKey = "#Text:SearchForAlienViews"; (* dormant code option *) - alienTypeKey = "#Text:AlienViewType"; - noAliensKey = "#Text:NoAlienViewsFound"; - noRulerKey = "#Text:NoRulerSelected"; - noMatchKey = "#Text:SelectionDoesNotMatch"; - noTargetKey = "#Text:NoTargetFound"; - noSelectionKey = "#Text:NoSelectionFound"; - noPatternKey = "#Text:PatternNotSpecified"; - notFoundKey = "#Text:PatternNotFound"; (* not used *) - replacingKey = "#System:Replacing"; - shiftingKey = "#Text:Shifting"; - showMarksKey = "#Text:ShowMarks"; - hideMarksKey = "#Text:HideMarks"; - replaceSelectionKey = "#Text:ReplaceAllInSelection"; - replaceAllKey = "#Text:ReplaceAll"; - - - TYPE - FindSpec = RECORD - valid, ignoreCase, wordBeginsWith, wordEndsWith, reverse: BOOLEAN; - start: INTEGER; - find: ARRAY maxPat OF CHAR - END; - - ReplList = POINTER TO RECORD - next: ReplList; - beg, end: INTEGER; - buf: TextModels.Model - END; - - ReplOp = POINTER TO RECORD (Stores.Operation) - text: TextModels.Model; - list, last: ReplList; - find: FindSpec - END; - - - VAR - find*: RECORD - find*: ARRAY maxPat OF CHAR; - replace*: ARRAY maxPat OF CHAR; - ignoreCase*, wordBeginsWith*, wordEndsWith*: BOOLEAN; - reverseOrientation*: BOOLEAN - END; - - ruler*: RECORD - pageBreaks*: RECORD - notInside*, joinPara*: BOOLEAN - END - END; - - - PROCEDURE Show (t: TextModels.Model; beg, end: INTEGER); - BEGIN - TextViews.ShowRange(t, beg, end, TextViews.focusOnly); - IF beg = end THEN - TextControllers.SetCaret(t, beg) - ELSE - TextControllers.SetSelection(t, beg, end) - END - END Show; - - PROCEDURE NoShow (t: TextModels.Model; pos: INTEGER); - BEGIN - TextControllers.SetSelection(t, pos, pos); - TextControllers.SetCaret(t, pos) - END NoShow; - - PROCEDURE Ruler (): TextRulers.Ruler; - VAR r: TextRulers.Ruler; - BEGIN - r := TextRulers.dir.New(NIL); - TextRulers.AddTab(r, 4*mm); TextRulers.AddTab(r, 20*mm); - RETURN r - END Ruler; - - - (* search & replace *) - - PROCEDURE LeftTerminator (ch: CHAR): BOOLEAN; - BEGIN - IF ch < 100X THEN - CASE ch OF - viewcode, tab, line, para, " ", - "(", "[", "{", "=", - hyphen, softhyphen: RETURN TRUE - ELSE RETURN FALSE - END - ELSE RETURN TRUE - END - END LeftTerminator; - - PROCEDURE RightTerminator (ch: CHAR): BOOLEAN; - BEGIN - IF ch < 100X THEN - CASE ch OF - 0X, viewcode, tab, line, para, " ", - "!", "(", ")", ",", ".", ":", ";", "?", "[", "]", "{", "}", - hyphen, softhyphen: RETURN TRUE - ELSE RETURN FALSE - END - ELSE RETURN TRUE - END - END RightTerminator; - - PROCEDURE PreparePat (spec: FindSpec; - VAR pat: ARRAY OF CHAR; VAR n: INTEGER; - VAR wordBeg, wordEnd: BOOLEAN); - VAR i: INTEGER; ch: CHAR; - BEGIN - i := 0; ch := spec.find[0]; - wordBeg := spec.wordBeginsWith & ~LeftTerminator(ch); - IF wordBeg THEN pat[0] := leftTerm; n := 1 ELSE n := 0 END; - WHILE ch # 0X DO - IF ch # softhyphen THEN - IF spec.ignoreCase THEN pat[n] := Strings.Upper(ch) ELSE pat[n] := ch END; - INC(n) - END; - INC(i); ch := spec.find[i] - END; - wordEnd := spec.wordEndsWith & ~RightTerminator(pat[n - 1]); - IF wordEnd THEN pat[n] := rightTerm; INC(n) END - END PreparePat; - - PROCEDURE FindPat (t: TextModels.Model; spec: FindSpec; VAR beg, end: INTEGER); - (* post: beg < end => t[beg, end) = spec.find, start <= beg; else beg = end *) - VAR r: TextModels.Reader; start: INTEGER; - i, j, b, e, n: INTEGER; ch0, ch, ch1: CHAR; wordBeg, wordEnd, icase: BOOLEAN; - pat, ref: ARRAY maxPat OF CHAR; (* ref [b..e) is readback buffer *) - pos0, pos1, absStart: INTEGER; - orientation: INTEGER; - BEGIN - IF spec.reverse THEN - orientation := -1; absStart := t.Length(); - PreparePat(spec, ref, n, wordEnd, wordBeg); - i := n; j := 0; REPEAT DEC(i); pat[j] := ref[i]; INC(j) UNTIL i = 0 (* Just reverse the pattern... *) - ELSE - orientation := 1; absStart := 0; - PreparePat(spec, pat, n, wordBeg, wordEnd) - END; - start := spec.start; icase := spec.ignoreCase; - r := t.NewReader(NIL); i := 0; - IF wordBeg THEN - IF start # absStart THEN - DEC(start, orientation) - ELSE - r.SetPos(absStart); - IF spec.reverse THEN r.ReadPrevChar(ch) ELSE r.ReadChar(ch) END; - IF ~LeftTerminator(ch) THEN i := 1 END - END - END; - r.SetPos(start); IF spec.reverse THEN r.ReadPrevChar(ch) ELSE r.ReadChar(ch) END; - pos0 := start; pos1 := start; - IF icase THEN ch := Strings.Upper(ch) END; - ref[0] := ch; ch0 := ch; j := 0; b := 0; e := 1; - WHILE ~r.eot & (i < n) DO - ch1 := pat[i]; - IF (ch1 = ch) - OR (ch1 = leftTerm) & LeftTerminator(ch) - OR (ch1 = rightTerm) & RightTerminator(ch) THEN - INC(i); j := (j + 1) MOD maxPat - ELSIF ch = softhyphen THEN - j := (j + 1) MOD maxPat - ELSE - i := 0; INC(pos0, orientation); b := (b + 1) MOD maxPat; j := b - END; - IF j # e THEN - ch := ref[j] - ELSE - INC(pos1, orientation); - IF spec.reverse THEN r.ReadPrevChar(ch) ELSE r.ReadChar(ch) END; - IF icase THEN ch := Strings.Upper(ch) END; - ref[j] := ch; e := (e + 1) MOD maxPat - END - END; - IF wordEnd & ~((i + 1 = n) & r.eot) THEN DEC(pos1, orientation) END; - IF (n > 0) & ((i = n) OR wordEnd & (i + 1 = n) & r.eot) THEN - IF wordBeg & ((pos0 # absStart) OR LeftTerminator(ch0)) THEN INC(pos0, orientation) END - ELSE - pos0 := pos1 - END; - IF spec.reverse THEN - beg := pos1; end := pos0 - ELSE - beg := pos0; end := pos1 - END - END FindPat; - - PROCEDURE OverrideSpecWithOption (VAR spec: FindSpec; option: ARRAY OF CHAR); - VAR i: INTEGER; choice: BOOLEAN; ch: CHAR; - BEGIN - choice := TRUE; i := 0; ch := option[i]; - WHILE ch # 0X DO - CASE option[i] OF - '~': choice := ~choice - | 'I', 'i': spec.ignoreCase := choice; choice := TRUE - | 'B', 'b': spec.wordBeginsWith := choice; choice := TRUE - | 'E', 'e': spec.wordEndsWith := choice; choice := TRUE - | 'R', 'r': spec.reverse := choice; choice := TRUE - ELSE choice := TRUE - END; - INC(i); ch := option[i] - END - END OverrideSpecWithOption; - - PROCEDURE SetSpec (VAR spec: FindSpec; pos0, pos1: INTEGER; option: ARRAY OF CHAR); - BEGIN - ASSERT(find.find # "", 20); - spec.valid := TRUE; - spec.ignoreCase := find.ignoreCase; - spec.wordBeginsWith := find.wordBeginsWith; - spec.wordEndsWith := find.wordEndsWith; - spec.reverse := find.reverseOrientation; - OverrideSpecWithOption(spec, option); - IF spec.reverse THEN spec.start := pos1 - ELSE spec.start := pos0 - END; - spec.find := find.find$ - END SetSpec; - - PROCEDURE SetFindSpec (c: TextControllers.Controller; first: BOOLEAN; option: ARRAY OF CHAR; - VAR spec: FindSpec - ); - VAR (*start,*) pos0, pos1, beg, end: INTEGER; - BEGIN - IF first THEN pos0 := 0; pos1 := pos0 - ELSIF c.HasCaret() THEN pos0 := c.CaretPos(); pos1 := pos0 - ELSIF c.HasSelection() THEN c.GetSelection(beg, end); pos0 := beg + 1; pos1 := end - 1 - ELSE pos0 := 0; pos1 := pos0 - END; - SetSpec(spec, pos0, pos1, option); - IF spec.reverse THEN - IF spec.start = 0 THEN spec.start := c.text.Length() END - ELSE - IF spec.start = c.text.Length() THEN spec.start := 0 END - END - END SetFindSpec; - - - PROCEDURE ReplBuf (target: TextModels.Model; pos: INTEGER): TextModels.Model; - VAR buf: TextModels.Model; attr: TextModels.Attributes; rd: TextModels.Reader; - out: TextModels.Writer; i: INTEGER; - BEGIN - rd := target.NewReader(NIL); rd.SetPos(pos); rd.ReadRun(attr); - buf := TextModels.CloneOf(target); out := buf.NewWriter(NIL); out.SetPos(0); - IF attr # NIL THEN out.SetAttr(attr) END; - i := 0; WHILE find.replace[i] # 0X DO out.WriteChar(find.replace[i]); INC(i) END; - RETURN buf - END ReplBuf; - - - (* operations *) - - PROCEDURE (op: ReplOp) Do; - VAR u, v: ReplList; text, save: TextModels.Model; beg, end, delta, len: INTEGER; - BEGIN - text := op.text; - u := op.list; v := NIL; delta := 0; - WHILE u # NIL DO - INC(u.beg, delta); INC(u.end, delta); - IF u.end > u.beg THEN - save := TextModels.CloneOf(text); save.Insert(0, text, u.beg, u.end); - DEC(delta, u.end - u.beg) - ELSE - save := NIL - END; - IF u.buf # NIL THEN - len := u.buf.Length(); - text.Insert(u.beg, u.buf, 0, len); - u.end := u.beg + len; - INC(delta, len) - ELSE - u.end := u.beg - END; - u.buf := save; - v := u; u := u.next - END; - IF op.find.valid THEN - FindPat(text, op.find, beg, end); op.find.valid := FALSE; - IF beg = end THEN Dialog.Beep END - ELSIF v # NIL THEN - beg := v.beg; end := v.end - ELSE - beg := 0; end := 0 - END; - IF end > beg THEN Show(text, beg, end) ELSE NoShow(text, beg) END - END Do; - - PROCEDURE AddRepl (op: ReplOp; beg, end: INTEGER; reverse: BOOLEAN); - VAR u: ReplList; - BEGIN - NEW(u); u.beg := beg; u.end := end; u.buf := ReplBuf(op.text, beg); - IF reverse THEN (* append *) - u.next := op.list; op.list := u - ELSE (* prepend *) - IF op.list = NIL THEN op.list := u ELSE op.last.next := u END; - op.last := u - END - END AddRepl; - - PROCEDURE DoReplaceThis ( - t: TextModels.Model; mode: INTEGER; - firstBeg, firstEnd: INTEGER; - rngBeg, rngEnd: INTEGER; - option: ARRAY OF CHAR - ); - VAR op: ReplOp; spec: FindSpec; beg, end, len: INTEGER; - BEGIN - NEW(op); op.text := t; op.list := NIL; - beg := firstBeg; end := firstEnd; - IF mode IN {replace, replaceAndFind} THEN - AddRepl(op, firstBeg, firstEnd, spec.reverse) - END; - IF mode = replaceAndFind THEN - SetSpec(op.find, firstBeg + (* LEN(find.replace$) *) ReplBuf(t, 0).Length(), firstBeg, option) - ELSE - op.find.valid := FALSE - END; - IF mode = replaceAll THEN - len := LEN(find.find$); - SetSpec(spec, 0, t.Length(), option); - WHILE (rngBeg <= beg) & (beg < end) & (end <= rngEnd) DO - AddRepl(op, beg, end, spec.reverse); - IF spec.reverse THEN spec.start := beg ELSE spec.start := beg + len END; - FindPat(t, spec, beg, end) - END - END; - Models.Do(t, replacingKey, op) - END DoReplaceThis; - - PROCEDURE DoReplace (c: TextControllers.Controller; mode: INTEGER; option: ARRAY OF CHAR); - VAR t: TextModels.Model; spec: FindSpec; - selBeg, selEnd, beg, end, len0: INTEGER; hasSel0: BOOLEAN; - BEGIN - IF c # NIL THEN - t := c.text; len0 := t.Length(); hasSel0 := c.HasSelection(); - IF hasSel0 THEN - c.GetSelection(selBeg, selEnd); - IF selEnd < len0 THEN - SetSpec(spec, selBeg, selEnd + 1, option) - ELSE SetSpec(spec, selBeg, selEnd, option) - END - ELSE - selBeg := 0; selEnd := len0; - SetFindSpec(c, (* again *) mode = replaceAll, option, spec) - END; - FindPat(t, spec, beg, end); - IF mode = replaceAll THEN - IF (selBeg <= beg) & (beg < end) & (end <= selEnd) THEN - DoReplaceThis(t, mode, beg, end, selBeg, selEnd, option); - IF hasSel0 THEN Show(c.text, selBeg, selEnd + t.Length() - len0) END - ELSE NoShow(c.text, 0); Dialog.Beep - END - ELSIF hasSel0 THEN - IF (beg = selBeg) & (end = selEnd) THEN - DoReplaceThis(t, mode, selBeg, selEnd, 0, len0, option) - ELSE Dialog.ShowParamMsg(noMatchKey, spec.find, "", "") - END - ELSE Dialog.ShowMsg(noSelectionKey) - END - ELSE Dialog.ShowMsg(noTargetKey) - END - END DoReplace; - - PROCEDURE DoShift (c: TextControllers.Controller; left: BOOLEAN); - VAR script: Stores.Operation; - t: TextModels.Model; st: TextSetters.Setter; - rd: TextModels.Reader; wr: TextModels.Writer; - box: TextSetters.LineBox; beg, pos, end: INTEGER; ch: CHAR; - BEGIN - IF (c # NIL) & (c.HasSelection() OR c.HasCaret()) THEN - t := c.text; - IF c.HasSelection() THEN c.GetSelection(beg, end) ELSE beg := c.CaretPos(); end := beg END; - st := c.view.ThisSetter(); beg := st.ThisSequence(beg); pos := beg; - rd := t.NewReader(NIL); rd.SetPos(pos); - IF ~left THEN wr := t.NewWriter(NIL) END; - Models.BeginScript(t, shiftingKey, script); - REPEAT - rd.ReadChar(ch); - IF rd.view # NIL THEN - st.GetLine(pos, box); - IF box.rbox THEN ch := para END - END; - IF left & ((ch = tab) OR (ch = " ") OR (ch = digitspace) OR (ch = nbspace)) THEN - t.Delete(pos, pos + 1); rd.SetPos(pos); DEC(end) - ELSIF ~left & (ch # line) & (ch # para) THEN - wr.SetPos(pos); - IF (ch = " ") OR (ch = digitspace) OR (ch = nbspace) THEN - wr.WriteChar(ch) - ELSE wr.WriteChar(tab) - END; - INC(pos); INC(end) - ELSE INC(pos) - END; - WHILE ~rd.eot & (ch # line) & (ch # para) DO - INC(pos); rd.ReadChar(ch) - END - UNTIL rd.eot OR (pos >= end); - Models.EndScript(t, script); - IF end > beg THEN TextControllers.SetSelection(t, beg, end) END - END - END DoShift; - - (** commands **) - - PROCEDURE ListAlienViews*; - VAR t: TextModels.Model; v: TextViews.View; wr: TextMappers.Formatter; - rd: TextModels.Reader; view: Views.View; - type: Stores.TypeName; none: BOOLEAN; - BEGIN - t := TextViews.FocusText(); - IF t # NIL THEN - wr.ConnectTo(TextModels.dir.New()); - rd := t.NewReader(NIL); rd.ReadView(view); none := TRUE; - WHILE view # NIL DO - IF view IS Views.Alien THEN - IF none THEN - wr.WriteTab; wr.WriteMsg(posKey); - wr.WriteTab; wr.WriteMsg(alienTypeKey); wr.WriteLn - END; - none := FALSE; - type := view(Views.Alien).store.path[0]$; - wr.WriteTab; - wr.WriteIntForm(rd.Pos() - 1, - TextMappers.decimal, 5, nbspace, TextMappers.hideBase); - wr.WriteTab; wr.WriteString(type); wr.WriteLn - END; - rd.ReadView(view) - END; - IF none THEN wr.WriteString(noAliensKey); wr.WriteLn END; - v := TextViews.dir.New(wr.rider.Base()); - v.SetDefaults(Ruler(), TextViews.dir.defAttr); - Views.OpenView(v) - END - END ListAlienViews; - - - PROCEDURE ToggleMarksGuard* (VAR par: Dialog.Par); - VAR v: TextViews.View; - BEGIN - v := TextViews.Focus(); - IF (v # NIL) & v.HidesMarks() THEN par.label := showMarksKey - ELSE par.label := hideMarksKey - END - END ToggleMarksGuard; - - PROCEDURE ToggleMarks*; - VAR v: TextViews.View; - BEGIN - v := TextViews.Focus(); - IF v # NIL THEN v.DisplayMarks(~v.HidesMarks()) END - END ToggleMarks; - - PROCEDURE ShowMarks*; - VAR v: TextViews.View; - BEGIN - v := TextViews.Focus(); - IF (v # NIL) & v.HidesMarks() THEN v.DisplayMarks(TextViews.show) END - END ShowMarks; - - PROCEDURE HideMarks*; - VAR v: TextViews.View; - BEGIN - v := TextViews.Focus(); - IF (v # NIL) & ~v.HidesMarks() THEN v.DisplayMarks(TextViews.hide) END - END HideMarks; - - PROCEDURE MakeDefaultRulerGuard* (VAR par: Dialog.Par); - VAR c: TextControllers.Controller; v: Views.View; - BEGIN - c := TextControllers.Focus(); - IF c # NIL THEN - v := c.Singleton(); - IF (v = NIL) OR ~(v IS TextRulers.Ruler) THEN par.disabled := TRUE END - ELSE par.disabled := TRUE - END - END MakeDefaultRulerGuard; - - PROCEDURE MakeDefaultRuler*; - VAR c: TextControllers.Controller; rd: TextModels.Reader; - r: TextRulers.Ruler; a: TextModels.Attributes; - beg, end: INTEGER; - BEGIN - c := TextControllers.Focus(); - IF c # NIL THEN - IF c.HasSelection() THEN - c.GetSelection(beg, end); - rd := c.text.NewReader(NIL); rd.SetPos(beg); rd.Read; - IF (rd.view # NIL) & (rd.view IS TextRulers.Ruler) THEN - c.view.PollDefaults(r, a); - c.view.SetDefaults(rd.view(TextRulers.Ruler), a) - ELSE Dialog.ShowMsg(noRulerKey) - END - ELSE Dialog.ShowMsg(noSelectionKey) - END - ELSE Dialog.ShowMsg(noTargetKey) - END - END MakeDefaultRuler; - - PROCEDURE MakeDefaultAttributes*; - VAR c: TextControllers.Controller; rd: TextModels.Reader; - r: TextRulers.Ruler; a: TextModels.Attributes; - beg, end: INTEGER; - BEGIN - c := TextControllers.Focus(); - IF c # NIL THEN - IF c.HasSelection() THEN - c.GetSelection(beg, end); - rd := c.text.NewReader(NIL); rd.SetPos(beg); rd.Read; - c.view.PollDefaults(r, a); - c.view.SetDefaults(r, rd.attr) - ELSE Dialog.ShowMsg(noSelectionKey) - END - ELSE Dialog.ShowMsg(noTargetKey) - END - END MakeDefaultAttributes; - - PROCEDURE ShiftLeft*; - BEGIN - DoShift(TextControllers.Focus(), left) - END ShiftLeft; - - PROCEDURE ShiftRight*; - BEGIN - DoShift(TextControllers.Focus(), right) - END ShiftRight; - - - PROCEDURE Subscript*; - VAR q, p0: Properties.Property; p: TextModels.Prop; - BEGIN - Properties.CollectProp(q); - p0 := q; WHILE (p0 # NIL) & ~(p0 IS TextModels.Prop) DO p0 := p0.next END; - NEW(p); p.valid := {TextModels.offset}; - IF (p0 # NIL) & (TextModels.offset IN p0.valid) THEN - p.offset := p0(TextModels.Prop).offset - point - ELSE p.offset := -point - END; - Properties.EmitProp(NIL, p) - END Subscript; - - PROCEDURE Superscript*; - VAR q, p0: Properties.Property; p: TextModels.Prop; - BEGIN - Properties.CollectProp(q); - p0 := q; WHILE (p0 # NIL) & ~(p0 IS TextModels.Prop) DO p0 := p0.next END; - NEW(p); p.valid := {TextModels.offset}; - IF (p0 # NIL) & (TextModels.offset IN p0.valid) THEN - p.offset := p0(TextModels.Prop).offset + point - ELSE p.offset := point - END; - Properties.EmitProp(NIL, p) - END Superscript; - - - PROCEDURE ForceToNewLine (c: TextControllers.Controller); - VAR st: TextSetters.Setter; pos, start: INTEGER; msg: Controllers.EditMsg; - BEGIN - IF c.HasCaret() THEN - pos := c.CaretPos(); - st := c.view.ThisSetter(); start := st.ThisLine(pos); - IF pos # start THEN - msg.op := Controllers.pasteChar; msg.char := line; - Controllers.Forward(msg) - END - END - END ForceToNewLine; - - PROCEDURE InsertParagraph*; - VAR c: TextControllers.Controller; script: Stores.Operation; msg: Controllers.EditMsg; - BEGIN - c := TextControllers.Focus(); - IF c # NIL THEN - Models.BeginScript(c.text, "#Text:InsertParagraph", script); - ForceToNewLine(c); - msg.op := Controllers.pasteChar; msg.char := para; - Controllers.Forward(msg); - Models.EndScript(c.text, script) - END - END InsertParagraph; - - PROCEDURE InsertRuler*; - VAR c: TextControllers.Controller; script: Stores.Operation; - rd: TextModels.Reader; r: TextRulers.Ruler; - pos, end: INTEGER; - BEGIN - c := TextControllers.Focus(); - IF c # NIL THEN - r := NIL; - IF c.HasSelection() THEN - c.GetSelection(pos, end); - rd := c.text.NewReader(NIL); rd.SetPos(pos); rd.Read; - IF (rd.view # NIL) & (rd.view IS TextRulers.Ruler) THEN - r := rd.view(TextRulers.Ruler) - END - ELSE pos := c.CaretPos() - END; - IF r = NIL THEN r := TextViews.ThisRuler(c.view, pos) END; - r := TextRulers.CopyOf(r, Views.deep); - Models.BeginScript(c.text, "#Text:InsertRuler", script); - ForceToNewLine(c); - c.view.DisplayMarks(TextViews.show); - Controllers.PasteView(r, Views.undefined, Views.undefined, FALSE); - Models.EndScript(c.text, script) - END - END InsertRuler; - - PROCEDURE InsertSoftHyphen*; - VAR msg: Controllers.EditMsg; - BEGIN - msg.op := Controllers.pasteChar; msg.char := softhyphen; - Controllers.Forward(msg) - END InsertSoftHyphen; - - PROCEDURE InsertNBHyphen*; - VAR msg: Controllers.EditMsg; - BEGIN - msg.op := Controllers.pasteChar; msg.char := nbhyphen; - Controllers.Forward(msg) - END InsertNBHyphen; - - PROCEDURE InsertNBSpace*; - VAR msg: Controllers.EditMsg; - BEGIN - msg.op := Controllers.pasteChar; msg.char := nbspace; - Controllers.Forward(msg) - END InsertNBSpace; - - PROCEDURE InsertDigitSpace*; - VAR msg: Controllers.EditMsg; - BEGIN - msg.op := Controllers.pasteChar; msg.char := digitspace; - Controllers.Forward(msg) - END InsertDigitSpace; - - - PROCEDURE GetFindPattern (c: TextControllers.Controller); - VAR r: TextModels.Reader; beg, end: INTEGER; i: INTEGER; ch: CHAR; - new: ARRAY maxPat OF CHAR; - BEGIN - IF (c # NIL) & c.HasSelection() THEN - c.GetSelection(beg, end); - r := c.text.NewReader(NIL); r.SetPos(beg); r.ReadChar(ch); i := 0; - WHILE (r.Pos() <= end) & (i < maxPat - 1) DO - new[i] := ch; INC(i); r.ReadChar(ch) - END; - new[i] := 0X; - IF (new # "") & (new # find.find) THEN - find.find := new$; - find.ignoreCase := FALSE; - find.wordBeginsWith := FALSE; find.wordEndsWith := FALSE; - Dialog.Update(find) - END - END - END GetFindPattern; - - PROCEDURE FindIn (c: TextControllers.Controller; first: BOOLEAN; option: ARRAY OF CHAR); - VAR spec: FindSpec; beg, end: INTEGER; - BEGIN - IF c # NIL THEN - IF find.find # "" THEN - SetFindSpec(c, first, option, spec); - FindPat(c.text, spec, beg, end); - IF end > beg THEN Show(c.text, beg, end) ELSE NoShow(c.text, 0); Dialog.Beep END - ELSE Dialog.ShowMsg(noPatternKey) - END - ELSE Dialog.ShowMsg(noTargetKey) - END - END FindIn; - - - PROCEDURE FindGuard* (VAR par: Dialog.Par); - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR (find.find = "") THEN par.disabled := TRUE END - END FindGuard; - - PROCEDURE FindFirst* (option: ARRAY OF CHAR); - BEGIN - FindIn(TextControllers.Focus(), first, option) - END FindFirst; - - PROCEDURE FindAgainGuard* (VAR par: Dialog.Par); - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR (~c.HasSelection() & (find.find = "")) THEN par.disabled := TRUE END - END FindAgainGuard; - - PROCEDURE FindAgain* (option: ARRAY OF CHAR); - BEGIN - FindIn(TextControllers.Focus(), again, option) - END FindAgain; - - - PROCEDURE ReplaceGuard* (VAR par: Dialog.Par); - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR (Containers.noCaret IN c.opts) OR ~c.HasSelection() OR (find.find = "") THEN - par.disabled := TRUE - END - END ReplaceGuard; - - PROCEDURE Replace* (option: ARRAY OF CHAR); - BEGIN - DoReplace(TextControllers.Focus(), replace, option) - END Replace; - - PROCEDURE ReplaceAndFindNext* (option: ARRAY OF CHAR); - BEGIN - DoReplace(TextControllers.Focus(), replaceAndFind, option) - END ReplaceAndFindNext; - - - PROCEDURE ReplaceAllGuard* (VAR par: Dialog.Par); - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR (Containers.noCaret IN c.opts) OR (find.find = "") THEN - par.disabled := TRUE - ELSE - IF c.HasSelection() THEN par.label := replaceSelectionKey ELSE par.label := replaceAllKey END - END - END ReplaceAllGuard; - - PROCEDURE ReplaceAll* (option: ARRAY OF CHAR); - BEGIN - DoReplace(TextControllers.Focus(), replaceAll, option) - END ReplaceAll; - - - PROCEDURE SetNormalOrientation*; - BEGIN - find.reverseOrientation := FALSE; - Dialog.Update(find) - END SetNormalOrientation; - - PROCEDURE SetReverseOrientation*; - BEGIN - find.reverseOrientation := TRUE; - Dialog.Update(find) - END SetReverseOrientation; - - PROCEDURE InitFindDialog*; - BEGIN - GetFindPattern(TextControllers.Focus()) - END InitFindDialog; - - - (** ruler dialog **) - - PROCEDURE InitRulerDialog*; - VAR v: Views.View; ra: TextRulers.Attributes; - BEGIN - v := Controllers.FocusView(); - IF v # NIL THEN - WITH v: TextRulers.Ruler DO - ra := v.style.attr; - ruler.pageBreaks.notInside := TextRulers.noBreakInside IN ra.opts; - ruler.pageBreaks.joinPara := TextRulers.parJoin IN ra.opts - ELSE - END - END - END InitRulerDialog; - - PROCEDURE SetRuler*; - VAR v: Views.View; p: TextRulers.Prop; - BEGIN - v := Controllers.FocusView(); - IF v # NIL THEN - WITH v: TextRulers.Ruler DO - NEW(p); p.valid := {TextRulers.opts}; - p.opts.mask := {TextRulers.noBreakInside, TextRulers.parJoin}; - p.opts.val := {}; - IF ruler.pageBreaks.notInside THEN INCL(p.opts.val, TextRulers.noBreakInside) END; - IF ruler.pageBreaks.joinPara THEN INCL(p.opts.val, TextRulers.parJoin) END; - Properties.EmitProp(NIL, p) - ELSE - END - END - END SetRuler; - - - (** standard text-related guards **) - - PROCEDURE FocusGuard* (VAR par: Dialog.Par); - (** in non-TextView menus; otherwise implied by menu type **) - BEGIN - IF TextViews.Focus() = NIL THEN par.disabled := TRUE END - END FocusGuard; - - PROCEDURE EditGuard* (VAR par: Dialog.Par); - (** in non-TextView menus; otherwise use "StdCmds.EditGuard" **) - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR (Containers.noCaret IN c.opts) THEN par.disabled := TRUE END - END EditGuard; - - PROCEDURE SelectionGuard* (VAR par: Dialog.Par); - (** in non-TextView menus; otherwise use "StdCmds.SelectionGuard" **) - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR ~c.HasSelection() THEN par.disabled := TRUE END - END SelectionGuard; - - PROCEDURE EditSelectionGuard* (VAR par: Dialog.Par); - (** in non-TextView menus; otherwise use "StdCmds.SelectionGuard" **) - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR (Containers.noCaret IN c.opts) OR ~c.HasSelection() THEN par.disabled := TRUE END - END EditSelectionGuard; - - PROCEDURE SingletonGuard* (VAR par: Dialog.Par); - (** in non-TextView menus; otherwise use "StdCmds.SingletonGuard" **) - VAR c: TextControllers.Controller; - BEGIN - c := TextControllers.Focus(); - IF (c = NIL) OR (c.Singleton() = NIL) THEN par.disabled := TRUE END - END SingletonGuard; - -END TextCmds. diff --git a/new/Text/Mod/Controllers.txt b/new/Text/Mod/Controllers.txt deleted file mode 100644 index 470727e..0000000 --- a/new/Text/Mod/Controllers.txt +++ /dev/null @@ -1,1633 +0,0 @@ -MODULE TextControllers; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Text/Mod/Controllers.odc *) - (* DO NOT EDIT *) - - IMPORT - Services, Stores, Ports, Models, Views, Dialog, Controllers, Properties, Containers, - TextModels, TextRulers, TextSetters, TextViews; - - CONST - noAutoScroll* = 16; noAutoIndent* = 17; - - (** Controller.SetCaret pos; Controller.SetSelection beg, end **) - none* = -1; - - (* Track mode *) - chars = 0; words = 1; lines = 2; (* plus "none", defined above *) - - enter = 3X; rdel = 7X; ldel = 8X; - aL = 1CX; aR = 1DX; aU = 1EX; aD = 1FX; - pL = 10X; pR = 11X; pU = 12X; pD = 13X; - dL = 14X; dR = 15X; dU = 16X; dD = 17X; - - viewcode = TextModels.viewcode; - tab = TextModels.tab; line = TextModels.line; para = TextModels.para; - - point = Ports.point; mm = Ports.mm; inch16 = Ports.inch DIV 16; - - boundCaret = TRUE; - lenCutoff = 2000; (* max run length inspected to fetch properties *) - - attrChangeKey = "#Text:AttributeChange"; - resizingKey = "#System:Resizing"; - insertingKey = "#System:Inserting"; - deletingKey = "#System:Deleting"; - movingKey = "#System:Moving"; - copyingKey = "#System:Copying"; - linkingKey = "#System:Linking"; - replacingKey = "#System:Replacing"; - - minVersion = 0; maxVersion = 0; maxStdVersion = 0; - - - TYPE - Controller* = POINTER TO ABSTRACT RECORD (Containers.Controller) - view-: TextViews.View; - text-: TextModels.Model (** view # NIL => text = view.ThisText() **) - END; - - Directory* = POINTER TO ABSTRACT RECORD (Containers.Directory) END; - - - FilterPref* = RECORD (Properties.Preference) - controller*: Controller; (** IN, set to text controller asking for filter **) - frame*: Views.Frame; (** IN, set to frame of controlled text view **) - x*, y*: INTEGER; (** IN, set to coordinates of cursor in frame space **) - filter*: BOOLEAN (** preset to FALSE **) - END; - - FilterPollCursorMsg* = RECORD (Controllers.Message) - controller*: Controller; (** IN, set to text controller asking for filter **) - x*, y*: INTEGER; - cursor*: INTEGER; (** as for Controllers.PollCursorMsg **) - done*: BOOLEAN (** OUT; initialized to FALSE **) - END; - - FilterTrackMsg* = RECORD (Controllers.Message) - controller*: Controller; (** IN, set to text controller asking for filter **) - x*, y*: INTEGER; - modifiers*: SET; (** as for Controllers.TrackMsg **) - done*: BOOLEAN (** OUT; initialized to FALSE **) - END; - - - StdCtrl = POINTER TO RECORD (Controller) - (* general state *) - cachedRd: TextModels.Reader; - cachedWr: TextModels.Writer; - insAttr: TextModels.Attributes; (* preset attrs for next typed char *) - autoBeg, autoEnd: INTEGER; (* lazy auto-scrolling; - invalid if (-1, .); initially (MAX(LONGINT), 0) *) - (* caret *) - carPos: INTEGER; (* HasCaret() iff 0 <= carPos <= text.Length() *) - carLast: INTEGER; (* used to recover caret at meaningful position *) - carX, lastX: INTEGER; (* arrow up/down anti-aliasing *) - carTick: LONGINT; (* next tick to invert flashing caret mark *) - carVisible: BOOLEAN; (* caret currently visible - used for flashing caret *) - (* selection *) - selBeg, selEnd: INTEGER; (* HasSel() iff 0 <= selBeg < selEnd <= text.Length() *) - aliasSelBeg, aliasSelEnd: INTEGER; (* need lazy synchronization? *) - selPin0, selPin1: INTEGER; (* anchor points of selection *) - (* most recent scroll-while-tracking step *) - lastStep: LONGINT - END; - - StdDirectory = POINTER TO RECORD (Directory) END; - - - (* messages *) - - ModelMessage* = ABSTRACT RECORD (Models.Message) END; - (** messages to control virtual model extensions, such as marks **) - - SetCaretMsg* = EXTENSIBLE RECORD (ModelMessage) - pos*: INTEGER - END; - - SetSelectionMsg* = EXTENSIBLE RECORD (ModelMessage) - beg*, end*: INTEGER - END; - - - ViewMessage = ABSTRACT RECORD (Views.Message) END; - - CaretMsg = RECORD (ViewMessage) - show: BOOLEAN - END; - - SelectionMsg = RECORD (ViewMessage) - beg, end: INTEGER; - show: BOOLEAN - END; - - - (* miscellaneous *) - - TrackState = RECORD - x, y: INTEGER; - toggle: BOOLEAN - END; - - - VAR - dir-, stdDir-: Directory; - - - PROCEDURE CachedReader (c: StdCtrl): TextModels.Reader; - VAR rd: TextModels.Reader; - BEGIN - rd := c.text.NewReader(c.cachedRd); c.cachedRd := NIL; RETURN rd - END CachedReader; - - PROCEDURE CacheReader (c: StdCtrl; rd: TextModels.Reader); - BEGIN - c.cachedRd := rd - END CacheReader; - - - PROCEDURE CachedWriter (c: StdCtrl; attr: TextModels.Attributes): TextModels.Writer; - VAR wr: TextModels.Writer; - BEGIN - wr := c.text.NewWriter(c.cachedWr); wr.SetAttr(attr); - c.cachedRd := NIL; RETURN wr - END CachedWriter; - - PROCEDURE CacheWriter (c: StdCtrl; wr: TextModels.Writer); - BEGIN - c.cachedWr := wr - END CacheWriter; - - - (** Controller **) - - PROCEDURE (c: Controller) Internalize2- (VAR rd: Stores.Reader), EXTENSIBLE; - VAR v: INTEGER; - BEGIN - (* c.Internalize^(rd); *) - rd.ReadVersion(minVersion, maxVersion, v) - END Internalize2; - - PROCEDURE (c: Controller) Externalize2- (VAR wr: Stores.Writer), EXTENSIBLE; - BEGIN - (* c.Externalize^(wr); *) - wr.WriteVersion(maxVersion) - END Externalize2; - - PROCEDURE (c: Controller) InitView2* (v: Views.View), EXTENSIBLE; - BEGIN - ASSERT((v = NIL) # (c.view = NIL), 21); - IF c.view = NIL THEN ASSERT(v IS TextViews.View, 22) END; - (* c.InitView^(v); *) - IF v # NIL THEN c.view := v(TextViews.View); c.text := c.view.ThisModel() - ELSE c.view := NIL; c.text := NIL - END - END InitView2; - - PROCEDURE (c: Controller) ThisView* (): TextViews.View, EXTENSIBLE; - BEGIN - RETURN c.view - END ThisView; - - - (** caret **) - - PROCEDURE (c: Controller) CaretPos* (): INTEGER, NEW, ABSTRACT; - PROCEDURE (c: Controller) SetCaret* (pos: INTEGER), NEW, ABSTRACT; - (** pre: pos = none OR 0 <= pos <= c.text.Length() **) - (** post: c.carPos = pos **) - - - (** selection **) - - PROCEDURE (c: Controller) GetSelection* (OUT beg, end: INTEGER), NEW, ABSTRACT; - (** post: beg = end OR 0 <= beg <= end <= c.text.Length() **) - - PROCEDURE (c: Controller) SetSelection* (beg, end: INTEGER), NEW, ABSTRACT; - (** pre: beg = end OR 0 <= beg < end <= c.text.Length() **) - (** post: c.selBeg = beg, c.selEnd = end **) - - - (** Directory **) - - PROCEDURE (d: Directory) NewController* (opts: SET): Controller, ABSTRACT; - - PROCEDURE (d: Directory) New* (): Controller, EXTENSIBLE; - BEGIN - RETURN d.NewController({}) - END New; - - - (** miscellaneous **) - - PROCEDURE SetDir* (d: Directory); - BEGIN - ASSERT(d # NIL, 20); dir := d - END SetDir; - - PROCEDURE Install*; - BEGIN - TextViews.SetCtrlDir(dir) - END Install; - - - PROCEDURE Focus* (): Controller; - VAR v: Views.View; c: Containers.Controller; - BEGIN - v := Controllers.FocusView(); - IF (v # NIL) & (v IS TextViews.View) THEN - c := v(TextViews.View).ThisController(); - IF (c # NIL) & (c IS Controller) THEN RETURN c(Controller) - ELSE RETURN NIL - END - ELSE RETURN NIL - END - END Focus; - - - PROCEDURE SetCaret* (text: TextModels.Model; pos: INTEGER); - (** pre: text # NIL, pos = none OR 0 <= pos <= text.Length() **) - VAR cm: SetCaretMsg; - BEGIN - ASSERT(text # NIL, 20); ASSERT(none <= pos, 21); ASSERT(pos <= text.Length(), 22); - cm.pos := pos; Models.Broadcast(text, cm) - END SetCaret; - - PROCEDURE SetSelection* (text: TextModels.Model; beg, end: INTEGER); - (** pre: text # NIL, beg = end OR 0 <= beg < end <= text.Length() **) - VAR sm: SetSelectionMsg; - BEGIN - ASSERT(text # NIL, 20); - IF beg # end THEN - ASSERT(0 <= beg, 21); ASSERT(beg < end, 22); ASSERT(end <= text.Length(), 23) - END; - sm.beg := beg; sm.end := end; Models.Broadcast(text, sm) - END SetSelection; - - - (* support for cursor/selection/focus marking *) - - PROCEDURE BlinkCaret (c: StdCtrl; f: Views.Frame; tick: INTEGER); - VAR vis: BOOLEAN; - BEGIN - IF (c.carPos # none) & f.front & (tick >= c.carTick) THEN - IF c.carVisible THEN - c.MarkCaret(f, Containers.hide); c.carVisible := FALSE - ELSE - c.carVisible := TRUE; c.MarkCaret(f, Containers.show) - END; - c.carTick := tick + Dialog.caretPeriod - END - END BlinkCaret; - - PROCEDURE FlipCaret (c: StdCtrl; show: BOOLEAN); - VAR msg: CaretMsg; - BEGIN - msg.show := show; - Views.Broadcast(c.view, msg) - END FlipCaret; - - PROCEDURE CheckCaret (c: StdCtrl); - VAR text: TextModels.Model; len, pos: INTEGER; - BEGIN - IF ~(Containers.noCaret IN c.opts) THEN - IF (c.carPos = none) & ~(boundCaret & (c.selBeg # c.selEnd)) & (c.ThisFocus() = NIL) THEN - text := c.text; len := text.Length(); pos := c.carLast; - IF pos < 0 THEN pos := 0 ELSIF pos > len THEN pos := len END; - (* c.carVisible := FALSE; c.carTick := 0; (* force visible mark *) *) - SetCaret(text, pos) - END - ELSE c.carPos := none - END - END CheckCaret; - - - - PROCEDURE HiliteRect (f: Views.Frame; l, t, r, b, s: INTEGER; show: BOOLEAN); - BEGIN - IF s = Ports.fill THEN - f.MarkRect(l, t, r, b, Ports.fill, Ports.hilite, show) - ELSE - f.MarkRect(l, t, r - s, t + s, s, Ports.hilite, show); - f.MarkRect(l, t + s, l + s, b - s, s, Ports.hilite, show); - f.MarkRect(l + s, b - s, r, b, s, Ports.hilite, show); - f.MarkRect(r - s, t + s, r, b - s, s, Ports.hilite, show) - END - END HiliteRect; - - PROCEDURE MarkSelRange (c: StdCtrl; f: Views.Frame; b, e: TextViews.Location; - front, show: BOOLEAN - ); - VAR fw, ff, r, t: INTEGER; - BEGIN - IF front THEN fw := 0; ff := Ports.fill ELSE fw := f.dot; ff := fw END; - IF b.start # e.start THEN - r := f.r; t := b.y + b.asc + b.dsc; - HiliteRect(f, b.x, b.y, r + fw, t + fw, ff, show); - IF t < e.y THEN HiliteRect(f, 0, t, r + fw, e.y + fw, ff, show) END; - b.x := f.l; b.y := e.y - END; - HiliteRect(f, b.x, b.y, e.x + fw, e.y + e.asc + e.dsc + fw, ff, show) - END MarkSelRange; - - PROCEDURE MarkSelection (c: StdCtrl; f: Views.Frame; beg, end: INTEGER; show: BOOLEAN); - VAR b, e: TextViews.Location; s: Views.View; - BEGIN - IF (beg # end) & f.mark THEN - ASSERT(beg < end, 20); - s := c.Singleton(); - IF s # NIL THEN - IF beg + 1 = end THEN Containers.MarkSingleton(c, f, show) END - ELSE - c.view.GetThisLocation(f, beg, b); c.view.GetThisLocation(f, end, e); - IF (b.pos < e.pos) OR (b.pos = e.pos) & (b.x < e.x) THEN - MarkSelRange(c, f, b, e, f.front, show) - END - END - END - END MarkSelection; - - PROCEDURE FlipSelection (c: StdCtrl; beg, end: INTEGER; show: BOOLEAN); - VAR msg: SelectionMsg; - BEGIN - msg.beg := beg; msg.end := end; msg.show := show; - Views.Broadcast(c.view, msg) - END FlipSelection; - - - PROCEDURE InitMarks (c: StdCtrl); - BEGIN - c.autoBeg := MAX(INTEGER); c.autoEnd := 0; - c.carPos := none; c.carVisible := FALSE; c.carLast := none; c.carTick := 0; c.carX := -1; - c.selBeg := none; c.selEnd := none; - c.lastStep := 0 - END InitMarks; - - PROCEDURE AutoShowRange (c: StdCtrl; beg, end: INTEGER); - BEGIN - IF (beg <= c.autoBeg) & (c.autoEnd <= end) THEN - c.autoBeg := beg; c.autoEnd := end (* new range includes old range: expand *) - ELSE - c.autoBeg := -1 (* schizopheric scroll request -> don't scroll at all *) - END - END AutoShowRange; - - PROCEDURE UpdateMarks (c: StdCtrl; op: INTEGER; beg, end, delta: INTEGER); - (* ensure that marks are valid after updates *) - BEGIN - CASE op OF - TextModels.insert: - c.carLast := end; c.selBeg := end; c.selEnd := end; beg := end - | TextModels.delete: - c.carLast := beg; c.selBeg := beg; c.selEnd := beg; end := beg - | TextModels.replace: - ELSE - HALT(100) - END; - AutoShowRange(c, beg, end) - END UpdateMarks; - - - (* support for smart cut/copy/paste and attributing *) - - PROCEDURE LegalChar (ch: CHAR): BOOLEAN; - BEGIN - IF ch < 100X THEN - CASE ORD(ch) OF - ORD(viewcode), - ORD(tab), ORD(line), ORD(para), - ORD(" ") .. 7EH, 80H .. 0FFH: RETURN TRUE - ELSE RETURN FALSE - END - ELSE RETURN TRUE - END - END LegalChar; - - PROCEDURE LeftTerminator (ch: CHAR): BOOLEAN; - BEGIN - IF ch < 100X THEN - CASE ch OF - viewcode, tab, line, para, '"', "'", "(", "[", "{": RETURN TRUE - ELSE RETURN FALSE - END - ELSE RETURN TRUE - END - END LeftTerminator; - - PROCEDURE RightTerminator (ch, ch1: CHAR): BOOLEAN; - BEGIN - IF ch < 100X THEN - CASE ch OF - 0X, viewcode, tab, line, para, - "!", '"', "'", "(", ")", ",", ";", "?", "[", "]", "{", "}": RETURN TRUE - | ".", ":": - CASE ch1 OF - 0X, viewcode, tab, line, para, " ": RETURN TRUE - ELSE RETURN FALSE - END - ELSE RETURN FALSE - END - ELSE RETURN TRUE - END - END RightTerminator; - - PROCEDURE ReadLeft (rd: TextModels.Reader; pos: INTEGER; OUT ch: CHAR); - BEGIN - IF pos > 0 THEN rd.SetPos(pos - 1); rd.ReadChar(ch) - ELSE rd.SetPos(pos); ch := " " - END - END ReadLeft; - - PROCEDURE SmartRange (c: StdCtrl; VAR beg, end: INTEGER); - (* if possible and whole words are covered, - extend [beg, end) to encompass either a leading or a trailing blank *) - VAR rd: TextModels.Reader; we, be: INTEGER; ch, ch0, ch1: CHAR; rightTerm: BOOLEAN; - BEGIN -(* -disable intelligent delete/cut/move for now - rd := CachedReader(c); ReadLeft(rd, beg, ch0); rd.ReadChar(ch); - IF ((ch0 <= " ") OR LeftTerminator(ch0)) & (ch # " ") THEN - (* range covers beg of word *) - we := beg; be := beg; - WHILE (ch # 0X) & (be <= end) DO - ch1 := ch; rd.ReadChar(ch); INC(be); - IF (ch1 # " ") & ((be <= end) OR ~RightTerminator(ch1, ch)) THEN we := be END - END; - rightTerm := RightTerminator(ch1, ch); - IF (beg < we) & (we = end) & ((we < be) OR rightTerm) THEN - (* range covers end of word *) - IF (we < be) & (ch1 = " ") THEN - INC(end) (* include trailing blank *) - ELSIF (beg > 0) & rightTerm & (ch0 = " ") THEN - DEC(beg) (* include leading blank *) - END - END - END; - CacheReader(c, rd) -*) - END SmartRange; - - PROCEDURE OnlyWords (c: StdCtrl; beg, end: INTEGER): BOOLEAN; - VAR rd: TextModels.Reader; we, be: INTEGER; ch, ch0, ch1: CHAR; - rightTerm, words: BOOLEAN; - BEGIN - words := FALSE; - rd := CachedReader(c); ReadLeft(rd, beg, ch0); rd.ReadChar(ch); - IF ((ch0 <= " ") OR LeftTerminator(ch0)) & (ch # " ") THEN (* range covers beg of word *) - we := beg; be := beg; - WHILE (ch # 0X) & (be <= end) DO - ch1 := ch; rd.ReadChar(ch); INC(be); - IF (ch1 # " ") & ((be <= end) OR ~RightTerminator(ch1, ch)) THEN - we := be - END - END; - rightTerm := RightTerminator(ch1, ch); - IF (beg < we) & (we = end) & ((we < be) OR rightTerm) THEN (* range covers end of word *) - words := TRUE - END - END; - CacheReader(c, rd); - RETURN words - END OnlyWords; - - PROCEDURE GetTargetField (t: TextModels.Model; pos: INTEGER; - VAR touchL, touchM, touchR: BOOLEAN - ); - VAR rd: TextModels.Reader; ch0, ch1: CHAR; leftTerm, rightTerm: BOOLEAN; - BEGIN - rd := t.NewReader(NIL); ReadLeft(rd, pos, ch0); rd.ReadChar(ch1); - leftTerm := (ch0 <= " ") OR LeftTerminator(ch0); - rightTerm := (ch1 <= " ") OR RightTerminator(ch1, 0X); - touchL := ~leftTerm & rightTerm; - touchM := ~leftTerm & ~rightTerm; - touchR := leftTerm & ~rightTerm - END GetTargetField; - - PROCEDURE LeftExtend (t: TextModels.Model; attr: TextModels.Attributes); - VAR wr: TextModels.Writer; - BEGIN - wr := t.NewWriter(NIL); wr.SetAttr(attr); wr.SetPos(0); wr.WriteChar(" ") - END LeftExtend; - - PROCEDURE RightExtend (t: TextModels.Model; attr: TextModels.Attributes); - VAR wr: TextModels.Writer; - BEGIN - wr := t.NewWriter(NIL); wr.SetPos(t.Length()); wr.SetAttr(attr); wr.WriteChar(" ") - END RightExtend; - - PROCEDURE MergeAdjust (target, inset: TextModels.Model; pos: INTEGER; OUT start: INTEGER); - VAR rd: TextModels.Reader; a: TextModels.Attributes; ch, ch1: CHAR; - touchL, touchM, touchR: BOOLEAN; - BEGIN - start := pos; -(* -disable intelligent paste for now - GetTargetField(target, pos, touchL, touchM, touchR); - IF touchL THEN - rd := inset.NewReader(NIL); rd.SetPos(0); - rd.ReadChar(ch); a := rd.attr; rd.ReadChar(ch1); - IF (ch > " ") & ~RightTerminator(ch, ch1) THEN LeftExtend(inset, a); INC(start) END - END; - IF touchR & (inset.Length() > 0) THEN - rd := inset.NewReader(rd); rd.SetPos(inset.Length() - 1); rd.ReadChar(ch); - IF (ch > " ") & ~LeftTerminator(ch) THEN RightExtend(inset, rd.attr) END - END -*) - END MergeAdjust; - - - PROCEDURE InsertionAttr (c: StdCtrl): TextModels.Attributes; - VAR rd: TextModels.Reader; r: TextRulers.Ruler; a: TextModels.Attributes; ch: CHAR; - BEGIN - a := c.insAttr; - IF a = NIL THEN - rd := CachedReader(c); a := NIL; - IF c.carPos # none THEN - ReadLeft(rd, c.carPos, ch); a := rd.attr; - IF ((ch <= " ") OR (ch = TextModels.nbspace)) & (c.carPos < c.text.Length()) THEN - rd.ReadChar(ch); - IF ch > " " THEN a := rd.attr END - END - ELSIF boundCaret & (c.selBeg # c.selEnd) THEN - rd.SetPos(c.selBeg); rd.ReadChar(ch); a := rd.attr; - c.insAttr := a - END; - IF a = NIL THEN c.view.PollDefaults(r, a) END; - CacheReader(c, rd) - END; - RETURN a - END InsertionAttr; - - - PROCEDURE GetTargetRange (c: StdCtrl; OUT beg, end: INTEGER); - BEGIN - IF boundCaret & (c.selBeg # c.selEnd) THEN - beg := c.selBeg; end := c.selEnd - ELSE - beg := c.carPos; end := beg - END - END GetTargetRange; - - - PROCEDURE DoEdit (name: Stores.OpName; - c: StdCtrl; beg, end: INTEGER; - attr: TextModels.Attributes; ch: CHAR; view: Views.View; w, h: INTEGER; - buf: TextModels.Model; bufbeg, bufend: INTEGER; (* buf # NIL & bufend < 0: bufend = buf.Length() *) - pos: INTEGER - ); - VAR script: Stores.Operation; wr: TextModels.Writer; cluster: BOOLEAN; - BEGIN - IF (beg < end) (* something to delete *) - OR (attr # NIL) (* something new to write *) - OR (buf # NIL) (* something new to insert *) - THEN - cluster := (beg < end) OR (attr = NIL) OR (view # NIL); - (* don't script when typing a single character -> TextModels will bunch if possible *) - (* ~cluster => name is reverted to #System.Inserting by TextModels *) - IF cluster THEN Models.BeginScript(c.text, name, script) END; - IF beg < end THEN - c.text.Delete(beg, end); - IF pos > beg THEN DEC(pos, end - beg) END - END; - IF attr # NIL THEN - ASSERT(buf = NIL, 20); - wr := CachedWriter(c, attr); wr.SetPos(pos); - IF view # NIL THEN wr.WriteView(view, w, h) ELSE wr.WriteChar(ch) END; - CacheWriter(c, wr) - ELSIF buf # NIL THEN - IF bufend < 0 THEN bufend := buf.Length() END; - c.text.Insert(pos, buf, bufbeg, bufend) - END; - IF cluster THEN Models.EndScript(c.text, script) END; - CheckCaret(c) - END - END DoEdit; - - - (* editing *) - - PROCEDURE ThisPos (v: TextViews.View; f: Views.Frame; x, y: INTEGER): INTEGER; - VAR loc: TextViews.Location; pos: INTEGER; - BEGIN - pos := v.ThisPos(f, x, y); v.GetThisLocation(f, pos, loc); - IF (loc.view # NIL) & (x > (loc.l + loc.r) DIV 2) THEN INC(pos) END; - RETURN pos - END ThisPos; - - PROCEDURE ShowPos (c: StdCtrl; beg, end: INTEGER); - BEGIN - IF ~(noAutoScroll IN c.opts) THEN - c.view.ShowRange(beg, end, TextViews.focusOnly) - END - END ShowPos; - - - PROCEDURE Indentation (c: StdCtrl; pos: INTEGER): TextModels.Model; - (* pre: c.carPos # none *) - VAR st: TextSetters.Setter; buf: TextModels.Model; rd: TextModels.Reader; - wr: TextModels.Writer; ch: CHAR; spos: INTEGER; - BEGIN - buf := NIL; - rd := CachedReader(c); - st := c.view.ThisSetter(); spos := st.ThisSequence(pos); rd.SetPos(spos); rd.ReadChar(ch); - IF (ch = tab) & (spos < pos) THEN - buf := TextModels.CloneOf(c.text); wr := buf.NewWriter(NIL); wr.SetPos(buf.Length()); - wr.SetAttr(InsertionAttr(c)); - wr.WriteChar(line); - REPEAT wr.WriteChar(tab); rd.ReadChar(ch) UNTIL (ch # tab) OR (rd.Pos() > pos) - END; - CacheReader(c, rd); - RETURN buf - END Indentation; - - PROCEDURE InsertChar (c: StdCtrl; ch: CHAR); - VAR buf: TextModels.Model; attr: TextModels.Attributes; - beg, end: INTEGER; legal: BOOLEAN; name: Stores.OpName; - BEGIN - attr := NIL; buf := NIL; - IF ch < 100X THEN legal := LegalChar(ch) ELSE legal := TRUE END; (* should check Unicode *) - IF (ch = ldel) OR (ch = rdel) THEN name := deletingKey ELSE name := replacingKey END; - IF boundCaret & (c.selBeg # c.selEnd) & (legal OR (ch = ldel) OR (ch = rdel) OR (ch = enter)) THEN - beg := c.selBeg; end := c.selEnd; - IF (ch = ldel) OR (ch = rdel) THEN SmartRange(c, beg, end); ch := 0X END - ELSE - beg := c.carPos; end := beg - END; - IF (c.carPos # none) OR boundCaret & (c.selBeg # c.selEnd) THEN - IF (ch = line) OR (ch = enter) THEN - IF noAutoIndent IN c.opts THEN buf := NIL ELSE buf := Indentation(c, beg) END; - IF buf = NIL THEN ch := line; legal := TRUE ELSE ch := 0X; legal := FALSE END - END; - IF legal THEN - attr := InsertionAttr(c) - ELSIF (ch = ldel) & (c.carPos > 0) THEN - beg := c.carPos - 1; end := c.carPos - ELSIF (ch = rdel) & (c.carPos < c.text.Length()) THEN - beg := c.carPos; end := c.carPos + 1 - END - END; - DoEdit(name, c, beg, end, attr, ch, NIL, 0, 0, buf, 0, -1, beg) - END InsertChar; - - PROCEDURE InsertText (c: StdCtrl; beg, end: INTEGER; text: TextModels.Model; OUT start: INTEGER); - VAR buf: TextModels.Model; - BEGIN - buf := TextModels.CloneOf(text); buf.InsertCopy(0, text, 0, text.Length()); - IF beg = end THEN MergeAdjust(c.text, buf, beg, start) ELSE start := beg END; - DoEdit(insertingKey, c, beg, end, NIL, 0X, NIL, 0, 0, buf, 0, -1, beg) - END InsertText; - - PROCEDURE InsertView (c: StdCtrl; beg, end: INTEGER; v: Views.View; w, h: INTEGER); - BEGIN - DoEdit(insertingKey, c, beg, end, InsertionAttr(c), 0X, v, w, h, NIL, 0, 0, beg) - END InsertView; - - - PROCEDURE InSubFrame (f, f1: Views.Frame; x, y: INTEGER): BOOLEAN; - BEGIN - INC(x, f.gx - f1.gx); INC(y, f.gy - f1.gy); - RETURN (f1.l <= x) & (x < f1.r) & (f1.t <= y) & (y < f1.b) - END InSubFrame; - - PROCEDURE InFrame (f: Views.Frame; x, y: INTEGER): BOOLEAN; - BEGIN - RETURN (f.l <= x) & (x < f.r) & (f.t <= y) & (y < f.b) - END InFrame; - - - (* filtered tracking *) - - PROCEDURE IsFilter (v: Views.View; c: StdCtrl; f: Views.Frame; x, y: INTEGER): BOOLEAN; - VAR pref: FilterPref; - BEGIN - pref.controller := c; pref.frame := f; pref.x := x; pref.y := y; - pref.filter := FALSE; - Views.HandlePropMsg(v, pref); - RETURN pref.filter - END IsFilter; - - PROCEDURE FindFilter (c: StdCtrl; f: Views.Frame; x, y: INTEGER; OUT filter: Views.View); - CONST catchRange = 1000; - VAR rd: TextModels.Reader; pos, beg, end: INTEGER; isF: BOOLEAN; - BEGIN - c.view.GetRange(f, beg, end); DEC(beg, catchRange); - pos := c.view.ThisPos(f, x, y); - IF pos < c.text.Length() THEN INC(pos) END; (* let filter handle itself *) - rd := CachedReader(c); rd.SetPos(pos); - REPEAT - rd.ReadPrevView(filter); - isF := (filter # NIL) & IsFilter(filter, c, f, x, y); - UNTIL isF OR rd.eot OR (rd.Pos() < beg); - IF ~isF THEN filter := NIL END; - CacheReader(c, rd) - END FindFilter; - - PROCEDURE FilteredPollCursor (c: StdCtrl; f: Views.Frame; - VAR msg: Controllers.PollCursorMsg; VAR done: BOOLEAN - ); - VAR filter, focus: Views.View; x, y: INTEGER; modifiers: SET; isDown: BOOLEAN; fmsg: FilterPollCursorMsg; - BEGIN - FindFilter(c, f, msg.x, msg.y, filter); - IF filter # NIL THEN - (* f.Input(x, y, modifiers, isDown); *) - fmsg.x := msg.x; fmsg.y := msg.y; fmsg.cursor := msg.cursor; - fmsg.controller := c; fmsg.done := FALSE; - (*Views.ForwardCtrlMsg(f, fmsg) - does not work f.view # filter !!*) - focus := NIL; - filter.HandleCtrlMsg(f, fmsg, focus); - IF fmsg.done THEN msg.cursor := fmsg.cursor END; - done := fmsg.done - END - END FilteredPollCursor; - - PROCEDURE FilteredTrack (c: StdCtrl; f: Views.Frame; - VAR msg: Controllers.TrackMsg; VAR done: BOOLEAN - ); - VAR filter, focus: Views.View; fmsg: FilterTrackMsg; - BEGIN - FindFilter(c, f, msg.x, msg.y, filter); - IF filter # NIL THEN - fmsg.x := msg.x; fmsg.y := msg.y; fmsg.modifiers := msg.modifiers; - fmsg.controller := c; fmsg.done := FALSE; - (*Views.ForwardCtrlMsg(f, fmsg) - does not work f.view # filter !!*) - focus := NIL; filter.HandleCtrlMsg(f, fmsg, focus); - done := fmsg.done - END - END FilteredTrack; - - - (* StdCtrl *) - - PROCEDURE (c: StdCtrl) Internalize2 (VAR rd: Stores.Reader); - VAR thisVersion: INTEGER; - BEGIN - c.Internalize2^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStdVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - InitMarks(c) - END Internalize2; - - PROCEDURE (c: StdCtrl) Externalize2 (VAR wr: Stores.Writer); - BEGIN - c.Externalize2^(wr); - wr.WriteVersion(maxStdVersion) - END Externalize2; - - PROCEDURE (c: StdCtrl) CopyFrom (source: Stores.Store); - BEGIN - c.CopyFrom^(source); InitMarks(c) - END CopyFrom; - - PROCEDURE (c: StdCtrl) Neutralize2; - BEGIN - (* c.Neutralize^; *) - c.SetCaret(none) - END Neutralize2; - - PROCEDURE (c: StdCtrl) GetContextType (OUT type: Stores.TypeName); - BEGIN - type := "TextViews.View" - END GetContextType; - - PROCEDURE (c: StdCtrl) GetValidOps (OUT valid: SET); - BEGIN - valid := {}; - IF (c.carPos # none) OR (boundCaret & (c.selBeg # c.selEnd)) THEN - valid := valid + {Controllers.pasteChar, Controllers.paste} - END; - IF c.selBeg # c.selEnd THEN - valid := valid + {Controllers.cut, Controllers.copy} - END - END GetValidOps; - - PROCEDURE (c: StdCtrl) NativeModel (m: Models.Model): BOOLEAN; - BEGIN - ASSERT(m # NIL, 20); - RETURN m IS TextModels.Model - END NativeModel; - - PROCEDURE (c: StdCtrl) NativeView (v: Views.View): BOOLEAN; - BEGIN - ASSERT(v # NIL, 20); - RETURN v IS TextViews.View - END NativeView; - - PROCEDURE (c: StdCtrl) NativeCursorAt (f: Views.Frame; x, y: INTEGER): INTEGER; - BEGIN - RETURN Ports.textCursor - END NativeCursorAt; - - PROCEDURE (c: StdCtrl) PollNativeProp (selection: BOOLEAN; - VAR p: Properties.Property; VAR truncated: BOOLEAN - ); - VAR beg, end: INTEGER; - BEGIN - IF selection & (c.selBeg = c.selEnd) THEN - p := InsertionAttr(c).Prop(); truncated := FALSE - ELSE - IF selection THEN beg := c.selBeg; end := c.selEnd - ELSE beg := 0; end := c.text.Length() - END; -(* - truncated := (end - beg > lenCutoff); - IF truncated THEN end := beg + lenCutoff END; -*) - p := c.text.Prop(beg, end) - END - END PollNativeProp; - - PROCEDURE (c: StdCtrl) SetNativeProp (selection: BOOLEAN; old, p: Properties.Property); - VAR t: TextModels.Model; beg, end: INTEGER; - BEGIN - t := c.text; - IF selection THEN beg := c.selBeg; end := c.selEnd ELSE beg := 0; end := t.Length() END; - IF beg < end THEN - t.Modify(beg, end, old, p); - IF selection THEN c.SetSelection(beg, end) END - ELSIF selection THEN - c.insAttr := TextModels.ModifiedAttr(InsertionAttr(c), p) - END - END SetNativeProp; - - PROCEDURE (c: StdCtrl) MakeViewVisible (v: Views.View); - VAR pos: INTEGER; - BEGIN - ASSERT(v # NIL, 20); - ASSERT(v.context # NIL, 21); - ASSERT(v.context.ThisModel() = c.text, 22); - pos := v.context(TextModels.Context).Pos(); - ShowPos(c, pos, pos + 1) - END MakeViewVisible; - - PROCEDURE (c: StdCtrl) GetFirstView (selection: BOOLEAN; OUT v: Views.View); - VAR rd: TextModels.Reader; beg, end: INTEGER; - BEGIN - IF selection THEN beg := c.selBeg; end := c.selEnd - ELSE beg := 0; end := c.text.Length() - END; - IF beg < end THEN - rd := CachedReader(c); rd.SetPos(beg); rd.ReadView(v); - IF rd.Pos() > end THEN v := NIL END; - CacheReader(c, rd) - ELSE v := NIL - END - END GetFirstView; - - PROCEDURE (c: StdCtrl) GetNextView (selection: BOOLEAN; VAR v: Views.View); - VAR con: Models.Context; rd: TextModels.Reader; beg, end, pos: INTEGER; - BEGIN - ASSERT(v # NIL, 20); con := v.context; - ASSERT(con # NIL, 21); ASSERT(con.ThisModel() = c.text, 22); - IF selection THEN beg := c.selBeg; end := c.selEnd - ELSE beg := 0; end := c.text.Length() - END; - pos := con(TextModels.Context).Pos(); - IF (beg <= pos) & (pos < end) THEN - rd := CachedReader(c); rd.SetPos(pos + 1); rd.ReadView(v); - IF rd.Pos() > end THEN v := NIL END; - CacheReader(c, rd) - ELSE v := NIL - END - END GetNextView; - - PROCEDURE (c: StdCtrl) GetPrevView (selection: BOOLEAN; VAR v: Views.View); - VAR con: Models.Context; rd: TextModels.Reader; beg, end, pos: INTEGER; - BEGIN - ASSERT(v # NIL, 20); con := v.context; - ASSERT(con # NIL, 21); ASSERT(con.ThisModel() = c.text, 22); - IF selection THEN beg := c.selBeg; end := c.selEnd - ELSE beg := 0; end := c.text.Length() - END; - pos := con(TextModels.Context).Pos(); - IF (beg < pos) & (pos <= end) THEN - rd := CachedReader(c); rd.SetPos(pos); rd.ReadPrevView(v); - IF rd.Pos() < beg THEN v := NIL END; - CacheReader(c, rd) - ELSE v := NIL - END - END GetPrevView; - - PROCEDURE (c: StdCtrl) GetSelectionBounds (f: Views.Frame; OUT x, y, w, h: INTEGER); - VAR b, e: TextViews.Location; - BEGIN - c.GetSelectionBounds^(f, x, y, w, h); - IF w = Views.undefined THEN - c.view.GetThisLocation(f, c.selBeg, b); - c.view.GetThisLocation(f, c.selEnd, e); - IF b.start = e.start THEN x := b.x; w := e.x - b.x; - ELSE x := f.l; w := f.r - f.l; - END; - y := b.y; h := e.y + e.asc + e.dsc - b.y - END - END GetSelectionBounds; - - PROCEDURE (c: StdCtrl) MarkPickTarget (source, f: Views.Frame; - sx, sy, x, y: INTEGER; show: BOOLEAN - ); - VAR b, e: TextViews.Location; pos: INTEGER; - BEGIN - pos := c.view.ThisPos(f, x, y); - IF pos < c.text.Length() THEN - c.view.GetThisLocation(f, pos, b); - c.view.GetThisLocation(f, pos + 1, e); - IF (b.pos < e.pos) OR (b.pos = e.pos) & (b.x < e.x) THEN - MarkSelRange(c, f, b, e, TRUE, show) - END - END - END MarkPickTarget; - - PROCEDURE (c: StdCtrl) MarkDropTarget (source, f: Views.Frame; - sx, sy, dx, dy, w, h, rx, ry: INTEGER; type: Stores.TypeName; isSingle, show: BOOLEAN - ); - VAR loc: TextViews.Location; pos: INTEGER; - BEGIN - pos := c.view.ThisPos(f, dx, dy); - IF (source # NIL) & ((source.view = f.view) OR (source.view.ThisModel() = f.view.ThisModel())) - & (c.selBeg < pos) & (pos < c.selEnd) THEN - pos := c.selBeg - END; - c.view.GetThisLocation(f, pos, loc); - f.MarkRect(loc.x, loc.y, loc.x + f.unit, loc.y + loc.asc + loc.dsc, Ports.fill, Ports.invert, show); - IF (isSingle OR ~Services.Extends(type, "TextViews.View")) & (w > 0) & (h > 0) THEN - DEC(dx, rx); DEC(dy, ry); - f.MarkRect(dx, dy, dx + w, dy + h, 0, Ports.dim25, show) - END - END MarkDropTarget; - - - PROCEDURE GetThisLine (c: StdCtrl; pos: INTEGER; OUT beg, end: INTEGER); - VAR st: TextSetters.Setter; - BEGIN - st := c.view.ThisSetter(); - beg := st.ThisLine(pos); end := st.NextLine(beg); - IF end = beg THEN end := c.text.Length() END; - END GetThisLine; - - PROCEDURE GetThisChunk (c: StdCtrl; f: Views.Frame; - VAR s: TrackState; OUT beg, end: INTEGER; OUT mode: INTEGER - ); - VAR v: TextViews.View; b, e: TextViews.Location; - st: TextSetters.Setter; ruler: TextRulers.Ruler; ra: TextRulers.Attributes; - pos, r: INTEGER; - BEGIN - v := c.view; st := v.ThisSetter(); pos := ThisPos(v, f, s.x, s.y); - ruler := TextViews.ThisRuler(v, pos); ra := ruler.style.attr; - r := ra.right; IF ~(TextRulers.rightFixed IN ra.opts) OR (r > f.r) THEN r := f.r END; - st.GetWord(pos, beg, end); - v.GetThisLocation(f, beg, b); v.GetThisLocation(f, end, e); - IF (s.x < f.l) OR (s.x >= r) THEN (* outside of line box: whole line *) - GetThisLine(c, pos, beg, end); - mode := lines - ELSIF (s.y < b.y) OR (s.y < b.y + b.asc + b.dsc) & (s.x < b.x) - OR (s.y >= e.y) & (s.x >= e.x) OR (s.y >= e.y + e.asc + e.dsc) THEN - (* outside of word: single char *) - beg := ThisPos(v, f, s.x, s.y); v.GetThisLocation(f, beg, b); - IF (b.x > s.x) & (beg > 0) THEN DEC(beg) END; - IF beg < c.text.Length() THEN end := beg + 1 ELSE end := beg END; - mode := words - ELSE (* whole word *) - mode := words - END - END GetThisChunk; - - PROCEDURE SetSel (c: StdCtrl; beg, end: INTEGER); - (* pre: ~(Containers.noSelection IN c.opts) *) - BEGIN - IF beg >= end THEN c.SetCaret(beg) ELSE c.SetSelection(beg, end) END - END SetSel; - - PROCEDURE PrepareToTrack (c: StdCtrl; f: Views.Frame; - VAR s: TrackState; mode: INTEGER; - VAR pin0, pin1, pos: INTEGER - ); - VAR loc: TextViews.Location; beg, end: INTEGER; m: INTEGER; - BEGIN - pos := ThisPos(c.view, f, s.x, s.y); - IF mode IN {chars, words, lines} THEN - GetThisChunk(c, f, s, pin0, pin1, m) - ELSE pin0 := pos; pin1 := pos - END; - IF s.toggle & ((c.selBeg # c.selEnd) OR boundCaret & (c.carPos # none)) - & ~(Containers.noSelection IN c.opts) THEN (* modify existing selection *) - IF c.selBeg # c.selEnd THEN - beg := c.selBeg; end := c.selEnd - ELSE - beg := c.carPos; end := beg; c.selPin0 := beg; c.selPin1 := beg - END; - IF pin1 > c.selPin0 THEN - end := pin1; pin0 := beg - ELSIF pin0 < c.selPin1 THEN - beg := pin0; pin0 := end - END; - SetSel(c, beg, end); - pin1 := pin0 - ELSIF mode IN {chars, words, lines} THEN - SetSel(c, pin0, pin1); - pos := pin1 - ELSE - SetCaret(c.text, pos) - END; - c.lastStep := Services.Ticks() - END PrepareToTrack; - - PROCEDURE ScrollDelay (d: INTEGER): INTEGER; - VAR second, delay: INTEGER; - BEGIN - second := Services.resolution; - IF d < 2 * mm THEN delay := second DIV 2 - ELSIF d < 4 * mm THEN delay := second DIV 3 - ELSIF d < 6 * mm THEN delay := second DIV 5 - ELSIF d < 8 * mm THEN delay := second DIV 10 - ELSE delay := second DIV 20 - END; - RETURN delay - END ScrollDelay; - - PROCEDURE ScrollWhileTracking (c: StdCtrl; f: Views.Frame; VAR x0, y0, x, y: INTEGER); - (* currently, there are no provisions to scroll while tracking inside an embedded view *) - VAR now: LONGINT; (* normalize: BOOLEAN; *) scr: Controllers.ScrollMsg; - BEGIN - (* normalize := c.view.context.Normalize(); *) - now := Services.Ticks(); - IF x < f.l THEN x0 := x; x := f.l ELSIF x > f.r THEN x0 := x; x := f.r END; - IF (y < f.t) (* & normalize*) THEN - IF c.lastStep + ScrollDelay(f.t - y) <= now THEN - c.lastStep := now; - scr.focus := TRUE; scr.vertical := TRUE; scr.op := Controllers.decLine; - scr.done := FALSE; - Controllers.ForwardVia(Controllers.frontPath, scr) - END - ELSIF (y > f.b) (* & normalize *) THEN - IF c.lastStep + ScrollDelay(y - f.b) <= now THEN - c.lastStep := now; - scr.focus := TRUE; scr.vertical := TRUE; scr.op := Controllers.incLine; - scr.done := FALSE; - Controllers.ForwardVia(Controllers.frontPath, scr) - END - ELSE - y0 := y - END - END ScrollWhileTracking; - - PROCEDURE (c: StdCtrl) TrackMarks (f: Views.Frame; x, y: INTEGER; units, extend, add: BOOLEAN); - VAR s: TrackState; pos, beg, end, pin0, pin1, p, p1: INTEGER; - modifiers: SET; mode, m: INTEGER; isDown, noSel: BOOLEAN; - BEGIN - IF c.opts * Containers.mask # Containers.mask THEN (* track caret or selection *) - s.x := x; s.y := y; s.toggle := extend; - noSel := Containers.noSelection IN c.opts; - IF units & ~noSel THEN (* select units, i.e. words or lines *) - GetThisChunk(c, f, s, beg, end, mode) - ELSE (* set caret or selection *) - mode := none - END; - PrepareToTrack(c, f, s, mode, pin0, pin1, p); x := s.x; y := s.y; - beg := pin0; end := pin1; - IF p < pin0 THEN beg := p ELSIF p > pin1 THEN end := p END; - p := -1; - f.Input(s.x, s.y, modifiers, isDown); - WHILE isDown DO -(* - REPEAT - f.Input(s.x, s.y, modifiers, isDown); -*) - IF (s.x # x) OR (s.y # y) THEN - ScrollWhileTracking(c, f, x, y, s.x, s.y); - p1 := ThisPos(c.view, f, s.x, s.y); - IF p1 # p THEN - p := p1; - IF mode IN {words, lines} THEN - IF mode = words THEN - GetThisChunk(c, f, s, beg, end, m) - ELSE - GetThisLine(c, p, beg, end) - END; - IF p > pin0 THEN pos := end ELSE pos := beg END - ELSE pos := p - END; - beg := pin0; end := pin1; - IF noSel THEN - c.SetCaret(pos) - ELSE - IF pos < pin0 THEN beg := pos ELSIF pos > pin1 THEN end := pos END; - SetSel(c, beg, end); - IF c.selPin0 = c.selPin1 THEN - IF pos < pin0 THEN c.selPin0 := pos; c.selPin1 := pin1 - ELSIF pos > pin1 THEN c.selPin0 := pin0; c.selPin1 := pos - END - END - END - END - END; - f.Input(s.x, s.y, modifiers, isDown) - END -(* - UNTIL ~isDown -*) - END - END TrackMarks; - - PROCEDURE (c: StdCtrl) Resize (v: Views.View; l, t, r, b: INTEGER); - VAR con: Models.Context; - BEGIN - ASSERT(v # NIL, 20); con := v.context; - ASSERT(con # NIL, 21); ASSERT(con.ThisModel() = c.text, 22); - con.SetSize(r - l, b - t) - END Resize; - - PROCEDURE (c: StdCtrl) DeleteSelection; - VAR beg, end: INTEGER; - BEGIN - beg := c.selBeg; end := c.selEnd; - IF beg # end THEN - SmartRange(c, beg, end); - DoEdit(deletingKey, c, beg, end, NIL, 0X, NIL, 0, 0, NIL, 0, 0, 0) - END - END DeleteSelection; - - PROCEDURE (c: StdCtrl) MoveLocalSelection (f, dest: Views.Frame; x, y, dx, dy: INTEGER); - VAR buf: TextModels.Model; pos, beg0, end0, beg, end, start, len: INTEGER; - BEGIN - pos := dest.view(TextViews.View).ThisPos(dest, dx, dy); -(* smart move disabled for now --> use true move instead of copy - beg0 := c.selBeg; end0 := c.selEnd; beg := beg0; end := end0; - SmartRange(c, beg, end); - IF (beg < pos) & (pos < end) THEN pos := beg END; - buf := TextModels.CloneOf(c.text); buf.CopyFrom(0, c.text, beg0, end0); - IF OnlyWords(c, beg0, end0) THEN MergeAdjust(c.text, buf, pos, start) ELSE start := pos END; - len := end0 - beg0; - IF start >= end THEN DEC(start, end - beg) END; - IF pos # beg THEN - DoEdit(movingKey, c, beg, end, NIL, 0X, NIL, 0, 0, buf, pos); - SetSelection(c.text, start, start + len); - AutoShowRange(c, start, start + len) - END -*) - beg := c.selBeg; end := c.selEnd; - IF (pos < beg) OR (pos > end) THEN - len := end - beg; start := pos; - IF start >= end THEN DEC(start, len) END; - DoEdit(movingKey, c, 0, 0, NIL, 0X, NIL, 0, 0, c.text, beg, end, pos); - SetSelection(c.text, start, start + len); - AutoShowRange(c, start, start + len) - END - END MoveLocalSelection; - - PROCEDURE (c: StdCtrl) CopyLocalSelection (f, dest: Views.Frame; x, y, dx, dy: INTEGER); - VAR buf: TextModels.Model; pos, beg, end, start, len: INTEGER; - BEGIN - pos := dest.view(TextViews.View).ThisPos(dest, dx, dy); - beg := c.selBeg; end := c.selEnd; - IF (beg < pos) & (pos < end) THEN pos := beg END; - buf := TextModels.CloneOf(c.text); buf.InsertCopy(0, c.text, beg, end); - IF OnlyWords(c, beg, end) THEN MergeAdjust(c.text, buf, pos, start) ELSE start := pos END; - len := end - beg; - DoEdit(copyingKey, c, 0, 0, NIL, 0X, NIL, 0, 0, buf, 0, -1, pos); - SetSelection(c.text, start, start + len); - AutoShowRange(c, start, start + len) - END CopyLocalSelection; - - PROCEDURE (c: StdCtrl) SelectionCopy (): Containers.Model; - VAR t: TextModels.Model; - BEGIN - IF c.selBeg # c.selEnd THEN - t := TextModels.CloneOf(c.text); t.InsertCopy(0, c.text, c.selBeg, c.selEnd); - ELSE t := NIL - END; - RETURN t - END SelectionCopy; - - PROCEDURE (c: StdCtrl) NativePaste (m: Models.Model; f: Views.Frame); - VAR beg, end, start: INTEGER; - BEGIN - WITH m: TextModels.Model DO - GetTargetRange(c, beg, end); - IF beg # none THEN InsertText(c, beg, end, m, start) END - END - END NativePaste; - - PROCEDURE (c: StdCtrl) ArrowChar (f: Views.Frame; ch: CHAR; units, select: BOOLEAN); - VAR st: TextSetters.Setter; v: TextViews.View; loc: TextViews.Location; - org, len, p, pos, b, e, beg, end, d, d0, edge, x, dy: INTEGER; - change, rightEdge, rightDir: BOOLEAN; - scroll: Controllers.ScrollMsg; - BEGIN - c.insAttr := NIL; - Models.StopBunching(c.text); - v := c.view; st := v.ThisSetter(); - change := select OR (c.selBeg = c.selEnd); - IF c.selBeg # c.selEnd THEN beg := c.selBeg; end := c.selEnd - ELSE beg := c.carPos; end := beg; c.carLast := beg - END; - len := c.text.Length(); - rightDir := (ch = aR) OR (ch = pR) OR (ch = dR) OR (ch = aD) OR (ch = pD) OR (ch = dD); - rightEdge := change & (c.carLast < end) - OR rightDir & (~change OR (beg = end) & (c.carLast = end)); - IF rightEdge THEN edge := end ELSE edge := beg END; - ShowPos(c, edge, edge); - b := beg; e := end; d := edge; d0 := edge; - CASE ch OF - | aL: - IF units THEN - p := d; e := d; - WHILE (p > 0) & ((edge = d) OR (edge = e)) DO DEC(p); st.GetWord(p, edge, e) END; - ELSIF change THEN DEC(edge) - END - | pL, dL: - v.GetThisLocation(f, edge, loc); edge := loc.start - | aR: - IF units THEN - p := d; e := edge; - WHILE (p < len) & ((edge <= d) OR (edge = e)) DO INC(p); st.GetWord(p, edge, e) END - ELSIF change THEN INC(edge) - END - | pR, dR: - v.GetThisLocation(f, edge, loc); p := st.NextLine(loc.start); - IF p = loc.start THEN p := len ELSE DEC(p) END; - IF p > edge THEN edge := p END - | aU: - IF units THEN - p := st.ThisSequence(edge); - IF p < edge THEN edge := p ELSE edge := st.PreviousSequence(edge) END - ELSE - v.PollOrigin(org, dy); v.GetThisLocation(f, edge, loc); - IF c.lastX >= 0 THEN x := c.lastX ELSE x := loc.x END; - c.carX := x; - IF loc.start > 0 THEN - edge := v.ThisPos(f, x, loc.y - 1); - IF (edge >= loc.start) & (org > 0) THEN - v.SetOrigin(org - 1, 0); - v.GetThisLocation(f, edge, loc); - edge := v.ThisPos(f, x, loc.y - 1) - END - END - END - | pU: - v.PollOrigin(org, dy); - IF edge > org THEN edge := org - ELSIF org > 0 THEN - scroll.focus := TRUE; scroll.vertical := TRUE; scroll.op := Controllers.decPage; - scroll.done := FALSE; - Views.ForwardCtrlMsg(f, scroll); - v.PollOrigin(edge, dy) - END - | dU: - edge := 0 - | aD: - IF units THEN - p := st.NextSequence(st.ThisSequence(edge)); - IF p > edge THEN edge := p ELSE edge := st.NextSequence(p) END - ELSE - v.GetThisLocation(f, edge, loc); - IF c.lastX >= 0 THEN x := c.lastX ELSE x := loc.x END; - c.carX := x; - edge := v.ThisPos(f, x, loc.y + loc.asc + loc.dsc + 1) - END - | pD: - v.GetRange(f, b, e); - IF e < len THEN - scroll.focus := TRUE; scroll.vertical := TRUE; scroll.op := Controllers.incPage; - scroll.done := FALSE; - Views.ForwardCtrlMsg(f, scroll); - v.GetRange(f, edge, e) - ELSE edge := len - END - | dD: - edge := len - END; - IF rightEdge THEN end := edge ELSE beg := edge END; - IF ~select THEN - IF rightDir THEN beg := edge ELSE end := edge END - END; - IF beg < 0 THEN beg := 0 ELSIF beg > len THEN beg := len END; - IF end < beg THEN end := beg ELSIF end > len THEN end := len END; - IF beg = end THEN - ShowPos(c, beg, end) - ELSE - IF rightEdge THEN ShowPos(c, end - 1, end) ELSE ShowPos(c, beg, beg + 1) END - END; - SetSel(c, beg, end) - END ArrowChar; - - PROCEDURE (c: StdCtrl) ControlChar (f: Views.Frame; ch: CHAR); - BEGIN - InsertChar(c, ch) - END ControlChar; - - PROCEDURE (c: StdCtrl) PasteChar (ch: CHAR); - BEGIN - InsertChar(c, ch) - END PasteChar; - - PROCEDURE (c: StdCtrl) PasteView (f: Views.Frame; v: Views.View; w, h: INTEGER); - VAR t: TextModels.Model; pos, start, beg, end, len: INTEGER; - BEGIN - GetTargetRange(c, beg, end); - IF beg # none THEN InsertView(c, beg, end, v, w, h) END - END PasteView; - - PROCEDURE (c: StdCtrl) Drop (src, f: Views.Frame; sx, sy, x, y, w, h, rx, ry: INTEGER; - v: Views.View; isSingle: BOOLEAN - ); - VAR t: TextModels.Model; pos, start, beg, end, len: INTEGER; - BEGIN - pos := ThisPos(c.view, f, x, y); - WITH v: TextViews.View DO t := v.ThisModel() ELSE t := NIL END; - IF (t # NIL) & ~isSingle THEN - InsertText(c, pos, pos, t, start); len := t.Length() - ELSE - InsertView(c, pos, pos, v, w, h); start := pos; len := 1 - END; - SetSelection(c.text, start, start + len); - AutoShowRange(c, start, start + len) - END Drop; - - PROCEDURE (c: StdCtrl) PickNativeProp (f: Views.Frame; x, y: INTEGER; VAR p: Properties.Property); - VAR rd: TextModels.Reader; - BEGIN - rd := CachedReader(c); rd.SetPos(ThisPos(c.view, f, x, y)); rd.Read; - IF ~rd.eot THEN p := rd.attr.Prop() ELSE p := NIL END; - CacheReader(c, rd) - END PickNativeProp; - - PROCEDURE (c: StdCtrl) HandleModelMsg (VAR msg: Models.Message); - VAR done: BOOLEAN; - BEGIN - c.HandleModelMsg^(msg); - IF msg.model = c.text THEN - WITH msg: Models.UpdateMsg DO - WITH msg: TextModels.UpdateMsg DO - CASE msg.op OF - TextModels.insert, TextModels.delete, TextModels.replace: - UpdateMarks(c, msg.op, msg.beg, msg.end, msg.delta) - ELSE (* unknown text op happened *) - c.view.Neutralize - END - ELSE (* unknown text update happened *) - c.view.Neutralize - END - | msg: ModelMessage DO - WITH msg: SetCaretMsg DO - c.SetCaret(msg.pos) - | msg: SetSelectionMsg DO - c.SetSelection(msg.beg, msg.end) - ELSE - END - ELSE - END - END - END HandleModelMsg; - - PROCEDURE (c: StdCtrl) HandleViewMsg (f: Views.Frame; VAR msg: Views.Message); - BEGIN - c.HandleViewMsg^(f, msg); - IF msg.view = c.view THEN - WITH msg: ViewMessage DO - WITH msg: CaretMsg DO - c.MarkCaret(f, msg.show) - | msg: SelectionMsg DO - MarkSelection(c, f, msg.beg, msg.end, msg.show) - END - ELSE - END - END - END HandleViewMsg; - - PROCEDURE (c: StdCtrl) HandleCtrlMsg (f: Views.Frame; - VAR msg: Controllers.Message; VAR focus: Views.View - ); - VAR g: Views.Frame; beg, end: INTEGER; done: BOOLEAN; - BEGIN - IF (msg IS Controllers.MarkMsg) OR (msg IS Controllers.TickMsg) THEN - beg := c.autoBeg; end := c.autoEnd; - c.autoBeg := MAX(INTEGER); c.autoEnd := 0 - END; - WITH msg: Controllers.TickMsg DO - IF ~(noAutoScroll IN c.opts) - & (0 <= beg) & (beg <= end) & (end <= c.text.Length()) - & c.view.context.Normalize() - THEN - c.view.ShowRange(beg, end, TextViews.focusOnly) - END; - IF focus = NIL THEN - CheckCaret(c); BlinkCaret(c, f, msg.tick); - IF (c.selBeg # c.aliasSelBeg) OR (c.selEnd # c.aliasSelEnd) THEN - (* lazy update of text-synchronous alias marks *) - c.aliasSelBeg := c.selBeg; c.aliasSelEnd := c.selEnd; - SetSelection(c.text, c.selBeg, c.selEnd) - END - END - | msg: Controllers.MarkMsg DO - c.carX := -1; - IF msg.show THEN c.carVisible := TRUE; c.carTick := 0 END - | msg: Controllers.TrackMsg DO - c.insAttr := NIL; c.carX := -1; Models.StopBunching(c.text) - | msg: Controllers.EditMsg DO - c.lastX := c.carX; c.carX := -1; - IF focus = NIL THEN CheckCaret(c) END - | msg: Controllers.ReplaceViewMsg DO - c.carX := -1 - | msg: Controllers.TransferMessage DO - c.carX := -1 - | msg: Properties.EmitMsg DO - c.carX := -1 - ELSE - END; - done := FALSE; - WITH msg: Controllers.CursorMessage DO - IF TRUE (* Containers.noCaret IN c.opts *) THEN (* mask or browser mode *) - g := Views.FrameAt(f, msg.x, msg.y); - IF (g = NIL) OR IsFilter(g.view, c, f, msg.x, msg.y) THEN - WITH msg: Controllers.PollCursorMsg DO - FilteredPollCursor(c, f, msg, done) - | msg: Controllers.TrackMsg DO - FilteredTrack(c, f, msg, done) - ELSE - END - END - END - ELSE - END; - IF ~done THEN c.HandleCtrlMsg^(f, msg, focus) END - END HandleCtrlMsg; - - - (* caret *) - - PROCEDURE (c: StdCtrl) HasCaret (): BOOLEAN; - BEGIN - RETURN c.carPos # none - END HasCaret; - - PROCEDURE (c: StdCtrl) MarkCaret (f: Views.Frame; show: BOOLEAN); - CONST carW = 1; carMinH = 7; (* in frame dots *) - VAR loc: TextViews.Location; pos, beg, end, u, x, y, w, h: INTEGER; fm: INTEGER; - BEGIN - pos := c.carPos; - IF (pos # none) & f.mark & (f.front & c.carVisible OR ~f.front) THEN - c.view.GetRange(f, beg, end); - IF (beg <= pos) & (pos <= end) THEN - u := f.dot; - c.view.GetThisLocation(f, pos, loc); - IF f.front THEN fm := Ports.invert ELSE fm := Ports.dim50 END; - x := loc.x; y := loc.y; h := loc.asc + loc.dsc; - IF Dialog.thickCaret THEN w := 2 * carW * u ELSE w := carW * u END; - IF x >= f.r - w THEN DEC(x, w) END; - IF h < carMinH * u THEN h := carMinH * u END; (* special caret in lines of (almost) zero height *) - f.MarkRect(x, y, x + w, y + h, Ports.fill, fm, show) - END - END - END MarkCaret; - - PROCEDURE (c: StdCtrl) CaretPos (): INTEGER; - BEGIN - RETURN c.carPos - END CaretPos; - - PROCEDURE (c: StdCtrl) SetCaret (pos: INTEGER); - BEGIN - ASSERT(none <= pos, 20); ASSERT(pos <= c.text.Length(), 21); - c.insAttr := NIL; - IF pos # c.carPos THEN - IF (pos # none) & (c.carPos = none) THEN - IF boundCaret THEN c.SetSelection(none, none) END; - c.SetFocus(NIL) - END; - - IF Containers.noCaret IN c.opts THEN pos := none END; - IF c.carPos # none THEN - c.carLast := c.carPos; FlipCaret(c, Containers.hide) - END; - c.carPos := pos; - IF pos # none THEN - c.carVisible := TRUE; c.carTick := Services.Ticks() + Dialog.caretPeriod; FlipCaret(c, Containers.show) - END - END - END SetCaret; - - - (* selection *) - - PROCEDURE (c: StdCtrl) HasSelection (): BOOLEAN; - BEGIN - RETURN c.selBeg # c.selEnd - END HasSelection; - - PROCEDURE (c: StdCtrl) Selectable (): BOOLEAN; - BEGIN - RETURN c.text.Length() > 0 - END Selectable; - - PROCEDURE (c: StdCtrl) SetSingleton (s: Views.View); - VAR s0: Views.View; - BEGIN - s0 := c.Singleton(); - c.SetSingleton^(s); - s := c.Singleton(); - IF s # s0 THEN - c.insAttr := NIL; - IF s # NIL THEN - c.selBeg := s.context(TextModels.Context).Pos(); c.selEnd := c.selBeg + 1; - c.selPin0 := c.selBeg; c.selPin1 := c.selEnd - ELSE c.selBeg := none; c.selEnd := none - END - END - END SetSingleton; - - PROCEDURE (c: StdCtrl) SelectAll (select: BOOLEAN); - (** extended by subclass to include intrinsic selections **) - BEGIN - IF select THEN c.SetSelection(0, c.text.Length()) ELSE c.SetSelection(none, none) END - END SelectAll; - - PROCEDURE (c: StdCtrl) InSelection (f: Views.Frame; x, y: INTEGER): BOOLEAN; - (* pre: c.selBeg # c.selEnd *) - (* post: (x, y) in c.selection *) - VAR b, e: TextViews.Location; y0, y1, y2, y3: INTEGER; - BEGIN - c.view.GetThisLocation(f, c.selBeg, b); y0 := b.y; y1 := y0 + b.asc + b.dsc; - c.view.GetThisLocation(f, c.selEnd, e); y2 := e.y; y3 := y2 + e.asc + e.dsc; - RETURN ((y >= y0) & (x >= b.x) OR (y >= y1)) & ((y < y2) OR (y < y3) & (x < e.x)) - END InSelection; - - PROCEDURE (c: StdCtrl) MarkSelection (f: Views.Frame; show: BOOLEAN); - BEGIN - MarkSelection(c, f, c.selBeg, c.selEnd, show) - END MarkSelection; - - PROCEDURE (c: StdCtrl) GetSelection (OUT beg, end: INTEGER); - BEGIN - beg := c.selBeg; end := c.selEnd - END GetSelection; - - PROCEDURE (c: StdCtrl) SetSelection (beg, end: INTEGER); - VAR t: TextModels.Model; rd: TextModels.Reader; - beg0, end0, p: INTEGER; singleton: BOOLEAN; - BEGIN - t := c.text; ASSERT(t # NIL, 20); - IF Containers.noSelection IN c.opts THEN end := beg - ELSIF beg # end THEN - ASSERT(0 <= beg, 21); ASSERT(beg < end, 22); ASSERT(end <= t.Length(), 23) - END; - beg0 := c.selBeg; end0 := c.selEnd; - c.insAttr := NIL; - IF (beg # beg0) OR (end # end0) THEN - IF (beg # end) & (c.selBeg = c.selEnd) THEN - IF boundCaret THEN - IF c.carPos = end THEN p := c.carPos ELSE p := beg END; - c.SetCaret(none); c.carLast := p - END; - c.SetFocus(NIL); - c.selPin0 := beg; c.selPin1 := end - ELSIF boundCaret & (beg = end) THEN - c.selPin1 := c.selPin0 (* clear selection anchors *) - END; - IF beg + 1 = end THEN - rd := CachedReader(c); - rd.SetPos(beg); rd.Read; singleton := rd.view # NIL; - CacheReader(c, rd) - ELSE singleton := FALSE - END; - IF singleton THEN (* native or singleton -> singleton *) - IF rd.view # c.Singleton() THEN c.SetSingleton(rd.view) END - ELSIF c.Singleton() # NIL THEN (* singleton -> native *) - c.SetSingleton(NIL); - c.selBeg := beg; c.selEnd := end; - FlipSelection(c, beg, end, Containers.show) - ELSE (* native -> native *) - c.selBeg := beg; c.selEnd := end; - IF (beg0 <= beg) & (end <= end0) THEN (* reduce *) - p := end0; end0 := beg; beg := end; end := p - ELSIF (beg <= beg0) & (end0 <= end) THEN (* extend *) - p := end; end := beg0; beg0 := end0; end0 := p - ELSIF (beg <= beg0) & (beg0 <= end) THEN (* shift left *) - p := end; end := beg0; beg0 := p - ELSIF (end >= end0) & (beg <= end0) THEN (* shift right *) - p := end0; end0 := beg; beg := p - END; - IF beg0 < end0 THEN FlipSelection(c, beg0, end0, Containers.show) END; - IF beg < end THEN FlipSelection(c, beg, end, Containers.show) END - END - END - END SetSelection; - - - (* StdDirectory *) - - PROCEDURE (d: StdDirectory) NewController (opts: SET): Controller; - VAR c: StdCtrl; - BEGIN - NEW(c); c.SetOpts(opts); InitMarks(c); RETURN c - END NewController; - - - PROCEDURE Init; - VAR d: StdDirectory; - BEGIN - NEW(d); dir := d; stdDir := d - END Init; - -BEGIN - Init -END TextControllers. diff --git a/new/Text/Mod/Mappers.txt b/new/Text/Mod/Mappers.txt deleted file mode 100644 index f0fc9b7..0000000 --- a/new/Text/Mod/Mappers.txt +++ /dev/null @@ -1,596 +0,0 @@ -MODULE TextMappers; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Text/Mod/Mappers.odc *) - (* DO NOT EDIT *) - - IMPORT Strings, Views, Dialog, TextModels; - - CONST - (** Scanner.opts **) - returnCtrlChars* = 1; - returnQualIdents* = 2; returnViews* = 3; - interpretBools* = 4; interpretSets* = 5; - maskViews* = 6; - - (** Scanner.type **) - char* = 1; string* = 3; int* = 4; real* = 5; - bool* = 6; (** iff interpretBools IN opts **) - set* = 7; (** iff interpretSets IN opts **) - view* = 8; (** iff returnViews IN opts **) - tab* = 9; line* = 10; para* = 11; (** iff returnCtrlChars IN opts **) - lint* = 16; - eot* = 30; - invalid* = 31; (** last Scan hit lexically invalid sequence **) - - (** Formatter.WriteIntForm base **) - charCode* = Strings.charCode; decimal* = Strings.decimal; hexadecimal* = Strings.hexadecimal; - - (** Formatter.WriteIntForm showBase **) - hideBase* = Strings.hideBase; showBase* = Strings.showBase; - - VIEW = TextModels.viewcode; - TAB = TextModels.tab; LINE = TextModels.line; PARA = TextModels.para; - - acceptUnderscores = TRUE; - - TYPE - String* = ARRAY 256 OF CHAR; - - Scanner* = RECORD - opts-: SET; - rider-: TextModels.Reader; (** prefetch state for single character look-ahead **) - - type*: INTEGER; - start*, lines*, paras*: INTEGER; (** update by Skip **) - - char*: CHAR; (** valid iff type = char **) - int*: INTEGER; (** valid iff type = int **) - base*: INTEGER; (** valid iff type IN {int, lint} **) - lint*: LONGINT; (** valid iff type IN {int, lint} **) - real*: REAL; (** valid iff type = real **) - bool*: BOOLEAN; (** valid iff type = bool **) - set*: SET; (** valid iff type = set **) - len*: INTEGER; (** valid iff type IN {string, int, lint} **) - string*: String; (** valid iff type IN {string, int, lint, bool, char} **) - view*: Views.View; w*, h*: INTEGER (** valid iff type = view **) - END; - - Formatter* = RECORD - rider-: TextModels.Writer - END; - - - (** Scanner **) - - PROCEDURE ^ (VAR s: Scanner) SetPos* (pos: INTEGER), NEW; - PROCEDURE ^ (VAR s: Scanner) SetOpts* (opts: SET), NEW; - PROCEDURE ^ (VAR s: Scanner) Skip* (OUT ch: CHAR), NEW; - PROCEDURE ^ (VAR s: Scanner) Scan*, NEW; - - - PROCEDURE Get (VAR s: Scanner; OUT ch: CHAR); - BEGIN - s.rider.ReadChar(ch) - END Get; - - PROCEDURE Real (VAR s: Scanner); - VAR res: INTEGER; ch: CHAR; - BEGIN - s.type := real; - s.string[s.len] := "."; INC(s.len); Get(s, ch); - WHILE ("0" <= ch) & (ch <= "9") & (s.len < LEN(s.string) - 1) DO - s.string[s.len] := ch; INC(s.len); Get(s, ch) - END; - IF (ch = "E") OR (ch = "D") THEN - s.string[s.len] := ch; INC(s.len); Get(s, ch); - IF (ch = "-") OR (ch = "+") THEN s.string[s.len] := ch; INC(s.len); Get(s,ch) END; - WHILE ("0" <= ch) & (ch <= "9") & (s.len < LEN(s.string) - 1) DO - s.string[s.len] := ch; INC(s.len); Get(s, ch) - END - END; - s.string[s.len] := 0X; - Strings.StringToReal(s.string, s.real, res); - IF res # 0 THEN s.type := invalid END - END Real; - - PROCEDURE Integer (VAR s: Scanner); - VAR n, k, res: INTEGER; ch: CHAR; hex: BOOLEAN; - BEGIN - s.type := int; hex := FALSE; ch := s.rider.char; - IF ch = "%" THEN - s.string[s.len] := "%"; INC(s.len); Get(s, ch); n:= 0; - IF ("0" <= ch) & (ch <= "9") THEN - k := ORD(ch) - ORD("0"); - REPEAT - n := 10*n + k; s.string[s.len] := ch; INC(s.len); - Get(s, ch); k := ORD(ch) - ORD("0") - UNTIL (ch < "0") OR (ch > "9") OR (n > (MAX(INTEGER) - k) DIV 10) OR (s.len = LEN(s.string)); - IF ("0" <= ch) & (ch <= "9") THEN s.type := invalid ELSE s.base := n END - ELSE s.type := invalid - END - ELSIF (ch = "H") OR (ch = "X") THEN - hex := TRUE; s.base := 16; - s.string[s.len] := ch; INC(s.len); Get(s, ch) - ELSE - s.base := 10 - END; - s.string[s.len] := 0X; - IF s.type # invalid THEN - Strings.StringToInt(s.string, s.int, res); - IF res = 0 THEN s.type := int; - IF hex THEN (* Strings.StringToLInt(s.string, s.lint, res); ASSERT(res = 0, 100); *) - IF s.int < 0 THEN s.lint := s.int + (LONG(MAX(INTEGER)) + 1) * 2 - ELSE s.lint := s.int - END - ELSE s.lint := s.int - END - ELSIF res = 1 THEN (* INTEGER overflow *) - Strings.StringToLInt(s.string, s.lint, res); - IF res = 0 THEN s.type := lint ELSE s.type := invalid END - ELSE (* syntax error *) - s.type := invalid - END - END - END Integer; - - PROCEDURE Number (VAR s: Scanner; neg: BOOLEAN); - VAR m: INTEGER; ch: CHAR; - BEGIN - s.len := 0; m := 0; ch := s.rider.char; - IF neg THEN s.string[s.len] := "-"; INC(s.len) END; - REPEAT - IF (m > 0) OR (ch # "0") THEN (* ignore leading zeroes *) - s.string[s.len] := ch; INC(s.len); INC(m) - END; - Get(s, ch) - UNTIL (ch < "0") OR (ch > "9") & (ch < "A") OR (ch > "F") - OR (s.len = LEN(s.string) - 1) OR s.rider.eot; - IF (s.len = 0) OR (s.len = 1) & (s.string[0] = "-") THEN (* compensate for ignoring leading zeroes *) - s.string[s.len] := "0"; INC(s.len) - END; - s.string[s.len] := 0X; - IF ch = "." THEN Real(s) ELSE Integer(s) END - END Number; - - PROCEDURE Cardinal (VAR s: Scanner; OUT n: INTEGER); - VAR k: INTEGER; ch: CHAR; - BEGIN - n := 0; s.Skip(ch); - IF ("0" <= ch) & (ch <= "9") THEN - k := ORD(ch) - ORD("0"); - REPEAT - n := n * 10 + k; - Get(s, ch); k := ORD(ch) - ORD("0") - UNTIL (ch < "0") OR (ch > "9") OR (n > (MAX(INTEGER) - k) DIV 10); - IF ("0" <= ch) & (ch <= "9") THEN s.type := invalid END - ELSE s.type := invalid - END - END Cardinal; - - PROCEDURE Set (VAR s: Scanner); - VAR n, m: INTEGER; ch: CHAR; - BEGIN - s.type := set; Get(s, ch); s.Skip(ch); s.set := {}; - WHILE ("0" <= ch) & (ch <= "9") & (s.type = set) DO - Cardinal(s, n); s.Skip(ch); - IF (MIN(SET) <= n) & (n <= MAX(SET)) THEN - INCL(s.set, n); - IF ch = "," THEN - Get(s, ch); s.Skip(ch) - ELSIF ch = "." THEN - Get(s, ch); - IF ch = "." THEN - Get(s, ch); s.Skip(ch); Cardinal(s, m); s.Skip(ch); - IF ch = "," THEN Get(s, ch); s.Skip(ch) END; - IF (n <= m) & (m <= MAX(SET)) THEN - WHILE m > n DO INCL(s.set, m); DEC(m) END - ELSE s.type := invalid - END - ELSE s.type := invalid - END - END - ELSE s.type := invalid - END - END; - IF s.type = set THEN - s.Skip(ch); - IF ch = "}" THEN Get(s, ch) ELSE s.type := invalid END - END - END Set; - - PROCEDURE Boolean (VAR s: Scanner); - VAR ch: CHAR; - BEGIN - s.type := bool; Get(s, ch); - IF (ch = "T") OR (ch = "F") THEN - s.Scan; - IF (s.type = string) & (s.string = "TRUE") THEN s.type := bool; s.bool := TRUE - ELSIF (s.type = string) & (s.string = "FALSE") THEN s.type := bool; s.bool := FALSE - ELSE s.type := invalid - END - ELSE s.type := invalid - END - END Boolean; - - PROCEDURE Name (VAR s: Scanner); - VAR max: INTEGER; ch: CHAR; - BEGIN - s.type := string; s.len := 0; ch := s.rider.char; max := LEN(s.string); - REPEAT - s.string[s.len] := ch; INC(s.len); Get(s, ch) - UNTIL - ~( ("0" <= ch) & (ch <= "9") - OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z") - OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D7X) & (ch # 0F7X) - OR acceptUnderscores & (ch = "_")) - OR (s.len = max); - IF (returnQualIdents IN s.opts) & (ch = ".") & (s.len < max) THEN - REPEAT - s.string[s.len] := ch; INC(s.len); Get(s, ch) - UNTIL - ~( ("0" <= ch) & (ch <= "9") - OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z") - OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D7X) & (ch # 0F7X) - OR acceptUnderscores & (ch = "_") ) - OR (s.len = max) - END; - IF s.len = max THEN DEC(s.len); s.type := invalid END; (* ident too long *) - s.string[s.len] := 0X - END Name; - - PROCEDURE DoubleQuotedString (VAR s: Scanner); - VAR max, pos: INTEGER; ch: CHAR; - BEGIN - pos := s.rider.Pos(); - s.type := string; s.len := 0; max := LEN(s.string) - 1; Get(s, ch); - WHILE (ch # '"') & (ch # 0X) & (s.len < max) DO - s.string[s.len] := ch; INC(s.len); - Get(s, ch) - END; - s.string[s.len] := 0X; - IF ch = '"' THEN Get(s, ch) - ELSE s.type := invalid; s.rider.SetPos(pos (* s.rider.Pos() - s.len - 1 *)); Get(s, ch) - END - END DoubleQuotedString; - - PROCEDURE SingleQuotedString (VAR s: Scanner); - VAR max, pos: INTEGER; ch: CHAR; - BEGIN - pos := s.rider.Pos(); - s.type := string; s.len := 0; max := LEN(s.string) - 1; Get(s, ch); - WHILE (ch # "'") & (ch # 0X) & (s.len < max) DO - s.string[s.len] := ch; INC(s.len); - Get(s, ch) - END; - s.string[s.len] := 0X; - IF s.len = 1 THEN s.type := char; s.char := s.string[0] END; - IF ch = "'" THEN Get(s, ch) - ELSE s.type := invalid; s.rider.SetPos(pos (* s.rider.Pos() - s.len - 1 *)); Get(s, ch) - END - END SingleQuotedString; - - PROCEDURE Char (VAR s: Scanner); - VAR ch: CHAR; - BEGIN - ch := s.rider.char; - IF ch # 0X THEN - s.type := char; s.char := ch; s.string[0] := ch; s.string[1] := 0X; Get(s, ch) - ELSE s.type := invalid - END - END Char; - - PROCEDURE View (VAR s: Scanner); - VAR ch: CHAR; - BEGIN - s.type := view; s.view := s.rider.view; s.w := s.rider.w; s.h := s.rider.h; - IF maskViews IN s.opts THEN - IF s.rider.char # TextModels.viewcode THEN - s.type := char; s.char := s.rider.char; s.string[0] := s.char; s.string[1] := 0X - END - END; - Get(s, ch) - END View; - - - PROCEDURE (VAR s: Scanner) ConnectTo* (text: TextModels.Model), NEW; - BEGIN - IF text # NIL THEN - s.rider := text.NewReader(s.rider); s.SetPos(0); s.SetOpts({}) - ELSE - s.rider := NIL - END - END ConnectTo; - - PROCEDURE (VAR s: Scanner) SetPos* (pos: INTEGER), NEW; - BEGIN - s.rider.SetPos(pos); s.start := pos; - s.lines := 0; s.paras := 0; s.type := invalid - END SetPos; - - PROCEDURE (VAR s: Scanner) SetOpts* (opts: SET), NEW; - BEGIN - s.opts := opts - END SetOpts; - - PROCEDURE (VAR s: Scanner) Pos* (): INTEGER, NEW; - BEGIN - RETURN s.rider.Pos() - END Pos; - - PROCEDURE (VAR s: Scanner) Skip* (OUT ch: CHAR), NEW; - VAR c, v: BOOLEAN; - BEGIN - IF s.opts * {returnCtrlChars, returnViews} = {} THEN - ch := s.rider.char; - WHILE ((ch <= " ") OR (ch = TextModels.digitspace) OR (ch = TextModels.nbspace)) - & ~s.rider.eot DO - IF ch = LINE THEN INC(s.lines) - ELSIF ch = PARA THEN INC(s.paras) - END; - Get(s, ch) - END - ELSE - c := returnCtrlChars IN s.opts; - v := returnViews IN s.opts; - ch := s.rider.char; - WHILE ((ch <= " ") OR (ch = TextModels.digitspace) OR (ch = TextModels.nbspace)) - & ~s.rider.eot - & (~c OR (ch # TAB) & (ch # LINE) & (ch # PARA)) - & (~v OR (ch # VIEW) OR (s.rider.view = NIL)) DO - IF ch = LINE THEN INC(s.lines) - ELSIF ch = PARA THEN INC(s.paras) - END; - Get(s, ch) - END - END; - IF ~s.rider.eot THEN s.start := s.rider.Pos() - 1 - ELSE s.start := s.rider.Base().Length(); s.type := eot - END - END Skip; - - PROCEDURE (VAR s: Scanner) Scan*, NEW; - VAR sign, neg: BOOLEAN; ch: CHAR; - BEGIN - s.Skip(ch); - IF s.type # eot THEN - neg := (ch = "-"); sign := neg OR (ch = "+"); - IF sign THEN s.char := ch; Get(s, ch) END; - IF ("0" <= ch) & (ch <= "9") THEN Number(s, neg) - ELSIF sign THEN s.type := char; (* return prefetched sign w/o trailing number *) - s.string[0] := s.char; s.string[1] := 0X - ELSE - CASE ch OF - | "A" .. "Z", "a" .. "z", 0C0X .. 0D6X, 0D8X .. 0F6X, 0F8X .. 0FFX: Name(s) - | '"': DoubleQuotedString(s) - | "'": SingleQuotedString(s) - | TAB: s.type := tab; Get(s, ch) - | LINE: s.type := line; Get(s, ch) - | PARA: s.type := para; Get(s, ch) - | VIEW: - IF s.rider.view # NIL THEN View(s) ELSE Char(s) END - | "{": - IF interpretSets IN s.opts THEN Set(s) ELSE Char(s) END - | "$": - IF interpretBools IN s.opts THEN Boolean(s) ELSE Char(s) END - | "_": - IF acceptUnderscores THEN Name(s) ELSE Char(s) END - ELSE Char(s) - END - END - END - END Scan; - - - (** scanning utilities **) - - PROCEDURE IsQualIdent* (IN s: ARRAY OF CHAR): BOOLEAN; - VAR i: INTEGER; ch: CHAR; - BEGIN - ch := s[0]; i := 1; - IF ("A" <= CAP(ch)) & (CAP(ch) <= "Z") - OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D0X) & (ch # 0D7X) & (ch # 0F7X) THEN - REPEAT - ch := s[i]; INC(i) - UNTIL - ~( ("0" <= ch) & (ch <= "9") - OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z") - OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D0X) & (ch # 0D7X) & (ch # 0F7X) - OR (ch = "_") ); - IF ch = "." THEN - INC(i); - REPEAT - ch := s[i]; INC(i) - UNTIL - ~( ("0" <= ch) & (ch <= "9") - OR ("A" <= CAP(ch)) & (CAP(ch) <= "Z") - OR (0C0X <= ch) & (ch <= 0FFX) & (ch # 0D0X) & (ch # 0D7X) & (ch # 0F7X) - OR (ch = "_") ); - RETURN ch = 0X - ELSE - RETURN FALSE - END - ELSE - RETURN FALSE - END - END IsQualIdent; - - PROCEDURE ScanQualIdent* (VAR s: Scanner; OUT x: ARRAY OF CHAR; OUT done: BOOLEAN); - VAR mod: String; i, j, len, start: INTEGER; ch: CHAR; - BEGIN - done := FALSE; - IF s.type = string THEN - IF IsQualIdent(s.string) THEN - IF s.len < LEN(x) THEN - x := s.string$; done := TRUE - END - ELSE - mod := s.string; len := s.len; start := s.start; - s.Scan; - IF (s.type = char) & (s.char = ".") THEN - s.Scan; - IF (s.type = string) & (len + 1 + s.len < LEN(x)) THEN - i := 0; ch := mod[0]; WHILE ch # 0X DO x[i] := ch; INC(i); ch := mod[i] END; - x[i] := "."; INC(i); - j := 0; ch := s.string[0]; - WHILE ch # 0X DO x[i] := ch; INC(i); INC(j); ch := s.string[j] END; - x[i] := 0X; done := TRUE - END - END; - IF ~done THEN s.SetPos(start); s.Scan() END - END - END - END ScanQualIdent; - - - (** Formatter **) - - PROCEDURE ^ (VAR f: Formatter) SetPos* (pos: INTEGER), NEW; - PROCEDURE ^ (VAR f: Formatter) WriteIntForm* (x: LONGINT; - base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN), NEW; - PROCEDURE ^ (VAR f: Formatter) WriteRealForm* (x: REAL; - precision, minW, expW: INTEGER; fillCh: CHAR), NEW; - PROCEDURE ^ (VAR f: Formatter) WriteViewForm* (v: Views.View; w, h: INTEGER), NEW; - - - PROCEDURE (VAR f: Formatter) ConnectTo* (text: TextModels.Model), NEW; - BEGIN - IF text # NIL THEN - f.rider := text.NewWriter(f.rider); f.SetPos(text.Length()) - ELSE - f.rider := NIL - END - END ConnectTo; - - PROCEDURE (VAR f: Formatter) SetPos* (pos: INTEGER), NEW; - BEGIN - f.rider.SetPos(pos) - END SetPos; - - PROCEDURE (VAR f: Formatter) Pos* (): INTEGER, NEW; - BEGIN - RETURN f.rider.Pos() - END Pos; - - - PROCEDURE (VAR f: Formatter) WriteChar* (x: CHAR), NEW; - BEGIN - IF (x >= " ") & (x # 7FX) THEN - f.rider.WriteChar(x) - ELSE - f.rider.WriteChar(" "); - f.WriteIntForm(ORD(x), charCode, 3, "0", showBase); - f.rider.WriteChar(" ") - END - END WriteChar; - - PROCEDURE (VAR f: Formatter) WriteInt* (x: LONGINT), NEW; - BEGIN - f.WriteIntForm(x, decimal, 0, TextModels.digitspace, hideBase) - END WriteInt; - - PROCEDURE (VAR f: Formatter) WriteSString* (x: ARRAY OF SHORTCHAR), NEW; - VAR i: INTEGER; - BEGIN - i := 0; WHILE x[i] # 0X DO f.WriteChar(x[i]); INC(i) END - END WriteSString; - - PROCEDURE (VAR f: Formatter) WriteString* (x: ARRAY OF CHAR), NEW; - VAR i: INTEGER; - BEGIN - i := 0; WHILE x[i] # 0X DO f.WriteChar(x[i]); INC(i) END - END WriteString; - - PROCEDURE (VAR f: Formatter) WriteReal* (x: REAL), NEW; - VAR m: ARRAY 256 OF CHAR; - BEGIN - Strings.RealToString(x, m); f.WriteString(m) - END WriteReal; - - PROCEDURE (VAR f: Formatter) WriteBool* (x: BOOLEAN), NEW; - BEGIN - IF x THEN f.WriteString("$TRUE") ELSE f.WriteString("$FALSE") END - END WriteBool; - - PROCEDURE (VAR f: Formatter) WriteSet* (x: SET), NEW; - VAR i: INTEGER; - BEGIN - f.WriteChar("{"); i := MIN(SET); - WHILE x # {} DO - IF i IN x THEN f.WriteInt(i); EXCL(x, i); - IF (i + 2 <= MAX(SET)) & (i+1 IN x) & (i+2 IN x) THEN f.WriteString(".."); - x := x - {i+1, i+2}; INC(i, 3); - WHILE (i <= MAX(SET)) & (i IN x) DO EXCL(x, i); INC(i) END; - f.WriteInt(i-1) - END; - IF x # {} THEN f.WriteString(", ") END - END; - INC(i) - END; - f.WriteChar("}") - END WriteSet; - - PROCEDURE (VAR f: Formatter) WriteTab*, NEW; - BEGIN - f.rider.WriteChar(TAB) - END WriteTab; - - PROCEDURE (VAR f: Formatter) WriteLn*, NEW; - BEGIN - f.rider.WriteChar(LINE) - END WriteLn; - - PROCEDURE (VAR f: Formatter) WritePara*, NEW; - BEGIN - f.rider.WriteChar(PARA) - END WritePara; - - PROCEDURE (VAR f: Formatter) WriteView* (v: Views.View), NEW; - BEGIN - f.WriteViewForm(v, Views.undefined, Views.undefined) - END WriteView; - - - PROCEDURE (VAR f: Formatter) WriteIntForm* (x: LONGINT; - base, minWidth: INTEGER; fillCh: CHAR; showBase: BOOLEAN - ), NEW; - VAR s: ARRAY 80 OF CHAR; - BEGIN - Strings.IntToStringForm(x, base, minWidth, fillCh, showBase, s); - f.WriteString(s) - END WriteIntForm; - - PROCEDURE (VAR f: Formatter) WriteRealForm* (x: REAL; - precision, minW, expW: INTEGER; fillCh: CHAR - ), NEW; - VAR s: ARRAY 256 OF CHAR; - BEGIN - Strings.RealToStringForm(x, precision, minW, expW, fillCh, s); f.WriteString(s) - END WriteRealForm; - - - PROCEDURE (VAR f: Formatter) WriteViewForm* (v: Views.View; w, h: INTEGER), NEW; - BEGIN - f.rider.WriteView(v, w, h) - END WriteViewForm; - - PROCEDURE (VAR f: Formatter) WriteParamMsg* (msg, p0, p1, p2: ARRAY OF CHAR), NEW; - VAR s: ARRAY 256 OF CHAR; i: INTEGER; ch: CHAR; - BEGIN - Dialog.MapParamString(msg, p0, p1, p2, s); - i := 0; ch := s[0]; - WHILE ch # 0X DO - IF ch = LINE THEN f.WriteLn - ELSIF ch = PARA THEN f.WritePara - ELSIF ch = TAB THEN f.WriteTab - ELSIF ch >= " " THEN f.WriteChar(ch) - END; - INC(i); ch := s[i] - END - END WriteParamMsg; - - PROCEDURE (VAR f: Formatter) WriteMsg* (msg: ARRAY OF CHAR), NEW; - BEGIN - f.WriteParamMsg(msg, "", "", "") - END WriteMsg; - -END TextMappers. diff --git a/new/Text/Mod/Models.txt b/new/Text/Mod/Models.txt deleted file mode 100644 index dc1e43b..0000000 --- a/new/Text/Mod/Models.txt +++ /dev/null @@ -1,2085 +0,0 @@ -MODULE TextModels; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Text/Mod/Models.odc *) - (* DO NOT EDIT *) - -(* re-check alien attributes: project to base attributes? *) -(* support *lists* of attribute extensions? *) -(* support for enumeration of texts within embedded views - - generally: support for enumeration of X-views within a recursive scheme? - - however: Containers already provides a general iteration scheme - -> could add recursion support to Reader later -*) - - IMPORT - Files, Services, Fonts, Ports, Stores, Models, Views, Properties, Containers; - - (* text file format: - - text = 0 CHAR - textoffset INTEGER (> 0) - { run } - -1 CHAR - { char } - - run = attrno BYTE (0..32) - [ attr ] attr.Internalize - ( piece | lpiece | viewref ) - - piece = length INTEGER (> 0) - - lpiece = -length INTEGER (< 0, length MOD 2 = 0) - - viewref = 0 INTEGER - w INTEGER - h INTEGER - view view.Internalize - *) - - CONST - (* unicode* = 1X; *) - viewcode* = 2X; (** code for embedded views **) - tab* = 9X; line* = 0DX; para* = 0EX; (** tabulator; line and paragraph separator **) - zwspace* = 8BX; nbspace* = 0A0X; digitspace* = 8FX; - hyphen* = 90X; nbhyphen* = 91X; softhyphen* = 0ADX; - - (** Pref.opts, options of text-aware views **) - maskChar* = 0; hideable* = 1; - - (** Prop.known/valid/readOnly **) - offset* = 0; code* = 1; - - (** InfoMsg.op **) - store* = 0; - - (** UpdateMsg.op **) - replace* = 0; insert* = 1; delete* = 2; - - (* EditOp.mode *) - deleteRange = 0; moveBuf = 1; writeSChar = 2; writeChar = 3; writeView = 4; - - dictSize = 32; - - point = Ports.point; - defW = 64 * point; defH = 32 * point; - - (* embedding limits - don't increase maxHeight w/o checking TextViews.StdView *) - minWidth = 5 * point; maxWidth = MAX(INTEGER) DIV 2; - minHeight = 5 * point; maxHeight = 1500 * point; - - minVersion = 0; maxAttrVersion = 0; maxModelVersion = 0; - noLCharStdModelVersion = 0; maxStdModelVersion = 1; - - cacheWidth = 8; cacheLen = 4096; cacheLine = 128; - - TYPE - Model* = POINTER TO ABSTRACT RECORD (Containers.Model) END; - - Attributes* = POINTER TO EXTENSIBLE RECORD (Stores.Store) - init-: BOOLEAN; (* immutable once init is set *) - color-: Ports.Color; - font-: Fonts.Font; - offset-: INTEGER - END; - - AlienAttributes* = POINTER TO RECORD (Attributes) - store-: Stores.Alien - END; - - Prop* = POINTER TO RECORD (Properties.Property) - offset*: INTEGER; - code*: CHAR - END; - - - Context* = POINTER TO ABSTRACT RECORD (Models.Context) END; - - Pref* = RECORD (Properties.Preference) - opts*: SET; (** preset to {} **) - mask*: CHAR (** valid if maskChar IN opts **) - END; - - - Reader* = POINTER TO ABSTRACT RECORD - eot*: BOOLEAN; - attr*: Attributes; - char*: CHAR; - view*: Views.View; - w*, h*: INTEGER - END; - - Writer* = POINTER TO ABSTRACT RECORD - attr-: Attributes - END; - - - InfoMsg* = RECORD (Models.Message) - op*: INTEGER - END; - - UpdateMsg* = RECORD (Models.UpdateMsg) - op*: INTEGER; - beg*, end*, delta*: INTEGER (** range: [beg, end); length = length' + delta **) - END; - - - Directory* = POINTER TO ABSTRACT RECORD - attr-: Attributes - END; - - - Run = POINTER TO EXTENSIBLE RECORD - prev, next: Run; - len: INTEGER; - attr: Attributes - END; - - LPiece = POINTER TO EXTENSIBLE RECORD (Run) - file: Files.File; - org: INTEGER - END; - - Piece = POINTER TO RECORD (LPiece) END; (* u IS Piece => CHAR run *) - - ViewRef = POINTER TO RECORD (Run) (* u IS ViewRef => View run *) - w, h: INTEGER; - view: Views.View (* embedded view *) - END; - - - PieceCache = RECORD - org: INTEGER; - prev: Run (* Org(prev.next) = org *) - END; - - SpillFile = POINTER TO RECORD - file: Files.File; (* valid if file # NIL *) - len: INTEGER; (* len = file.Length() *) - writer: Files.Writer (* writer.Base() = file *) - END; - - AttrDict = RECORD - len: BYTE; - attr: ARRAY dictSize OF Attributes - END; - - StdModel = POINTER TO RECORD (Model) - len: INTEGER; (* len = sum(u : [trailer.next, trailer) : u.len) *) - id: INTEGER; (* unique (could use SYSTEM.ADR instead ...) *) - era: INTEGER; (* stable era >= k *) - trailer: Run; (* init => trailer # NIL *) - pc: PieceCache; - spill: SpillFile; (* spill file, created lazily, shared with clones *) - rd: Reader (* reader cache *) - END; - - StdContext = POINTER TO RECORD (Context) - text: StdModel; - ref: ViewRef - END; - - StdReader = POINTER TO RECORD (Reader) - base: StdModel; (* base = Base() *) - pos: INTEGER; (* pos = Pos() *) - era: INTEGER; - run: Run; (* era = base.era => Pos(run) + off = pos *) - off: INTEGER; (* era = base.era => 0 <= off < run.len *) - reader: Files.Reader (* file reader cache *) - END; - - StdWriter = POINTER TO RECORD (Writer) - base: StdModel; (* base = Base() *) - (* hasSequencer := base.Domain() = NIL OR base.Domain().GetSequencer() = NIL *) - pos: INTEGER; (* pos = Pos() *) - era: INTEGER; (* relevant iff hasSequencer *) - run: Run (* hasSequencer & era = base.era => Pos(run) = pos *) - END; - - StdDirectory = POINTER TO RECORD (Directory) END; - - - MoveOp = POINTER TO RECORD (Stores.Operation) (* MoveStretchFrom *) - (* move src.[beg, end) to dest.pos *) - src: StdModel; - beg, end: INTEGER; - dest: StdModel; - pos: INTEGER - END; - - EditOp = POINTER TO RECORD (Stores.Operation) (* CopyStretchFrom, Delete, WriteXXX *) - mode: INTEGER; - canBunch: BOOLEAN; - text: StdModel; - beg, end: INTEGER; (* op = deleteRange: move text.[beg, end) to *) - pos: INTEGER; - first, last: Run; (* op = moveBuf: move to text.pos; - op = writeView: insert at text.pos*) - len: INTEGER; (* op = moveBuf: length of ; - op = write[L]Char: length of spill file before writing new [long] char *) - attr: Attributes (* op = write[L]Char *) - END; - - AttrList = POINTER TO RECORD - next: AttrList; - len: INTEGER; - attr: Attributes - END; - - SetAttrOp = POINTER TO RECORD (Stores.Operation) (* SetAttr, Modify *) - text: StdModel; - beg: INTEGER; - list: AttrList - END; - - ResizeViewOp = POINTER TO RECORD (Stores.Operation) (* ResizeView *) - text: StdModel; - pos: INTEGER; - ref: ViewRef; - w, h: INTEGER - END; - - ReplaceViewOp = POINTER TO RECORD (Stores.Operation) (* ReplaceView *) - text: StdModel; - pos: INTEGER; - ref: ViewRef; - new: Views.View - END; - - TextCache = RECORD - id: INTEGER; (* id of the text block served by this cache block *) - beg, end: INTEGER; (* [beg .. end) cached, 0 <= end - beg < cacheLen *) - buf: ARRAY cacheLen OF BYTE (* [beg MOD cacheLen .. end MOD cacheLen) *) - END; - Cache = ARRAY cacheWidth OF TextCache; - - VAR - dir-, stdDir-: Directory; - - stdProp: Properties.StdProp; (* temp for NewColor, ... NewWeight *) - prop: Prop; (* temp for NewOffset *) - nextId: INTEGER; - cache: Cache; - - - (** Model **) - - PROCEDURE (m: Model) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE; - VAR thisVersion: INTEGER; - BEGIN - m.Internalize^(rd); IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxModelVersion, thisVersion) - END Internalize; - - PROCEDURE (m: Model) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE; - BEGIN - m.Externalize^(wr); - wr.WriteVersion(maxModelVersion) - END Externalize; - - - PROCEDURE (m: Model) Length* (): INTEGER, NEW, ABSTRACT; - PROCEDURE (m: Model) NewReader* (old: Reader): Reader, NEW, ABSTRACT; - PROCEDURE (m: Model) NewWriter* (old: Writer): Writer, NEW, ABSTRACT; - PROCEDURE (m: Model) InsertCopy* (pos: INTEGER; m0: Model; beg0, end0: INTEGER), NEW, ABSTRACT; - PROCEDURE (m: Model) Insert* (pos: INTEGER; m0: Model; beg0, end0: INTEGER), NEW, ABSTRACT; - PROCEDURE (m: Model) Delete* (beg, end: INTEGER), NEW, ABSTRACT; - PROCEDURE (m: Model) SetAttr* (beg, end: INTEGER; attr: Attributes), NEW, ABSTRACT; - PROCEDURE (m: Model) Prop* (beg, end: INTEGER): Properties.Property, NEW, ABSTRACT; - PROCEDURE (m: Model) Modify* (beg, end: INTEGER; old, p: Properties.Property), NEW, ABSTRACT; - PROCEDURE (m: Model) ReplaceView* (old, new: Views.View), ABSTRACT; - - PROCEDURE (m: Model) Append* (m0: Model), NEW, ABSTRACT; -(* - BEGIN - ASSERT(m # m0, 20); - m.Insert(m.Length(), m0, 0, m0.Length()) - END Append; -*) - PROCEDURE (m: Model) Replace* (beg, end: INTEGER; m0: Model; beg0, end0: INTEGER), - NEW, ABSTRACT; -(* - VAR script: Stores.Operation; delta: INTEGER; - BEGIN - Models.BeginScript(m, "#System:Replacing", script); - m.Delete(beg, end); - IF beg0 > - m.Insert(beg, m0, beg0, end0); - Models.EndScript(m, script) - END Replace; -*) - - (** Attributes **) - - PROCEDURE (a: Attributes) CopyFrom- (source: Stores.Store), EXTENSIBLE; - (** pre: ~a.init, source.init **) - (** post: a.init **) - BEGIN - WITH source: Attributes DO - ASSERT(~a.init, 20); ASSERT(source.init, 21); a.init := TRUE; - a.color := source.color; a.font := source.font; a.offset := source.offset - END - END CopyFrom; - - PROCEDURE (a: Attributes) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE; - (** pre: ~a.init **) - (** post: a.init **) - VAR thisVersion: INTEGER; - fprint: INTEGER; face: Fonts.Typeface; size: INTEGER; style: SET; weight: INTEGER; - BEGIN - ASSERT(~a.init, 20); a.init := TRUE; - a.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxAttrVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - rd.ReadInt(a.color); - rd.ReadInt(fprint); - rd.ReadXString(face); rd.ReadInt(size); rd.ReadSet(style); rd.ReadXInt(weight); - a.font := Fonts.dir.This(face, size, style, weight); - IF a.font.IsAlien() THEN Stores.Report("#System:AlienFont", face, "", "") -(* - ELSIF a.font.Fingerprint() # fprint THEN Stores.Report("#System:AlienFontVersion", face, "", "") -*) - END; - rd.ReadInt(a.offset) - END Internalize; - - PROCEDURE (a: Attributes) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE; - (** pre: a.init **) - VAR f: Fonts.Font; - BEGIN - ASSERT(a.init, 20); - a.Externalize^(wr); - wr.WriteVersion(maxAttrVersion); - wr.WriteInt(a.color); - f := a.font; -(* - wr.WriteInt(f.Fingerprint()); -*) - wr.WriteInt(0); - wr.WriteXString(f.typeface); wr.WriteInt(f.size); wr.WriteSet(f.style); wr.WriteXInt(f.weight); - wr.WriteInt(a.offset) - END Externalize; - - PROCEDURE (a: Attributes) InitFromProp* (p: Properties.Property), NEW, EXTENSIBLE; - (** pre: ~a.init **) - (** post: a.init, x IN p.valid => x set in a, else x defaults in a **) - VAR def: Fonts.Font; face: Fonts.Typeface; size: INTEGER; style: SET; weight: INTEGER; - BEGIN - ASSERT(~a.init, 20); a.init := TRUE; - def := Fonts.dir.Default(); - face := def.typeface$; size := def.size; style := def.style; weight := def.weight; - a.color := Ports.defaultColor; a.offset := 0; - WHILE p # NIL DO - WITH p: Properties.StdProp DO - IF Properties.color IN p.valid THEN a.color := p.color.val END; - IF Properties.typeface IN p.valid THEN face := p.typeface END; - IF (Properties.size IN p.valid) - & (Ports.point <= p.size) & (p.size <= 32767 * Ports.point) THEN - size := p.size - END; - IF Properties.style IN p.valid THEN - style := style - p.style.mask + p.style.val * p.style.mask - END; - IF (Properties.weight IN p.valid) & (1 <= p.weight) & (p.weight <= 1000) THEN - weight := p.weight - END - | p: Prop DO - IF offset IN p.valid THEN a.offset := p.offset END - ELSE - END; - p := p.next - END; - a.font := Fonts.dir.This(face, size, style, weight) - END InitFromProp; - - PROCEDURE (a: Attributes) Equals* (b: Attributes): BOOLEAN, NEW, EXTENSIBLE; - (** pre: a.init, b.init **) - BEGIN - ASSERT(a.init, 20); ASSERT((b # NIL) & b.init, 21); - RETURN (a = b) - OR (Services.SameType(a, b)) - & (a.color = b.color) & (a.font = b.font) & (a.offset = b.offset) - END Equals; - - PROCEDURE (a: Attributes) Prop* (): Properties.Property, NEW, EXTENSIBLE; - (** pre: a.init **) - VAR p: Properties.Property; sp: Properties.StdProp; tp: Prop; - BEGIN - ASSERT(a.init, 20); - NEW(sp); - sp.known := {Properties.color .. Properties.weight}; sp.valid := sp.known; - sp.color.val := a.color; - sp.typeface := a.font.typeface$; - sp.size := a.font.size; - sp.style.mask := {Fonts.italic, Fonts.underline, Fonts.strikeout}; - sp.style.val := a.font.style * sp.style.mask; - sp.weight := a.font.weight; - NEW(tp); - tp.known := {offset}; tp.valid := tp.known; - tp.offset := a.offset; - Properties.Insert(p, tp); Properties.Insert(p, sp); - RETURN p - END Prop; - - PROCEDURE (a: Attributes) ModifyFromProp- (p: Properties.Property), NEW, EXTENSIBLE; - (** pre: ~a.init **) - VAR face: Fonts.Typeface; size: INTEGER; style: SET; weight: INTEGER; - valid: SET; - BEGIN - face := a.font.typeface; size := a.font.size; - style := a.font.style; weight := a.font.weight; - WHILE p # NIL DO - valid := p.valid; - WITH p: Properties.StdProp DO - IF Properties.color IN valid THEN a.color := p.color.val END; - IF Properties.typeface IN valid THEN - face := p.typeface - END; - IF (Properties.size IN valid) - & (Ports.point <= p.size) & (p.size <= 32767 * Ports.point) THEN - size := p.size - ELSE EXCL(valid, Properties.size) - END; - IF Properties.style IN valid THEN - style := style - p.style.mask + p.style.val * p.style.mask - END; - IF (Properties.weight IN valid) & (1 <= p.weight) & (p.weight <= 1000) THEN - weight := p.weight - ELSE EXCL(valid, Properties.weight) - END; - IF valid - {Properties.typeface .. Properties.weight} # valid THEN - a.font := Fonts.dir.This(face, size, style, weight) - END - | p: Prop DO - IF offset IN valid THEN a.offset := p.offset END - ELSE - END; - p := p.next - END - END ModifyFromProp; - - - PROCEDURE ReadAttr* (VAR rd: Stores.Reader; VAR a: Attributes); - VAR st: Stores.Store; alien: AlienAttributes; - BEGIN - rd.ReadStore(st); ASSERT(st # NIL, 20); - IF st IS Stores.Alien THEN - NEW(alien); alien.store := st(Stores.Alien); Stores.Join(alien, alien.store); - alien.InitFromProp(NIL); a := alien; - Stores.Report("#Text:AlienAttributes", "", "", "") - ELSE a := st(Attributes) - END - END ReadAttr; - - PROCEDURE WriteAttr* (VAR wr: Stores.Writer; a: Attributes); - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - WITH a: AlienAttributes DO wr.WriteStore(a.store) ELSE wr.WriteStore(a) END - END WriteAttr; - - PROCEDURE ModifiedAttr* (a: Attributes; p: Properties.Property): Attributes; - (** pre: a.init **) - (** post: x IN p.valid => x in new attr set to value in p, else set to value in a **) - VAR h: Attributes; - BEGIN - ASSERT(a.init, 20); - h := Stores.CopyOf(a)(Attributes); h.ModifyFromProp(p); - RETURN h - END ModifiedAttr; - - - (** AlienAttributes **) - - PROCEDURE (a: AlienAttributes) Externalize- (VAR wr: Stores.Writer); - BEGIN - HALT(100) - END Externalize; - - PROCEDURE (a: AlienAttributes) CopyFrom- (source: Stores.Store); - BEGIN - a.CopyFrom^(source); - a.store := Stores.CopyOf(source(AlienAttributes).store)(Stores.Alien); - Stores.Join(a, a.store) - END CopyFrom; - - PROCEDURE (a: AlienAttributes) Prop* (): Properties.Property; - BEGIN - RETURN NIL - END Prop; - - PROCEDURE (a: AlienAttributes) ModifyFromProp- (p: Properties.Property); - END ModifyFromProp; - - - (** Prop **) - - PROCEDURE (p: Prop) IntersectWith* (q: Properties.Property; OUT equal: BOOLEAN); - VAR valid: SET; - BEGIN - WITH q: Prop DO - valid := p.valid * q.valid; equal := TRUE; - IF p.offset # q.offset THEN EXCL(valid, offset) END; - IF p.code # q.code THEN EXCL(valid, code) END; - IF p.valid # valid THEN p.valid := valid; equal := FALSE END - END - END IntersectWith; - - - (** Context **) - - PROCEDURE (c: Context) ThisModel* (): Model, ABSTRACT; - PROCEDURE (c: Context) Pos* (): INTEGER, NEW, ABSTRACT; - PROCEDURE (c: Context) Attr* (): Attributes, NEW, ABSTRACT; - - - (** Reader **) - - PROCEDURE (rd: Reader) Base* (): Model, NEW, ABSTRACT; - PROCEDURE (rd: Reader) SetPos* (pos: INTEGER), NEW, ABSTRACT; - PROCEDURE (rd: Reader) Pos* (): INTEGER, NEW, ABSTRACT; - PROCEDURE (rd: Reader) Read*, NEW, ABSTRACT; - PROCEDURE (rd: Reader) ReadPrev*, NEW, ABSTRACT; - - PROCEDURE (rd: Reader) ReadChar* (OUT ch: CHAR), NEW, ABSTRACT; -(* - BEGIN - rd.Read; ch := rd.char - END ReadChar; -*) - PROCEDURE (rd: Reader) ReadPrevChar* (OUT ch: CHAR), NEW, ABSTRACT; -(* - BEGIN - rd.ReadPrev; ch := rd.char - END ReadPrevChar; -*) - PROCEDURE (rd: Reader) ReadView* (OUT v: Views.View), NEW, ABSTRACT; -(* - BEGIN - REPEAT rd.Read UNTIL (rd.view # NIL) OR rd.eot; - v := rd.view - END ReadView; -*) - PROCEDURE (rd: Reader) ReadPrevView* (OUT v: Views.View), NEW, ABSTRACT; -(* - BEGIN - REPEAT rd.ReadPrev UNTIL (rd.view # NIL) OR rd.eot; - v := rd.view - END ReadPrevView; -*) - PROCEDURE (rd: Reader) ReadRun* (OUT attr: Attributes), NEW, ABSTRACT; - (** post: rd.eot OR a # NIL, rd.view = ViewAt(rd.Pos() - 1) **) -(* - VAR a: Attributes; - BEGIN - a := rd.attr; - REPEAT rd.Read UNTIL (rd.attr # a) OR (rd.view # NIL) OR rd.eot; - IF rd.eot THEN attr := NIL ELSE attr := rd.attr END - END ReadRun; -*) - PROCEDURE (rd: Reader) ReadPrevRun* (OUT attr: Attributes), NEW, ABSTRACT; - (** post: rd.eot OR a # NIL, rd.view = ViewAt(rd.Pos()) **) -(* - VAR a: Attributes; - BEGIN - a := rd.attr; - REPEAT rd.ReadPrev UNTIL (rd.attr # a) OR (rd.view # NIL) OR rd.eot; - IF rd.eot THEN attr := NIL ELSE attr := rd.attr END - END ReadPrevRun; -*) - - (** Writer **) - - PROCEDURE (wr: Writer) Base* (): Model, NEW, ABSTRACT; - PROCEDURE (wr: Writer) SetPos* (pos: INTEGER), NEW, ABSTRACT; - PROCEDURE (wr: Writer) Pos* (): INTEGER, NEW, ABSTRACT; - (* PROCEDURE (wr: Writer) WriteSChar* (ch: SHORTCHAR), NEW, ABSTRACT; *) - PROCEDURE (wr: Writer) WriteChar* (ch: CHAR), NEW, ABSTRACT; - PROCEDURE (wr: Writer) WriteView* (view: Views.View; w, h: INTEGER), NEW, ABSTRACT; - - PROCEDURE (wr: Writer) SetAttr* (attr: Attributes), NEW(*, EXTENSIBLE*); - BEGIN - ASSERT(attr # NIL, 20); ASSERT(attr.init, 21); wr.attr := attr - END SetAttr; - - - (** Directory **) - - PROCEDURE (d: Directory) New* (): Model, NEW, ABSTRACT; - - PROCEDURE (d: Directory) NewFromString* (s: ARRAY OF CHAR): Model, NEW, EXTENSIBLE; - VAR m: Model; w: Writer; i: INTEGER; - BEGIN - m := d.New(); w := m.NewWriter(NIL); - i := 0; WHILE s[i] # 0X DO w.WriteChar(s[i]); INC(i) END; - RETURN m - END NewFromString; - - PROCEDURE (d: Directory) SetAttr* (attr: Attributes), NEW, EXTENSIBLE; - BEGIN - ASSERT(attr.init, 20); d.attr := attr - END SetAttr; - - - (* StdModel - foundation *) - - PROCEDURE OpenSpill (s: SpillFile); - BEGIN - s.file := Files.dir.Temp(); s.len := 0; - s.writer := s.file.NewWriter(NIL) - END OpenSpill; - - PROCEDURE Find (t: StdModel; VAR pos: INTEGER; VAR u: Run; VAR off: INTEGER); - (* post: 0 <= pos <= t.len, 0 <= off < u.len, Pos(u) + off = pos *) - (* Read/Write rely on Find to force pos into the legal range *) - VAR v: Run; m: INTEGER; - BEGIN - IF pos < 0 THEN pos := 0 END; - IF pos >= t.len THEN - u := t.trailer; off := 0; t.pc.prev := t.trailer; t.pc.org := 0 - ELSE - v := t.pc.prev.next; m := pos - t.pc.org; - IF m >= 0 THEN - WHILE m >= v.len DO DEC(m, v.len); v := v.next END - ELSE - WHILE m < 0 DO v := v.prev; INC(m, v.len) END - END; - u := v; off := m; t.pc.prev := v.prev; t.pc.org := pos - m - END - END Find; - - PROCEDURE Split (off: INTEGER; VAR u, un: Run); - (* pre: 0 <= off <= u.len *) - (* post: u.len = off, u.len + un.len = u'.len, Pos(u) + u.len = Pos(un) *) - VAR lp: LPiece; sp: Piece; - BEGIN - IF off = 0 THEN un := u; u := un.prev (* "split" at left edge of run *) - ELSIF off < u.len THEN (* u.len > 1 => u IS LPiece; true split *) - WITH u: Piece DO - NEW(sp); sp^ := u^; INC(sp.org, off); - un := sp - ELSE (* u IS LPiece) & ~(u IS Piece) *) - NEW(lp); - lp.prev := u.prev; lp.next := u.next; lp.len := u.len; lp.attr := u.attr; - lp.file := u(LPiece).file; lp.org := u(LPiece).org; - INC(lp.org, 2 * off); - un := lp - END; - DEC(un.len, off); DEC(u.len, un.len); - un.prev := u; un.next := u.next; un.next.prev := un; u.next := un - ELSIF off = u.len THEN un := u.next (* "split" at right edge of run *) - ELSE HALT(100) - END - END Split; - - PROCEDURE Merge (t: StdModel; u: Run; VAR v: Run); - VAR p, q: LPiece; - BEGIN - WITH u: Piece DO - IF (v IS Piece) & ((u.attr = v.attr) OR u.attr.Equals(v.attr)) THEN - p := u; q := v(Piece); - IF (p.file = q.file) & (p.org + p.len = q.org) THEN - IF t.pc.prev = p THEN INC(t.pc.org, q.len) - ELSIF t.pc.prev = q THEN t.pc.prev := t.trailer; t.pc.org := 0 - END; - INC(p.len, q.len); v := v.next - END - END - | u: LPiece DO (* ~(u IS Piece) *) - IF (v IS LPiece) & ~(v IS Piece) & ((u.attr = v.attr) OR u.attr.Equals(v.attr)) THEN - p := u(LPiece); q := v(LPiece); - IF (p.file = q.file) & (p.org + 2 * p.len = q.org) THEN - IF t.pc.prev = p THEN INC(t.pc.org, q.len) - ELSIF t.pc.prev = q THEN t.pc.prev := t.trailer; t.pc.org := 0 - END; - INC(p.len, q.len); v := v.next - END - END - ELSE (* ignore: can't merge ViewRef runs *) - END - END Merge; - - PROCEDURE Splice (un, v, w: Run); (* (u, un) -> (u, v ... w, un) *) - VAR u: Run; - BEGIN - IF v # w.next THEN (* non-empty stretch v ... w *) - u := un.prev; - u.next := v; v.prev := u; un.prev := w; w.next := un - END - END Splice; - - PROCEDURE NewContext (r: ViewRef; text: StdModel): StdContext; - VAR c: StdContext; - BEGIN - NEW(c); c.text := text; c.ref := r; - Stores.Join(text, r.view); - RETURN c - END NewContext; - - PROCEDURE CopyOfPiece (p: LPiece): LPiece; - VAR lp: LPiece; sp: Piece; - BEGIN - WITH p: Piece DO NEW(sp); sp^ := p^; RETURN sp - ELSE - NEW(lp); - lp.prev := p.prev; lp.next := p.next; lp.len := p.len; lp.attr := p.attr; - lp.file := p(LPiece).file; lp.org := p(LPiece).org; - RETURN lp - END - END CopyOfPiece; - - PROCEDURE CopyOfViewRef (r: ViewRef; text: StdModel): ViewRef; - VAR v: ViewRef; - BEGIN - NEW(v); v^ := r^; - v.view := Views.CopyOf(r.view, Views.deep); - v.view.InitContext(NewContext(v, text)); - RETURN v - END CopyOfViewRef; - - PROCEDURE InvalCache (t: StdModel; pos: INTEGER); - VAR n: INTEGER; - BEGIN - n := t.id MOD cacheWidth; - IF cache[n].id = t.id THEN - IF pos <= cache[n].beg THEN cache[n].beg := 0; cache[n].end := 0 - ELSIF pos < cache[n].end THEN cache[n].end := pos - END - END - END InvalCache; - - PROCEDURE StdInit (t: StdModel); - VAR u: Run; - BEGIN - IF t.trailer = NIL THEN - NEW(u); u.len := MAX(INTEGER); u.attr := NIL; u.next := u; u.prev := u; - t.len := 0; t.id := nextId; INC(nextId); t.era := 0; t.trailer := u; - t.pc.prev := u; t.pc.org := 0; - IF t.spill = NIL THEN NEW(t.spill) END - END - END StdInit; - - PROCEDURE CopyOf (src: StdModel; beg, end: INTEGER; dst: StdModel): StdModel; - VAR buf: StdModel; u, v, r, z, zn: Run; ud, vd: INTEGER; - BEGIN - ASSERT(beg < end, 20); - buf := Containers.CloneOf(dst)(StdModel); - ASSERT(buf.Domain() = NIL, 100); - Find(src, beg, u, ud); Find(src, end, v, vd); - z := buf.trailer; r := u; - WHILE r # v DO - WITH r: LPiece DO (* Piece or LPiece *) - zn := CopyOfPiece(r); DEC(zn.len, ud); - IF zn IS Piece THEN INC(zn(LPiece).org, ud) ELSE INC(zn(LPiece).org, 2 * ud) END - | r: ViewRef DO - zn := CopyOfViewRef(r, buf) - ELSE (* ignore *) - END; - z.next := zn; zn.prev := z; z := zn; r := r.next; ud := 0 - END; - IF vd > 0 THEN (* v IS LPiece *) - zn := CopyOfPiece(v(LPiece)); zn.len := vd - ud; - IF zn IS Piece THEN INC(zn(LPiece).org, ud) ELSE INC(zn(LPiece).org, 2 * ud) END; - z.next := zn; zn.prev := z; z := zn - END; - z.next := buf.trailer; buf.trailer.prev := z; - buf.len := end - beg; - RETURN buf - END CopyOf; - - PROCEDURE ProjectionOf (src: Model; beg, end: INTEGER; dst: StdModel): StdModel; - (* rider-conversion to eliminate covariance conflicts in binary operations *) - VAR buf: StdModel; rd: Reader; wr: Writer; - BEGIN - rd := src.NewReader(NIL); rd.SetPos(beg); - buf := Containers.CloneOf(dst)(StdModel); ASSERT(buf.Domain() = NIL, 100); - wr := buf.NewWriter(NIL); - WHILE beg < end DO - INC(beg); - rd.Read; wr.SetAttr(rd.attr); - IF rd.view # NIL THEN - wr.WriteView(Views.CopyOf(rd.view, Views.deep), rd.w, rd.h) - ELSE - wr.WriteChar(rd.char) - END - END; - RETURN buf - END ProjectionOf; - - PROCEDURE Move (src: StdModel; beg, end: INTEGER; dest: StdModel; pos: INTEGER); - VAR pc: PieceCache; view: Views.View; - u, un, v, vn, w, wn: Run; ud, vd, wd: INTEGER; - (*initDom: BOOLEAN; newDom, dom: Stores.Domain;*) - upd: UpdateMsg; neut: Models.NeutralizeMsg; - BEGIN - Models.Broadcast(src, neut); - Find(src, beg, u, ud); Split(ud, u, un); pc := src.pc; - Find(src, end, v, vd); Split(vd, v, vn); src.pc := pc; - Merge(src, u, vn); u.next := vn; vn.prev := u; - DEC(src.len, end - beg); - InvalCache(src, beg); - INC(src.era); - upd.op := delete; upd.beg := beg; upd.end := beg + 1; upd.delta := beg - end; - Models.Broadcast(src, upd); - IF src = dest THEN - IF pos > end THEN DEC(pos, end - beg) END - ELSE - (*newDom := dest.Domain(); initDom := (src.Domain() = NIL) & (newDom # NIL);*) - w := un; - WHILE w # vn DO - (* - IF initDom THEN - dom := w.attr.Domain(); - IF (dom # NIL) & (dom # newDom) THEN w.attr := Stores.CopyOf(w.attr)(Attributes) END; - Stores.InitDomain(w.attr, newDom) - END; - *) - IF ~Stores.Joined(dest, w.attr) THEN - IF ~Stores.Unattached(w.attr) THEN w.attr := Stores.CopyOf(w.attr)(Attributes) END; - Stores.Join(dest, w.attr) - END; - WITH w: ViewRef DO - view := w.view; - (*IF initDom THEN Stores.InitDomain(view, newDom) END;*) - Stores.Join(dest, view); - view.context(StdContext).text := dest - ELSE - END; - w := w.next - END - END; - Find(dest, pos, w, wd); Split(wd, w, wn); Splice(wn, un, v); - v := wn.prev; Merge(dest, v, wn); v.next := wn; wn.prev := v; - wn := w.next; Merge(dest, w, wn); w.next := wn; wn.prev := w; - INC(dest.len, end - beg); - InvalCache(dest, pos); - INC(dest.era); - upd.op := insert; upd.beg := pos; upd.end := pos + end - beg; upd.delta := end - beg; - Models.Broadcast(dest, upd) - END Move; - - - (* StdModel - operations *) - - PROCEDURE (op: MoveOp) Do; - VAR src, dest: StdModel; beg, end, pos: INTEGER; neut: Models.NeutralizeMsg; - BEGIN - src := op.src; beg := op.beg; end := op.end; dest := op.dest; pos := op.pos; - IF src = dest THEN - IF pos < beg THEN - op.pos := end; op.beg := pos; op.end := pos + end - beg - ELSE - op.pos := beg; op.beg := pos - (end - beg); op.end := pos - END - ELSE - Models.Broadcast(op.src, neut); (* destination is neutralized by sequencer *) - op.dest := src; op.src := dest; - op.pos := beg; op.beg := pos; op.end := pos + end - beg - END; - Move(src, beg, end, dest, pos) - END Do; - - PROCEDURE DoMove (name: Stores.OpName; - src: StdModel; beg, end: INTEGER; - dest: StdModel; pos: INTEGER - ); - VAR op: MoveOp; - BEGIN - IF (beg < end) & ((src # dest) OR ~((beg <= pos) & (pos <= end))) THEN - NEW(op); - op.src := src; op.beg := beg; op.end := end; - op.dest := dest; op.pos := pos; - Models.Do(dest, name, op) - END - END DoMove; - - - PROCEDURE (op: EditOp) Do; - VAR text: StdModel; (*newDom, dom: Stores.Domain;*) pc: PieceCache; - u, un, v, vn: Run; sp: Piece; lp: LPiece; r: ViewRef; - ud, vd, beg, end, pos, len: INTEGER; w, h: INTEGER; - upd: UpdateMsg; - BEGIN - text := op.text; - CASE op.mode OF - deleteRange: - beg := op.beg; end := op.end; len := end - beg; - Find(text, beg, u, ud); Split(ud, u, un); pc := text.pc; - Find(text, end, v, vd); Split(vd, v, vn); text.pc := pc; - Merge(text, u, vn); u.next := vn; vn.prev := u; - DEC(text.len, len); - InvalCache(text, beg); - INC(text.era); - op.mode := moveBuf; op.canBunch := FALSE; - op.pos := beg; op.first := un; op.last := v; op.len := len; - upd.op := delete; upd.beg := beg; upd.end := beg + 1; upd.delta := -len; - Models.Broadcast(text, upd) - | moveBuf: - pos := op.pos; - Find(text, pos, u, ud); Split(ud, u, un); Splice(un, op.first, op.last); - INC(text.len, op.len); - InvalCache(text, pos); - INC(text.era); - op.mode := deleteRange; - op.beg := pos; op.end := pos + op.len; - upd.op := insert; upd.beg := pos; upd.end := pos + op.len; upd.delta := op.len; - Models.Broadcast(text, upd) - | writeSChar: - pos := op.pos; - InvalCache(text, pos); - Find(text, pos, u, ud); Split(ud, u, un); - IF (u.attr = op.attr) & (u IS Piece) & (u(Piece).file = text.spill.file) - & (u(Piece).org + u.len = op.len) THEN - INC(u.len); - IF text.pc.org >= pos THEN INC(text.pc.org) END - ELSE - (* - newDom := text.Domain(); - IF newDom # NIL THEN - dom := op.attr.Domain(); - IF (dom # NIL) & (dom # newDom) THEN - op.attr := Stores.CopyOf(op.attr)(Attributes) - END; - Stores.InitDomain(op.attr, newDom) - END; - *) - IF ~Stores.Joined(text, op.attr) THEN - IF ~Stores.Unattached(op.attr) THEN op.attr := Stores.CopyOf(op.attr)(Attributes) END; - Stores.Join(text, op.attr) - END; - NEW(sp); u.next := sp; sp.prev := u; sp.next := un; un.prev := sp; - sp.len := 1; sp.attr := op.attr; - sp.file := text.spill.file; sp.org := op.len; - IF text.pc.org > pos THEN INC(text.pc.org) END - END; - INC(text.len); INC(text.era); - op.mode := deleteRange; - upd.op := insert; upd.beg := pos; upd.end := pos + 1; upd.delta := 1; - Models.Broadcast(text, upd) - | writeChar: - pos := op.pos; - InvalCache(text, pos); - Find(text, pos, u, ud); Split(ud, u, un); - IF (u.attr = op.attr) & (u IS LPiece) & ~(u IS Piece) & (u(LPiece).file = text.spill.file) - & (u(LPiece).org + 2 * u.len = op.len) THEN - INC(u.len); - IF text.pc.org >= pos THEN INC(text.pc.org) END - ELSE - (* - newDom := text.Domain(); - IF newDom # NIL THEN - dom := op.attr.Domain(); - IF (dom # NIL) & (dom # newDom) THEN - op.attr := Stores.CopyOf(op.attr)(Attributes) - END; - Stores.InitDomain(op.attr, newDom) - END; - *) - IF ~Stores.Joined(text, op.attr) THEN - IF ~Stores.Unattached(op.attr) THEN op.attr := Stores.CopyOf(op.attr)(Attributes) END; - Stores.Join(text, op.attr) - END; - NEW(lp); u.next := lp; lp.prev := u; lp.next := un; un.prev := lp; - lp.len := 1; lp.attr := op.attr; - lp.file := text.spill.file; lp.org := op.len; - IF text.pc.org > pos THEN INC(text.pc.org) END - END; - INC(text.len); INC(text.era); - op.mode := deleteRange; - upd.op := insert; upd.beg := pos; upd.end := pos + 1; upd.delta := 1; - Models.Broadcast(text, upd) - | writeView: - pos := op.pos; r := op.first(ViewRef); - InvalCache(text, pos); - Find(text, pos, u, ud); Split(ud, u, un); - u.next := r; r.prev := u; r.next := un; un.prev := r; - INC(text.len); INC(text.era); - r.view.InitContext(NewContext(r, text)); - (* Stores.InitDomain(r.view, text.Domain()); *) - Stores.Join(text, r.view); - w := r.w; h := r.h; r.w := defW; r.h := defH; - Properties.PreferredSize(r.view, minWidth, maxWidth, minHeight, maxHeight, defW, defH, - w, h - ); - r.w := w; r.h := h; - op.mode := deleteRange; - upd.op := insert; upd.beg := pos; upd.end := pos + 1; upd.delta := 1; - Models.Broadcast(text, upd) - END - END Do; - - PROCEDURE GetWriteOp (t: StdModel; pos: INTEGER; VAR op: EditOp; VAR bunch: BOOLEAN); - VAR last: Stores.Operation; - BEGIN - last := Models.LastOp(t); - IF (last # NIL) & (last IS EditOp) THEN - op := last(EditOp); - bunch := op.canBunch & (op.end = pos) - ELSE bunch := FALSE - END; - IF bunch THEN - INC(op.end) - ELSE - NEW(op); op.canBunch := TRUE; - op.text := t; op.beg := pos; op.end := pos + 1 - END; - op.pos := pos - END GetWriteOp; - - - PROCEDURE SetPreferredSize (t: StdModel; v: Views.View); - VAR minW, maxW, minH, maxH, w, h: INTEGER; - BEGIN - t.GetEmbeddingLimits(minW, maxW, minH, maxH); - v.context.GetSize(w, h); - Properties.PreferredSize(v, minW, maxW, minH, maxH, w, h, w, h); - v.context.SetSize(w, h) - END SetPreferredSize; - - PROCEDURE (op: SetAttrOp) Do; - VAR t: StdModel; attr: Attributes; z: AttrList; (*checkDom: BOOLEAN;*) - pc: PieceCache; u, un, v, vn: Run; ud, vd, pos, next: INTEGER; - upd: UpdateMsg; - BEGIN - t := op.text; z := op.list; pos := op.beg; (*checkDom := t.Domain() # NIL;*) - WHILE z # NIL DO - next := pos + z.len; - IF z.attr # NIL THEN - Find(t, pos, u, ud); Split(ud, u, un); pc := t.pc; - Find(t, next, v, vd); Split(vd, v, vn); t.pc := pc; - attr := un.attr; - WHILE un # vn DO - un.attr := z.attr; - (* - IF checkDom & (un.attr.Domain() # t.Domain()) THEN - IF un.attr.Domain() # NIL THEN un.attr := Stores.CopyOf(un.attr)(Attributes) END; - Stores.InitDomain(un.attr, t.Domain()) - END; - *) - IF ~Stores.Joined(t, un.attr) THEN - IF ~Stores.Unattached(un.attr) THEN un.attr := Stores.CopyOf(un.attr)(Attributes) END; - Stores.Join(t, un.attr) - END; - Merge(t, u, un); - WITH un: ViewRef DO SetPreferredSize(t, un.view) ELSE END; - IF u.next = un THEN u := un; un := un.next ELSE u.next := un; un.prev := u END - END; - Merge(t, u, un); u.next := un; un.prev := u; - z.attr := attr - END; - pos := next; z := z.next - END; - INC(t.era); - upd.op := replace; upd.beg := op.beg; upd.end := pos; upd.delta := 0; - Models.Broadcast(t, upd) - END Do; - - - PROCEDURE (op: ResizeViewOp) Do; - VAR r: ViewRef; w, h: INTEGER; upd: UpdateMsg; - BEGIN - r := op.ref; - w := op.w; h := op.h; op.w := r.w; op.h := r.h; r.w := w; r.h := h; - INC(op.text.era); - upd.op := replace; upd.beg := op.pos; upd.end := op.pos + 1; upd.delta := 0; - Models.Broadcast(op.text, upd) - END Do; - - - PROCEDURE (op: ReplaceViewOp) Do; - VAR new: Views.View; upd: UpdateMsg; - BEGIN - new := op.new; op.new := op.ref.view; op.ref.view := new; - INC(op.text.era); - upd.op := replace; upd.beg := op.pos; upd.end := op.pos + 1; upd.delta := 0; - Models.Broadcast(op.text, upd) - END Do; - - - (* StdModel *) - - PROCEDURE (t: StdModel) InitFrom (source: Containers.Model); - BEGIN - WITH source: StdModel DO - ASSERT(source.trailer # NIL, 20); - t.spill := source.spill; (* reduce no of temp files: share spill files among clones *) - StdInit(t) - END - END InitFrom; - - PROCEDURE WriteCharacters (t: StdModel; VAR wr: Stores.Writer); - VAR r: Files.Reader; u: Run; len: INTEGER; -(* - sp: Properties.StorePref; -*) - buf: ARRAY 1024 OF BYTE; - BEGIN - r := NIL; - u := t.trailer.next; - WHILE u # t.trailer DO - WITH u: Piece DO - r := u.file.NewReader(r); r.SetPos(u.org); - len := u.len; - WHILE len > LEN(buf) DO - r.ReadBytes(buf, 0, LEN(buf)); wr.rider.WriteBytes(buf, 0, LEN(buf)); - DEC(len, LEN(buf)) - END; - r.ReadBytes(buf, 0, len); wr.rider.WriteBytes(buf, 0, len) - | u: LPiece DO (* ~(u IS Piece) *) - r := u.file.NewReader(r); r.SetPos(u.org); - len := 2 * u.len; - WHILE len > LEN(buf) DO - r.ReadBytes(buf, 0, LEN(buf)); wr.rider.WriteBytes(buf, 0, LEN(buf)); - DEC(len, LEN(buf)) - END; - r.ReadBytes(buf, 0, len); wr.rider.WriteBytes(buf, 0, len) - | u: ViewRef DO -(* - sp.view := u.view; Views.HandlePropMsg(u.view, sp); - IF sp.view # NIL THEN wr.WriteSChar(viewcode) END -*) - IF Stores.ExternalizeProxy(u.view) # NIL THEN - wr.WriteSChar(viewcode) - END - END; - u := u.next - END - END WriteCharacters; - - PROCEDURE WriteAttributes (VAR wr: Stores.Writer; t: StdModel; - a: Attributes; VAR dict: AttrDict - ); - VAR k, len: BYTE; - BEGIN - len := dict.len; k := 0; WHILE (k # len) & ~a.Equals(dict.attr[k]) DO INC(k) END; - wr.WriteByte(k); - IF k = len THEN - IF len < dictSize THEN dict.attr[len] := a; INC(dict.len) END; - (* ASSERT(Stores.Joined(t, a)); but bkwd-comp: *) - (* IF a.Domain() # d THEN always copy: bkwd-comp hack to avoid link *) - a := Stores.CopyOf(a)(Attributes); (* Stores.InitDomain(a, d); *) Stores.Join(t, a); - (* END; *) - WriteAttr(wr, a) - END - END WriteAttributes; - - PROCEDURE (t: StdModel) Externalize (VAR wr: Stores.Writer); - VAR (*dom: Stores.Domain;*) u, v, un: Run; - attr: Attributes; dict: AttrDict; - org, runlen, pos: INTEGER; lchars: BOOLEAN; - inf: InfoMsg; - BEGIN - t.Externalize^(wr); - StdInit(t); (*dom := t.Domain();*) - wr.WriteVersion(0); - wr.WriteInt(0); org := wr.Pos(); - u := t.trailer.next; v := t.trailer; dict.len := 0; lchars := FALSE; - WHILE u # v DO - attr := u.attr; - WITH u: Piece DO - runlen := u.len; un := u.next; - WHILE (un IS Piece) & un.attr.Equals(attr) DO - INC(runlen, un.len); un := un.next - END; - WriteAttributes(wr, t, attr, dict); wr.WriteInt(runlen) - | u: LPiece DO (* ~(u IS Piece) *) - runlen := 2 * u.len; un := u.next; - WHILE (un IS LPiece) & ~(un IS Piece) & un.attr.Equals(attr) DO - INC(runlen, 2 * un.len); un := un.next - END; - WriteAttributes(wr, t, attr, dict); wr.WriteInt(-runlen); - lchars := TRUE - | u: ViewRef DO - IF Stores.ExternalizeProxy(u.view) # NIL THEN - WriteAttributes(wr, t, attr, dict); wr.WriteInt(0); - wr.WriteInt(u.w); wr.WriteInt(u.h); Views.WriteView(wr, u.view) - END; - un := u.next - END; - u := un - END; - wr.WriteByte(-1); - pos := wr.Pos(); - wr.SetPos(org - 5); - IF lchars THEN wr.WriteVersion(maxStdModelVersion) - ELSE wr.WriteVersion(noLCharStdModelVersion) (* version 0 did not support LONGCHAR *) - END; - wr.WriteInt(pos - org); - wr.SetPos(pos); - WriteCharacters(t, wr); - inf.op := store; Models.Broadcast(t, inf) - END Externalize; - - PROCEDURE (t: StdModel) Internalize (VAR rd: Stores.Reader); - VAR u, un: Run; sp: Piece; lp: LPiece; v: ViewRef; - org, len: INTEGER; ano: BYTE; thisVersion: INTEGER; - attr: Attributes; dict: AttrDict; - BEGIN - ASSERT(t.Domain() = NIL, 20); ASSERT(t.len = 0, 21); - t.Internalize^(rd); IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStdModelVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - StdInit(t); - dict.len := 0; u := t.trailer; - rd.ReadInt(len); org := rd.Pos() + len; - rd.ReadByte(ano); - WHILE ano # -1 DO - IF ano = dict.len THEN - ReadAttr(rd, attr); Stores.Join(t, attr); - IF dict.len < dictSize THEN dict.attr[dict.len] := attr; INC(dict.len) END - ELSE - attr := dict.attr[ano] - END; - rd.ReadInt(len); - IF len > 0 THEN (* piece *) - NEW(sp); sp.len := len; sp.attr := attr; - sp.file := rd.rider.Base(); sp.org := org; un := sp; - INC(org, len) - ELSIF len < 0 THEN (* longchar piece *) - len := -len; ASSERT(~ODD(len), 100); - NEW(lp); lp.len := len DIV 2; lp.attr := attr; - lp.file := rd.rider.Base(); lp.org := org; un := lp; - INC(org, len) - ELSE (* len = 0 => embedded view *) - NEW(v); v.len := 1; v.attr := attr; - rd.ReadInt(v.w); rd.ReadInt(v.h); Views.ReadView(rd, v.view); - v.view.InitContext(NewContext(v, t)); - un := v; INC(org) - END; - INC(t.len, un.len); u.next := un; un.prev := u; u := un; - rd.ReadByte(ano) - END; - rd.SetPos(org); - u.next := t.trailer; t.trailer.prev := u - END Internalize; - -(* - PROCEDURE (t: StdModel) PropagateDomain; - VAR u: Run; dom: Stores.Domain; - BEGIN - IF t.Domain() # NIL THEN - u := t.trailer.next; - WHILE u # t.trailer DO - dom := u.attr.Domain(); - IF (dom # NIL) & (dom # t.Domain()) THEN u.attr := Stores.CopyOf(u.attr)(Attributes) END; - Stores.InitDomain(u.attr, t.Domain()); - WITH u: ViewRef DO Stores.InitDomain(u.view, t.Domain()) ELSE END; - u := u.next - END - END - END PropagateDomain; -*) - - PROCEDURE (t: StdModel) GetEmbeddingLimits (OUT minW, maxW, minH, maxH: INTEGER); - BEGIN - minW := minWidth; maxW := maxWidth; minH := minHeight; maxH := maxHeight - END GetEmbeddingLimits; - - - PROCEDURE (t: StdModel) Length (): INTEGER; - BEGIN - StdInit(t); - RETURN t.len - END Length; - - PROCEDURE (t: StdModel) NewReader (old: Reader): Reader; - VAR rd: StdReader; - BEGIN - StdInit(t); - IF (old # NIL) & (old IS StdReader) THEN rd := old(StdReader) ELSE NEW(rd) END; - IF rd.base # t THEN - rd.base := t; rd.era := -1; rd.SetPos(0) - ELSIF rd.pos > t.len THEN - rd.SetPos(t.len) - END; - rd.eot := FALSE; - RETURN rd - END NewReader; - - PROCEDURE (t: StdModel) NewWriter (old: Writer): Writer; - VAR wr: StdWriter; - BEGIN - StdInit(t); - IF (old # NIL) & (old IS StdWriter) THEN wr := old(StdWriter) ELSE NEW(wr) END; - IF (wr.base # t) OR (wr.pos > t.len) THEN - wr.base := t; wr.era := -1; wr.SetPos(t.len) - END; - wr.SetAttr(dir.attr); - RETURN wr - END NewWriter; - - PROCEDURE (t: StdModel) InsertCopy (pos: INTEGER; t0: Model; beg0, end0: INTEGER); - VAR buf: StdModel; - BEGIN - StdInit(t); - ASSERT(0 <= pos, 21); ASSERT(pos <= t.len, 22); - ASSERT(0 <= beg0, 23); ASSERT(beg0 <= end0, 24); ASSERT(end0 <= t0.Length(), 25); - IF beg0 < end0 THEN - WITH t0: StdModel DO buf := CopyOf(t0, beg0, end0, t) - ELSE buf := ProjectionOf(t0, beg0, end0, t) - END; - (* IF t.Domain() # NIL THEN Stores.InitDomain(buf,t.Domain()) END; *) - Stores.Join(t, buf); - DoMove("#System:Copying", buf, 0, buf.len, t, pos) - END - END InsertCopy; - - PROCEDURE (t: StdModel) Insert (pos: INTEGER; t0: Model; beg, end: INTEGER); - BEGIN - StdInit(t); - ASSERT(0 <= pos, 21); ASSERT(pos <= t.len, 22); - ASSERT(0 <= beg, 23); ASSERT(beg <= end, 24); ASSERT(end <= t0.Length(), 25); - IF beg < end THEN - IF (t.Domain() # NIL) & (t0 IS StdModel) & (t0.Domain() = t.Domain()) THEN - DoMove("#System:Moving", t0(StdModel), beg, end, t, pos) - ELSE (* moving across domains *) - t.InsertCopy(pos, t0, beg, end); t0.Delete(beg, end) - END - END - END Insert; - - PROCEDURE (t: StdModel) Append (t0: Model); - VAR len0: INTEGER; - BEGIN - StdInit(t); - ASSERT(t # t0, 20); - len0 := t0.Length(); - IF len0 > 0 THEN - IF (t.Domain() # NIL) & (t0 IS StdModel) & (t0.Domain() = t.Domain()) THEN - DoMove("#Text:Appending", t0(StdModel), 0, len0, t, t.len) - ELSE (* moving across domains *) - t.InsertCopy(t.len, t0, 0, len0); t0.Delete(0, len0) - END - END - END Append; - - PROCEDURE (t: StdModel) Delete (beg, end: INTEGER); - VAR op: EditOp; - BEGIN - StdInit(t); - ASSERT(0 <= beg, 20); ASSERT(beg <= end, 21); ASSERT(end <= t.len, 22); - IF beg < end THEN - NEW(op); op.mode := deleteRange; op.canBunch := FALSE; - op.text := t; op.beg := beg; op.end := end; - Models.Do(t, "#System:Deleting", op) - END - END Delete; - - PROCEDURE (t: StdModel) SetAttr (beg, end: INTEGER; attr: Attributes); - VAR op: SetAttrOp; zp, z: AttrList; - u, v, w: Run; ud, vd: INTEGER; modified: BOOLEAN; - BEGIN - StdInit(t); - ASSERT(0 <= beg, 20); ASSERT(beg <= end, 21); ASSERT(end <= t.len, 22); - IF beg < end THEN - NEW(op); op.text := t; op.beg := beg; - Find(t, beg, u, ud); Find(t, end, v, vd); - IF vd > 0 THEN w := v.next ELSE w := v END; - zp := NIL; modified := FALSE; - WHILE u # w DO - IF u = v THEN INC(ud, v.len - vd) END; - NEW(z); z.len := u.len - ud; z.attr := attr; - IF zp = NIL THEN op.list := z ELSE zp.next:= z END; - zp := z; - modified := modified OR ~u.attr.Equals(attr); - u := u.next; ud := 0 - END; - IF modified THEN Models.Do(t, "#Text:AttributeChange", op) END - END - END SetAttr; - - PROCEDURE (t: StdModel) Prop (beg, end: INTEGER): Properties.Property; - VAR p, q: Properties.Property; tp: Prop; - u, v, w: Run; ud, vd: INTEGER; equal: BOOLEAN; - rd: Reader; - BEGIN - StdInit(t); - ASSERT(0 <= beg, 20); ASSERT(beg <= end, 21); ASSERT(end <= t.len, 22); - IF beg < end THEN - Find(t, beg, u, ud); Find(t, end, v, vd); - IF vd > 0 THEN w := v.next ELSE w := v END; - p := u.attr.Prop(); - u := u.next; - WHILE u # w DO - Properties.Intersect(p, u.attr.Prop(), equal); - u := u.next - END; - IF beg + 1 = end THEN - t.rd := t.NewReader(t.rd); rd := t.rd; - rd.SetPos(beg); rd.Read; - IF (rd.view = NIL) OR (rd.char # viewcode) THEN - q := p; WHILE (q # NIL) & ~(q IS Prop) DO q := q.next END; - IF q # NIL THEN - tp := q(Prop) - ELSE NEW(tp); Properties.Insert(p, tp) - END; - INCL(tp.valid, code); INCL(tp.known, code); INCL(tp.readOnly, code); - tp.code := rd.char - END - END - ELSE p := NIL - END; - RETURN p - END Prop; - - PROCEDURE (t: StdModel) Modify (beg, end: INTEGER; old, p: Properties.Property); - VAR op: SetAttrOp; zp, z: AttrList; - u, v, w: Run; ud, vd: INTEGER; equal, modified: BOOLEAN; - q: Properties.Property; - BEGIN - StdInit(t); - ASSERT(0 <= beg, 20); ASSERT(beg <= end, 21); ASSERT(end <= t.len, 22); - IF (beg < end) & (p # NIL) THEN - NEW(op); op.text := t; op.beg := beg; - Find(t, beg, u, ud); Find(t, end, v, vd); - IF vd > 0 THEN w := v.next ELSE w := v END; - zp := NIL; modified := FALSE; - WHILE u # w DO - IF u = v THEN INC(ud, v.len - vd) END; - IF old # NIL THEN - q := u.attr.Prop(); - Properties.Intersect(q, old, equal); (* q := q * old *) - Properties.Intersect(q, old, equal) (* equal := q = old *) - END; - NEW(z); z.len := u.len - ud; - IF (old = NIL) OR equal THEN - z.attr := ModifiedAttr(u.attr, p); - modified := modified OR ~u.attr.Equals(z.attr) - END; - IF zp = NIL THEN op.list := z ELSE zp.next := z END; - zp := z; - u := u.next; ud := 0 - END; - IF modified THEN Models.Do(t, "#System:Modifying", op) END - END - END Modify; - - PROCEDURE (t: StdModel) ReplaceView (old, new: Views.View); - VAR c: StdContext; op: ReplaceViewOp; - BEGIN - StdInit(t); - ASSERT(old.context # NIL, 20); ASSERT(old.context IS StdContext, 21); - ASSERT(old.context(StdContext).text = t, 22); - ASSERT((new.context = NIL) OR (new.context = old.context), 24); - IF new # old THEN - c := old.context(StdContext); - IF new.context = NIL THEN new.InitContext(c) END; - (* Stores.InitDomain(new, t.Domain()); *) - Stores.Join(t, new); - NEW(op); op.text := t; op.pos := c.Pos(); op.ref := c.ref; op.new := new; - Models.Do(t, "#System:Replacing", op) - END - END ReplaceView; - - PROCEDURE (t: StdModel) CopyFrom- (source: Stores.Store); - BEGIN - StdInit(t); - WITH source: StdModel DO t.InsertCopy(0, source, 0, source.len) END - END CopyFrom; - - PROCEDURE (t: StdModel) Replace (beg, end: INTEGER; t0: Model; beg0, end0: INTEGER); - VAR script: Stores.Operation; - BEGIN - StdInit(t); - ASSERT(0 <= beg, 20); ASSERT(beg <= end, 21); ASSERT(end <= t.len, 22); - ASSERT(0 <= beg0, 23); ASSERT(beg0 <= end0, 24); ASSERT(end0 <= t0.Length(), 25); - ASSERT(t # t0, 26); - Models.BeginScript(t, "#System:Replacing", script); - t.Delete(beg, end); t.Insert(beg, t0, beg0, end0); - Models.EndScript(t, script) - END Replace; - - - (* StdContext *) - - PROCEDURE (c: StdContext) ThisModel (): Model; - BEGIN - RETURN c.text - END ThisModel; - - PROCEDURE (c: StdContext) GetSize (OUT w, h: INTEGER); - BEGIN - w := c.ref.w; h := c.ref.h - END GetSize; - - PROCEDURE (c: StdContext) SetSize (w, h: INTEGER); - VAR t: StdModel; r: ViewRef; op: ResizeViewOp; - BEGIN - t := c.text; r := c.ref; - IF w = Views.undefined THEN w := r.w END; - IF h = Views.undefined THEN h := r.h END; - Properties.PreferredSize(r.view, minWidth, maxWidth, minHeight, maxHeight, r.w, r.h, w, h); - IF (w # r.w) OR (h # r.h) THEN - NEW(op); op.text := t; op.pos := c.Pos(); op.ref := r; op.w := w; op.h := h; - Models.Do(t, "#System:Resizing", op) - END - END SetSize; - - PROCEDURE (c: StdContext) Normalize (): BOOLEAN; - BEGIN - RETURN FALSE - END Normalize; - - PROCEDURE (c: StdContext) Pos (): INTEGER; - VAR t: StdModel; u, r, w: Run; pos: INTEGER; - BEGIN - t := c.text; r := c.ref; - IF t.pc.prev.next # r THEN - u := t.trailer.next; w := t.trailer; pos := 0; - WHILE (u # r) & (u # w) DO INC(pos, u.len); u := u.next END; - ASSERT(u = r, 20); - t.pc.prev := r.prev; t.pc.org := pos - END; - RETURN t.pc.org - END Pos; - - PROCEDURE (c: StdContext) Attr (): Attributes; - BEGIN - RETURN c.ref.attr - END Attr; - - - (* StdReader *) - - PROCEDURE RemapView (rd: StdReader); - VAR p: Pref; - BEGIN - p.opts := {}; Views.HandlePropMsg(rd.view, p); - IF maskChar IN p.opts THEN rd.char := p.mask ELSE rd.char := viewcode END - END RemapView; - - PROCEDURE Reset (rd: StdReader); - VAR t: StdModel; - BEGIN - t := rd.base; - Find(t, rd.pos, rd.run, rd.off); rd.era := t.era - END Reset; - - - PROCEDURE (rd: StdReader) Base (): Model; - BEGIN - RETURN rd.base - END Base; - - PROCEDURE (rd: StdReader) SetPos (pos: INTEGER); - BEGIN - ASSERT(pos >= 0, 20); ASSERT(rd.base # NIL, 21); ASSERT(pos <= rd.base.len, 22); - rd.eot := FALSE; rd.attr := NIL; rd.char := 0X; rd.view := NIL; - IF (rd.pos # pos) OR (rd.run = rd.base.trailer) THEN - rd.pos := pos; rd.era := -1 - END - END SetPos; - - PROCEDURE (rd: StdReader) Pos (): INTEGER; - BEGIN - RETURN rd.pos - END Pos; - - PROCEDURE (rd: StdReader) Read; - VAR t: StdModel; u: Run; n, pos, len: INTEGER; lc: ARRAY 2 OF BYTE; - BEGIN - t := rd.base; - n := t.id MOD cacheWidth; - IF rd.era # t.era THEN Reset(rd) END; - u := rd.run; - WITH u: Piece DO - rd.attr := u.attr; - pos := rd.pos MOD cacheLen; - IF ~((cache[n].id = t.id) & (cache[n].beg <= rd.pos) & (rd.pos < cache[n].end)) THEN - (* cache miss *) - IF cache[n].id # t.id THEN cache[n].id := t.id; cache[n].beg := 0; cache[n].end := 0 END; - len := cacheLine; - IF len > cacheLen - pos THEN len := cacheLen - pos END; - IF len > u.len - rd.off THEN len := u.len - rd.off END; - rd.reader := u.file.NewReader(rd.reader); rd.reader.SetPos(u.org + rd.off); - rd.reader.ReadBytes(cache[n].buf, pos, len); - IF rd.pos = cache[n].end THEN -cache[n].end := rd.pos + len; -(* - INC(cache[n].end, len); -*) - IF cache[n].end - cache[n].beg >= cacheLen THEN - cache[n].beg := cache[n].end - (cacheLen - 1) - END - ELSE cache[n].beg := rd.pos; cache[n].end := rd.pos + len - END - END; - rd.char := CHR(cache[n].buf[pos] MOD 256); rd.view := NIL; - INC(rd.pos); INC(rd.off); - IF rd.off = u.len THEN rd.run := u.next; rd.off := 0 END - | u: LPiece DO (* ~(u IS Piece) *) - rd.attr := u.attr; - rd.reader := u.file.NewReader(rd.reader); rd.reader.SetPos(u.org + rd.off * 2); - rd.reader.ReadBytes(lc, 0, 2); - rd.char := CHR(lc[0] MOD 256 + 256 * (lc[1] + 128)); rd.view := NIL; - IF (cache[n].id = t.id) & (rd.pos = cache[n].end) THEN -cache[n].end := cache[n].end + 1; -IF cache[n].end - cache[n].beg >= cacheLen THEN cache[n].beg := cache[n].beg + 1 END; -(* - INC(cache[n].end); - IF cache[n].end - cache[n].beg >= cacheLen THEN INC(cache[n].beg) END -*) - END; - INC(rd.pos); INC(rd.off); - IF rd.off = u.len THEN rd.run := u.next; rd.off := 0 END - | u: ViewRef DO - rd.attr := u.attr; - rd.view := u.view; rd.w := u.w; rd.h := u.h; RemapView(rd); - IF (cache[n].id = t.id) & (rd.pos = cache[n].end) THEN -cache[n].end := cache[n].end + 1; -IF cache[n].end - cache[n].beg >= cacheLen THEN cache[n].beg := cache[n].beg + 1 END; -(* - INC(cache[n].end); - IF cache[n].end - cache[n].beg >= cacheLen THEN INC(cache[n].beg) END -*) - END; - INC(rd.pos); rd.run := u.next; rd.off := 0 - ELSE - rd.eot := TRUE; rd.attr := NIL; rd.char := 0X; rd.view := NIL - END - END Read; - - PROCEDURE (rd: StdReader) ReadPrev; - VAR t: StdModel; u: Run; n, pos, len: INTEGER; lc: ARRAY 2 OF BYTE; - BEGIN - t := rd.base; - n := t.id MOD cacheWidth; - IF rd.era # t.era THEN Reset(rd) END; - IF rd.off > 0 THEN DEC(rd.off) - ELSIF rd.pos > 0 THEN - rd.run := rd.run.prev; rd.off := rd.run.len - 1 - ELSE rd.run := t.trailer - END; - u := rd.run; - WITH u: Piece DO - rd.attr := u.attr; - DEC(rd.pos); - pos := rd.pos MOD cacheLen; - IF ~((cache[n].id = t.id) & (cache[n].beg <= rd.pos) & (rd.pos < cache[n].end)) THEN - (* cache miss *) - IF cache[n].id # t.id THEN cache[n].id := t.id; cache[n].beg := 0; cache[n].end := 0 END; - len := cacheLine; - IF len > pos + 1 THEN len := pos + 1 END; - IF len > rd.off + 1 THEN len := rd.off + 1 END; - rd.reader := u.file.NewReader(rd.reader); - rd.reader.SetPos(u.org + rd.off - (len - 1)); - rd.reader.ReadBytes(cache[n].buf, pos - (len - 1), len); - IF rd.pos = cache[n].beg - 1 THEN -cache[n].beg := cache[n] .beg - len; -(* - DEC(cache[n].beg, len); -*) - IF cache[n].end - cache[n].beg >= cacheLen THEN - cache[n].end := cache[n].beg + (cacheLen - 1) - END - ELSE cache[n].beg := rd.pos - (len - 1); cache[n].end := rd.pos + 1 - END - END; - rd.char := CHR(cache[n].buf[pos] MOD 256); rd.view := NIL - | u: LPiece DO (* ~(u IS Piece) *) - rd.attr := u.attr; - rd.reader := u.file.NewReader(rd.reader); - rd.reader.SetPos(u.org + 2 * rd.off); - rd.reader.ReadBytes(lc, 0, 2); - rd.char := CHR(lc[0] MOD 256 + 256 * (lc[1] + 128)); rd.view := NIL; - IF (cache[n].id = t.id) & (rd.pos = cache[n].beg) THEN -cache[n].beg := cache[n].beg - 1; -IF cache[n].end - cache[n].beg >= cacheLen THEN cache[n].end := cache[n].end - 1 END -(* - DEC(cache[n].beg); - IF cache[n].end - cache[n].beg >= cacheLen THEN DEC(cache[n].end) END -*) - END; - DEC(rd.pos) - | u: ViewRef DO - rd.attr := u.attr; - rd.view := u.view; rd.w := u.w; rd.h := u.h; RemapView(rd); - IF (cache[n].id = t.id) & (rd.pos = cache[n].beg) THEN -cache[n].beg := cache[n].beg - 1; -IF cache[n].end - cache[n].beg >= cacheLen THEN cache[n].end := cache[n].end - 1 END -(* - DEC(cache[n].beg); - IF cache[n].end - cache[n].beg >= cacheLen THEN DEC(cache[n].end) END -*) - END; - DEC(rd.pos) - ELSE - rd.eot := TRUE; rd.attr := NIL; rd.char := 0X; rd.view := NIL - END - END ReadPrev; - - PROCEDURE (rd: StdReader) ReadChar (OUT ch: CHAR); - BEGIN - rd.Read; ch := rd.char - END ReadChar; - - PROCEDURE (rd: StdReader) ReadPrevChar (OUT ch: CHAR); - BEGIN - rd.ReadPrev; ch := rd.char - END ReadPrevChar; - - PROCEDURE (rd: StdReader) ReadView (OUT v: Views.View); - VAR t: StdModel; u: Run; - BEGIN - t := rd.base; - IF rd.era # t.era THEN Reset(rd) END; - DEC(rd.pos, rd.off); - u := rd.run; - WHILE u IS LPiece DO INC(rd.pos, u.len); u := u.next END; - WITH u: ViewRef DO - INC(rd.pos); rd.run := u.next; rd.off := 0; - rd.attr := u.attr; rd.view := u.view; rd.w := u.w; rd.h := u.h; RemapView(rd) - ELSE (* u = t.trailer *) - ASSERT(u = t.trailer, 100); - rd.run := u; rd.off := 0; - rd.eot := TRUE; rd.attr := NIL; rd.char := 0X; rd.view := NIL - END; - v := rd.view - END ReadView; - - PROCEDURE (rd: StdReader) ReadPrevView (OUT v: Views.View); - VAR t: StdModel; u: Run; - BEGIN - t := rd.base; - IF rd.era # t.era THEN Reset(rd) END; - DEC(rd.pos, rd.off); - u := rd.run.prev; - WHILE u IS LPiece DO DEC(rd.pos, u.len); u := u.prev END; - rd.run := u; rd.off := 0; - WITH u: ViewRef DO - DEC(rd.pos); - rd.attr := u.attr; rd.view := u.view; rd.w := u.w; rd.h := u.h; RemapView(rd) - ELSE (* u = t.trailer *) - ASSERT(u = t.trailer, 100); - rd.eot := TRUE; rd.attr := NIL; rd.char := 0X; rd.view := NIL - END; - v := rd.view - END ReadPrevView; - - PROCEDURE (rd: StdReader) ReadRun (OUT attr: Attributes); - VAR t: StdModel; a0: Attributes; u, trailer: Run; pos: INTEGER; - BEGIN - t := rd.base; - IF rd.era # t.era THEN Reset(rd) END; - a0 := rd.attr; u := rd.run; pos := rd.pos - rd.off; trailer := t.trailer; - WHILE (u.attr = a0) & ~(u IS ViewRef) & (u # trailer) DO - INC(pos, u.len); u := u.next - END; - rd.run := u; rd.pos := pos; rd.off := 0; - rd.Read; - attr := rd.attr - END ReadRun; - - PROCEDURE (rd: StdReader) ReadPrevRun (OUT attr: Attributes); - VAR t: StdModel; a0: Attributes; u, trailer: Run; pos: INTEGER; - BEGIN - t := rd.base; - IF rd.era # t.era THEN Reset(rd) END; - a0 := rd.attr; u := rd.run; pos := rd.pos - rd.off; trailer := t.trailer; - IF u # trailer THEN u := u.prev; DEC(pos, u.len) END; - WHILE (u.attr = a0) & ~(u IS ViewRef) & (u # trailer) DO - u := u.prev; DEC(pos, u.len) - END; - IF u # trailer THEN - rd.run := u.next; rd.pos := pos + u.len; rd.off := 0 - ELSE - rd.run := trailer; rd.pos := 0; rd.off := 0 - END; - rd.ReadPrev; - attr := rd.attr - END ReadPrevRun; - - - (* StdWriter *) - - PROCEDURE WriterReset (wr: StdWriter); - VAR t: StdModel; u: Run; uo: INTEGER; - BEGIN - t := wr.base; - Find(t, wr.pos, u, uo); Split(uo, u, wr.run); wr.era := t.era - END WriterReset; - - PROCEDURE (wr: StdWriter) Base (): Model; - BEGIN - RETURN wr.base - END Base; - - PROCEDURE (wr: StdWriter) SetPos (pos: INTEGER); - BEGIN - ASSERT(pos >= 0, 20); ASSERT(wr.base # NIL, 21); ASSERT(pos <= wr.base.len, 22); - IF wr.pos # pos THEN - wr.pos := pos; wr.era := -1 - END - END SetPos; - - PROCEDURE (wr: StdWriter) Pos (): INTEGER; - BEGIN - RETURN wr.pos - END Pos; - - PROCEDURE WriteSChar (wr: StdWriter; ch: SHORTCHAR); - VAR t: StdModel; u, un: Run; p: Piece; pos, spillPos: INTEGER; - op: EditOp; bunch: BOOLEAN; - BEGIN - t := wr.base; pos := wr.pos; - IF t.spill.file = NIL THEN OpenSpill(t.spill) END; - t.spill.writer.WriteByte(SHORT(ORD(ch))); spillPos := t.spill.len; t.spill.len := spillPos + 1; - IF (t.Domain() = NIL) OR (t.Domain().GetSequencer() = NIL) THEN - (* optimized for speed - writing to unbound text *) - InvalCache(t, pos); - IF wr.era # t.era THEN WriterReset(wr) END; - un := wr.run; u := un.prev; - IF (u.attr # NIL) & u.attr.Equals(wr.attr) & (u IS Piece) & (u(Piece).file = t.spill.file) - & (u(Piece).org + u.len = spillPos) THEN - INC(u.len); - IF t.pc.org >= pos THEN INC(t.pc.org) END - ELSE - NEW(p); u.next := p; p.prev := u; p.next := un; un.prev := p; - p.len := 1; p.attr := wr.attr; - p.file := t.spill.file; p.org := spillPos; - IF t.pc.org > pos THEN INC(t.pc.org) END; - IF ~Stores.Joined(t, p.attr) THEN - IF ~Stores.Unattached(p.attr) THEN p.attr := Stores.CopyOf(p.attr)(Attributes) END; - Stores.Join(t, p.attr) - END - END; - INC(t.era); INC(t.len); - INC(wr.era) - ELSE - GetWriteOp(t, pos, op, bunch); - IF (op.attr = NIL) OR ~op.attr.Equals(wr.attr) THEN op.attr := wr.attr END; - op.mode := writeSChar; (*op.attr := wr.attr;*) op.len := spillPos; - IF bunch THEN Models.Bunch(t) ELSE Models.Do(t, "#System:Inserting", op) END - END; - wr.pos := pos + 1 - END WriteSChar; - - PROCEDURE (wr: StdWriter) WriteChar (ch: CHAR); - VAR t: StdModel; u, un: Run; lp: LPiece; pos, spillPos: INTEGER; - fw: Files.Writer; op: EditOp; bunch: BOOLEAN; - BEGIN - IF (ch >= 20X) & (ch < 7FX) - OR (ch = tab) OR (ch = line) OR (ch = para) - OR (ch = zwspace) OR (ch = digitspace) - OR (ch = hyphen) OR (ch = nbhyphen) OR (ch >= 0A0X) & (ch < 100X) THEN - WriteSChar(wr, SHORT(ch)) (* could inline! *) - ELSIF ch = 200BX THEN wr.WriteChar(zwspace) - ELSIF ch = 2010X THEN wr.WriteChar(hyphen) - ELSIF ch = 2011X THEN wr.WriteChar(nbhyphen) - ELSIF ch >= 100X THEN - t := wr.base; pos := wr.pos; - IF t.spill.file = NIL THEN OpenSpill(t.spill) END; - fw := t.spill.writer; - fw.WriteByte(SHORT(SHORT(ORD(ch)))); - fw.WriteByte(SHORT(SHORT(ORD(ch) DIV 256 - 128))); - spillPos := t.spill.len; t.spill.len := spillPos + 2; - IF (t.Domain() = NIL) OR (t.Domain().GetSequencer() = NIL) THEN - (* optimized for speed - writing to unbound text *) - InvalCache(t, pos); - IF wr.era # t.era THEN WriterReset(wr) END; - un := wr.run; u := un.prev; - IF (u.attr # NIL) & u.attr.Equals(wr.attr) & (u IS LPiece) & ~(u IS Piece) & (u(LPiece).file = t.spill.file) - & (u(LPiece).org + 2 * u.len = spillPos) THEN - INC(u.len); - IF t.pc.org >= pos THEN INC(t.pc.org) END - ELSE - NEW(lp); u.next := lp; lp.prev := u; lp.next := un; un.prev := lp; - lp.len := 1; lp.attr := wr.attr; - lp.file := t.spill.file; lp.org := spillPos; - IF t.pc.org > pos THEN INC(t.pc.org) END; - IF ~Stores.Joined(t, lp.attr) THEN - IF ~Stores.Unattached(lp.attr) THEN lp.attr := Stores.CopyOf(lp.attr)(Attributes) END; - Stores.Join(t, lp.attr) - END - END; - INC(t.era); INC(t.len); - INC(wr.era) - ELSE - GetWriteOp(t, pos, op, bunch); - IF (op.attr = NIL) OR ~op.attr.Equals(wr.attr) THEN op.attr := wr.attr END; - op.mode := writeChar; (*op.attr := wr.attr;*) op.len := spillPos; - IF bunch THEN Models.Bunch(t) ELSE Models.Do(t, "#System:Inserting", op) END - END; - wr.pos := pos + 1 - END - END WriteChar; - - PROCEDURE (wr: StdWriter) WriteView (view: Views.View; w, h: INTEGER); - VAR t: StdModel; u, un: Run; r: ViewRef; pos: INTEGER; - op: EditOp; bunch: BOOLEAN; - BEGIN - ASSERT(view # NIL, 20); ASSERT(view.context = NIL, 21); - t := wr.base; pos := wr.pos; - Stores.Join(t, view); - IF (t.Domain() = NIL) OR (t.Domain().GetSequencer() = NIL) THEN - (* optimized for speed - writing to unbound text *) - IF wr.era # t.era THEN WriterReset(wr) END; - InvalCache(t, pos); - NEW(r); r.len := 1; r.attr := wr.attr; r.view := view; r.w := defW; r.h := defH; - un := wr.run; u := un.prev; u.next := r; r.prev := u; r.next := un; un.prev := r; - IF t.pc.org > pos THEN INC(t.pc.org) END; - INC(t.era); INC(t.len); - view.InitContext(NewContext(r, t)); - Properties.PreferredSize(view, minWidth, maxWidth, minHeight, maxHeight, defW, defH, - w, h - ); - r.w := w; r.h := h; - INC(wr.era) - ELSE - NEW(r); r.len := 1; r.attr := wr.attr; r.view := view; r.w := w; r.h := h; - GetWriteOp(t, pos, op, bunch); - op.mode := writeView; op.first := r; - IF bunch THEN Models.Bunch(t) ELSE Models.Do(t, "#System:Inserting", op) END - END; - INC(wr.pos) - END WriteView; - - - (* StdDirectory *) - - PROCEDURE (d: StdDirectory) New (): Model; - VAR t: StdModel; - BEGIN - NEW(t); StdInit(t); RETURN t - END New; - - - (** miscellaneous procedures **) -(* - PROCEDURE DumpRuns* (t: Model); - VAR u: Run; n, i, beg, end: INTEGER; name: ARRAY 64 OF CHAR; r: Files.Reader; b: BYTE; - BEGIN - Sub.synch := FALSE; - WITH t: StdModel DO - u := t.trailer.next; - REPEAT - WITH u: Piece DO - Sub.String("short"); - Sub.Int(u.len); - Sub.Char(" "); Sub.IntForm(SYSTEM.ADR(u.file^), 16, 8, "0", FALSE); - Sub.Int(u.org); Sub.Char(" "); - r := u.file.NewReader(NIL); r.SetPos(u.org); i := 0; - WHILE i < 16 DO r.ReadByte(b); Sub.Char(CHR(b)); INC(i) END; - Sub.Ln - | u: LPiece DO (* ~(u IS Piece) *) - Sub.String("long"); - Sub.Int(-u.len); - Sub.Char(" "); Sub.IntForm(SYSTEM.ADR(u.file^), 16, 8, "0", FALSE); - Sub.Int(u.org); Sub.Char(" "); - r := u.file.NewReader(NIL); r.SetPos(u.org); i := 0; - WHILE i < 16 DO r.ReadByte(b); Sub.Char(CHR(b)); INC(i) END; - Sub.Ln - | u: ViewRef DO - Sub.String("view"); - Services.GetTypeName(u.view, name); - Sub.String(name); Sub.Int(u.w); Sub.Int(u.h); Sub.Ln - ELSE - Sub.Char("?"); Sub.Ln - END; - u := u.next - UNTIL u = t.trailer; - n := t.id MOD cacheWidth; - IF cache[n].id = t.id THEN - beg := cache[n].beg; end := cache[n].end; - Sub.Int(beg); Sub.Int(end); Sub.Ln; - Sub.Char("{"); - WHILE beg < end DO Sub.Char(CHR(cache[n].buf[beg MOD cacheLen])); INC(beg) END; - Sub.Char("}"); Sub.Ln - ELSE Sub.String("not cached"); Sub.Ln - END - END - END DumpRuns; -*) - - PROCEDURE NewColor* (a: Attributes; color: Ports.Color): Attributes; - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - stdProp.valid := {Properties.color}; stdProp.color.val := color; - RETURN ModifiedAttr(a, stdProp) - END NewColor; - - PROCEDURE NewFont* (a: Attributes; font: Fonts.Font): Attributes; - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - stdProp.valid := {Properties.typeface .. Properties.weight}; - stdProp.typeface := font.typeface$; - stdProp.size := font.size; - stdProp.style.val := font.style; - stdProp.style.mask := {Fonts.italic, Fonts.underline, Fonts.strikeout}; - stdProp.weight := font.weight; - RETURN ModifiedAttr(a, stdProp) - END NewFont; - - PROCEDURE NewOffset* (a: Attributes; offset: INTEGER): Attributes; - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - prop.valid := {0 (*global constant offset masked by param :-( *)}; prop.offset := offset; - RETURN ModifiedAttr(a, prop) - END NewOffset; - - PROCEDURE NewTypeface* (a: Attributes; typeface: Fonts.Typeface): Attributes; - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - stdProp.valid := {Properties.typeface}; stdProp.typeface := typeface; - RETURN ModifiedAttr(a, stdProp) - END NewTypeface; - - PROCEDURE NewSize* (a: Attributes; size: INTEGER): Attributes; - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - stdProp.valid := {Properties.size}; stdProp.size := size; - RETURN ModifiedAttr(a, stdProp) - END NewSize; - - PROCEDURE NewStyle* (a: Attributes; style: SET): Attributes; - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - stdProp.valid := {Properties.style}; stdProp.style.val := style; stdProp.style.mask := -{}; - RETURN ModifiedAttr(a, stdProp) - END NewStyle; - - PROCEDURE NewWeight* (a: Attributes; weight: INTEGER): Attributes; - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - stdProp.valid := {Properties.weight}; stdProp.weight := weight; - RETURN ModifiedAttr(a, stdProp) - END NewWeight; - - - PROCEDURE WriteableChar* (ch: CHAR): BOOLEAN; - (* must be identical to test in (StdWriter)WriteChar - inlined there for efficiency *) - BEGIN - RETURN - (ch >= 20X) & (ch < 7FX) OR - (ch = tab) OR (ch = line) OR (ch = para) OR - (ch = zwspace) OR (ch = digitspace) OR - (ch = hyphen) OR (ch = nbhyphen) OR - (ch >= 0A0X) (* need to augment with test for valid Unicode *) - END WriteableChar; - - - PROCEDURE CloneOf* (source: Model): Model; - BEGIN - ASSERT(source # NIL, 20); - RETURN Containers.CloneOf(source)(Model) - END CloneOf; - - - PROCEDURE SetDir* (d: Directory); - BEGIN - ASSERT(d # NIL, 20); ASSERT(d.attr # NIL, 21); ASSERT(d.attr.init, 22); - dir := d - END SetDir; - - - PROCEDURE Init; - VAR d: StdDirectory; a: Attributes; - BEGIN - NEW(a); a.InitFromProp(NIL); - NEW(stdProp); stdProp.known := -{}; - NEW(prop); prop.known := -{}; - NEW(d); stdDir := d; dir := d; d.SetAttr(a) - END Init; - -BEGIN - Init -END TextModels. diff --git a/new/Text/Mod/Rulers.txt b/new/Text/Mod/Rulers.txt deleted file mode 100644 index f2faa49..0000000 --- a/new/Text/Mod/Rulers.txt +++ /dev/null @@ -1,1676 +0,0 @@ -(* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Text/Mod/Rulers.odc *) -(* DO NOT EDIT *) - -MODULE TextRulers; - -(** - project = "BlackBox" - organization = "www.oberon.ch" - contributors = "Oberon microsystems" - version = "System/Rsrc/About" - copyright = "System/Rsrc/About" - license = "Docu/BB-License" - changes = "" - issues = "" - -**) - - (* re-check alien attributes: consider projection semantics *) - - IMPORT - Kernel, Strings, Services, Fonts, Ports, Stores, - Models, Views, Controllers, Properties, Dialog, - TextModels; - - CONST - (** Attributes.valid, Prop.known/valid **) (* Mark.kind *) - first* = 0; left* = 1; right* = 2; lead* = 3; asc* = 4; dsc* = 5; grid* = 6; - opts* = 7; tabs* = 8; - (* additional values for icons held by Mark.kind *) - invalid = -1; - firstIcon = 10; lastIcon = 25; - rightToggle = 10; - gridDec = 12; gridVal = 13; gridInc = 14; - leftFlush = 16; centered = 17; rightFlush = 18; justified = 19; - leadDec = 21; leadVal = 22; leadInc = 23; - pageBrk = 25; - - modeIcons = {leftFlush .. justified}; - validIcons = {rightToggle, gridDec .. gridInc, leftFlush .. justified, leadDec .. leadInc, pageBrk}; - fieldIcons = {gridVal, leadVal}; - - (** Attributes.opts **) - leftAdjust* = 0; rightAdjust* = 1; - (** both: fully justified; none: centered **) - noBreakInside* = 2; pageBreak* = 3; parJoin* = 4; - (** pageBreak of this ruler overrides parJoin request of previous ruler **) - rightFixed* = 5; (** has fixed right border **) - - options = {leftAdjust .. rightFixed}; (* options mask *) - adjMask = {leftAdjust, rightAdjust}; - - (** Attributes.tabType[i] **) - maxTabs* = 32; - centerTab* = 0; rightTab* = 1; - (** both: (reserved); none: leftTab **) - barTab* = 2; - - tabOptions = {centerTab .. barTab}; (* mask for presently valid options *) - - mm = Ports.mm; inch16 = Ports.inch DIV 16; point = Ports.point; - tabBarHeight = 11 * point; scaleHeight = 10 * point; iconBarHeight = 14 * point; - rulerHeight = tabBarHeight + scaleHeight + iconBarHeight; - iconHeight = 10 * point; iconWidth = 12 * point; iconGap = 2 * point; - iconPin = rulerHeight - (iconBarHeight - iconHeight) DIV 2; - - rulerChangeKey = "#Text:RulerChange"; - - minVersion = 0; - maxAttrVersion = 2; maxStyleVersion = 0; maxStdStyleVersion = 0; - maxRulerVersion = 0; maxStdRulerVersion = 0; - - - TYPE - Tab* = RECORD - stop*: INTEGER; - type*: SET - END; - - TabArray* = RECORD (* should be POINTER TO ARRAY OF Tab -- but cannot protect *) - len*: INTEGER; - tab*: ARRAY maxTabs OF Tab - END; - - Attributes* = POINTER TO EXTENSIBLE RECORD (Stores.Store) - init-: BOOLEAN; (* immutable once init holds *) - first-, left-, right-, lead-, asc-, dsc-, grid-: INTEGER; - opts-: SET; - tabs-: TabArray - END; - - AlienAttributes* = POINTER TO RECORD (Attributes) - store-: Stores.Alien - END; - - Style* = POINTER TO ABSTRACT RECORD (Models.Model) - attr-: Attributes - END; - - Ruler* = POINTER TO ABSTRACT RECORD (Views.View) - style-: Style - END; - - - Prop* = POINTER TO RECORD (Properties.Property) - first*, left*, right*, lead*, asc*, dsc*, grid*: INTEGER; - opts*: RECORD val*, mask*: SET END; - tabs*: TabArray - END; - - - UpdateMsg* = RECORD (Models.UpdateMsg) - (** domaincast upon style update **) - style*: Style; - oldAttr*: Attributes - END; - - - Directory* = POINTER TO ABSTRACT RECORD - attr-: Attributes - END; - - - StdStyle = POINTER TO RECORD (Style) END; - - StdRuler = POINTER TO RECORD (Ruler) - sel: INTEGER; (* sel # invalid => sel = kind of selected mark *) - px, py: INTEGER (* sel # invalid => px, py of selected mark *) - END; - - StdDirectory = POINTER TO RECORD (Directory) END; - - Mark = RECORD - ruler: StdRuler; - l, r, t, b: INTEGER; - px, py, px0, py0, x, y: INTEGER; - kind, index: INTEGER; - type: SET; (* valid if kind = tabs *) - tabs: TabArray; (* if valid: tabs[index].type = type *) - dirty: BOOLEAN - END; - - SetAttrOp = POINTER TO RECORD (Stores.Operation) - style: Style; - attr: Attributes - END; - - NeutralizeMsg = RECORD (Views.Message) END; - - - VAR - dir-, stdDir-: Directory; - - def: Attributes; - prop: Prop; (* recycled *) - globRd: TextModels.Reader; (* cache for temp reader; beware of reentrance *) - font: Fonts.Font; - - marginGrid, minTabWidth, tabGrid: INTEGER; - - - PROCEDURE ^ DoSetAttrOp (s: Style; attr: Attributes); - - PROCEDURE CopyTabs (IN src: TabArray; OUT dst: TabArray); - (* a TabArray is a 256 byte structure - copying of used parts is much faster than ":= all" *) - VAR i, n: INTEGER; - BEGIN - n := src.len; dst.len := n; - i := 0; WHILE i < n DO dst.tab[i] := src.tab[i]; INC(i) END - END CopyTabs; - - - (** Attributes **) - - PROCEDURE (a: Attributes) CopyFrom- (source: Stores.Store), EXTENSIBLE; - BEGIN - WITH source: Attributes DO - ASSERT(~a.init, 20); ASSERT(source.init, 21); - a.init := TRUE; - a.first := source.first; a.left := source.left; a.right := source.right; - a.lead := source.lead; a.asc := source.asc; a.dsc := source.dsc; a.grid := source.grid; - a.opts := source.opts; - CopyTabs(source.tabs, a.tabs) - END - END CopyFrom; - - PROCEDURE (a: Attributes) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE; - (** pre: a.init **) - VAR i: INTEGER; typedTabs: BOOLEAN; - BEGIN - ASSERT(a.init, 20); - a.Externalize^(wr); - i := 0; WHILE (i < a.tabs.len) & (a.tabs.tab[i].type = {}) DO INC(i) END; - typedTabs := i < a.tabs.len; - IF typedTabs THEN - wr.WriteVersion(maxAttrVersion) - ELSE - wr.WriteVersion(1) (* versions before 2 had only leftTabs *) - END; - wr.WriteInt(a.first); wr.WriteInt(a.left); wr.WriteInt(a.right); - wr.WriteInt(a.lead); wr.WriteInt(a.asc); wr.WriteInt(a.dsc); wr.WriteInt(a.grid); - wr.WriteSet(a.opts); - wr.WriteXInt(a.tabs.len); - i := 0; WHILE i < a.tabs.len DO wr.WriteInt(a.tabs.tab[i].stop); INC(i) END; - IF typedTabs THEN - i := 0; WHILE i < a.tabs.len DO wr.WriteSet(a.tabs.tab[i].type); INC(i) END - END - END Externalize; - - PROCEDURE (a: Attributes) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE; - (** pre: ~a.init **) - (** post: a.init **) - VAR thisVersion, i, n, trash: INTEGER; trashSet: SET; - BEGIN - ASSERT(~a.init, 20); a.init := TRUE; - a.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxAttrVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - rd.ReadInt(a.first); rd.ReadInt(a.left); rd.ReadInt(a.right); - rd.ReadInt(a.lead); rd.ReadInt(a.asc); rd.ReadInt(a.dsc); rd.ReadInt(a.grid); - rd.ReadSet(a.opts); - rd.ReadXInt(n); a.tabs.len := MIN(n, maxTabs); - i := 0; WHILE i < a.tabs.len DO rd.ReadInt(a.tabs.tab[i].stop); INC(i) END; - WHILE i < n DO rd.ReadInt(trash); INC(i) END; - IF thisVersion = 0 THEN (* convert from v0 rightFixed to v1 ~rightFixed default *) - INCL(a.opts, rightFixed) - END; - IF thisVersion >= 2 THEN - i := 0; WHILE i < a.tabs.len DO rd.ReadSet(a.tabs.tab[i].type); INC(i) END; - WHILE i < n DO rd.ReadSet(trashSet); INC(i) END - ELSE - i := 0; WHILE i < a.tabs.len DO a.tabs.tab[i].type := {}; INC(i) END - END - END Internalize; - - PROCEDURE Set (p: Prop; opt: INTEGER; VAR x: INTEGER; min, max, new: INTEGER); - BEGIN - IF opt IN p.valid THEN x := MAX(min, MIN(max, new)) END - END Set; - - PROCEDURE ModifyFromProp (a: Attributes; p: Properties.Property); - CONST maxW = 10000*mm; maxH = 32767 * point; - VAR i: INTEGER; type, mask: SET; - BEGIN - WHILE p # NIL DO - WITH p: Prop DO - Set(p, first, a.first, 0, maxW, p.first); - Set(p, left, a.left, 0, maxW, p.left); - Set(p, right, a.right, MAX(a.left, a.first), maxW, p.right); - Set(p, lead, a.lead, 0, maxH, p.lead); - Set(p, asc, a.asc, 0, maxH, p.asc); - Set(p, dsc, a.dsc, 0, maxH - a.asc, p.dsc); - Set(p, grid, a.grid, 1, maxH, p.grid); - IF opts IN p.valid THEN - a.opts := a.opts * (-p.opts.mask) + p.opts.val * p.opts.mask - END; - IF (tabs IN p.valid) & (p.tabs.len >= 0) THEN - IF (p.tabs.len > 0) & (p.tabs.tab[0].stop >= 0) THEN - i := 0; a.tabs.len := MIN(p.tabs.len, maxTabs); - REPEAT - a.tabs.tab[i].stop := p.tabs.tab[i].stop; - type := p.tabs.tab[i].type; mask := tabOptions; - IF type * {centerTab, rightTab} = {centerTab, rightTab} THEN - mask := mask - {centerTab, rightTab} - END; - a.tabs.tab[i].type := a.tabs.tab[i].type * (-mask) + type * mask; - INC(i) - UNTIL (i = a.tabs.len) OR (p.tabs.tab[i].stop < p.tabs.tab[i - 1].stop); - a.tabs.len := i - ELSE a.tabs.len := 0 - END - END - ELSE - END; - p := p.next - END - END ModifyFromProp; - - PROCEDURE (a: Attributes) ModifyFromProp- (p: Properties.Property), NEW, EXTENSIBLE; - BEGIN - ModifyFromProp(a, p) - END ModifyFromProp; - - PROCEDURE (a: Attributes) InitFromProp* (p: Properties.Property), NEW, EXTENSIBLE; - (** pre: ~a.init **) - (** post: (a.init, p # NIL & x IN p.valid) => x set in a, else x defaults in a **) - BEGIN - ASSERT(~a.init, 20); - a.init := TRUE; - a.first := def.first; a.left := def.left; a.right := def.right; - a.lead := def.lead; a.asc := def.asc; a.dsc := def.dsc; a.grid := def.grid; - a.opts := def.opts; - CopyTabs(def.tabs, a.tabs); - ModifyFromProp(a, p) - END InitFromProp; - - PROCEDURE (a: Attributes) Equals* (b: Attributes): BOOLEAN, NEW, EXTENSIBLE; - (** pre: a.init, b.init **) - VAR i: INTEGER; - BEGIN - ASSERT(a.init, 20); ASSERT(b.init, 21); - IF a # b THEN - i := 0; - WHILE (i < a.tabs.len) - & (a.tabs.tab[i].stop = b.tabs.tab[i].stop) - & (a.tabs.tab[i].type = b.tabs.tab[i].type) DO - INC(i) - END; - RETURN (Services.SameType(a, b)) - & (a.first = b.first) & (a.left = b.left) & (a.right = b.right) - & (a.lead = b.lead) & (a.asc = b.asc) & (a.dsc = b.dsc) & (a.grid = b.grid) - & (a.opts = b.opts) & (a.tabs.len = b.tabs.len) & (i = a.tabs.len) - ELSE RETURN TRUE - END - END Equals; - - PROCEDURE (a: Attributes) Prop* (): Properties.Property, NEW, EXTENSIBLE; - (** pre: a.init **) - (** post: x attr in a => x IN p.valid, m set to value of attr in a **) - VAR p: Prop; - BEGIN - ASSERT(a.init, 20); - NEW(p); - p.known := {first .. tabs}; p.valid := p.known; - p.first := a.first; p.left := a.left; p.right := a.right; - p.lead := a.lead; p.asc := a.asc; p.dsc := a.dsc; p.grid := a.grid; - p.opts.val := a.opts; p.opts.mask := options; - CopyTabs(a.tabs, p.tabs); - RETURN p - END Prop; - - - PROCEDURE ReadAttr* (VAR rd: Stores.Reader; OUT a: Attributes); - VAR st: Stores.Store; alien: AlienAttributes; - BEGIN - rd.ReadStore(st); - ASSERT(st # NIL, 100); - IF st IS Stores.Alien THEN - NEW(alien); alien.store := st(Stores.Alien); Stores.Join(alien, alien.store); - alien.InitFromProp(NIL); a := alien - ELSE a := st(Attributes) - END - END ReadAttr; - - PROCEDURE WriteAttr* (VAR wr: Stores.Writer; a: Attributes); - BEGIN - ASSERT(a # NIL, 20); ASSERT(a.init, 21); - WITH a: AlienAttributes DO wr.WriteStore(a.store) ELSE wr.WriteStore(a) END - END WriteAttr; - - PROCEDURE ModifiedAttr* (a: Attributes; p: Properties.Property): Attributes; - (** pre: a.init **) - (** post: x IN p.valid => x in new attr set to value in p, else set to value in a **) - VAR h: Attributes; - BEGIN - ASSERT(a.init, 20); - h := Stores.CopyOf(a)(Attributes); h.ModifyFromProp(p); - RETURN h - END ModifiedAttr; - - - (** AlienAttributes **) - - PROCEDURE (a: AlienAttributes) Externalize- (VAR wr: Stores.Writer); - BEGIN - HALT(100) - END Externalize; - - PROCEDURE (a: AlienAttributes) Internalize- (VAR rd: Stores.Reader); - BEGIN - HALT(100) - END Internalize; - - PROCEDURE (a: AlienAttributes) InitFromProp* (p: Properties.Property); - BEGIN - a.InitFromProp^(NIL) - END InitFromProp; - - PROCEDURE (a: AlienAttributes) ModifyFromProp- (p: Properties.Property); - BEGIN - (* a.InitFromProp^(NIL) *) - a.InitFromProp(NIL) - END ModifyFromProp; - - - (** Style **) - -(* - PROCEDURE (s: Style) PropagateDomain-, EXTENSIBLE; - VAR dom: Stores.Domain; - BEGIN - ASSERT(s.attr # NIL, 20); - dom := s.attr.Domain(); - IF (dom # NIL) & (dom # s.Domain()) THEN s.attr := Stores.CopyOf(s.attr)(Attributes) END; - Stores.InitDomain(s.attr, s.Domain()) - END PropagateDomain; -*) - - PROCEDURE (s: Style) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE; - BEGIN - s.Externalize^(wr); - wr.WriteVersion(maxStyleVersion); - WriteAttr(wr, s.attr) - END Externalize; - - PROCEDURE (s: Style) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE; - VAR thisVersion: INTEGER; - BEGIN - s.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStyleVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - ReadAttr(rd, s.attr); Stores.Join(s, s.attr) - END Internalize; - - PROCEDURE (s: Style) SetAttr* (attr: Attributes), NEW, EXTENSIBLE; - (** pre: attr.init **) - (** post: s.attr = attr OR s.attr.Equals(attr) **) - BEGIN - ASSERT(attr.init, 20); - DoSetAttrOp(s, attr) - END SetAttr; - - PROCEDURE (s: Style) CopyFrom- (source: Stores.Store), EXTENSIBLE; - BEGIN - WITH source: Style DO - ASSERT(source.attr # NIL, 21); - s.SetAttr(Stores.CopyOf(source.attr)(Attributes)) - (* bkwd-comp hack to avoid link *) - (* copy would not be necessary if Attributes were immutable (and assigned to an Immutable Domain) *) - END - END CopyFrom; - -(* - PROCEDURE (s: Style) InitFrom- (source: Models.Model), EXTENSIBLE; - BEGIN - WITH source: Style DO - ASSERT(source.attr # NIL, 21); - s.SetAttr(Stores.CopyOf(source.attr)(Attributes)) - (* bkwd-comp hack to avoid link *) - END - END InitFrom; -*) - - (** Directory **) - - PROCEDURE (d: Directory) SetAttr* (attr: Attributes), NEW, EXTENSIBLE; - (** pre: attr.init **) - (** post: d.attr = ModifiedAttr(attr, p) - [ p.valid = {opts, tabs}, p.tabs.len = 0, p.opts.mask = {noBreakInside.. parJoin}, p.opts.val = {} ] - **) - VAR p: Prop; - BEGIN - ASSERT(attr.init, 20); - IF attr.tabs.len > 0 THEN - NEW(p); - p.valid := {opts, tabs}; - p.opts.mask := {noBreakInside, pageBreak, parJoin}; p.opts.val := {}; - p.tabs.len := 0; - attr := ModifiedAttr(attr, p) - END; - d.attr := attr - END SetAttr; - - PROCEDURE (d: Directory) NewStyle* (attr: Attributes): Style, NEW, ABSTRACT; - PROCEDURE (d: Directory) New* (style: Style): Ruler, NEW, ABSTRACT; - - PROCEDURE (d: Directory) NewFromProp* (p: Prop): Ruler, NEW, EXTENSIBLE; - BEGIN - RETURN d.New(d.NewStyle(ModifiedAttr(d.attr, p))) - END NewFromProp; - - - PROCEDURE Deposit*; - BEGIN - Views.Deposit(dir.New(NIL)) - END Deposit; - - - (** Ruler **) - - PROCEDURE (r: Ruler) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE; - BEGIN - ASSERT(r.style # NIL, 20); - r.Externalize^(wr); - wr.WriteVersion(maxRulerVersion); wr.WriteStore(r.style) - END Externalize; - - PROCEDURE (r: Ruler) InitStyle* (s: Style), NEW; - (** pre: r.style = NIL, s # NIL, style.attr # NIL **) - (** post: r.style = s **) - BEGIN - ASSERT((r.style = NIL) OR (r.style = s), 20); - ASSERT(s # NIL, 21); ASSERT(s.attr # NIL, 22); - r.style := s; Stores.Join(r, s) - END InitStyle; - - - PROCEDURE (r: Ruler) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE; - VAR st: Stores.Store; thisVersion: INTEGER; - BEGIN - r.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxRulerVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - rd.ReadStore(st); - IF st IS Stores.Alien THEN rd.TurnIntoAlien(Stores.alienComponent); RETURN END; - r.InitStyle(st(Style)) - END Internalize; - -(* - PROCEDURE (r: Ruler) InitModel* (m: Models.Model), EXTENSIBLE; - (** pre: r.style = NIL, m # NIL, style.attr # NIL, m IS Style **) - (** post: r.style = m **) - BEGIN - WITH m: Style DO - ASSERT((r.style = NIL) OR (r.style = m), 20); - ASSERT(m # NIL, 21); ASSERT(m.attr # NIL, 22); - r.style := m - ELSE HALT(23) - END - END InitModel; -*) - -(* - PROCEDURE (r: Ruler) PropagateDomain-, EXTENSIBLE; - BEGIN - ASSERT(r.style # NIL, 20); - Stores.InitDomain(r.style, r.Domain()) - END PropagateDomain; -*) - - PROCEDURE CopyOf* (r: Ruler; shallow: BOOLEAN): Ruler; - VAR v: Views.View; - BEGIN - ASSERT(r # NIL, 20); - v := Views.CopyOf(r, shallow); RETURN v(Ruler) - END CopyOf; - - - (** Prop **) - - PROCEDURE (p: Prop) IntersectWith* (q: Properties.Property; OUT equal: BOOLEAN); - VAR valid: SET; i: INTEGER; c, m: SET; eq: BOOLEAN; - BEGIN - WITH q: Prop DO - valid := p.valid * q.valid; equal := TRUE; - i := 0; - WHILE (i < p.tabs.len) - & (p.tabs.tab[i].stop = q.tabs.tab[i].stop) - & (p.tabs.tab[i].type = q.tabs.tab[i].type) - DO - INC(i) - END; - IF p.first # q.first THEN EXCL(valid, first) END; - IF p.left # q.left THEN EXCL(valid, left) END; - IF p.right # q.right THEN EXCL(valid, right) END; - IF p.lead # q.lead THEN EXCL(valid, lead) END; - IF p.asc # q.asc THEN EXCL(valid, asc) END; - IF p.dsc # q.dsc THEN EXCL(valid, dsc) END; - IF p.grid # q.grid THEN EXCL(valid, grid) END; - Properties.IntersectSelections(p.opts.val, p.opts.mask, q.opts.val, q.opts.mask, c, m, eq); - IF m = {} THEN EXCL(valid, opts) - ELSIF (opts IN valid) & ~eq THEN p.opts.mask := m; equal := FALSE - END; - IF (p.tabs.len # q.tabs.len) OR (q.tabs.len # i) THEN EXCL(valid, tabs) END; - IF p.valid # valid THEN p.valid := valid; equal := FALSE END - END - END IntersectWith; - - - (** ruler construction **) - -(*property-based facade procedures *) - - PROCEDURE SetFirst* (r: Ruler; x: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {first}; prop.first := x; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetFirst; - - PROCEDURE SetLeft* (r: Ruler; x: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {left}; prop.left := x; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetLeft; - - PROCEDURE SetRight* (r: Ruler; x: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {right}; prop.right := x; - prop.opts.mask := {rightFixed}; prop.opts.val := {}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetRight; - - PROCEDURE SetFixedRight* (r: Ruler; x: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {right, opts}; prop.right := x; - prop.opts.mask := {rightFixed}; prop.opts.val := {rightFixed}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetFixedRight; - - - PROCEDURE SetLead* (r: Ruler; h: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {lead}; prop.lead := h; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetLead; - - PROCEDURE SetAsc* (r: Ruler; h: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {asc}; prop.asc := h; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetAsc; - - PROCEDURE SetDsc* (r: Ruler; h: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {dsc}; prop.dsc := h; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetDsc; - - PROCEDURE SetGrid* (r: Ruler; h: INTEGER); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {grid}; prop.grid := h; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetGrid; - - - PROCEDURE SetLeftFlush* (r: Ruler); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {opts}; - prop.opts.mask := {leftAdjust, rightAdjust}; prop.opts.val := {leftAdjust}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetLeftFlush; - - PROCEDURE SetRightFlush* (r: Ruler); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {opts}; - prop.opts.mask := {leftAdjust, rightAdjust}; prop.opts.val := {rightAdjust}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetRightFlush; - - PROCEDURE SetCentered* (r: Ruler); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {opts}; - prop.opts.mask := {leftAdjust, rightAdjust}; prop.opts.val := {}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetCentered; - - PROCEDURE SetJustified* (r: Ruler); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {opts}; - prop.opts.mask := {leftAdjust, rightAdjust}; prop.opts.val := {leftAdjust, rightAdjust}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetJustified; - - - PROCEDURE SetNoBreakInside* (r: Ruler); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {opts}; - prop.opts.mask := {noBreakInside}; prop.opts.val := {noBreakInside}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetNoBreakInside; - - PROCEDURE SetPageBreak* (r: Ruler); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {opts}; - prop.opts.mask := {pageBreak}; prop.opts.val := {pageBreak}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetPageBreak; - - PROCEDURE SetParJoin* (r: Ruler); - BEGIN - ASSERT(r.style # NIL, 20); - prop.valid := {opts}; - prop.opts.mask := {parJoin}; prop.opts.val := {parJoin}; - r.style.SetAttr(ModifiedAttr(r.style.attr, prop)) - END SetParJoin; - - - PROCEDURE AddTab* (r: Ruler; x: INTEGER); - VAR ra: Attributes; i: INTEGER; - BEGIN - ASSERT(r.style # NIL, 20); ra := r.style.attr; i := ra.tabs.len; ASSERT(i < maxTabs, 21); - ASSERT((i = 0) OR (ra.tabs.tab[i - 1].stop < x), 22); - prop.valid := {tabs}; - CopyTabs(ra.tabs, prop.tabs); - prop.tabs.tab[i].stop := x; prop.tabs.tab[i].type := {}; INC(prop.tabs.len); - r.style.SetAttr(ModifiedAttr(ra, prop)) - END AddTab; - - PROCEDURE MakeCenterTab* (r: Ruler); - VAR ra: Attributes; i: INTEGER; - BEGIN - ASSERT(r.style # NIL, 20); ra := r.style.attr; i := ra.tabs.len; ASSERT(i > 0, 21); - prop.valid := {tabs}; - CopyTabs(ra.tabs, prop.tabs); - prop.tabs.tab[i - 1].type := prop.tabs.tab[i - 1].type + {centerTab} - {rightTab}; - r.style.SetAttr(ModifiedAttr(ra, prop)) - END MakeCenterTab; - - PROCEDURE MakeRightTab* (r: Ruler); - VAR ra: Attributes; i: INTEGER; - BEGIN - ASSERT(r.style # NIL, 20); ra := r.style.attr; i := ra.tabs.len; ASSERT(i > 0, 21); - prop.valid := {tabs}; - CopyTabs(ra.tabs, prop.tabs); - prop.tabs.tab[i - 1].type := prop.tabs.tab[i - 1].type - {centerTab} + {rightTab}; - r.style.SetAttr(ModifiedAttr(ra, prop)) - END MakeRightTab; - - PROCEDURE MakeBarTab* (r: Ruler); - VAR ra: Attributes; i: INTEGER; - BEGIN - ASSERT(r.style # NIL, 20); ra := r.style.attr; i := ra.tabs.len; ASSERT(i > 0, 21); - prop.valid := {tabs}; - CopyTabs(ra.tabs, prop.tabs); - prop.tabs.tab[i - 1].type := prop.tabs.tab[i - 1].type + {barTab}; - r.style.SetAttr(ModifiedAttr(ra, prop)) - END MakeBarTab; - - - (* SetAttrOp *) - - PROCEDURE (op: SetAttrOp) Do; - VAR s: Style; attr: Attributes; upd: UpdateMsg; - BEGIN - s := op.style; - attr := s.attr; s.attr := op.attr; op.attr := attr; - (*Stores.InitDomain(s.attr, s.Domain());*) (* Stores.Join(s, s.attr); *) - ASSERT((s.attr=NIL) OR Stores.Joined(s, s.attr), 100); - upd.style := s; upd.oldAttr := attr; Models.Domaincast(s.Domain(), upd) - END Do; - - PROCEDURE DoSetAttrOp (s: Style; attr: Attributes); - VAR op: SetAttrOp; - BEGIN - IF (s.attr # attr) OR ~s.attr.Equals(attr) THEN - (* IF attr.Domain() # s.Domain() THEN attr := Stores.CopyOf(attr)(Attributes) END; *) - IF ~Stores.Joined(s, attr) THEN - IF ~Stores.Unattached(attr) THEN attr := Stores.CopyOf(attr)(Attributes) END; - Stores.Join(s, attr) - END; - NEW(op); op.style := s; op.attr := attr; - Models.Do(s, rulerChangeKey, op) - END - END DoSetAttrOp; - - - (* grid definitions *) - - PROCEDURE MarginGrid (x: INTEGER): INTEGER; - BEGIN - RETURN (x + marginGrid DIV 2) DIV marginGrid * marginGrid - END MarginGrid; - - PROCEDURE TabGrid (x: INTEGER): INTEGER; - BEGIN - RETURN (x + tabGrid DIV 2) DIV tabGrid * tabGrid - END TabGrid; - - - (* nice graphical primitives *) - - PROCEDURE DrawCenteredInt (f: Views.Frame; x, y, n: INTEGER); - VAR sw: INTEGER; s: ARRAY 32 OF CHAR; - BEGIN - Strings.IntToString(n, s); sw := font.StringWidth(s); - f.DrawString(x - sw DIV 2, y, Ports.defaultColor, s, font) - END DrawCenteredInt; - - PROCEDURE DrawNiceRect (f: Views.Frame; l, t, r, b: INTEGER); - VAR u: INTEGER; - BEGIN - u := f.dot; - f.DrawRect(l, t, r - u, b - u, 0, Ports.defaultColor); - f.DrawLine(l + u, b - u, r - u, b - u, u, Ports.grey25); - f.DrawLine(r - u, t + u, r - u, b - u, u, Ports.grey25) - END DrawNiceRect; - - PROCEDURE DrawScale (f: Views.Frame; l, t, r, b, clipL, clipR: INTEGER); - VAR u, h, x, px, sw: INTEGER; i, n, d1, d2: INTEGER; s: ARRAY 32 OF CHAR; - BEGIN - f.DrawRect(l, t, r, b, Ports.fill, Ports.grey12); - u := f.dot; - IF Dialog.metricSystem THEN d1 := 2; d2 := 10 ELSE d1 := 2; d2 := 16 END; - DEC(b, point); - sw := 2*u + font.StringWidth("8888888888"); - x := l + tabGrid; i := 0; n := 0; - WHILE x <= r DO - INC(i); px := TabGrid(x); - IF i = d2 THEN - h := 6*point; i := 0; INC(n); - IF (px >= clipL - sw) & (px < clipR) THEN - Strings.IntToString(n, s); - f.DrawString(px - 2*u - font.StringWidth(s), b - 3*point, Ports.defaultColor, s, font) - END - ELSIF i MOD d1 = 0 THEN - h := 2*point - ELSE - h := 0 - END; - IF (px >= clipL) & (px < clipR) & (h > 0) THEN - f.DrawLine(px, b, px, b - h, 0, Ports.defaultColor) - END; - INC(x, tabGrid) - END - END DrawScale; - - PROCEDURE InvertTabMark (f: Views.Frame; l, t, r, b: INTEGER; type: SET; show: BOOLEAN); - VAR u, u2, u3, yc, i, ih: INTEGER; - BEGIN - u := f.dot; u2 := 2*u; u3 := 3*u; - IF ~ODD((r - l) DIV u) THEN DEC(r, u) END; - yc := l + (r - l) DIV u DIV 2 * u; - IF barTab IN type THEN - f.MarkRect(yc, b - u3, yc + u, b - u2, Ports.fill, Ports.invert, show); - f.MarkRect(yc, b - u, yc + u, b, Ports.fill, Ports.invert, show) - END; - IF centerTab IN type THEN - f.MarkRect(l + u, b - u2, r - u, b - u, Ports.fill, Ports.invert, show) - ELSIF rightTab IN type THEN - f.MarkRect(l, b - u2, yc + u, b - u, Ports.fill, Ports.invert, show) - ELSE - f.MarkRect(yc, b - u2, r, b - u, Ports.fill, Ports.invert, show) - END; - DEC(b, u3); INC(l, u2); DEC(r, u2); - ih := (r - l) DIV 2; - i := b - t; t := b - u; - WHILE (i > 0) & (r > l) DO - DEC(i, u); - f.MarkRect(l, t, r, b, Ports.fill, Ports.invert, show); - IF i <= ih THEN INC(l, u); DEC(r, u) END; - DEC(t, u); DEC(b, u) - END - END InvertTabMark; - - PROCEDURE InvertFirstMark (f: Views.Frame; l, t, r, b: INTEGER; show: BOOLEAN); - VAR u, i, ih: INTEGER; - BEGIN - u := f.dot; - i := b - t; t := b - u; - ih := r - l; - WHILE (i > 0) & (r > l) DO - DEC(i, u); - f.MarkRect(l, t, r, b, Ports.fill, Ports.invert, show); - IF i <= ih THEN DEC(r, u) END; - DEC(t, u); DEC(b, u) - END - END InvertFirstMark; - - PROCEDURE InvertLeftMark (f: Views.Frame; l, t, r, b: INTEGER; show: BOOLEAN); - VAR u, i, ih: INTEGER; - BEGIN - u := f.dot; - i := b - t; b := t + u; - ih := r - l; - WHILE (i > 0) & (r > l) DO - DEC(i, u); - f.MarkRect(l, t, r, b, Ports.fill, Ports.invert, show); - IF i <= ih THEN DEC(r, u) END; - INC(t, u); INC(b, u) - END - END InvertLeftMark; - - PROCEDURE InvertRightMark (f: Views.Frame; l, t, r, b: INTEGER; show: BOOLEAN); - VAR u, i, ih: INTEGER; - BEGIN - u := f.dot; - IF ~ODD((b - t) DIV u) THEN INC(t, u) END; - ih := r - l; l := r - u; - i := b - t; b := t + u; - WHILE (i > 0) & (i > ih) DO - DEC(i, u); - f.MarkRect(l, t, r, b, Ports.fill, Ports.invert, show); - DEC(l, u); - INC(t, u); INC(b, u) - END; - WHILE (i > 0) & (r > l) DO - DEC(i, u); - f.MarkRect(l, t, r, b, Ports.fill, Ports.invert, show); - INC(l, u); - INC(t, u); INC(b, u) - END - END InvertRightMark; - - - (* marks *) - - PROCEDURE SetMark (VAR m: Mark; r: StdRuler; px, py: INTEGER; kind, index: INTEGER); - BEGIN - m.ruler := r; m.kind := kind; - m.px := px; m.py := py; - CASE kind OF - first: - m.l := px; m.r := m.l + 4*point; - m.b := py - 7*point; m.t := m.b - 4*point - | left: - m.l := px; m.r := m.l + 4*point; - m.b := py - 2*point; m.t := m.b - 4*point - | right: - m.r := px; m.l := m.r - 4*point; - m.b := py - 3*point; m.t := m.b - 7*point - | tabs: - m.l := px - 4*point; m.r := m.l + 9*point; - m.b := py - 5*point; m.t := m.b - 6*point; - m.type := r.style.attr.tabs.tab[index].type - | firstIcon .. lastIcon: - m.l := px; m.r := px + iconWidth; - m.t := py; m.b := py + iconHeight - ELSE HALT(100) - END - END SetMark; - - PROCEDURE Try (VAR m: Mark; r: StdRuler; px, py, x, y: INTEGER; kind, index: INTEGER); - BEGIN - IF m.kind = invalid THEN - SetMark(m, r, px, py, kind, index); - IF (m.l - point <= x) & (x < m.r + point) & (m.t - point <= y) & (y < m.b + point) THEN - m.px0 := m.px; m.py0 := m.py; m.x := x; m.y := y; - IF kind = tabs THEN - m.index := index; CopyTabs(r.style.attr.tabs, m.tabs) - END - ELSE - m.kind := invalid - END - END - END Try; - - PROCEDURE InvertMark (VAR m: Mark; f: Views.Frame; show: BOOLEAN); - (* pre: kind # invalid *) - BEGIN - CASE m.kind OF - first: InvertFirstMark(f, m.l, m.t, m.r, m.b, show) - | left: InvertLeftMark(f, m.l, m.t, m.r, m.b, show) - | right: InvertRightMark(f, m.l, m.t, m.r, m.b, show) - | tabs: InvertTabMark(f, m.l, m.t, m.r, m.b, m.type, show) - END - END InvertMark; - - PROCEDURE HiliteMark (VAR m: Mark; f: Views.Frame; show: BOOLEAN); - BEGIN - f.MarkRect(m.l, m.t, m.r - point, m.b - point, Ports.fill, Ports.hilite, show) - END HiliteMark; - - PROCEDURE HiliteThisMark (r: StdRuler; f: Views.Frame; kind: INTEGER; show: BOOLEAN); - VAR m: Mark; px, w, h: INTEGER; - BEGIN - IF (kind # invalid) & (kind IN validIcons) THEN - px := iconGap + (kind - firstIcon) * (iconWidth + iconGap); - r.context.GetSize(w, h); - SetMark(m, r, px, h - iconPin, kind, -1); - HiliteMark(m, f, show) - END - END HiliteThisMark; - - PROCEDURE DrawMark (VAR m: Mark; f: Views.Frame); - (* pre: kind # invalid *) - VAR a: Attributes; l, t, r, b, y, d, e, asc, dsc, fw: INTEGER; i: INTEGER; - w: ARRAY 4 OF INTEGER; - BEGIN - a := m.ruler.style.attr; - l := m.l + 2 * point; t := m.t + 2 * point; r := m.r - 4 * point; b := m.b - 3 * point; - font.GetBounds(asc, dsc, fw); - y := (m.t + m.b + asc) DIV 2; - w[0] := (r - l) DIV 2; w[1] := r - l; w[2] := (r - l) DIV 3; w[3] := (r - l) * 2 DIV 3; - CASE m.kind OF - rightToggle: - IF rightFixed IN a.opts THEN - d := 0; y := (t + b) DIV 2 - point; e := (l + r) DIV 2 + point; - WHILE t < y DO - f.DrawLine(e - d, t, e, t, point, Ports.defaultColor); INC(d, point); INC(t, point) - END; - WHILE t < b DO - f.DrawLine(e - d, t, e, t, point, Ports.defaultColor); DEC(d, point); INC(t, point) - END - ELSE - DEC(b, point); - f.DrawLine(l, t, r, t, point, Ports.defaultColor); - f.DrawLine(l, b, r, b, point, Ports.defaultColor); - f.DrawLine(l, t, l, b, point, Ports.defaultColor); - f.DrawLine(r, t, r, b, point, Ports.defaultColor) - END - | gridDec: - WHILE t < b DO f.DrawLine(l, t, r, t, point, Ports.defaultColor); INC(t, 2 * point) END - | gridVal: - DrawCenteredInt(f, (l + r) DIV 2, y, a.grid DIV point) - | gridInc: - WHILE t < b DO f.DrawLine(l, t, r, t, point, Ports.defaultColor); INC(t, 3 * point) END - | leftFlush: - i := 0; - WHILE t < b DO - d := w[i]; i := (i + 1) MOD LEN(w); - f.DrawLine(l, t, l + d, t, point, Ports.defaultColor); INC(t, 2 * point) - END - | centered: - i := 0; - WHILE t < b DO - d := (r - l - w[i]) DIV 2; i := (i + 1) MOD LEN(w); - f.DrawLine(l + d, t, r - d, t, point, Ports.defaultColor); INC(t, 2 * point) - END - | rightFlush: - i := 0; - WHILE t < b DO - d := w[i]; i := (i + 1) MOD LEN(w); - f.DrawLine(r - d, t, r, t, point, Ports.defaultColor); INC(t, 2 * point) - END - | justified: - WHILE t < b DO f.DrawLine(l, t, r, t, point, Ports.defaultColor); INC(t, 2 * point) END - | leadDec: - f.DrawLine(l, t, l, t + point, point, Ports.defaultColor); INC(t, 2 * point); - WHILE t < b DO f.DrawLine(l, t, r, t, point, Ports.defaultColor); INC(t, 2 * point) END - | leadVal: - DrawCenteredInt(f, (l + r) DIV 2, y, m.ruler.style.attr.lead DIV point) - | leadInc: - f.DrawLine(l, t, l, t + 3 * point, point, Ports.defaultColor); INC(t, 4 * point); - WHILE t < b DO f.DrawLine(l, t, r, t, point, Ports.defaultColor); INC(t, 2 * point) END - | pageBrk: - DEC(b, point); - IF pageBreak IN a.opts THEN - y := (t + b) DIV 2 - point; - f.DrawLine(l, t, l, y, point, Ports.defaultColor); - f.DrawLine(r, t, r, y, point, Ports.defaultColor); - f.DrawLine(l, y, r, y, point, Ports.defaultColor); - INC(y, 2 * point); - f.DrawLine(l, y, r, y, point, Ports.defaultColor); - f.DrawLine(l, y, l, b, point, Ports.defaultColor); - f.DrawLine(r, y, r, b, point, Ports.defaultColor) - ELSE - f.DrawLine(l, t, l, b, point, Ports.defaultColor); - f.DrawLine(r, t, r, b, point, Ports.defaultColor) - END - ELSE - HALT(100) - END; - IF ~(m.kind IN {gridVal, leadVal}) THEN - DrawNiceRect(f, m.l, m.t, m.r, m.b) - END - END DrawMark; - - PROCEDURE GetMark (VAR m: Mark; r: StdRuler; f: Views.Frame; - x, y: INTEGER; canCreate: BOOLEAN - ); - (* pre: ~canCreate OR (f # NIL) *) - VAR a: Attributes; px, w, h: INTEGER; i: INTEGER; - BEGIN - m.kind := invalid; m.dirty := FALSE; - a := r.style.attr; - r.context.GetSize(w, h); - - (* first try scale *) - Try(m, r, a.first, h, x, y, first, 0); - Try(m, r, a.left, h, x, y, left, 0); - IF rightFixed IN a.opts THEN - Try(m, r, a.right, h, x, y, right, 0) - END; - i := 0; - WHILE (m.kind = invalid) & (i < a.tabs.len) DO - Try(m, r, a.tabs.tab[i].stop, h, x, y, tabs, i); - INC(i) - END; - IF (m.kind = invalid) & (y >= h - tabBarHeight) & (a.tabs.len < maxTabs) THEN - i := 0; px := TabGrid(x); - WHILE (i < a.tabs.len) & (a.tabs.tab[i].stop < px) DO INC(i) END; - IF (i = 0) OR (px - a.tabs.tab[i - 1].stop >= minTabWidth) THEN - IF (i = a.tabs.len) OR (a.tabs.tab[i].stop - px >= minTabWidth) THEN - IF canCreate THEN (* set new tab stop, initially at end of list *) - m.kind := tabs; m.index := a.tabs.len; m.dirty := TRUE; - CopyTabs(a.tabs, m.tabs); m.tabs.len := a.tabs.len + 1; - m.tabs.tab[a.tabs.len].stop := px; m.tabs.tab[a.tabs.len].type := {}; - a.tabs.tab[a.tabs.len].stop := px; a.tabs.tab[a.tabs.len].type := {}; - SetMark(m, r, px, h, tabs, m.index); InvertMark(m, f, Ports.show); - m.px0 := m.px; m.py0 := m.py; m.x := x; m.y := y - END - END - END - END; - - (* next try icon bar *) - px := iconGap; i := firstIcon; - WHILE i <= lastIcon DO - IF i IN validIcons THEN - Try(m, r, px, h - iconPin, x, y, i, 0) - END; - INC(px, iconWidth + iconGap); INC(i) - END - END GetMark; - - PROCEDURE SelectMark (r: StdRuler; f: Views.Frame; IN m: Mark); - BEGIN - r.sel := m.kind; r.px := m.px; r.py := m.py - END SelectMark; - - PROCEDURE DeselectMark (r: StdRuler; f: Views.Frame); - BEGIN - HiliteThisMark(r, f, r.sel, Ports.hide); r.sel := invalid - END DeselectMark; - - - (* mark interaction *) - - PROCEDURE Mode (r: StdRuler): INTEGER; - VAR a: Attributes; i: INTEGER; - BEGIN - a := r.style.attr; - IF a.opts * adjMask = {leftAdjust} THEN - i := leftFlush - ELSIF a.opts * adjMask = {} THEN - i := centered - ELSIF a.opts * adjMask = {rightAdjust} THEN - i := rightFlush - ELSE (* a.opts * adjMask = adjMask *) - i := justified - END; - RETURN i - END Mode; - - PROCEDURE GrabMark (VAR m: Mark; r: StdRuler; f: Views.Frame; x, y: INTEGER); - BEGIN - GetMark(m, r, f, x, y, TRUE); - DeselectMark(r, f); - IF m.kind = Mode(r) THEN m.kind := invalid END - END GrabMark; - - PROCEDURE TrackMark (VAR m: Mark; f: Views.Frame; x, y: INTEGER; modifiers: SET); - VAR px, py, w, h: INTEGER; - BEGIN - IF m.kind # invalid THEN - px := m.px + x - m.x; py := m.py + y - m.y; - IF m.kind = tabs THEN - px := TabGrid(px) - ELSIF m.kind IN validIcons THEN - IF (m.l <= x) & (x < m.r) THEN px := 1 ELSE px := 0 END - ELSE - px := MarginGrid(px) - END; - IF m.kind IN {right, tabs} THEN - m.ruler.context.GetSize(w, h); - IF (0 <= y) & (y < h + scaleHeight) OR (Controllers.extend IN modifiers) THEN - py := h - ELSE - py := -1 (* moved mark out of ruler: delete tab stop or fixed right margin *) - END - ELSIF m.kind IN validIcons THEN - IF (m.t <= y) & (y < m.b) THEN py := 1 ELSE py := 0 END - ELSE - py := MarginGrid(py) - END; - IF (m.kind IN {right, tabs}) & ((m.px # px) OR (m.py # py)) THEN - INC(m.x, px - m.px); INC(m.y, py - m.py); - InvertMark(m, f, Ports.hide); SetMark(m, m.ruler, px, py, m.kind, m.index); - InvertMark(m, f, Ports.show); - m.dirty := TRUE - ELSIF (m.kind IN {first, left}) & (m.px # px) THEN - INC(m.x, px - m.px); - InvertMark(m, f, Ports.hide); SetMark(m, m.ruler, px, m.py, m.kind, m.index); - InvertMark(m, f, Ports.show) - ELSIF (m.kind IN validIcons) & (m.px * m.py # px * py) THEN - HiliteMark(m, f, Ports.show); - IF m.kind IN modeIcons THEN HiliteThisMark(m.ruler, f, Mode(m.ruler), Ports.hide) END; - m.px := px; m.py := py - END - END - END TrackMark; - - PROCEDURE ShiftMarks (a: Attributes; p: Prop; mask: SET; x0, dx: INTEGER); - VAR new: SET; i, j, t0, t1: INTEGER; tab0, tab1: TabArray; - BEGIN - new := mask - p.valid; - IF first IN new THEN p.first := a.first END; - IF tabs IN new THEN CopyTabs(a.tabs, p.tabs) END; - p.valid := p.valid + mask; - IF first IN mask THEN INC(p.first, dx) END; - IF tabs IN mask THEN - i := 0; - WHILE (i < p.tabs.len) & (p.tabs.tab[i].stop < x0) DO tab0.tab[i] := p.tabs.tab[i]; INC(i) END; - t0 := i; - t1 := 0; - WHILE i < p.tabs.len DO - tab1.tab[t1].stop := p.tabs.tab[i].stop + dx; - tab1.tab[t1].type := p.tabs.tab[i].type; - INC(t1); INC(i) - END; - i := 0; j := 0; p.tabs.len := 0; - WHILE i < t0 DO (* merge sort *) - WHILE (j < t1) & (tab1.tab[j].stop < tab0.tab[i].stop) DO - p.tabs.tab[p.tabs.len] := tab1.tab[j]; INC(p.tabs.len); INC(j) - END; - IF (j < t1) & (tab1.tab[j].stop = tab0.tab[i].stop) THEN INC(j) END; - p.tabs.tab[p.tabs.len] := tab0.tab[i]; INC(p.tabs.len); INC(i) - END; - WHILE j < t1 DO - p.tabs.tab[p.tabs.len] := tab1.tab[j]; INC(p.tabs.len); INC(j) - END - END - END ShiftMarks; - - PROCEDURE ShiftDependingMarks (VAR m: Mark; p: Prop); - VAR a: Attributes; dx: INTEGER; - BEGIN - a := m.ruler.style.attr; dx := m.px - m.px0; - CASE m.kind OF - first: ShiftMarks(a, p, {tabs}, 0, dx) - | left: ShiftMarks(a, p, {first, tabs}, 0, dx) - | tabs: ShiftMarks(a, p, {tabs}, m.px0, dx) - ELSE - END - END ShiftDependingMarks; - - PROCEDURE AdjustMarks (VAR m: Mark; f: Views.Frame; modifiers: SET); - VAR r: StdRuler; a: Attributes; p: Prop; - g: INTEGER; i, j: INTEGER; shift: BOOLEAN; type: SET; - BEGIN - r := m.ruler; - IF (m.kind # invalid) & (m.kind IN validIcons) - & (m.px = 1) & (m.py = 1) - OR (m.kind # invalid) & ~(m.kind IN validIcons) - & ((m.px # m.px0) OR (m.py # m.py0) - OR (m.kind = tabs) (*(m.tabs.len # r.style.attr.tabs.len)*) ) - THEN - a := r.style.attr; NEW(p); - p.valid := {}; - shift := (Controllers.modify IN modifiers) & (m.tabs.len = r.style.attr.tabs.len); - CASE m.kind OF - first: - p.valid := {first}; p.first := m.px - | left: - p.valid := {left}; p.left := m.px - | right: - IF m.py >= 0 THEN - p.valid := {right}; p.right := m.px - ELSE - p.valid := {opts}; p.opts.val := {}; p.opts.mask := {rightFixed} - END - | tabs: - IF ~m.dirty THEN - p.valid := {tabs}; CopyTabs(m.tabs, p.tabs); - i := m.index; type := m.tabs.tab[i].type; - IF shift THEN - type := type * {barTab}; - IF type = {} THEN type := {barTab} - ELSE type := {} - END; - p.tabs.tab[i].type := p.tabs.tab[i].type - {barTab} + type - ELSE - type := type * {centerTab, rightTab}; - IF type = {} THEN type := {centerTab} - ELSIF type = {centerTab} THEN type := {rightTab} - ELSE type := {} - END; - p.tabs.tab[i].type := p.tabs.tab[i].type - {centerTab, rightTab} + type - END - ELSIF ~shift THEN - p.valid := {tabs}; p.tabs.len := m.tabs.len - 1; - i := 0; - WHILE i < m.index DO p.tabs.tab[i] := m.tabs.tab[i]; INC(i) END; - INC(i); - WHILE i < m.tabs.len DO p.tabs.tab[i - 1] := m.tabs.tab[i]; INC(i) END; - i := 0; - WHILE (i < p.tabs.len) & (p.tabs.tab[i].stop < m.px) DO INC(i) END; - IF (m.px >= MIN(a.first, a.left)) & (m.px <= f.r) & (m.py >= 0) - & ((i = 0) OR (m.px - p.tabs.tab[i - 1].stop >= minTabWidth)) - & ((i = p.tabs.len) OR (p.tabs.tab[i].stop - m.px >= minTabWidth)) THEN - j := p.tabs.len; - WHILE j > i DO p.tabs.tab[j] := p.tabs.tab[j - 1]; DEC(j) END; - p.tabs.tab[i].stop := m.px; p.tabs.tab[i].type := m.tabs.tab[m.index].type; - INC(p.tabs.len) - END; - i := 0; - WHILE (i < p.tabs.len) - & (p.tabs.tab[i].stop = a.tabs.tab[i].stop) - & (p.tabs.tab[i].type = a.tabs.tab[i].type) DO - INC(i) - END; - IF (i = p.tabs.len) & (p.tabs.len = a.tabs.len) THEN RETURN END (* did not change *) - END - | rightToggle: - p.valid := {right, opts}; - IF ~(rightFixed IN a.opts) THEN - p.right := f.r DIV marginGrid * marginGrid - END; - p.opts.val := a.opts / {rightFixed}; p.opts.mask := {rightFixed} - | gridDec: - p.valid := {asc, grid}; g := a.grid - point; - IF g = 0 THEN p.grid := 1; p.asc := 0 ELSE p.grid := g; p.asc := g - a.dsc END - | gridVal: - SelectMark(r, f, m); RETURN - | gridInc: - p.valid := {asc, grid}; g := a.grid + point; DEC(g, g MOD point); - p.grid := g; p.asc := g - a.dsc - | leftFlush: - p.valid := {opts}; p.opts.val := {leftAdjust}; p.opts.mask := adjMask - | centered: - p.valid := {opts}; p.opts.val := {}; p.opts.mask := adjMask - | rightFlush: - p.valid := {opts}; p.opts.val := {rightAdjust}; p.opts.mask := adjMask - | justified: - p.valid := {opts}; p.opts.val := adjMask; p.opts.mask := adjMask - | leadDec: - p.valid := {lead}; p.lead := a.lead - point - | leadVal: - SelectMark(r, f, m); RETURN - | leadInc: - p.valid := {lead}; p.lead := a.lead + point - | pageBrk: - p.valid := {opts}; p.opts.val := a.opts / {pageBreak}; p.opts.mask := {pageBreak} - ELSE HALT(100) - END; - IF shift THEN ShiftDependingMarks(m, p) END; - IF m.kind IN validIcons - modeIcons THEN HiliteMark(m, f, Ports.hide) END; - - r.style.SetAttr(ModifiedAttr(a, p)) - END - END AdjustMarks; - - - (* primitivies for standard ruler *) - - PROCEDURE Track (r: StdRuler; f: Views.Frame; IN msg: Controllers.TrackMsg); - VAR m: Mark; x, y, res: INTEGER; modifiers: SET; isDown: BOOLEAN; - cmd: ARRAY 128 OF CHAR; - BEGIN - GrabMark(m, r, f, msg.x, msg.y); - REPEAT - f.Input(x, y, modifiers, isDown); TrackMark(m, f, x, y, modifiers) - UNTIL ~isDown; - AdjustMarks(m, f, modifiers); - IF Controllers.doubleClick IN msg.modifiers THEN - CASE m.kind OF - | invalid: - Dialog.MapString("#Text:OpenRulerDialog", cmd); Dialog.Call(cmd, "", res) - | gridVal, leadVal: - Dialog.MapString("#Text:OpenSizeDialog", cmd); Dialog.Call(cmd, "", res) - ELSE - END - END - END Track; - - PROCEDURE Edit (r: StdRuler; f: Views.Frame; VAR msg: Controllers.EditMsg); - VAR v: Views.View; - BEGIN - CASE msg.op OF - Controllers.copy: - msg.view := Views.CopyOf(r, Views.deep); - msg.isSingle := TRUE - | Controllers.paste: - v := msg.view; - WITH v: Ruler DO r.style.SetAttr(v.style.attr) ELSE END - ELSE - END - END Edit; - - PROCEDURE PollOps (r: StdRuler; f: Views.Frame; VAR msg: Controllers.PollOpsMsg); - BEGIN - msg.type := "TextRulers.Ruler"; - msg.pasteType := "TextRulers.Ruler"; - msg.selectable := FALSE; - msg.valid := {Controllers.copy, Controllers.paste} - END PollOps; - - PROCEDURE SetProp (r: StdRuler; VAR msg: Properties.SetMsg; VAR requestFocus: BOOLEAN); - VAR a1: Attributes; px, py, g: INTEGER; sel: INTEGER; - p: Properties.Property; sp: Properties.StdProp; rp: Prop; - BEGIN - p := msg.prop; sel := r.sel; px := r.px; py := r.py; - IF sel # invalid THEN - WHILE (p # NIL) & ~(p IS Properties.StdProp) DO p := p.next END; - IF p # NIL THEN - sp := p(Properties.StdProp); - IF (r.sel = leadVal) & (Properties.size IN sp.valid) THEN - NEW(rp); rp.valid := {lead}; - rp.lead := sp.size - ELSIF (r.sel = gridVal) & (Properties.size IN sp.valid) THEN - g := sp.size; DEC(g, g MOD point); - NEW(rp); rp.valid := {asc, grid}; - IF g = 0 THEN rp.asc := 0; rp.grid := 1 - ELSE rp.asc := g - r.style.attr.dsc; rp.grid := g - END - ELSE - rp := NIL - END - END; - p := rp - END; - a1 := ModifiedAttr(r.style.attr, p); - IF ~a1.Equals(r.style.attr) THEN - r.style.SetAttr(a1); - IF requestFocus & (r.sel = invalid) THEN (* restore mark selection *) - r.sel := sel; r.px := px; r.py := py - END - ELSE requestFocus := FALSE - END - END SetProp; - - PROCEDURE PollProp (r: StdRuler; VAR msg: Properties.PollMsg); - VAR p: Properties.StdProp; - BEGIN - CASE r.sel OF - invalid: - msg.prop := r.style.attr.Prop() - | leadVal: - NEW(p); p.known := {Properties.size}; p.valid := p.known; - p.size := r.style.attr.lead; - msg.prop := p - | gridVal: - NEW(p); p.known := {Properties.size}; p.valid := p.known; - p.size := r.style.attr.grid; - msg.prop := p - ELSE HALT(100) - END - END PollProp; - - - (* StdStyle *) - - PROCEDURE (r: StdStyle) Internalize (VAR rd: Stores.Reader); - VAR thisVersion: INTEGER; - BEGIN - r.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStdStyleVersion, thisVersion) - END Internalize; - - PROCEDURE (r: StdStyle) Externalize (VAR wr: Stores.Writer); - BEGIN - r.Externalize^(wr); - wr.WriteVersion(maxStdStyleVersion) - END Externalize; -(* - PROCEDURE (r: StdStyle) CopyFrom (source: Stores.Store); - BEGIN - r.SetAttr(source(StdStyle).attr) - END CopyFrom; -*) - - (* StdRuler *) - - PROCEDURE (r: StdRuler) Internalize (VAR rd: Stores.Reader); - VAR thisVersion: INTEGER; - BEGIN - r.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStdRulerVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - r.sel := invalid - END Internalize; - - PROCEDURE (r: StdRuler) Externalize (VAR wr: Stores.Writer); - BEGIN - r.Externalize^(wr); - wr.WriteVersion(maxStdRulerVersion) - END Externalize; - - PROCEDURE (r: StdRuler) ThisModel (): Models.Model; - BEGIN - RETURN r.style - END ThisModel; - - PROCEDURE (r: StdRuler) CopyFromModelView (source: Views.View; model: Models.Model); - BEGIN - r.sel := invalid; r.InitStyle(model(Style)) - END CopyFromModelView; - - PROCEDURE (ruler: StdRuler) Restore (f: Views.Frame; l, t, r, b: INTEGER); - VAR a: Attributes; m: Mark; u, scale, tabBar, px, w, h: INTEGER; i: INTEGER; - BEGIN - u := f.dot; a := ruler.style.attr; - ruler.context.GetSize(w, h); - tabBar := h - tabBarHeight; scale := tabBar - scaleHeight; - w := MIN(f.r + 10 * mm, 10000 * mm); (* high-level clipping *) - f.DrawLine(0, scale - u, w - u, scale - u, u, Ports.grey25); - f.DrawLine(0, tabBar - u, w - u, tabBar - u, u, Ports.grey50); - DrawScale(f, 0, scale, w, tabBar, l, r); - DrawNiceRect(f, 0, h - rulerHeight, w, h); - SetMark(m, ruler, a.first, h, first, -1); InvertMark(m, f, Ports.show); - SetMark(m, ruler, a.left, h, left, -1); InvertMark(m, f, Ports.show); - IF rightFixed IN a.opts THEN - SetMark(m, ruler, a.right, h, right, -1); InvertMark(m, f, Ports.show) - END; - i := 0; - WHILE i < a.tabs.len DO - SetMark(m, ruler, a.tabs.tab[i].stop, h, tabs, i); InvertMark(m, f, Ports.show); INC(i) - END; - px := iconGap; i := firstIcon; - WHILE i <= lastIcon DO - IF i IN validIcons THEN - SetMark(m, ruler, px, h - iconPin, i, -1); DrawMark(m, f) - END; - INC(px, iconWidth + iconGap); INC(i) - END; - HiliteThisMark(ruler, f, Mode(ruler), Ports.show) - END Restore; - - PROCEDURE (ruler: StdRuler) RestoreMarks (f: Views.Frame; l, t, r, b: INTEGER); - BEGIN - HiliteThisMark(ruler, f, ruler.sel, Ports.show) - END RestoreMarks; - - PROCEDURE (r: StdRuler) GetBackground (VAR color: Ports.Color); - BEGIN - color := Ports.background - END GetBackground; - - PROCEDURE (r: StdRuler) Neutralize; - VAR msg: NeutralizeMsg; - BEGIN - Views.Broadcast(r, msg) - END Neutralize; - - PROCEDURE (r: StdRuler) HandleModelMsg (VAR msg: Models.Message); - BEGIN - WITH msg: UpdateMsg DO - Views.Update(r, Views.keepFrames) - ELSE - END - END HandleModelMsg; - - PROCEDURE (r: StdRuler) HandleViewMsg (f: Views.Frame; VAR msg: Views.Message); - BEGIN - WITH msg: NeutralizeMsg DO - DeselectMark(r, f) - ELSE - END - END HandleViewMsg; - - PROCEDURE (r: StdRuler) HandleCtrlMsg (f: Views.Frame; - VAR msg: Controllers.Message; VAR focus: Views.View - ); - VAR requestFocus: BOOLEAN; - BEGIN - WITH msg: Controllers.TrackMsg DO - Track(r, f, msg) - | msg: Controllers.EditMsg DO - Edit(r, f, msg) - | msg: Controllers.MarkMsg DO - r.RestoreMarks(f, f.l, f.t, f.r, f.b) - | msg: Controllers.SelectMsg DO - IF ~msg.set THEN DeselectMark(r, f) END - | msg: Controllers.PollOpsMsg DO - PollOps(r, f, msg) - | msg: Properties.CollectMsg DO - PollProp(r, msg.poll) - | msg: Properties.EmitMsg DO - requestFocus := f.front; - SetProp(r, msg.set, requestFocus); - msg.requestFocus := requestFocus - ELSE - END - END HandleCtrlMsg; - - PROCEDURE (r: StdRuler) HandlePropMsg (VAR msg: Properties.Message); - VAR m: Mark; requestFocus: BOOLEAN; w, h: INTEGER; - BEGIN - WITH msg: Properties.SizePref DO - msg.w := 10000 * Ports.mm; msg.h := rulerHeight - | msg: Properties.ResizePref DO - msg.fixed := TRUE - | msg: Properties.FocusPref DO - IF msg.atLocation THEN - r.context.GetSize(w, h); - GetMark(m, r, NIL, msg.x, msg.y, FALSE); - msg.hotFocus := (m.kind # invalid) & ~(m.kind IN fieldIcons) OR (msg.y >= h - tabBarHeight); - msg.setFocus := ~msg.hotFocus - END - | msg: TextModels.Pref DO - msg.opts := {TextModels.maskChar, TextModels.hideable}; - msg.mask := TextModels.para - | msg: Properties.SetMsg DO - requestFocus := FALSE; - SetProp(r, msg, requestFocus) - | msg: Properties.PollMsg DO - PollProp(r, msg) - ELSE - END - END HandlePropMsg; - - - (* StdDirectory *) - - PROCEDURE (d: StdDirectory) NewStyle (attr: Attributes): Style; - VAR s: StdStyle; - BEGIN - IF attr = NIL THEN attr := d.attr END; - NEW(s); s.SetAttr(attr); RETURN s - END NewStyle; - - PROCEDURE (d: StdDirectory) New (style: Style): Ruler; - VAR r: StdRuler; - BEGIN - IF style = NIL THEN style := d.NewStyle(NIL) END; - NEW(r); r.InitStyle(style); r.sel := invalid; RETURN r - END New; - - - (** miscellaneous **) - - PROCEDURE GetValidRuler* (text: TextModels.Model; pos, hint: INTEGER; - VAR ruler: Ruler; VAR rpos: INTEGER - ); - (** pre: (hint < 0 OR (ruler, rpos) is first ruler before hint & 0 <= pos <= t.Length() **) - (** post: hint < rpos <= pos & rpos = Pos(ruler) & (no ruler in (rpos, pos]) - OR ((ruler, rpos) unmodified) - **) - VAR view: Views.View; - BEGIN - IF pos < text.Length() THEN INC(pos) END; (* let a ruler dominate its own position *) - IF pos < hint THEN hint := -1 END; - globRd := text.NewReader(globRd); globRd.SetPos(pos); - REPEAT - globRd.ReadPrevView(view) - UNTIL globRd.eot OR (view IS Ruler) OR (globRd.Pos() < hint); - IF (view # NIL) & (view IS Ruler) THEN - ruler := view(Ruler); rpos := globRd.Pos() - END - END GetValidRuler; - - PROCEDURE SetDir* (d: Directory); - (** pre: d # NIL, d.attr # NIL **) - (** post: dir = d **) - BEGIN - ASSERT(d # NIL, 20); ASSERT(d.attr.init, 21); dir := d - END SetDir; - - - PROCEDURE Init; - VAR d: StdDirectory; fnt: Fonts.Font; asc, dsc, w: INTEGER; - BEGIN - IF Dialog.metricSystem THEN - marginGrid := 1*mm; minTabWidth := 1*mm; tabGrid := 1*mm - ELSE - marginGrid := inch16; minTabWidth := inch16; tabGrid := inch16 - END; - - fnt := Fonts.dir.Default(); - font := Fonts.dir.This(fnt.typeface, 7*point, {}, Fonts.normal); (* font for ruler scales *) - NEW(prop); - prop.valid := {first .. tabs}; - prop.first := 0; prop.left := 0; - IF Dialog.metricSystem THEN - prop.right := 165*mm - ELSE - prop.right := 104*inch16 - END; - fnt.GetBounds(asc, dsc, w); - prop.lead := 0; prop.asc := asc; prop.dsc := dsc; prop.grid := 1; - prop.opts.val := {leftAdjust}; prop.opts.mask := options; - prop.tabs.len := 0; - - NEW(def); def.InitFromProp(prop); - NEW(d); d.attr := def; dir := d; stdDir := d - END Init; - - PROCEDURE Cleaner; - BEGIN - globRd := NIL - END Cleaner; - -BEGIN - Init; - Kernel.InstallCleaner(Cleaner) -CLOSE - Kernel.RemoveCleaner(Cleaner) -END TextRulers. diff --git a/new/Text/Mod/Setters.txt b/new/Text/Mod/Setters.txt deleted file mode 100644 index 77aab8b..0000000 --- a/new/Text/Mod/Setters.txt +++ /dev/null @@ -1,1313 +0,0 @@ -MODULE TextSetters; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Text/Mod/Setters.odc *) - (* DO NOT EDIT *) - - (* correct NextPage postcond in docu *) - (* make s.r, s.rd reducible? *) - (* paraShutoff needs to be controlled by an approx flag to certain ops (later ...?) *) - - IMPORT - Fonts, Ports, Printers, Stores, Models, Views, Properties, - TextModels, TextRulers; - - CONST - (** Pref.opts, options of setter-aware views; 0 overrides 1 **) - lineBreak* = 0; wordJoin* = 1; wordPart* = 2; flexWidth* = 3; - - tab = TextModels.tab; line = TextModels.line; para = TextModels.para; - zwspace = TextModels.zwspace; nbspace = TextModels.nbspace; - hyphen = TextModels.hyphen; nbhyphen = TextModels.nbhyphen; - digitspace = TextModels.digitspace; - softhyphen = TextModels.softhyphen; - - mm = Ports.mm; - minTabWidth = 2 * Ports.point; stdTabWidth = 4 * mm; - leftLineGap = 2 * Ports.point; rightLineGap = 3 * Ports.point; - adjustMask = {TextRulers.leftAdjust, TextRulers.rightAdjust}; - centered = {}; leftFlush = {TextRulers.leftAdjust}; rightFlush = {TextRulers.rightAdjust}; - blocked = adjustMask; - - boxCacheLen = 64; - seqCacheLen = 16; - - paraShutoff = MAX(INTEGER); (* longest stretch read backwards to find start of paragraph *) - (* unsafe: disabled *) - cachedRulers = FALSE; (* caching ruler objects trades speed against GC effectiveness *) - periodInWords = FALSE; - colonInWords = FALSE; - - minVersion = 0; maxVersion = 0; maxStdVersion = 0; - - - TYPE - Pref* = RECORD (Properties.Preference) - opts*: SET; - endW*: INTEGER; (** preset (to width of view) **) - dsc*: INTEGER (** preset (to dominating line descender) **) - END; - - - Reader* = POINTER TO ABSTRACT RECORD - r-: TextModels.Reader; (** look-ahead state **) - (** unit **) - string*: ARRAY 64 OF CHAR; (** single chars in string[0] **) - view*: Views.View; - (** unit props **) - textOpts*: SET; - mask*: CHAR; - setterOpts*: SET; - w*, endW*, h*, dsc*: INTEGER; - attr*: TextModels.Attributes; - (** reading state **) - eot*: BOOLEAN; - pos*: INTEGER; - x*: INTEGER; (** to be advanced by client! **) - adjStart*: INTEGER; - spaces*: INTEGER; - tabIndex*: INTEGER; (** tabs being processed; initially -1 **) - tabType*: SET; (** type of tab being processed; initially {} **) - (** line props **) - vw*: INTEGER; - hideMarks*: BOOLEAN; - ruler*: TextRulers.Ruler; - rpos*: INTEGER - END; - - Setter* = POINTER TO ABSTRACT RECORD (Stores.Store) - text-: TextModels.Model; (** connected iff text # NIL **) - defRuler-: TextRulers.Ruler; - vw-: INTEGER; - hideMarks-: BOOLEAN - END; - - - LineBox* = RECORD - len*: INTEGER; - ruler*: TextRulers.Ruler; - rpos*: INTEGER; - left*, right*, asc*, dsc*: INTEGER; - rbox*, bop*, adj*, eot*: BOOLEAN; (** adj => adjW > 0; adj & blocked => spaces > 0 **) - views*: BOOLEAN; - skipOff*: INTEGER; (** chars in [skipOff, len) take endW **) - adjOff*: INTEGER; (** offset of last block in box - adjust only this block **) - spaces*: INTEGER; (** valid, > 0 if adj & blocked **) - adjW*: INTEGER; (** valid if adj - to be distributed over spaces **) - tabW*: ARRAY TextRulers.maxTabs OF INTEGER (** delta width of tabs (<= 0) **) - END; - - - Directory* = POINTER TO ABSTRACT RECORD END; - - - Worder = RECORD - box: LineBox; next: INTEGER; - i: INTEGER - END; - - StdReader = POINTER TO RECORD (Reader) END; - - StdSetter = POINTER TO RECORD (Setter) - rd: Reader; (* subject to reduction? *) - r: TextModels.Reader; (* subject to reduction? *) - ruler: TextRulers.Ruler; - rpos: INTEGER; - key: INTEGER - END; - - StdDirectory = POINTER TO RECORD (Directory) END; - - - VAR - dir-, stdDir-: Directory; - - nextKey: INTEGER; - boxIndex, seqIndex: INTEGER; - boxCache: ARRAY boxCacheLen OF RECORD - key: INTEGER; (* valid iff key > 0 *) - start: INTEGER; - line: LineBox (* inv ruler = NIL *) - END; - seqCache: ARRAY seqCacheLen OF RECORD - key: INTEGER; (* valid iff key > 0 *) - start, pos: INTEGER (* sequence [start, end), end >= pos *) - END; - - - (** Reader **) - - PROCEDURE (rd: Reader) Set* ( - old: TextModels.Reader; - text: TextModels.Model; x, pos: INTEGER; - ruler: TextRulers.Ruler; rpos: INTEGER; vw: INTEGER; hideMarks: BOOLEAN - ), NEW, EXTENSIBLE; - BEGIN - ASSERT(text # NIL, 20); - ASSERT(ruler # NIL, 22); - rd.r := text.NewReader(old); rd.r.SetPos(pos); rd.r.Read; - rd.string[0] := 0X; rd.view := NIL; - rd.textOpts := {}; - rd.setterOpts := {}; rd.w := 0; rd.endW := 0; rd.h := 0; rd.dsc := 0; - rd.attr := NIL; - rd.eot := FALSE; rd.pos := pos; rd.x := x; - rd.tabIndex := -1; rd.tabType := {}; - rd.adjStart := pos; rd.spaces := 0; - rd.ruler := ruler; rd.rpos := rpos; rd.vw := vw; rd.hideMarks := hideMarks - END Set; - - PROCEDURE (rd: Reader) Read*, NEW, EXTENSIBLE; - (** pre: rd set **) - (** post: rd.pos = rd.pos' + Length(rd.string) **) - BEGIN - rd.string[0] := rd.r.char; rd.string[1] := 0X; - rd.view := rd.r.view; - rd.textOpts := {}; - rd.setterOpts := {}; - rd.w := rd.r.w; rd.endW := rd.w; rd.h := rd.r.h; rd.dsc := 0; - rd.attr := rd.r.attr; - rd.eot := rd.r.eot; - INC(rd.pos); - rd.r.Read - END Read; - - PROCEDURE (rd: Reader) AdjustWidth* (start, pos: INTEGER; IN box: LineBox; - VAR w: INTEGER - ), NEW, ABSTRACT; - - PROCEDURE (rd: Reader) SplitWidth* (w: INTEGER): INTEGER, NEW, ABSTRACT; - - - (** Setter **) - - PROCEDURE (s: Setter) CopyFrom- (source: Stores.Store), EXTENSIBLE; - BEGIN - WITH source: Setter DO - s.text := source.text; s.defRuler := source.defRuler; - s.vw := source.vw; s.hideMarks := source.hideMarks - END - END CopyFrom; - - PROCEDURE (s: Setter) Internalize- (VAR rd: Stores.Reader), EXTENSIBLE; - VAR thisVersion: INTEGER; - BEGIN - s.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxVersion, thisVersion) - END Internalize; - - PROCEDURE (s: Setter) Externalize- (VAR wr: Stores.Writer), EXTENSIBLE; - BEGIN - s.Externalize^(wr); - wr.WriteVersion(maxVersion) - END Externalize; - - PROCEDURE (s: Setter) ConnectTo* (text: TextModels.Model; - defRuler: TextRulers.Ruler; vw: INTEGER; hideMarks: BOOLEAN - ), NEW, EXTENSIBLE; - BEGIN - IF text # NIL THEN - s.text := text; s.defRuler := defRuler; s.vw := vw; s.hideMarks := hideMarks - ELSE - s.text := NIL; s.defRuler := NIL - END - END ConnectTo; - - - PROCEDURE (s: Setter) ThisPage* (pageH: INTEGER; pageNo: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, 0 <= pageNo **) - (** post: (result = -1) & (pageNo >= maxPageNo) OR (result = pageStart(pageNo)) **) - - PROCEDURE (s: Setter) NextPage* (pageH: INTEGER; start: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, ThisPage(pageH, pageNo) = start [with pageNo = NumberOfPageAt(start)] **) - (** post: (result = start) & last-page(start) OR result = next-pageStart(start) **) - - - PROCEDURE (s: Setter) ThisSequence* (pos: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, 0 <= pos <= s.text.Length() **) - (** post: (result = 0) OR (char(result - 1) IN {line, para}) **) - - PROCEDURE (s: Setter) NextSequence* (start: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, ThisSequence(start) = start **) - (** post: (result = start) & last-line(start) OR (ThisSequence(t, result - 1) = start) **) - - PROCEDURE (s: Setter) PreviousSequence* (start: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, ThisSequence(t, start) = start **) - (** post: (result = 0) & (start = 0) OR (result = ThisSequence(t, start - 1)) **) - - - PROCEDURE (s: Setter) ThisLine* (pos: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, 0 <= pos <= s.text.Length() **) - (** post: result <= pos, (pos < NextLine(result)) OR last-line(result) **) - - PROCEDURE (s: Setter) NextLine* (start: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, ThisLine(start) = start **) - (** post: (result = 0) & (start = 0) OR - (result = start) & last-line(start) OR - (ThisLine(result - 1) = start) **) - - PROCEDURE (s: Setter) PreviousLine* (start: INTEGER): INTEGER, NEW, ABSTRACT; - (** pre: connected, ThisLine(start) = start **) - (** post: (result = 0) & (start = 0) OR (result = ThisLine(start - 1)) **) - - - PROCEDURE (s: Setter) GetWord* (pos: INTEGER; OUT beg, end: INTEGER), NEW, ABSTRACT; - (** pre: connected, 0 <= pos <= s.text.Length() **) - (** post: c set, beg <= pos <= end **) - - PROCEDURE (s: Setter) GetLine* (start: INTEGER; OUT box: LineBox), NEW, ABSTRACT; - (** pre: connected, ThisLine(start) = start, 0 <= start <= s.text.Length() **) - (** post: (c, box) set (=> box.ruler # NIL), (box.len > 0) OR box.eot, - 0 <= box.left <= box.right <= ruler.right **) - - PROCEDURE (s: Setter) GetBox* (start, end, maxW, maxH: INTEGER; - OUT w, h: INTEGER - ), NEW, ABSTRACT; - (** pre: connected, ThisLine(start) = start, 0 <= start <= end <= s.text.Length() **) - (** post: c set, maxW > undefined => w <= maxW, maxH > undefined => h <= maxH **) - - - PROCEDURE (s: Setter) NewReader* (old: Reader): Reader, NEW, ABSTRACT; - (** pre: connected **) - - - PROCEDURE (s: Setter) GridOffset* (dsc: INTEGER; IN box: LineBox): INTEGER, NEW, ABSTRACT; - (** pre: connected, dsc >= 0: dsc is descender of previous line; dsc = -1 for first line **) - (** post: dsc + GridOffset(dsc, box) + box.asc = k*ruler.grid (k >= 0) >= ruler.asc + ruler.grid **) - - - (** Directory **) - - PROCEDURE (d: Directory) New* (): Setter, NEW, ABSTRACT; - - - (* line box cache *) - - PROCEDURE InitCache; - VAR i: INTEGER; - BEGIN - nextKey := 1; boxIndex := 0; seqIndex := 0; - i := 0; WHILE i < boxCacheLen DO boxCache[i].key := -1; INC(i) END; - i := 0; WHILE i < seqCacheLen DO seqCache[i].key := -1; INC(i) END - END InitCache; - - PROCEDURE ClearCache (key: INTEGER); - VAR i, j: INTEGER; - BEGIN - i := 0; j := boxIndex; - WHILE i < boxCacheLen DO - IF boxCache[i].key = key THEN boxCache[i].key := -1; j := i END; - INC(i) - END; - boxIndex := j; - i := 0; j := seqIndex; - WHILE i < seqCacheLen DO - IF seqCache[i].key = key THEN seqCache[i].key := -1; j := i END; - INC(i) - END; - seqIndex := j - END ClearCache; - - - PROCEDURE CacheIndex (key, start: INTEGER): INTEGER; - VAR i: INTEGER; - BEGIN -RETURN -1; - i := 0; - WHILE (i < boxCacheLen) & ~((boxCache[i].key = key) & (boxCache[i].start = start)) DO - INC(i) - END; - IF i = boxCacheLen THEN i := -1 END; - RETURN i - END CacheIndex; - - PROCEDURE GetFromCache (s: StdSetter; i: INTEGER; VAR l: LineBox); - BEGIN - l := boxCache[i].line; - IF ~cachedRulers THEN - IF l.rpos >= 0 THEN - s.r := s.text.NewReader(s.r); s.r.SetPos(l.rpos); s.r.Read; - l.ruler := s.r.view(TextRulers.Ruler) - ELSE l.ruler := s.defRuler - END - END - END GetFromCache; - - PROCEDURE AddToCache (key, start: INTEGER; VAR l: LineBox); - VAR i: INTEGER; - BEGIN - i := boxIndex; boxIndex := (i + 1) MOD boxCacheLen; - boxCache[i].key := key; boxCache[i].start := start; boxCache[i].line := l; - IF ~cachedRulers THEN - boxCache[i].line.ruler := NIL - END - END AddToCache; - - - PROCEDURE CachedSeqStart (key, pos: INTEGER): INTEGER; - VAR start: INTEGER; i: INTEGER; - BEGIN - i := 0; - WHILE (i < seqCacheLen) - & ~((seqCache[i].key = key) & (seqCache[i].start <= pos) & (pos <= seqCache[i].pos)) DO - INC(i) - END; - IF i < seqCacheLen THEN start := seqCache[i].start ELSE start := -1 END; - RETURN start - END CachedSeqStart; - - PROCEDURE AddSeqStartToCache (key, pos, start: INTEGER); - VAR i: INTEGER; - BEGIN - i := 0; - WHILE (i < seqCacheLen) & ~((seqCache[i].key = key) & (seqCache[i].start = start)) DO - INC(i) - END; - IF i < seqCacheLen THEN - IF seqCache[i].pos < pos THEN seqCache[i].pos := pos END - ELSE - i := seqIndex; seqIndex := (i + 1) MOD seqCacheLen; - seqCache[i].key := key; seqCache[i].pos := pos; seqCache[i].start := start - END - END AddSeqStartToCache; - - - (* StdReader *) - -(* - PROCEDURE WordPart (ch, ch1: CHAR): BOOLEAN; - (* needs more work ... put elsewhere? *) - BEGIN - CASE ORD(ch) OF - ORD("0") .. ORD("9"), ORD("A") .. ORD("Z"), ORD("a") .. ORD("z"), - ORD(digitspace), ORD(nbspace), ORD(nbhyphen), ORD("_"), - 0C0H .. 0C6H, 0E0H .. 0E6H, (* ~ A *) - 0C7H, 0E7H, (* ~ C *) - 0C8H .. 0CBH, 0E8H .. 0EBH, (* ~ E *) - 0CCH .. 0CFH, 0ECH .. 0EFH, (* ~ I *) - 0D1H, 0F1H, (* ~ N *) - 0D2H .. 0D6H, 0D8H, 0F2H .. 0F6H, 0F8H, (* ~ O *) - 0D9H .. 0DCH, 0F9H .. 0FCH, (* ~ U *) - 0DDH, 0FDH, 0FFH, (* ~ Y *) - 0DFH: (* ~ ss *) - RETURN TRUE - | ORD("."), ORD(":"): - IF (ch = ".") & periodInWords OR (ch = ":") & colonInWords THEN - CASE ch1 OF - 0X, TextModels.viewcode, tab, line, para, " ": - RETURN FALSE - ELSE RETURN TRUE - END - ELSE RETURN FALSE - END - ELSE RETURN FALSE - END - END WordPart; -*) - - PROCEDURE WordPart (ch, ch1: CHAR): BOOLEAN; - (* Same as .net function System.Char.IsLetterOrDigit(ch) - + digit space, nonbreaking space, nonbreaking hyphen, & underscore - ch1 unused *) - VAR low: INTEGER; - BEGIN - low := ORD(ch) MOD 256; - CASE ORD(ch) DIV 256 OF - | 001H, 015H, 034H..04CH, 04EH..09EH, 0A0H..0A3H, 0ACH..0D6H, 0F9H, 0FCH: RETURN TRUE - | 000H: CASE low OF - | 030H..039H, 041H..05AH, 061H..07AH, 0AAH, 0B5H, 0BAH, 0C0H..0D6H, 0D8H..0F6H, 0F8H..0FFH, - ORD(digitspace), ORD(nbspace), ORD(nbhyphen), ORD("_"): RETURN TRUE - ELSE - END - | 002H: CASE low OF - | 000H..041H, 050H..0C1H, 0C6H..0D1H, 0E0H..0E4H, 0EEH: RETURN TRUE - ELSE - END - | 003H: CASE low OF - | 07AH, 086H, 088H..08AH, 08CH, 08EH..0A1H, 0A3H..0CEH, 0D0H..0F5H, 0F7H..0FFH: RETURN TRUE - ELSE - END - | 004H: CASE low OF - | 000H..081H, 08AH..0CEH, 0D0H..0F9H: RETURN TRUE - ELSE - END - | 005H: CASE low OF - | 000H..00FH, 031H..056H, 059H, 061H..087H, 0D0H..0EAH, 0F0H..0F2H: RETURN TRUE - ELSE - END - | 006H: CASE low OF - | 021H..03AH, 040H..04AH, 060H..069H, 06EH..06FH, 071H..0D3H, 0D5H, 0E5H..0E6H, 0EEH..0FCH, 0FFH: RETURN TRUE - ELSE - END - | 007H: CASE low OF - | 010H, 012H..02FH, 04DH..06DH, 080H..0A5H, 0B1H: RETURN TRUE - ELSE - END - | 009H: CASE low OF - | 004H..039H, 03DH, 050H, 058H..061H, 066H..06FH, 07DH, 085H..08CH, 08FH..090H, 093H..0A8H, 0AAH..0B0H, 0B2H, 0B6H..0B9H, 0BDH, 0CEH, 0DCH..0DDH, 0DFH..0E1H, 0E6H..0F1H: RETURN TRUE - ELSE - END - | 00AH: CASE low OF - | 005H..00AH, 00FH..010H, 013H..028H, 02AH..030H, 032H..033H, 035H..036H, 038H..039H, 059H..05CH, 05EH, 066H..06FH, 072H..074H, 085H..08DH, 08FH..091H, 093H..0A8H, 0AAH..0B0H, 0B2H..0B3H, 0B5H..0B9H, 0BDH, 0D0H, 0E0H..0E1H, 0E6H..0EFH: RETURN TRUE - ELSE - END - | 00BH: CASE low OF - | 005H..00CH, 00FH..010H, 013H..028H, 02AH..030H, 032H..033H, 035H..039H, 03DH, 05CH..05DH, 05FH..061H, 066H..06FH, 071H, 083H, 085H..08AH, 08EH..090H, 092H..095H, 099H..09AH, 09CH, 09EH..09FH, 0A3H..0A4H, 0A8H..0AAH, 0AEH..0B9H, 0E6H..0EFH: RETURN TRUE - ELSE - END - | 00CH: CASE low OF - | 005H..00CH, 00EH..010H, 012H..028H, 02AH..033H, 035H..039H, 060H..061H, 066H..06FH, 085H..08CH, 08EH..090H, 092H..0A8H, 0AAH..0B3H, 0B5H..0B9H, 0BDH, 0DEH, 0E0H..0E1H, 0E6H..0EFH: RETURN TRUE - ELSE - END - | 00DH: CASE low OF - | 005H..00CH, 00EH..010H, 012H..028H, 02AH..039H, 060H..061H, 066H..06FH, 085H..096H, 09AH..0B1H, 0B3H..0BBH, 0BDH, 0C0H..0C6H: RETURN TRUE - ELSE - END - | 00EH: CASE low OF - | 001H..030H, 032H..033H, 040H..046H, 050H..059H, 081H..082H, 084H, 087H..088H, 08AH, 08DH, 094H..097H, 099H..09FH, 0A1H..0A3H, 0A5H, 0A7H, 0AAH..0ABH, 0ADH..0B0H, 0B2H..0B3H, 0BDH, 0C0H..0C4H, 0C6H, 0D0H..0D9H, 0DCH..0DDH: RETURN TRUE - ELSE - END - | 00FH: CASE low OF - | 000H, 020H..029H, 040H..047H, 049H..06AH, 088H..08BH: RETURN TRUE - ELSE - END - | 010H: CASE low OF - | 000H..021H, 023H..027H, 029H..02AH, 040H..049H, 050H..055H, 0A0H..0C5H, 0D0H..0FAH, 0FCH: RETURN TRUE - ELSE - END - | 011H: CASE low OF - | 000H..059H, 05FH..0A2H, 0A8H..0F9H: RETURN TRUE - ELSE - END - | 012H: CASE low OF - | 000H..048H, 04AH..04DH, 050H..056H, 058H, 05AH..05DH, 060H..088H, 08AH..08DH, 090H..0B0H, 0B2H..0B5H, 0B8H..0BEH, 0C0H, 0C2H..0C5H, 0C8H..0D6H, 0D8H..0FFH: RETURN TRUE - ELSE - END - | 013H: CASE low OF - | 000H..010H, 012H..015H, 018H..05AH, 080H..08FH, 0A0H..0F4H: RETURN TRUE - ELSE - END - | 014H: IF low >= 001H THEN RETURN TRUE END - | 016H: CASE low OF - | 000H..06CH, 06FH..076H, 081H..09AH, 0A0H..0EAH: RETURN TRUE - ELSE - END - | 017H: CASE low OF - | 000H..00CH, 00EH..011H, 020H..031H, 040H..051H, 060H..06CH, 06EH..070H, 080H..0B3H, 0D7H, 0DCH, 0E0H..0E9H: RETURN TRUE - ELSE - END - | 018H: CASE low OF - | 010H..019H, 020H..077H, 080H..0A8H: RETURN TRUE - ELSE - END - | 019H: CASE low OF - | 000H..01CH, 046H..06DH, 070H..074H, 080H..0A9H, 0C1H..0C7H, 0D0H..0D9H: RETURN TRUE - ELSE - END - | 01AH: IF low < 017H THEN RETURN TRUE END - | 01DH: IF low < 0C0H THEN RETURN TRUE END - | 01EH: CASE low OF - | 000H..09BH, 0A0H..0F9H: RETURN TRUE - ELSE - END - | 01FH: CASE low OF - | 000H..015H, 018H..01DH, 020H..045H, 048H..04DH, 050H..057H, 059H, 05BH, 05DH, 05FH..07DH, 080H..0B4H, 0B6H..0BCH, 0BEH, 0C2H..0C4H, 0C6H..0CCH, 0D0H..0D3H, 0D6H..0DBH, 0E0H..0ECH, 0F2H..0F4H, 0F6H..0FCH: RETURN TRUE - ELSE - END - | 020H: CASE low OF - | 071H, 07FH, 090H..094H: RETURN TRUE - ELSE - END - | 021H: CASE low OF - | 002H, 007H, 00AH..013H, 015H, 019H..01DH, 024H, 026H, 028H, 02AH..02DH, 02FH..031H, 033H..039H, 03CH..03FH, 045H..049H: RETURN TRUE - ELSE - END - | 02CH: CASE low OF - | 000H..02EH, 030H..05EH, 080H..0E4H: RETURN TRUE - ELSE - END - | 02DH: CASE low OF - | 000H..025H, 030H..065H, 06FH, 080H..096H, 0A0H..0A6H, 0A8H..0AEH, 0B0H..0B6H, 0B8H..0BEH, 0C0H..0C6H, 0C8H..0CEH, 0D0H..0D6H, 0D8H..0DEH: RETURN TRUE - ELSE - END - | 030H: CASE low OF - | 005H..006H, 031H..035H, 03BH..03CH, 041H..096H, 09DH..09FH, 0A1H..0FAH, 0FCH..0FFH: RETURN TRUE - ELSE - END - | 031H: CASE low OF - | 005H..02CH, 031H..08EH, 0A0H..0B7H, 0F0H..0FFH: RETURN TRUE - ELSE - END - | 04DH: IF low < 0B6H THEN RETURN TRUE END - | 09FH: IF low < 0BCH THEN RETURN TRUE END - | 0A4H: IF low < 08DH THEN RETURN TRUE END - | 0A8H: CASE low OF - | 000H..001H, 003H..005H, 007H..00AH, 00CH..022H: RETURN TRUE - ELSE - END - | 0D7H: IF low < 0A4H THEN RETURN TRUE END - | 0FAH: CASE low OF - | 000H..02DH, 030H..06AH, 070H..0D9H: RETURN TRUE - ELSE - END - | 0FBH: CASE low OF - | 000H..006H, 013H..017H, 01DH, 01FH..028H, 02AH..036H, 038H..03CH, 03EH, 040H..041H, 043H..044H, 046H..0B1H, 0D3H..0FFH: RETURN TRUE - ELSE - END - | 0FDH: CASE low OF - | 000H..03DH, 050H..08FH, 092H..0C7H, 0F0H..0FBH: RETURN TRUE - ELSE - END - | 0FEH: CASE low OF - | 070H..074H, 076H..0FCH: RETURN TRUE - ELSE - END - | 0FFH: CASE low OF - | 010H..019H, 021H..03AH, 041H..05AH, 066H..0BEH, 0C2H..0C7H, 0CAH..0CFH, 0D2H..0D7H, 0DAH..0DCH: RETURN TRUE - ELSE - END - ELSE - END; - RETURN FALSE - END WordPart; - -(* - PROCEDURE ExtendToEOL (x, right: INTEGER): INTEGER; - BEGIN - IF right - x > 5 * mm THEN RETURN right - x ELSE RETURN 5 * mm END - END ExtendToEOL; -*) - - PROCEDURE Right (ra: TextRulers.Attributes; vw: INTEGER): INTEGER; - BEGIN - IF TextRulers.rightFixed IN ra.opts THEN - RETURN ra.right - ELSE - RETURN vw - END - END Right; - - PROCEDURE GetViewPref (rd: StdReader); - CONST maxH = 1600 * Ports.point; - VAR ra: TextRulers.Attributes; tp: TextModels.Pref; sp: Pref; - BEGIN - ra := rd.ruler.style.attr; - tp.opts := {}; Views.HandlePropMsg(rd.view, tp); - rd.textOpts := tp.opts; rd.mask := tp.mask; - sp.opts := {}; sp.dsc := ra.dsc; sp.endW := rd.w; Views.HandlePropMsg(rd.view, sp); - rd.setterOpts := sp.opts; rd.dsc := sp.dsc; rd.endW := sp.endW; - IF rd.w >= 10000 * mm THEN rd.w := 10000 * mm END; - IF (TextModels.hideable IN tp.opts) & rd.hideMarks THEN - rd.h := 0; sp.dsc := 0; -(* -rd.w := 0; -*) - IF ~( (rd.view IS TextRulers.Ruler) - OR (TextModels.maskChar IN rd.textOpts) & (rd.mask = para) ) THEN - rd.w := 0 - END -(**) - ELSIF rd.h > maxH THEN rd.h := maxH - END; - IF TextModels.maskChar IN rd.textOpts THEN - rd.string[0] := rd.mask; rd.string[1] := 0X - ELSE rd.string[0] := TextModels.viewcode - END - END GetViewPref; - - PROCEDURE GatherString (rd: StdReader); - VAR i, len: INTEGER; ch: CHAR; - BEGIN - i := 1; len := LEN(rd.string) - 1; ch := rd.r.char; - WHILE (i < len) - & (rd.r.view = NIL) & (rd.r.attr = rd.attr) - & ( (" " < ch) & (ch <= "~") & (ch # "-") - OR (ch = digitspace) - OR (ch >= nbspace) & (ch < 100X) & (ch # softhyphen) - ) - DO (* rd.r.char > " " => ~rd.eot *) - rd.string[i] := ch; INC(i); - rd.eot := rd.r.eot; - rd.r.Read; ch := rd.r.char; INC(rd.pos) - END; - rd.string[i] := 0X; rd.setterOpts := {wordJoin}; - IF i = 1 THEN - IF WordPart(rd.string[0], 0X) THEN INCL(rd.setterOpts, wordPart) END - END; - rd.w := rd.attr.font.StringWidth(rd.string); rd.endW := rd.w - END GatherString; - - PROCEDURE SpecialChar (rd: StdReader); - VAR ra: TextRulers.Attributes; i, tabs, spaceW, dW: INTEGER; type: SET; - BEGIN - ra := rd.ruler.style.attr; - CASE ORD(rd.string[0]) OF - ORD(tab): - rd.textOpts := {TextModels.hideable}; - rd.endW := minTabWidth; - rd.adjStart := rd.pos; rd.spaces := 0; - (* - i := 0; WHILE (i < ra.tabs.len) & (ra.tabs.tab[i].stop < rd.x + minTabWidth) DO INC(i) END; - *) - i := rd.tabIndex + 1; - IF i < ra.tabs.len THEN - type := ra.tabs.tab[i].type; - rd.w := MAX(minTabWidth, ra.tabs.tab[i].stop - rd.x); - IF TextRulers.barTab IN type THEN - IF TextRulers.rightTab IN type THEN - rd.w := MAX(minTabWidth, rd.w - leftLineGap) - ELSIF ~(TextRulers.centerTab IN type) THEN - INC(rd.w, rightLineGap) - END - END; - rd.tabIndex := i; rd.tabType := type - ELSE (* for "reasonable" fonts: round to closest multiple of spaces of this font *) - spaceW := rd.attr.font.SStringWidth(" "); - IF (1 <= spaceW) & (spaceW <= stdTabWidth) THEN - rd.w := (stdTabWidth + spaceW DIV 2) DIV spaceW * spaceW - ELSE - rd.w := stdTabWidth - END; - rd.tabIndex := TextRulers.maxTabs; rd.tabType := {} - END - | ORD(line): - rd.setterOpts := {lineBreak}; rd.w := 0; rd.endW := 0 - | ORD(para): -(* - IF rd.hideMarks THEN - rd.w := 0; rd.h := 0; rd.dsc := 0 - ELSE - rd.w := ExtendToEOL(rd.x, Right(ra, rd.vw)) + 1 - END; - INC(rd.h, ra.lead); - rd.textOpts := {TextModels.hideable}; - rd.endW := rd.w -*) -(* - rd.setterOpts := {lineBreak}; -*) - IF rd.hideMarks THEN rd.h := 0; rd.dsc := 0 END; - INC(rd.h, ra.lead); rd.textOpts := {TextModels.hideable}; - IF (rd.view = NIL) OR ~(rd.view IS TextRulers.Ruler) THEN - rd.w := 10000 * Ports.mm (* ExtendToEOL(rd.x, Right(ra, rd.vw)) + 1 *) - END; - rd.endW := rd.w -(**) - | ORD(" "): - rd.setterOpts := {flexWidth}; - rd.w := rd.attr.font.StringWidth(rd.string); rd.endW := 0; INC(rd.spaces) - | ORD(zwspace): - rd.w := 0; rd.endW := 0 - | ORD(digitspace): - rd.setterOpts := {wordPart}; - rd.w := rd.attr.font.StringWidth("0"); rd.endW := rd.w - | ORD("-"): - rd.setterOpts := {}; - rd.w := rd.attr.font.StringWidth("-"); rd.endW := rd.w - | ORD(hyphen): - rd.setterOpts := {}; - rd.string[0] := "-" (*softhyphen*); - rd.w := rd.attr.font.StringWidth("-" (*softhyphen*)); rd.endW := rd.w - | ORD(nbhyphen): - rd.setterOpts := {wordJoin, wordPart}; - rd.string[0] := "-" (*softhyphen*); - rd.w := rd.attr.font.StringWidth("-" (*softhyphen*)); rd.endW := rd.w - | ORD(softhyphen): - rd.setterOpts := {wordPart}; rd.textOpts := {TextModels.hideable}; - rd.string[0] := "-"; - rd.endW := rd.attr.font.StringWidth("-" (*softhyphen*)); - IF rd.hideMarks THEN rd.w := 0 ELSE rd.w := rd.endW END - ELSE - rd.setterOpts := {wordJoin}; - IF WordPart(rd.string[0], rd.r.char) THEN INCL(rd.setterOpts, wordPart) END; - rd.w := rd.attr.font.StringWidth(rd.string); rd.endW := rd.w - END - END SpecialChar; -(* - PROCEDURE LongChar (rd: StdReader); - VAR ra: TextRulers.Attributes; - BEGIN - ra := rd.ruler.style.attr; - rd.setterOpts := {wordJoin, wordPart}; - rd.w := rd.attr.font.StringWidth(rd.string); rd.endW := rd.w - END LongChar; -*) - - PROCEDURE (rd: StdReader) Read; - (* pre: connected *) - VAR ra: TextRulers.Attributes; asc, dsc, w: INTEGER; ch: CHAR; - BEGIN - rd.Read^; - IF ~rd.eot THEN - IF rd.view = NIL THEN - rd.attr.font.GetBounds(asc, dsc, w); - rd.h := asc + dsc; rd.dsc := dsc - ELSE - GetViewPref(rd) - END; - IF (rd.view = NIL) OR (TextModels.maskChar IN rd.textOpts) THEN - ch := rd.string[0]; - IF (rd.view = NIL) - & ( (" " < ch) & (ch < "~") & (ch # "-") - OR (ch = digitspace) - OR (ch >= nbspace) & (ch # softhyphen) - ) - THEN - GatherString(rd) - ELSE - SpecialChar(rd) - END - END - ELSE - ra := rd.ruler.style.attr; - rd.w := 0; rd.endW := 0; rd.h := ra.asc + ra.dsc; rd.dsc := ra.dsc - END - END Read; - - PROCEDURE (rd: StdReader) AdjustWidth (start, pos: INTEGER; IN box: LineBox; VAR w: INTEGER); - VAR i: INTEGER; form: SET; - BEGIN - IF box.adj & (pos >= start + box.adjOff) THEN - form := box.ruler.style.attr.opts * adjustMask; - IF (form = blocked) & (rd.string[0] = " ") THEN - INC(w, box.adjW DIV box.spaces) - ELSIF (form # blocked) & (rd.string[0] = tab) THEN - INC(w, box.adjW) (* is this correct ??? *) - END - END; - i := rd.tabIndex; (* rd.string[0] = tab => i >= 0 *) - IF (rd.string[0] = tab) & (i < box.ruler.style.attr.tabs.len) THEN - w := box.tabW[i] - END - END AdjustWidth; - - PROCEDURE (rd: StdReader) SplitWidth (w: INTEGER): INTEGER; - BEGIN - IF (rd.string[1] = 0X) & (rd.view = NIL) THEN - RETURN (w + 1) DIV 2 - ELSE RETURN w - END - END SplitWidth; - - - (* Worder *) - - PROCEDURE SetWorder (VAR w: Worder; s: StdSetter; pos: INTEGER; OUT start: INTEGER); - CONST wordCutoff = LEN(s.rd.string); - BEGIN - start := s.ThisSequence(pos); - IF pos - start >= wordCutoff THEN - start := pos; WHILE pos - start < wordCutoff DO start := s.PreviousLine(start) END - END; - s.GetLine(start, w.box); w.next := start + w.box.len; - s.rd.Set(s.r, s.text, w.box.left, start, w.box.ruler, w.box.rpos, s.vw, s.hideMarks); - w.i := 0; s.rd.string[0] := 0X - END SetWorder; - - PROCEDURE StepWorder (VAR w: Worder; s: StdSetter; VAR part: BOOLEAN); - VAR rd: Reader; - BEGIN - rd := s.rd; - IF rd.string[w.i] = 0X THEN - IF rd.pos < w.next THEN - rd.Read; w.i := 0 - ELSE - IF ~w.box.eot THEN - s.GetLine(w.next, w.box); - s.rd.Set(s.r, s.text, w.box.left, w.next, w.box.ruler, w.box.rpos, s.vw, s.hideMarks); - rd.Read; w.i := 0; - INC(w.next, w.box.len) - ELSE - rd.string[0] := 0X - END - END - END; - IF rd.string[0] = 0X THEN (* end of text *) - part := TRUE - ELSIF rd.string[1] = 0X THEN (* special character *) - part := wordPart IN rd.setterOpts; INC(w.i) - ELSE (* gathered sString *) - part := WordPart(rd.string[w.i], rd.string[w.i + 1]); INC(w.i) - END - END StepWorder; - - - (* StdSetter *) - - PROCEDURE (s: StdSetter) CopyFrom (source: Stores.Store); - BEGIN - s.CopyFrom^(source); - WITH source: StdSetter DO - s.ruler := source.ruler; s.rpos := source.rpos; s.key := source.key; - s.rd := NIL; s.r := NIL - END - END CopyFrom; - - PROCEDURE (s: StdSetter) Externalize (VAR wr: Stores.Writer); - BEGIN - s.Externalize^(wr); - wr.WriteVersion(maxStdVersion) - END Externalize; - - PROCEDURE (s: StdSetter) Internalize (VAR rd: Stores.Reader); - VAR thisVersion: INTEGER; - BEGIN - s.Internalize^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStdVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - s.text := NIL; s.defRuler := NIL; s.ruler := NIL; s.rd := NIL; s.r := NIL - END Internalize; - - - PROCEDURE (s: StdSetter) ConnectTo (text: TextModels.Model; - defRuler: TextRulers.Ruler; vw: INTEGER; hideMarks: BOOLEAN - ); - BEGIN - s.ConnectTo^(text, defRuler, vw, hideMarks); - ClearCache(s.key); - IF text # NIL THEN - s.ruler := defRuler; s.rpos := -1; s.key := nextKey; INC(nextKey) - ELSE - s.ruler := NIL - END - END ConnectTo; - - - PROCEDURE (s: StdSetter) ThisPage (pageH: INTEGER; pageNo: INTEGER): INTEGER; - (* pre: connected, 0 <= pageNo *) - (* post: (result = -1) & (pageNo >= maxPageNo) OR (result = pageStart(pageNo)) *) - VAR start, prev: INTEGER; - BEGIN - ASSERT(s.text # NIL, 20); ASSERT(pageNo >= 0, 21); - start := 0; - WHILE pageNo > 0 DO - prev := start; DEC(pageNo); start := s.NextPage(pageH, start); - IF start = prev THEN start := -1; pageNo := 0 END - END; - RETURN start - END ThisPage; - - PROCEDURE (s: StdSetter) NextPage (pageH: INTEGER; start: INTEGER): INTEGER; - (* pre: connected, ThisPage(pageH, x) = start *) - (* post: (result = s.text.Length()) OR result = next-pageStart(start) *) - CONST - noBreakInside = TextRulers.noBreakInside; - pageBreak = TextRulers.pageBreak; - parJoin = TextRulers.parJoin; - regular = 0; protectInside = 1; joinFirst = 2; joinNext = 3; confirmSpace = 4; (* state *) - VAR - box: LineBox; ra: TextRulers.Attributes; - h, asc, dsc, backup, pos, state: INTEGER; isRuler: BOOLEAN; - - PROCEDURE FetchNextLine; - BEGIN - s.GetLine(pos, box); - IF box.len > 0 THEN - ra := box.ruler.style.attr; isRuler := box.rpos = pos; - asc := box.asc + s.GridOffset(dsc, box); dsc := box.dsc; h := asc + dsc - END - END FetchNextLine; - - PROCEDURE HandleRuler; - CONST norm = 0; nbi = 1; pj = 2; - VAR strength: INTEGER; - BEGIN - IF isRuler & (pos > start) & ~(pageBreak IN ra.opts) THEN - IF parJoin IN ra.opts THEN strength := pj - ELSIF noBreakInside IN ra.opts THEN strength := nbi - ELSE strength := norm - END; - CASE state OF - | regular: - CASE strength OF - | norm: - | nbi: state := protectInside; backup := pos - | pj: state := joinFirst; backup := pos - END - | protectInside: - CASE strength OF - | norm: state := regular - | nbi: backup := pos - | pj: state := joinFirst; backup := pos - END - | joinFirst: - CASE strength OF - | norm: state := confirmSpace - | nbi: state := protectInside - | pj: state := joinNext - END - | joinNext: - CASE strength OF - | norm: state := confirmSpace - | nbi: state := protectInside - | pj: - END - | confirmSpace: - CASE strength OF - | norm: state := regular - | nbi: state := protectInside; backup := pos - | pj: state := joinFirst; backup := pos - END - END - END - END HandleRuler; - - PROCEDURE IsEmptyLine (): BOOLEAN; - BEGIN - RETURN (box.right = box.left) OR s.hideMarks & isRuler & ~(pageBreak IN ra.opts) - END IsEmptyLine; - - BEGIN - ASSERT(s.text # NIL, 20); - ASSERT(0 <= start, 21); ASSERT(start <= s.text.Length(), 22); - pos := start; dsc := -1; - FetchNextLine; - IF box.len > 0 THEN - state := regular; - REPEAT (* at least one line per page *) - HandleRuler; DEC(pageH, h); INC(pos, box.len); - IF (state = confirmSpace) & ~IsEmptyLine() THEN state := regular END; - FetchNextLine - UNTIL (box.len = 0) OR (pageH - h < 0) OR isRuler & (pageBreak IN ra.opts); - IF ~isRuler OR ~(pageBreak IN ra.opts) THEN - WHILE (box.len > 0) & IsEmptyLine() DO (* skip empty lines at top of page *) - HandleRuler; INC(pos, box.len); FetchNextLine - END - END; - HandleRuler; - IF (state # regular) & ~(isRuler & (pageBreak IN ra.opts) OR (box.len = 0)) THEN pos := backup END - END; - RETURN pos - END NextPage; - - - PROCEDURE (s: StdSetter) NextSequence (start: INTEGER): INTEGER; - (* pre: connected, ThisSequence(start) = start *) - (* post: (result = start) & last-line(start) OR (ThisSequence(t, result - 1) = start) *) - VAR rd: TextModels.Reader; ch: CHAR; - BEGIN - ASSERT(s.text # NIL, 20); - s.r := s.text.NewReader(s.r); rd := s.r; rd.SetPos(start); - REPEAT rd.ReadChar(ch) UNTIL rd.eot OR (ch = line) OR (ch = para); - IF rd.eot THEN RETURN start ELSE RETURN rd.Pos() END - END NextSequence; - - PROCEDURE (s: StdSetter) ThisSequence (pos: INTEGER): INTEGER; - (* pre: connected, 0 <= pos <= t.Length() *) - (* post: (result = 0) OR (char(result - 1) IN {line, para}) *) - VAR rd: TextModels.Reader; start, limit: INTEGER; ch: CHAR; - BEGIN - ASSERT(s.text # NIL, 20); ASSERT(0 <= pos, 21); ASSERT(pos <= s.text.Length(), 22); - IF pos = 0 THEN - RETURN 0 - ELSE - start := CachedSeqStart(s.key, pos); - IF start < 0 THEN - s.r := s.text.NewReader(s.r); rd := s.r; rd.SetPos(pos); - limit := paraShutoff; - REPEAT rd.ReadPrevChar(ch); DEC(limit) - UNTIL rd.eot OR (ch = line) OR (ch = para) OR (limit = 0); - IF rd.eot THEN start := 0 ELSE start := rd.Pos() + 1 END; - AddSeqStartToCache(s.key, pos, start) - END; - RETURN start - END - END ThisSequence; - - PROCEDURE (s: StdSetter) PreviousSequence (start: INTEGER): INTEGER; - (* pre: connected, ThisSequence(t, start) = start *) - (* post: (result = 0) & (start = 0) OR (result = ThisSequence(t, start - 1)) *) - BEGIN - IF start <= 1 THEN RETURN 0 ELSE RETURN s.ThisSequence(start - 1) END - END PreviousSequence; - - - PROCEDURE (s: StdSetter) ThisLine (pos: INTEGER): INTEGER; - (* pre: connected *) - VAR start, next: INTEGER; - BEGIN - next := s.ThisSequence(pos); - REPEAT start := next; next := s.NextLine(start) UNTIL (next > pos) OR (next = start); - RETURN start - END ThisLine; - - PROCEDURE (s: StdSetter) NextLine (start: INTEGER): INTEGER; - (* pre: connected, ThisLine(start) = start *) - (* post: (result = 0) & (start = 0) OR - (result = start) & last-line(start) OR - (ThisLine(result - 1) = start) *) - VAR box: LineBox; len: INTEGER; i: INTEGER; eot: BOOLEAN; - BEGIN - i := CacheIndex(s.key, start); - IF i >= 0 THEN - len := boxCache[i].line.len; eot := boxCache[i].line.eot - ELSE - s.GetLine(start, box); len := box.len; eot := box.eot - END; - IF ~eot THEN RETURN start + len ELSE RETURN start END - END NextLine; - - PROCEDURE (s: StdSetter) PreviousLine (start: INTEGER): INTEGER; - (* pre: connected, ThisLine(start) = start *) - (* post: (result = 0) & (start = 0) OR (result = ThisLine(start - 1)) *) - BEGIN - IF start <= 1 THEN start := 0 ELSE start := s.ThisLine(start - 1) END; - RETURN start - END PreviousLine; - - - PROCEDURE (s: StdSetter) GetWord (pos: INTEGER; OUT beg, end: INTEGER); - (* pre: connected, 0 <= pos <= s.text.Length() *) - (* post: beg <= pos <= end *) - CONST wordCutoff = LEN(s.rd.string); - VAR w: Worder; part: BOOLEAN; - BEGIN - ASSERT(s.text # NIL, 20); ASSERT(0 <= pos, 21); ASSERT(pos <= s.text.Length(), 22); - SetWorder(w, s, pos, beg); end := beg; - REPEAT - StepWorder(w, s, part); INC(end); - IF ~part THEN beg := end END - UNTIL end >= pos; - DEC(end); - REPEAT - StepWorder(w, s, part); INC(end) - UNTIL ~part OR (s.rd.string[0] = 0X) OR (end - beg > wordCutoff) - END GetWord; - - PROCEDURE (s: StdSetter) GetLine (start: INTEGER; OUT box: LineBox); - VAR rd: Reader; ra: TextRulers.Attributes; brk: LineBox; - d, off, right, w: INTEGER; i, tabsN: INTEGER; form: SET; adj: BOOLEAN; ch: CHAR; - - PROCEDURE TrueW (VAR b: LineBox; w: INTEGER): INTEGER; - VAR i: INTEGER; type: SET; - BEGIN - i := rd.tabIndex; - IF (0 <= i ) & (i < TextRulers.maxTabs) & (rd.string[0] # tab) THEN - type := rd.tabType * {TextRulers.centerTab, TextRulers.rightTab}; - IF type = {TextRulers.centerTab} THEN - DEC(w, b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w DIV 2)) - ELSIF type = {TextRulers.rightTab} THEN - DEC(w, b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w)) - END - END; - RETURN w - END TrueW; - - PROCEDURE Enclose (VAR b: LineBox; w: INTEGER); - VAR off, i, d: INTEGER; type: SET; - BEGIN - b.len := rd.pos - start; INC(b.right, w); - off := rd.attr.offset; i := rd.tabIndex; - IF rd.h - rd.dsc + off > b.asc THEN b.asc := rd.h - rd.dsc + off END; - IF rd.dsc - off > b.dsc THEN b.dsc := rd.dsc - off END; - IF rd.view # NIL THEN b.views := TRUE END; - IF (0 <= i ) & (i < TextRulers.maxTabs) THEN - IF rd.string[0] = tab THEN - b.tabW[i] := w - ELSE - type := rd.tabType * {TextRulers.centerTab, TextRulers.rightTab}; - IF type = {TextRulers.centerTab} THEN - d := b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w DIV 2); - DEC(b.tabW[i], d); DEC(b.right, d) - ELSIF type = {TextRulers.rightTab} THEN - d := b.tabW[i] - MAX(minTabWidth, b.tabW[i] - w); - DEC(b.tabW[i], d); DEC(b.right, d) - END - END - END - END Enclose; - - BEGIN - ASSERT(s.text # NIL, 20); ASSERT(0 <= start, 21); ASSERT(start <= s.text.Length(), 22); - i := CacheIndex(s.key, start); - IF i >= 0 THEN - GetFromCache(s, i, box) - ELSE - TextRulers.GetValidRuler(s.text, start, s.rpos, s.ruler, s.rpos); - IF s.rpos > start THEN s.ruler := s.defRuler; s.rpos := -1 END; - box.ruler := s.ruler; box.rpos := s.rpos; - ra := s.ruler.style.attr; tabsN := ra.tabs.len; right := Right(ra, s.vw); - s.r := s.text.NewReader(s.r); - IF start = 0 THEN s.r.SetPos(start); ch := para - ELSE s.r.SetPos(start - 1); s.r.ReadChar(ch) - END; - s.r.Read; - -(* - IF s.r.char = para THEN box.rbox := ~s.hideMarks; box.bop := s.hideMarks; box.left := 0 - ELSIF ch = para THEN box.rbox := FALSE; box.bop := TRUE; box.left := ra.first - ELSE box.rbox := FALSE; box.bop := FALSE; box.left := ra.left - END; -*) - IF s.r.char = para THEN box.rbox := TRUE; box.bop := FALSE; box.left := 0 - ELSIF ch = para THEN box.rbox := FALSE; box.bop := TRUE; box.left := ra.first - ELSE box.rbox := FALSE; box.bop := FALSE; box.left := ra.left - END; -(**) - box.views := FALSE; - box.asc := 0; box.dsc := 0; box.right := box.left; - box.len := 0; box.adjOff := 0; box.spaces := 0; - brk.right := 0; - - s.rd := s.NewReader(s.rd); rd := s.rd; - rd.Set(s.r, s.text, box.left, start, box.ruler, box.rpos, s.vw, s.hideMarks); - rd.Read; - WHILE ~rd.eot & (box.right + (*rd.w*) TrueW(box, rd.w) <= right) - & ~(lineBreak IN rd.setterOpts) DO - IF ~(wordJoin IN rd.setterOpts) & (box.right + rd.endW <= right) THEN - (*brk := box;*) - brk.len := box.len; brk.ruler := box.ruler; brk.rpos := box.rpos; - brk.left := box.left; brk.right := box.right; brk.asc := box.asc; brk.dsc := box.dsc; - brk.rbox := box.rbox; brk.bop := box.bop; brk.adj := box.adj; brk.eot := box.eot; - brk.views := box.views; brk.skipOff := box.skipOff; brk.adjOff := box.adjOff; - brk.spaces := box.spaces; brk.adjW := box.adjW; - i := 0; WHILE i < tabsN DO brk.tabW[i] := box.tabW[i]; INC(i) END; - (*---*) - Enclose(brk, rd.endW); - brk.eot := rd.r.eot (* rd.r.eot one ahead of rd.eot *) - END; - box.adjOff := rd.adjStart - start; box.spaces := rd.spaces; - Enclose(box, rd.w); - rd.x := box.right; rd.Read - END; - IF (lineBreak IN rd.setterOpts) (* & ~box.rbox *) THEN Enclose(box, 0) END; - box.eot := rd.eot; adj := FALSE; box.skipOff := box.len; - IF box.right + rd.w > right THEN (* rd.w > 0 => ~rd.eot & ~(lineBreak IN setterOpts) *) - IF ~(wordJoin IN rd.setterOpts) & (box.right + rd.endW <= right) THEN - IF rd.string[0] = " " THEN DEC(box.spaces) END; - Enclose(box, rd.endW); - adj := TRUE - ELSIF brk.right > 0 THEN - (*box := brk;*) - box.len := brk.len; box.ruler := brk.ruler; box.rpos := brk.rpos; - box.left := brk.left; box.right := brk.right; box.asc := brk.asc; box.dsc := brk.dsc; - box.rbox := brk.rbox; box.bop := brk.bop; box.adj := brk.adj; box.eot := brk.eot; - box.views := brk.views; box.skipOff := brk.skipOff; box.adjOff := brk.adjOff; - box.spaces := brk.spaces; box.adjW := brk.adjW; - i := 0; WHILE i < tabsN DO box.tabW[i] := brk.tabW[i]; INC(i) END; - (*---*) - box.skipOff := box.len - 1; adj := TRUE - ELSIF box.right = box.left THEN - Enclose(box, rd.w) (* force at least one per line *) - END - ELSIF (box.right = box.left) & box.eot THEN - box.asc := ra.asc; box.dsc := ra.dsc (* force empty line to ruler's default height *) - END; - - box.adj := FALSE; - d := right - box.right; - IF d > 0 THEN - form := ra.opts * adjustMask; - IF form = blocked THEN - IF adj & (box.spaces > 0) THEN - box.right := right; box.adj := TRUE; box.adjW := d - END - ELSIF form = rightFlush THEN - IF box.adjOff > 0 THEN - box.adjW := d; box.adj := TRUE - ELSE - INC(box.left, d) - END; - box.right := right - ELSIF form = centered THEN - IF box.adjOff > 0 THEN - box.adjW := d DIV 2; box.adj := TRUE - ELSE - INC(box.left, d DIV 2) - END; - INC(box.right, d DIV 2) - END - END; - - AddToCache(s.key, start, box) - END; - - ASSERT(box.eot OR (box.len > 0), 100) - END GetLine; - - - PROCEDURE (s: StdSetter) GetBox (start, end, maxW, maxH: INTEGER; OUT w, h: INTEGER); - VAR box: LineBox; asc, dsc: INTEGER; - BEGIN - ASSERT(s.text # NIL, 20); - ASSERT(0 <= start, 21); - ASSERT(start <= end, 22); - ASSERT(end <= s.text.Length(), 23); - w := 0; h := 0; dsc := -1; - IF maxW <= Views.undefined THEN maxW := MAX(INTEGER) END; - IF maxH <= Views.undefined THEN maxH := MAX(INTEGER) END; - WHILE (start < end) & (h < maxH) DO - s.GetLine(start, box); - IF box.rbox THEN w := MAX(w, Right(box.ruler.style.attr, s.vw)) - ELSE w := MAX(w, box.right) - END; - asc := box.asc + s.GridOffset(dsc, box); dsc := box.dsc; - INC(start, box.len); INC(h, asc + dsc) - END; - w := MIN(w, maxW); h := MIN(h, maxH) - END GetBox; - - - PROCEDURE (s: StdSetter) NewReader (old: Reader): Reader; - (* pre: connected *) - VAR rd: StdReader; - BEGIN - ASSERT(s.text # NIL, 20); - IF (old # NIL) & (old IS StdReader) THEN RETURN old - ELSE NEW(rd); RETURN rd - END - END NewReader; - - - PROCEDURE (s: StdSetter) GridOffset (dsc: INTEGER; IN box: LineBox): INTEGER; - VAR ra: TextRulers.Attributes; h, h0: INTEGER; - (* minimal possible line spacing h0, minimal legal line spacing h *) - BEGIN - IF ~box.rbox THEN - ra := box.ruler.style.attr; - IF dsc < 0 THEN -RETURN 0 (* no longer try to correct first line's grid position -- should be done when printing... *) -(* - h0 := box.asc; h := ra.asc; - IF h < h0 THEN (* override legal spacing if to small *) - h := h - (h - h0) DIV ra.grid * ra.grid (* adjust to next larger grid line *) - END; - RETURN h - h0 -*) - ELSE - h0 := box.asc + dsc; h := ra.asc + ra.dsc; - IF h < h0 THEN h := h0 END; (* override legal spacing if to small *) - RETURN - (-h) DIV ra.grid * ra.grid - h0 (* adjust to next larger grid line *) - END - ELSE - RETURN 0 - END - END GridOffset; - - - (* StdDirectory *) - - PROCEDURE (d: StdDirectory) New (): Setter; - VAR s: StdSetter; - BEGIN - NEW(s); s.text := NIL; RETURN s - END New; - - - (** miscellaneous **) - - PROCEDURE Init; - VAR d: StdDirectory; - BEGIN - InitCache; - NEW(d); dir := d; stdDir := d - END Init; - - PROCEDURE SetDir* (d: Directory); - BEGIN - ASSERT(d # NIL, 20); dir := d - END SetDir; - -BEGIN - Init -END TextSetters. diff --git a/new/Text/Mod/Views.txt b/new/Text/Mod/Views.txt deleted file mode 100644 index 2ee55ea..0000000 --- a/new/Text/Mod/Views.txt +++ /dev/null @@ -1,1579 +0,0 @@ -MODULE TextViews; - - (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Text/Mod/Views.odc *) - (* DO NOT EDIT *) - -(* could use +, $ in DrawLine cache implementation *) - - IMPORT - Services, Fonts, Ports, Stores, - Models, Views, Controllers, Properties, Dialog, Printing, Containers, - TextModels, TextRulers, TextSetters; - - CONST - (** v.DisplayMarks hide *) - show* = FALSE; hide* = TRUE; - - (** v.ShowRange focusOnly **) - any* = FALSE; focusOnly* = TRUE; - - parasign = 0B6X; (* paragraph sign, to mark non-ruler paragraph breaks *) - - mm = Ports.mm; inch16 = Ports.inch DIV 16; point = Ports.point; - maxScrollHeight = 16 * point; maxScrollSteps = 100; fuseScrollHeight = maxScrollHeight DIV 2; - maxHeight = maxScrollHeight * maxScrollSteps; - adjustMask = {TextRulers.leftAdjust, TextRulers.rightAdjust}; - - (* SetOp.mode *) - setMarks = 0; setSetter = 1; setDefs = 2; - - scrollingKey = "#System:Scrolling"; - viewSettingKey = "#System:ViewSetting"; - - minVersion = 0; maxVersion = 0; maxStdVersion = 0; - - - TYPE - View* = POINTER TO ABSTRACT RECORD (Containers.View) END; - - Directory* = POINTER TO ABSTRACT RECORD - defAttr-: TextModels.Attributes - END; - - - Location* = RECORD - (** start of line and position of location **) - start*, pos*: INTEGER; - (** coordinates of location **) - x*, y*: INTEGER; - (** line dimensions at location **) - asc*, dsc*: INTEGER; - (** if view at location: **) - view*: Views.View; - l*, t*, r*, b*: INTEGER - END; - - - PositionMsg* = RECORD (Models.Message) - focusOnly*: BOOLEAN; - beg*, end*: INTEGER - END; - - - PageMsg* = RECORD (Properties.Message) - current*: INTEGER - END; - - - Line = POINTER TO RECORD - next: Line; - start, asc, h: INTEGER; - attr: TextRulers.Attributes; (* attr = box.ruler.style.attr *) - box: TextSetters.LineBox (* caching of box.rpos not consistent *) - END; - - StdView = POINTER TO RECORD (View) - (* model *) - text: TextModels.Model; - org: INTEGER; - dy: INTEGER; (* 0 <= dy < Height(first line) *) - defRuler: TextRulers.Ruler; - defAttr: TextModels.Attributes; - hideMarks: BOOLEAN; - (* general state *) - cachedRd: TextSetters.Reader; - (* line grid cache *) - trailer: Line; (* trailer # NIL => trailer.eot, trailer.next # trailer *) - bot: INTEGER; (* max(f : f seen by Restore : f.b) *) - (* setter *) - setter, setter0: TextSetters.Setter (* setter # setter0 lazily detects setter change *) - END; - - StdDirectory = POINTER TO RECORD (Directory) END; - - ScrollOp = POINTER TO RECORD (Stores.Operation) - v: StdView; - org, dy: INTEGER; - bunchOrg, bunchDy: INTEGER; - bunch: BOOLEAN; (* bunch => bunchOrg, bunchDy valid *) - silent: BOOLEAN (* original caller of Do(op) already handled situation *) - END; - - SetOp = POINTER TO RECORD (Stores.Operation) - mode: INTEGER; - view: StdView; - hideMarks: BOOLEAN; - setter: TextSetters.Setter; - defRuler: TextRulers.Ruler; - defAttr: TextModels.Attributes - END; - - FindAnyFrameMsg = RECORD (Views.Message) - (* find frame with smallest height (frame.b - frame.t) that displays view; NIL if none found *) - frame: Views.Frame (* OUT, initially NIL *) - END; - - FindFocusFrameMsg = RECORD (Controllers.Message) - (* find outermost focus frame displaying view; NIL if none found *) - view: Views.View; (* IN *) - frame: Views.Frame (* OUT, initially NIL *) - END; - - - VAR - ctrlDir-: Containers.Directory; - dir-, stdDir-: Directory; - - - (* forward used in GetStart, UpdateView, ShowRangeIn *) - PROCEDURE ^ DoSetOrigin (v: StdView; org, dy: INTEGER; silent: BOOLEAN); - - - (** View **) - - PROCEDURE (v: View) Internalize2- (VAR rd: Stores.Reader), EXTENSIBLE; - (** pre: ~v.init **) - (** post: v.init **) - VAR thisVersion: INTEGER; - BEGIN - (*v.Internalize^(rd);*) - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxVersion, thisVersion) - END Internalize2; - - PROCEDURE (v: View) Externalize2- (VAR wr: Stores.Writer), EXTENSIBLE; - (** pre: v.init **) - BEGIN - (*v.Externalize^(wr);*) - wr.WriteVersion(maxVersion) - END Externalize2; - - PROCEDURE (v: View) ThisModel* (): TextModels.Model, EXTENSIBLE; - VAR m: Containers.Model; - BEGIN - m := v.ThisModel^(); - IF m # NIL THEN - RETURN m(TextModels.Model) - ELSE - RETURN NIL - END - END ThisModel; - - PROCEDURE (v: View) DisplayMarks* (hide: BOOLEAN), NEW, ABSTRACT; - PROCEDURE (v: View) HidesMarks* (): BOOLEAN, NEW, ABSTRACT; - PROCEDURE (v: View) SetSetter* (setter: TextSetters.Setter), NEW, ABSTRACT; - PROCEDURE (v: View) ThisSetter* (): TextSetters.Setter, NEW, ABSTRACT; - PROCEDURE (v: View) SetOrigin* (org, dy: INTEGER), NEW, ABSTRACT; - (** post: org = ThisLine(org) => v.org = org, v.dy = dy; else v.org = ThisLine(org), v.dy = 0 **) - - PROCEDURE (v: View) PollOrigin* (OUT org, dy: INTEGER), NEW, ABSTRACT; - PROCEDURE (v: View) SetDefaults* (r: TextRulers.Ruler; a: TextModels.Attributes), - NEW, ABSTRACT; - (** pre: r.init, a.init **) - - PROCEDURE (v: View) PollDefaults* (OUT r: TextRulers.Ruler; OUT a: TextModels.Attributes), - NEW, ABSTRACT; - PROCEDURE (v: View) GetThisLocation* (f: Views.Frame; pos: INTEGER; OUT loc: Location), - NEW, ABSTRACT; - - PROCEDURE (v: View) GetRect* (f: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER); - VAR con: Models.Context; loc: Location; pos: INTEGER; - BEGIN - con := view.context; - ASSERT(con # NIL, 20); ASSERT(con.ThisModel() = v.ThisModel(), 21); - pos := con(TextModels.Context).Pos(); - v.GetThisLocation(f, pos, loc); - IF loc.view = view THEN - l := loc.l; t := loc.t; r := loc.r; b := loc.b - ELSE - l := MAX(INTEGER); t := MAX(INTEGER); r := l; b := t - END - END GetRect; - - PROCEDURE (v: View) GetRange* (f: Views.Frame; OUT beg, end: INTEGER), NEW, ABSTRACT; - (** post: beg = beg of first visible line, end = end of last visible line **) - - PROCEDURE (v: View) ThisPos* (f: Views.Frame; x, y: INTEGER): INTEGER, NEW, ABSTRACT; - PROCEDURE (v: View) ShowRangeIn* (f: Views.Frame; beg, end: INTEGER), NEW, ABSTRACT; - PROCEDURE (v: View) ShowRange* (beg, end: INTEGER; focusOnly: BOOLEAN), NEW, ABSTRACT; - (** post: in all frames (resp. in front or otherwise target frame if focusOnly): - if possible, first visible pos <= k <= last visible pos, - with k = beg if beg = end and beg <= k < end otherwise **) - - - (** Directory **) - - PROCEDURE (d: Directory) Set* (defAttr: TextModels.Attributes), NEW, EXTENSIBLE; - BEGIN - ASSERT(defAttr # NIL, 20); ASSERT(defAttr.init, 21); - d.defAttr := defAttr - END Set; - - PROCEDURE (d: Directory) New* (text: TextModels.Model): View, NEW, ABSTRACT; - - - (** miscellaneous **) - - PROCEDURE SetCtrlDir* (d: Containers.Directory); - BEGIN - ASSERT(d # NIL, 20); ctrlDir := d - END SetCtrlDir; - - PROCEDURE SetDir* (d: Directory); - BEGIN - ASSERT(d # NIL, 20); dir := d - END SetDir; - - - PROCEDURE Focus* (): View; - VAR v: Views.View; - BEGIN - v := Controllers.FocusView(); - IF (v # NIL) & (v IS View) THEN RETURN v(View) ELSE RETURN NIL END - END Focus; - - PROCEDURE FocusText* (): TextModels.Model; - VAR v: View; - BEGIN - v := Focus(); - IF v # NIL THEN RETURN v.ThisModel() ELSE RETURN NIL END - END FocusText; - - PROCEDURE Deposit*; - BEGIN - Views.Deposit(dir.New(NIL)) - END Deposit; - - - PROCEDURE ShowRange* (text: TextModels.Model; beg, end: INTEGER; focusOnly: BOOLEAN); - (** post: in all front or target frames displaying a view displaying t: - if possible, first visible pos <= k <= last visible pos, - with k = beg if beg = end and beg <= k < end otherwise **) - VAR pm: PositionMsg; - BEGIN - ASSERT(text # NIL, 20); - pm.beg := beg; pm.end := end; pm.focusOnly := focusOnly; - Models.Broadcast(text, pm) - END ShowRange; - - - PROCEDURE ThisRuler* (v: View; pos: INTEGER): TextRulers.Ruler; - VAR r: TextRulers.Ruler; a: TextModels.Attributes; rpos: INTEGER; - BEGIN - v.PollDefaults(r, a); rpos := -1; TextRulers.GetValidRuler(v.ThisModel(), pos, -1, r, rpos); - RETURN r - END ThisRuler; - - - (* auxiliary procedures *) - - PROCEDURE GetReader (v: StdView; start: INTEGER; IN box: TextSetters.LineBox - ): TextSetters.Reader; - VAR st: TextSetters.Setter; rd: TextSetters.Reader; - BEGIN - ASSERT(box.ruler # NIL, 100); - st := v.ThisSetter(); - rd := v.cachedRd; v.cachedRd := NIL; (* reader recycling *) - rd := st.NewReader(rd); - rd.Set(rd.r, v.text, box.left, start, box.ruler, box.rpos, st.vw, st.hideMarks); - RETURN rd - END GetReader; - - PROCEDURE CacheReader (v: StdView; rd: TextSetters.Reader); - BEGIN - ASSERT(v.cachedRd = NIL, 20); - v.cachedRd := rd - END CacheReader; - - - (* line descriptors *) - - PROCEDURE SetLineAsc (st: TextSetters.Setter; t: Line; dsc: INTEGER); - (* pre: dsc: descender of previous line (-1 if first line) *) - BEGIN - t.asc := t.box.asc + st.GridOffset(dsc, t.box); - t.h := t.asc + t.box.dsc - END SetLineAsc; - - PROCEDURE NewLine (st: TextSetters.Setter; start, dsc: INTEGER): Line; - (* pre: start: start of line to measure; dsc: descender of previous line (-1 if first line) *) - VAR t: Line; - BEGIN - NEW(t); st.GetLine(start, t.box); - t.start := start; SetLineAsc(st, t, dsc); - t.attr := t.box.ruler.style.attr; - RETURN t - END NewLine; - - PROCEDURE AddLine (st: TextSetters.Setter; VAR t: Line; VAR start, y: INTEGER); - BEGIN - t.next := NewLine(st, start, t.box.dsc); t := t.next; - INC(start, t.box.len); INC(y, t.h) - END AddLine; - - PROCEDURE InitLines (v: StdView); - VAR asc, dsc, w: INTEGER; t0, t: Line; start, y: INTEGER; - BEGIN - v.defAttr.font.GetBounds(asc, dsc, w); - NEW(t0); start := v.org; y := v.dy; - t0.box.dsc := -1; (* dsc = -1: trailer.next is first line *) - t := t0; AddLine(v.ThisSetter(), t, start, y); t.next := t0; (* at least one valid line desc *) - t0.start := start; t0.asc := asc; t0.h := asc + dsc; (* trailer.(asc, h) for caret display following last line *) - t0.attr := NIL; - t0.box.eot := TRUE; t0.box.len := 0; - t0.box.ruler := NIL; - t0.box.left := -1; (* make trailer async to every other line *) - v.trailer := t0; v.bot := 0 - END InitLines; - - PROCEDURE ExtendLines (v: StdView; bot: INTEGER); - VAR st: TextSetters.Setter; t0, t: Line; start, y: INTEGER; - BEGIN - IF bot >= v.bot THEN - t0 := v.trailer; start := t0.start; - y := v.dy; t := t0; WHILE t.next # t0 DO t := t.next; INC(y, t.h) END; - IF (y < bot) & ~t.box.eot THEN - st := v.ThisSetter(); - REPEAT AddLine(st, t, start, y) UNTIL (y >= bot) OR t.box.eot; - t.next := t0; t0.start := start - END; - v.bot := bot - END - END ExtendLines; - - PROCEDURE ReduceLines (v: StdView; bot: INTEGER); - VAR t0, t: Line; y: INTEGER; - BEGIN - IF bot <= v.bot THEN - t0 := v.trailer; y := v.dy; - t := t0; WHILE (t.next # t0) & (y < bot) DO t := t.next; INC(y, t.h) END; - t0.start := t.next.start; t.next := t0; - v.bot := bot - END - END ReduceLines; - - PROCEDURE ValidateLines (v: StdView; bot: INTEGER); - VAR st: TextSetters.Setter; w, h, len: INTEGER; - BEGIN - IF v.setter # NIL THEN - v.context.GetSize(w, h); (* possibly adapt to changed width *) - IF v.setter.vw # w THEN v.setter0 := NIL; v.trailer := NIL END - END; - len := v.text.Length(); - IF (v.org > len) OR (v.trailer # NIL) & (v.trailer.start > len) THEN v.trailer := NIL END; - IF v.trailer = NIL THEN - IF v.org > len THEN v.org := len END; - st := v.ThisSetter(); v.org := st.ThisLine(v.org); - InitLines(v) - END; - ExtendLines(v, bot) - END ValidateLines; - - PROCEDURE PrependLines (v: StdView); - VAR st: TextSetters.Setter; t0, t1, t: Line; start, y: INTEGER; - BEGIN - t0 := v.trailer; start := v.org; y := v.dy; - IF t0.start # start THEN - st := v.ThisSetter(); - t := t0; t1 := t0.next; - WHILE (t1.start # start) & (y < v.bot) DO AddLine(st, t, start, y) END; - IF y >= v.bot THEN - t.next := t0; t0.start := start - ELSE - t.next := t1; - IF t1 # v.trailer THEN SetLineAsc(st, t1, t.box.dsc) END - END - END - END PrependLines; - - - (* update frame after insert/delete/replace *) - - PROCEDURE ThisViewLine (v: StdView; y: INTEGER): Line; - (* pre: 0 <= y < v.bot *) - VAR t: Line; py: INTEGER; - BEGIN - t := v.trailer.next; py := v.dy; - WHILE ~t.box.eot & (py + t.h < y) DO INC(py, t.h); t := t.next END; - RETURN t - END ThisViewLine; - - PROCEDURE LocateThisLine (v: StdView; start: INTEGER; OUT t: Line; OUT y: INTEGER); - VAR t1: Line; - BEGIN - t := v.trailer.next; y := v.dy; - t1 := v.trailer.next; - WHILE t.start # start DO INC(y, t.h); t := t.next; ASSERT(t # t1, 100) END - END LocateThisLine; - - PROCEDURE GetStart (st: TextSetters.Setter; v: StdView; beg: INTEGER; OUT start: INTEGER); - (* find start of line containing beg after text change; tuned using valid line descs *) - VAR s, t: Line; - BEGIN - s := v.trailer; t := s.next; - WHILE (t # v.trailer) & (t.start + t.box.len < beg) DO s := t; t := s.next END; - IF s # v.trailer THEN (* at least first line desc possibly still valid *) - start := st.NextLine(s.start); (* NextLine can be much cheaper than ThisLine *) - IF start # t.start THEN - GetStart(st, v, s.start, start) - ELSIF ~t.box.eot & (start + t.box.len = beg) & (st.NextLine(start) = beg) THEN - start := beg - END - ELSE - IF v.org <= v.text.Length() THEN - start := st.ThisLine(v.org) - ELSE - start := st.ThisLine(v.text.Length()) - END; - IF start < v.org THEN - DoSetOrigin(v, start, 0, TRUE) - ELSIF start > v.org THEN - start := v.org - END - END - END GetStart; - - PROCEDURE GetStringStart (v: StdView; t: Line; pos: INTEGER; OUT p1, x: INTEGER); - VAR rd: TextSetters.Reader; - BEGIN - p1 := t.start; x := t.box.left; - IF t.box.views THEN - rd := GetReader(v, p1, t.box); rd.Read; - WHILE ~rd.eot & (rd.pos <= pos) DO - rd.AdjustWidth(t.start, p1, t.box, rd.w); INC(rd.x, rd.w); - IF rd.view # NIL THEN p1 := rd.pos; x := rd.x END; - rd.Read - END; - CacheReader(v, rd) - END - END GetStringStart; - - PROCEDURE InSynch (t0, t1: Line): BOOLEAN; - BEGIN - RETURN (t0.start = t1.start) & (t0.asc = t1.asc) & (t0.attr = t1.attr) - & (t0.box.left = t1.box.left) & (t0.box.asc = t1.box.asc) & (t0.box.dsc = t1.box.dsc) - & (t0.box.rbox = t1.box.rbox) & (t0.box.bop = t1.box.bop) - END InSynch; - - PROCEDURE RebuildView (v: StdView); - BEGIN - v.setter0 := NIL; - IF v.trailer # NIL THEN v.trailer := NIL; v.bot := 0; Views.Update(v, Views.rebuildFrames) END - END RebuildView; - - PROCEDURE UpdateIn (v: StdView; l, t, b: INTEGER); - BEGIN - Views.UpdateIn(v, l, t, MAX(INTEGER), b, Views.rebuildFrames) - END UpdateIn; - - PROCEDURE UpdateFrames (v: StdView; t0, t1, u: Line; beg, y0, yu: INTEGER); - VAR t, te: Line; b, x, b0, b1, top, bot: INTEGER; - BEGIN - IF ((beg < t0.next.start) OR t0.box.eot) & ~t0.box.adj - & ((beg < t1.next.start) OR t1.box.eot) & ~t1.box.adj - & InSynch(t0, t1) THEN - GetStringStart(v, t1, beg, beg, x) - ELSE - beg := t1.start - END; - b := y0; t := t0; WHILE t # u DO INC(b, t.h); t := t.next END; - IF b = yu THEN - te := u - ELSE (* t = u *) - te := v.trailer; - b0 := b; WHILE t # v.trailer DO INC(b0, t.h); t := t.next END; - IF yu < b THEN ExtendLines(v, v.bot) ELSE ReduceLines(v, v.bot) END; - b1 := y0; t := t1; WHILE t # v.trailer DO INC(b1, t.h); t := t.next END; - IF b1 < b0 THEN UpdateIn(v, 0, b1, b0) END (* erase trailer *) - END; - IF t1.start < beg THEN (* conserve head of t1 *) - UpdateIn(v, x, y0, y0 + t1.h); (* redraw tail of t1 *) - top := y0 + t1.h - ELSE - top := y0 - END; - bot := y0; REPEAT INC(bot, t1.h); t1 := t1.next UNTIL t1 = te; - IF top < bot THEN UpdateIn(v, 0, top, bot) END (* redraw affected lines *) - END UpdateFrames; - - PROCEDURE UpdateView (v: StdView; beg, end, delta: INTEGER); - VAR st: TextSetters.Setter; r: TextRulers.Ruler; rpos: INTEGER; - s0, t0, t, tn, u: Line; start, y, y0: INTEGER; - BEGIN - IF v.trailer # NIL THEN - v.setter0 := NIL; st := v.ThisSetter(); - IF (beg <= v.trailer.start) & ((end >= v.org) OR (end - delta >= v.org)) THEN - GetStart(st, v, beg, start); - y0 := v.dy; s0 := v.trailer; - WHILE s0.next.start < start DO s0 := s0.next; INC(y0, s0.h) END; - - t := s0.next; WHILE (t # v.trailer) & (t.start < end) DO t := t.next END; - IF (t = v.trailer.next) & (t.start >= end) THEN - REPEAT - INC(t.start, delta); - IF t.box.rpos >= end THEN INC(t.box.rpos, delta) END; - t := t.next - UNTIL t = v.trailer.next - ELSE - WHILE (t # v.trailer.next) & (t.start >= end) DO - INC(t.start, delta); - IF t.box.rpos >= end THEN INC(t.box.rpos, delta) END; - t := t.next - END - END; - tn := s0; y := y0; t0 := s0.next; u := t0; - REPEAT - t := tn; AddLine(st, tn, start, y); (* start = end(tn), y = bot(tn) *) - WHILE (u # v.trailer) & (u.start < tn.start) DO u := u.next END - UNTIL tn.box.eot OR (y > v.bot) - OR (tn.start >= end) & (u.start = tn.start) & (u.box.len = tn.box.len) - & (u.asc = tn.asc) & (u.attr = tn.attr) & (u.box.dsc = tn.box.dsc) - & (u.box.rpos = tn.box.rpos); (* can be expensive ... *) - IF tn.box.eot OR (y > v.bot) THEN - t := tn; u := v.trailer; v.trailer.start := start - ELSE - DEC(y, tn.h) - END; - t.next := u; - IF (s0 # v.trailer) & (s0.next # v.trailer) THEN s0.box.eot := FALSE END; - ASSERT(v.trailer.start <= v.text.Length(), 100); - UpdateFrames(v, t0, s0.next, u, beg, y0, y) - ELSIF end <= v.org THEN - INC(v.org, delta); -(* - IF end < v.org - delta - 500 THEN start := v.org ELSE start := st.ThisLine(v.org) END; - (* this is not safe; even a change 500 characters away could force the view's origin to a - new position in order to maintain the invariant that the origin always falls on a line start; - however, ThisLine can be quite expensive -- can we rely on TextSetters cache ? *) -*) - start := st.ThisLine(v.org); - r := v.defRuler; rpos := -1; TextRulers.GetValidRuler(v.text, start, -1, r, rpos); - IF (v.org = start) & (v.trailer.next.attr = r.style.attr) THEN - t := v.trailer; - REPEAT - t := t.next; INC(t.start, delta); - IF t.box.rpos < start THEN t.box.rpos := rpos ELSE INC(t.box.rpos, delta) END - UNTIL t = v.trailer - ELSE - DoSetOrigin(v, start, 0, TRUE); RebuildView(v) - END - END - END - END UpdateView; - - PROCEDURE StyleUpdate (v: StdView; oldAttr: TextRulers.Attributes); - VAR t: Line; beg: INTEGER; first: BOOLEAN; - BEGIN - IF v.trailer # NIL THEN - t := v.trailer.next; first := TRUE; - WHILE t # v.trailer DO - WHILE (t # v.trailer) & (t.attr # oldAttr) DO t := t.next END; - IF t # v.trailer THEN - IF first THEN v.Neutralize; first := FALSE END; - beg := t.start; t := t.next; - WHILE (t # v.trailer) & (t.attr = oldAttr) DO t := t.next END; - UpdateView(v, beg, t.start, 0) - END - END - END - END StyleUpdate; - - - (* line drawing *) - - PROCEDURE DrawLine (v: StdView; - start: INTEGER; IN box: TextSetters.LineBox; - f: Views.Frame; l, r, y, t: INTEGER; pageF: BOOLEAN - ); - (* pre: area cleared *) - (* [l,r) for high-level clipping to tune update after small change *) - CONST cacheLen = 128; - VAR rd: TextSetters.Reader; ra: TextRulers.Attributes; - v1: Views.View; c: Containers.Controller; - py, end, skip: INTEGER; - cache: RECORD (* initially: long = TRUE, len = 0 *) - x, y: INTEGER; color: Ports.Color; font: Fonts.Font; - len: INTEGER; - buf: ARRAY cacheLen OF CHAR - END; - - PROCEDURE FlushCaches; - BEGIN - IF cache.len > 0 THEN - cache.buf[cache.len] := 0X; - f.DrawString(cache.x, cache.y, cache.color, cache.buf, cache.font) - END; - cache.len := 0 - END FlushCaches; - - PROCEDURE CacheString (x, y: INTEGER; c: INTEGER; IN s: ARRAY OF CHAR; - f: Fonts.Font - ); - VAR i, j, len: INTEGER; - BEGIN - len := 0; WHILE s[len] # 0X DO INC(len) END; - IF (cache.len + len >= cacheLen) OR (cache.y # y) OR (cache.color # c) OR (cache.font # f) THEN - FlushCaches - END; - ASSERT(cache.len + len < cacheLen, 100); - IF cache.len = 0 THEN cache.x := x; cache.y := y; cache.color := c; cache.font := f END; - i := 0; j := cache.len; - WHILE i < len DO cache.buf[j] := s[i]; INC(i); INC(j) END; - cache.len := j - END CacheString; - -(* - PROCEDURE CacheString (x, y: INTEGER; c: INTEGER; IN s: ARRAY OF CHAR; - f: Fonts.Font - ); - VAR i, j, len: INTEGER; - BEGIN - (* flush first, then promote *) - len := 0; WHILE s[len] # 0X DO INC(len) END; - IF (cache.len + len >= cacheLen) OR (cache.y # y) OR (cache.color # c) OR (cache.font # f) THEN - FlushCaches - END; - IF (cache.len > 0) & cache.short THEN (* promote short chars to chars *) - i := 0; WHILE i < cache.len DO cache.buf[i] := cache.sbuf[i]; INC(i) END - END; - cache.short := FALSE; - ASSERT(cache.len + len < cacheLen, 100); - IF cache.len = 0 THEN cache.x := x; cache.y := y; cache.color := c; cache.font := f END; - i := 0; j := cache.len; - WHILE i < len DO cache.buf[j] := s[i]; INC(i); INC(j) END; - cache.len := j - END CacheString; -*) - - BEGIN - IF box.len > 0 THEN - cache.len := 0; - end := start + box.len; skip := start + box.skipOff; - rd := GetReader(v, start, box); rd.Read; - WHILE ~rd.eot & (rd.pos <= end) & (rd.x < r) DO - IF rd.pos > skip THEN rd.w := rd.endW END; - rd.AdjustWidth(start, rd.pos, box, rd.w); - IF rd.x + rd.w > l THEN - v1 := rd.view; - IF v1 # NIL THEN - FlushCaches; - IF ~((TextModels.hideable IN rd.textOpts) & v.hideMarks) THEN - c := v.ThisController(); - Views.InstallFrame(f, v1, - rd.x, y - rd.attr.offset + rd.dsc - rd.h, 0, - (c # NIL) & (v1 = c.ThisFocus()) ) - END - ELSIF (rd.h > 0) & (rd.w > 0) THEN - IF box.rbox & ~v.hideMarks THEN rd.string[0] := parasign END; (* ¶ sign *) - py := y - rd.attr.offset; - IF rd.string[0] > " " THEN - CacheString(rd.x, py, rd.attr.color, rd.string, rd.attr.font); - IF ~v.hideMarks & (TextModels.hideable IN rd.textOpts) THEN - f.DrawRect(rd.x, py - box.asc + f.dot, - MIN(rd.x + rd.w, f.r), py + box.dsc - f.dot, 0, Ports.grey25) - END - ELSIF rd.string[0] # 0X THEN - FlushCaches; - IF ~v.hideMarks & (TextModels.hideable IN rd.textOpts) THEN - f.DrawRect(rd.x, py - box.asc + f.dot, rd.x + rd.w, py + box.dsc - f.dot, 0, Ports.grey25) - END - ELSE FlushCaches - END - END - END; - INC(rd.x, rd.w); rd.Read - END; - FlushCaches; - CacheReader(v, rd) - END; - IF v.hideMarks & ~pageF THEN - ra := box.ruler.style.attr; - IF TextRulers.pageBreak IN ra.opts THEN - IF (box.rpos = start) & (ra.lead >= f.dot) THEN - f.DrawLine(l, t, r - f.dot, t, 0, Ports.grey50) - ELSIF (box.rpos = start - 1) & (ra.lead < f.dot) THEN - f.DrawLine(l, t, r - f.dot, t, 0, Ports.grey50) - END - END - END - END DrawLine; - - PROCEDURE DrawDecorations (v: StdView; u: Line; f: Views.Frame; l, t, r, b: INTEGER); - VAR a: TextRulers.Attributes; i, x: INTEGER; col: Ports.Color; - st: TextSetters.Setter; srd: TextSetters.Reader; rd: TextModels.Reader; - BEGIN - IF t < b THEN - i := 0; a := u.attr; srd := NIL; - WHILE i < a.tabs.len DO - IF TextRulers.barTab IN a.tabs.tab[i].type THEN - x := a.tabs.tab[i].stop; - IF (l <= x) & (x < r) THEN - IF u.box.rpos = -1 THEN col := v.defAttr.color - ELSIF srd = NIL THEN - st := v.ThisSetter(); - srd := v.cachedRd; v.cachedRd := NIL; - srd := st.NewReader(srd); - srd.Set(srd.r, v.text, 0, 0, v.defRuler, 0, st.vw, st.hideMarks); rd := srd.r; - rd.SetPos(u.box.rpos); rd.Read; col := rd.attr.color - END; - f.DrawLine(x, t, x, b - f.dot, 0, col) - END - END; - INC(i) - END; - IF srd # NIL THEN CacheReader(v, srd) END - END - END DrawDecorations; - - - (* focus-message handling *) - - PROCEDURE PollSection (v: StdView; f: Views.Frame; VAR msg: Controllers.PollSectionMsg); - CONST ms = maxScrollSteps; mh = maxScrollHeight; - VAR t: Line; steps, step: INTEGER; - BEGIN - IF msg.vertical THEN - ValidateLines(v, f.b); t := v.trailer.next; - IF t.h > 0 THEN - steps := -((-t.h) DIV mh); step := -(v.dy DIV mh) - ELSE steps := 1; step := 0 - END; - msg.wholeSize := v.text.Length() * ms; - msg.partPos := v.org * ms + t.box.len * ms * step DIV steps; - msg.partSize := 0; - msg.valid := (v.org > 0) OR (t.h > mh) OR (t.next # v.trailer); - msg.done := TRUE - END - END PollSection; - - PROCEDURE Scroll (v: StdView; f: Views.Frame; VAR msg: Controllers.ScrollMsg); - VAR st: TextSetters.Setter; box, box0: TextSetters.LineBox; - t, t1, trailer: Line; org, len, dy, h, h1, sh, steps, step: INTEGER; - poll: Controllers.PollSectionMsg; - BEGIN - IF msg.vertical THEN - poll.vertical := TRUE; - PollSection(v, f, poll) - END; - IF msg.vertical & poll.valid THEN - org := v.org; dy := v.dy; st := v.ThisSetter(); trailer := v.trailer; - CASE msg.op OF - Controllers.decLine: - IF dy <= -(maxScrollHeight + fuseScrollHeight) THEN - INC(dy, maxScrollHeight) - ELSIF dy < 0 THEN - dy := 0 - ELSIF org > 0 THEN - org := st.PreviousLine(org); st.GetLine(org, box); - h1 := box.asc + box.dsc + st.GridOffset(-1, box); - IF h1 > maxScrollHeight + fuseScrollHeight THEN - sh := h1 - h1 MOD maxScrollHeight; - IF h1 - sh < fuseScrollHeight THEN DEC(sh, maxScrollHeight) END; - dy := -sh - ELSE dy := 0 - END - END - | Controllers.incLine: - t := trailer.next; - IF t.h + dy > maxScrollHeight + fuseScrollHeight THEN - DEC(dy, maxScrollHeight) - ELSIF ~t.box.eot THEN - org := t.next.start; dy := 0 - END - | Controllers.decPage: - sh := f.b; DEC(sh, maxScrollHeight + sh MOD maxScrollHeight); - IF dy <= -(sh + fuseScrollHeight) THEN - INC(dy, sh) - ELSE - t := trailer.next; - h := maxScrollHeight - dy; - IF t.h < h THEN h := t.h END; - box0 := t.box; h1:= h - st.GridOffset(-1, box0); - WHILE (org > 0) & (h + fuseScrollHeight < f.b) DO - org := st.PreviousLine(org); st.GetLine(org, box); - h1 := box.asc + box.dsc; - INC(h, h1 + st.GridOffset(box.dsc, box0)); - box0 := box - END; - h1 := h1 + st.GridOffset(-1, box0); - sh := h1 - (h - f.b); DEC(sh, sh MOD maxScrollHeight); - IF h1 - sh >= fuseScrollHeight THEN dy := -sh ELSE dy := 0 END - END; - IF (org > v.org) OR (org = v.org) & (dy <= v.dy) THEN (* guarantee progress *) - org := st.PreviousLine(org); st.GetLine(org, box); - h1 := box.asc + box.dsc + st.GridOffset(-1, box); - IF h1 > maxScrollHeight + fuseScrollHeight THEN - dy := - (h1 DIV maxScrollHeight * maxScrollHeight) - ELSE - dy := 0 - END - END - | Controllers.incPage: - t := trailer.next; - sh := f.b; DEC(sh, maxScrollHeight + sh MOD maxScrollHeight); - IF t.h + dy > sh + fuseScrollHeight THEN - DEC(dy, sh) - ELSE - t := ThisViewLine(v, f.b); LocateThisLine(v, t.start, t1, h); - IF (h + t.h >= f.b) & (t.h <= maxScrollHeight) THEN - org := st.PreviousLine(t.start) - ELSE org := t.start - END; - IF h + t.h - f.b > maxScrollHeight THEN - sh := f.b - h; DEC(sh, maxScrollHeight + sh MOD maxScrollHeight); - IF sh >= fuseScrollHeight THEN dy := -sh ELSE dy := 0 END - ELSE - dy := 0 - END - END; - IF (org < v.org) OR (org = v.org) & (dy >= v.dy) THEN (* guarantee progress *) - IF t.h + dy > maxScrollHeight + fuseScrollHeight THEN - DEC(dy, maxScrollHeight) - ELSE - org := t.next.start; dy := 0 - END - END - | Controllers.gotoPos: - org := st.ThisLine(msg.pos DIV maxScrollSteps); st.GetLine(org, box); - sh := box.asc + box.dsc + st.GridOffset(-1, box); - steps := -((-sh) DIV maxScrollHeight); - IF (steps > 0) & (box.len > 0) THEN - step := steps * (msg.pos - org * maxScrollSteps) DIV (maxScrollSteps * box.len); -(* - step := steps * (msg.pos MOD maxScrollSteps) DIV maxScrollSteps; -*) - dy := -(step * maxScrollHeight) - ELSE - dy := 0 - END - ELSE - END; - len := v.text.Length(); - IF org > len THEN org := len; dy := 0 END; - v.SetOrigin(org, dy); - msg.done := TRUE - END - END Scroll; - - PROCEDURE NotifyViewsOnPage (v: StdView; beg, end, pageNo: INTEGER); - VAR st: TextSetters.Setter; rd: TextSetters.Reader; r: TextModels.Reader; - view: Views.View; current: INTEGER; - page: PageMsg; - BEGIN - IF pageNo >= 0 THEN current := pageNo - ELSIF Printing.par # NIL THEN current := Printing.Current() (* Printing.par.page.current *) + 1 - ELSE current := -1 - END; - IF current >= 0 THEN - st := v.ThisSetter(); - rd := v.cachedRd; v.cachedRd := NIL; (* reader recycling *) - rd := st.NewReader(rd); - rd.Set(rd.r, v.text, 0, 0, v.defRuler, 0, st.vw, st.hideMarks); - r := rd.r; r.SetPos(beg); r.ReadView(view); - WHILE (r.Pos() <= end) & ~r.eot DO - page.current := current; Views.HandlePropMsg(view, page); r.ReadView(view) - END; - CacheReader(v, rd) - END - END NotifyViewsOnPage; - - PROCEDURE Page (v: StdView; pageH: INTEGER; op, pageY: INTEGER; OUT done, eoy: BOOLEAN); - VAR st: TextSetters.Setter; org, prev, page: INTEGER; - BEGIN - IF ~v.hideMarks & ((v.context = NIL) OR v.context.Normalize()) THEN - v.DisplayMarks(hide) - END; - st := v.ThisSetter(); - IF op = Controllers.nextPageY THEN - done := TRUE; org := st.NextPage(pageH, v.org); eoy := (org = v.text.Length()); - IF ~eoy THEN NotifyViewsOnPage(v, org, st.NextPage(pageH, org), -1) END - ELSIF op = Controllers.gotoPageY THEN - ASSERT(pageY >= 0, 20); - done := TRUE; org := 0; eoy := FALSE; page := 0; - WHILE (page < pageY) & ~eoy DO - prev := org; org := st.NextPage(pageH, org); eoy := org = prev; - IF ~eoy THEN NotifyViewsOnPage(v, prev, org, page) END; - INC(page) - END; - IF ~eoy THEN NotifyViewsOnPage(v, org, st.NextPage(pageH, org), page) END - ELSE - done := FALSE - END; - IF done & ~eoy THEN v.org := org; v.dy := 0; v.trailer := NIL; v.bot := 0 END - END Page; - - - PROCEDURE ShowAdjusted (v: StdView; shift: INTEGER; rebuild: BOOLEAN); - BEGIN - IF shift # 0 THEN Views.Scroll(v, 0, shift) - ELSIF rebuild THEN UpdateIn(v, 0, 0, MAX(INTEGER)) - END; - Views.RestoreDomain(v.Domain()) - END ShowAdjusted; - - PROCEDURE AdjustLines (v: StdView; org, dy: INTEGER; - OUT shift: INTEGER; OUT rebuild: BOOLEAN - ); - (* post: shift = 0 OR ~rebuild *) - VAR d: Stores.Domain; c: Containers.Controller; t, t0, t1: Line; org0, dy0, y: INTEGER; - BEGIN - d := v.Domain(); t0 := v.trailer; org0 := v.org; rebuild := FALSE; shift := 0; - IF (d # NIL) & ((org # org0) OR (dy # v.dy)) THEN - Views.RestoreDomain(d); (* make sure that pixels are up-to-date before scrolling *) - c := v.ThisController(); - IF c # NIL THEN - Containers.FadeMarks(c, Containers.hide) (* fade marks with overhang *) - END - END; - IF (t0 # NIL) & (org = org0) & (dy # v.dy) THEN (* sub-line shift *) - shift := dy - v.dy; - ELSIF (t0 # NIL) & (org > org0) & (org < t0.start) THEN (* shift up *) - LocateThisLine(v, org, t, y); t0.next := t; - shift := dy - y - ELSIF (t0 # NIL) & (org < org0) THEN (* shift down *) - t1 := t0.next; dy0 := v.dy + t1.asc; v.org := org; v.dy := dy; - IF t1.start = org0 THEN (* new lines need to be prepended *) - PrependLines(v) (* may change t1.asc *) - END; - ASSERT(t0.next.start = org, 100); - IF org0 < t0.start THEN (* former top still visible -> shift down *) - LocateThisLine(v, org0, t, y); shift := y - (dy0 - t1.asc) - ELSE (* rebuild all *) - rebuild := TRUE - END - ELSIF (t0 = NIL) OR (org # org0) OR (dy # v.dy) THEN (* rebuild all *) - rebuild := TRUE - END; - v.org := org; v.dy := dy; - IF rebuild THEN (* rebuild all *) - v.trailer := NIL; ValidateLines(v, v.bot) - ELSIF shift < 0 THEN (* shift up *) - INC(v.bot, shift); ExtendLines(v, v.bot - shift) - ELSIF shift > 0 THEN (* shift down *) - INC(v.bot, shift); ReduceLines(v, v.bot - shift) - END - END AdjustLines; - - PROCEDURE Limit (v: StdView; bot: INTEGER; allLines: BOOLEAN): INTEGER; - CONST minH = 12 * point; - VAR s, t: Line; pos, y: INTEGER; - BEGIN - s := v.trailer.next; t := s; y := v.dy; - WHILE ~t.box.eot & (y + t.h <= bot) DO INC(y, t.h); s := t; t := t.next END; - IF ~allLines & (bot - y < t.h) & (bot - y < minH) THEN t := s END; - pos := t.start + t.box.len; -(* - IF t.box.eot THEN INC(pos) END; -*) - RETURN pos - END Limit; - - - (* ScrollOp *) - - PROCEDURE (op: ScrollOp) Do; - VAR org0, dy0, org, dy, shift: INTEGER; rebuild: BOOLEAN; - BEGIN - IF op.bunch THEN org := op.bunchOrg; dy := op.bunchDy - ELSE org := op.org; dy := op.dy - END; - org0 := op.v.org; dy0 := op.v.dy; - IF op.silent THEN - op.v.org := org; op.v.dy := dy; op.silent := FALSE - ELSE - AdjustLines(op.v, org, dy, shift, rebuild); ShowAdjusted(op.v, shift, rebuild) - END; - IF op.bunch THEN op.bunch := FALSE ELSE op.org := org0; op.dy := dy0 END - END Do; - - PROCEDURE DoSetOrigin (v: StdView; org, dy: INTEGER; silent: BOOLEAN); - (* pre: org = v.ThisSetter().ThisLine(org) *) - VAR con: Models.Context; last: Stores.Operation; op: ScrollOp; - shift: INTEGER; rebuild: BOOLEAN; - BEGIN - IF (org # v.org) OR (dy # v.dy) THEN - con := v.context; - IF con # NIL THEN - IF (v.Domain() = NIL) OR con.Normalize() THEN - IF silent THEN - v.org := org; v.dy := dy - ELSE - AdjustLines(v, org, dy, shift, rebuild); ShowAdjusted(v, shift, rebuild) - END - ELSE - last := Views.LastOp(v); - IF (last # NIL) & (last IS ScrollOp) THEN - op := last(ScrollOp); - op.bunch := TRUE; op.bunchOrg := org; op.bunchDy := dy; - op.silent := silent; - Views.Bunch(v) - ELSE - NEW(op); op.v := v; op.org := org; op.dy := dy; - op.bunch := FALSE; - op.silent := silent; - Views.Do(v, scrollingKey, op) - END - END - ELSE - v.org := org; v.dy := dy - END - END - END DoSetOrigin; - - - (* SetOp *) - - PROCEDURE (op: SetOp) Do; - VAR v: StdView; m: BOOLEAN; - a: TextModels.Attributes; r: TextRulers.Ruler; s: TextSetters.Setter; - BEGIN - v := op.view; - CASE op.mode OF - setMarks: - m := v.hideMarks; v.hideMarks := op.hideMarks; op.hideMarks := m - | setSetter: - s := v.setter; - IF s # NIL THEN s.ConnectTo(NIL, NIL, 0, FALSE) END; - v.setter := op.setter; op.setter := s - | setDefs: - r := v.defRuler; a := v.defAttr; - v.defRuler := op.defRuler; v.defAttr := op.defAttr; - op.defRuler := r; op.defAttr := a; -(* - IF (v.defAttr.Domain() # NIL) & (v.defAttr.Domain() # v.Domain()) THEN - v.defAttr := Stores.CopyOf(v.defAttr)(TextModels.Attributes) - END; - Stores.Join(v, v.defAttr); -*) - IF v.defAttr # NIL THEN (* could be for undo operations *) - IF ~Stores.Joined(v, v.defAttr) THEN - IF ~Stores.Unattached(v.defAttr) THEN - v.defAttr := Stores.CopyOf(v.defAttr)(TextModels.Attributes) - END; - Stores.Join(v, v.defAttr) - END; - END; - - IF v.defRuler # NIL THEN Stores.Join(v, v.defRuler) END; - END; - RebuildView(v) - END Do; - - PROCEDURE DoSet (op: SetOp; mode: INTEGER; v: StdView); - BEGIN - op.mode := mode; op.view := v; Views.Do(v, viewSettingKey, op) - END DoSet; - - - (* StdView *) - - PROCEDURE (v: StdView) Internalize2 (VAR rd: Stores.Reader); - VAR st: Stores.Store; r: TextRulers.Ruler; a: TextModels.Attributes; - org, dy: INTEGER; thisVersion: INTEGER; hideMarks: BOOLEAN; - BEGIN - v.Internalize2^(rd); - IF rd.cancelled THEN RETURN END; - rd.ReadVersion(minVersion, maxStdVersion, thisVersion); - IF rd.cancelled THEN RETURN END; - rd.ReadBool(hideMarks); - rd.ReadStore(st); ASSERT(st # NIL, 100); - IF ~(st IS TextRulers.Ruler) THEN - rd.TurnIntoAlien(Stores.alienComponent); - Stores.Report("#Text:AlienDefaultRuler", "", "", ""); - RETURN - END; - r := st(TextRulers.Ruler); - TextModels.ReadAttr(rd, a); - rd.ReadInt(org); rd.ReadInt(dy); - v.DisplayMarks(hideMarks); - v.setter := TextSetters.dir.New(); v.setter0 := NIL; - v.SetDefaults(r, a); v.SetOrigin(org, dy); - v.trailer := NIL; v.bot := 0 - END Internalize2; - - PROCEDURE (v: StdView) Externalize2 (VAR wr: Stores.Writer); - VAR org, dy: INTEGER; hideMarks: BOOLEAN; - a: Stores.Store; - BEGIN - v.Externalize2^(wr); - IF (v.context = NIL) OR v.context.Normalize() THEN - org := 0; dy := 0; hideMarks := TRUE - ELSE - org := v.org; dy := v.dy; hideMarks := v.hideMarks - END; - wr.WriteVersion(maxStdVersion); - wr.WriteBool(hideMarks); - a := Stores.CopyOf(v.defAttr); (*Stores.InitDomain(a, v.Domain());*) Stores.Join(v, a); - (* bkwd-comp hack: avoid link => so that pre release 1.3 Internalize can still read texts *) - wr.WriteStore(v.defRuler); - wr.WriteStore(a); - wr.WriteInt(org); wr.WriteInt(dy) - END Externalize2; - - PROCEDURE (v: StdView) CopyFromModelView2 (source: Views.View; model: Models.Model); - VAR s: TextSetters.Setter; r: TextRulers.Ruler; - BEGIN - (* v.CopyFromModelView^(source, model); *) - WITH source: StdView DO - s := Stores.CopyOf(source.setter)(TextSetters.Setter); - v.setter := s; v.setter0 := NIL; - r := TextRulers.CopyOf(source.defRuler, Views.deep); - v.DisplayMarks(source.HidesMarks()); - v.SetDefaults(r, source.defAttr); - v.trailer := NIL; v.bot := 0; - IF v.text = source.text THEN - v.org := source.org; v.dy := source.dy - END - END - END CopyFromModelView2; - - PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER); - VAR st: TextSetters.Setter; u0, u: Line; - y0, y, w, h: INTEGER; end: INTEGER; pageF: BOOLEAN; - BEGIN - ASSERT(v.context # NIL, 20); - IF v.setter # NIL THEN v.context.GetSize(w, h) END; - IF (v.setter = NIL) OR (v.setter.vw # w) THEN - Views.RemoveFrames(f, l, t, r, b) - END; - ValidateLines(v, b); - u := v.trailer.next; y := v.dy; - pageF := Views.IsPrinterFrame(f) & v.context.Normalize(); - IF pageF THEN (* on page-formatted frames do not display truncated lines at bottom *) - st := v.ThisSetter(); end := st.NextPage(f.b - f.t, v.org) - END; - WHILE (u # v.trailer) & (y + u.h <= t) DO INC(y, u.h); u := u.next END; - y0 := y; u0 := u; - IF (u = v.trailer.next) & (y < b) THEN (* at least one line per page *) - ASSERT((u.box.len > 0) OR u.box.eot OR (u.next = v.trailer), 100); - DrawLine(v, u.start, u.box, f, l, r, y + u.asc, y + u.h - u.box.dsc - u.box.asc, pageF); - INC(y, u.h); u := u.next - END; - WHILE (u # v.trailer) & (y < b) & (~pageF OR (u.start < end)) DO - ASSERT((u.box.len > 0) OR u.box.eot OR (u.next = v.trailer), 101); - IF u.box.ruler # u0.box.ruler THEN - DrawDecorations(v, u0, f, l, y0, r, y); u0 := u; y0 := y - END; - DrawLine(v, u.start, u.box, f, l, r, y + u.asc, y + u.h - u.box.dsc - u.box.asc, pageF); - INC(y, u.h); u := u.next - END; - IF y0 # y THEN DrawDecorations(v, u0, f, l, y0, r, y) END - END Restore; - - PROCEDURE (v: StdView) DisplayMarks (hide: BOOLEAN); - VAR op: SetOp; c: Containers.Controller; - BEGIN - IF v.hideMarks # hide THEN - c := v.ThisController(); - IF c # NIL THEN Containers.FadeMarks(c, Containers.hide) END; - IF (v.context # NIL) & ~v.context.Normalize() THEN - NEW(op); op.hideMarks := hide; DoSet(op, setMarks, v) - ELSE - v.hideMarks := hide; RebuildView(v) - END - END - END DisplayMarks; - - PROCEDURE (v: StdView) HidesMarks (): BOOLEAN; - BEGIN - RETURN v.hideMarks - END HidesMarks; - - PROCEDURE (v: StdView) SetSetter (setter: TextSetters.Setter); - VAR op: SetOp; - BEGIN - ASSERT(setter # NIL, 20); - IF v.setter # setter THEN - IF v.setter # NIL THEN - NEW(op); op.setter := setter; DoSet(op, setSetter, v) - ELSE v.setter := setter - END - END - END SetSetter; - - PROCEDURE (v: StdView) ThisSetter (): TextSetters.Setter; - VAR st: TextSetters.Setter; w, h: INTEGER; - BEGIN - st := v.setter; ASSERT(st # NIL, 20); - IF st # v.setter0 THEN - IF v.context # NIL THEN - v.context.GetSize(w, h) - ELSE - IF Dialog.metricSystem THEN - w := 165*mm - ELSE - w := 104*inch16 - END - END; - st.ConnectTo(v.text, v.defRuler, w, v.hideMarks); - v.setter0 := st - END; - RETURN st - END ThisSetter; - - PROCEDURE (d: StdView) AcceptableModel (m: Containers.Model): BOOLEAN; - BEGIN - RETURN m IS TextModels.Model - END AcceptableModel; - - PROCEDURE (v: StdView) InitModel2 (m: Containers.Model); - BEGIN - ASSERT(m IS TextModels.Model, 23); - v.text := m(TextModels.Model) - END InitModel2; - - PROCEDURE (v: StdView) SetOrigin (org, dy: INTEGER); - VAR st: TextSetters.Setter; start: INTEGER; - BEGIN - ASSERT(v.text # NIL, 20); - st := v.ThisSetter(); start := st.ThisLine(org); - IF start # org THEN org := start; dy := 0 END; - DoSetOrigin(v, org, dy, FALSE) - END SetOrigin; - - PROCEDURE (v: StdView) PollOrigin (OUT org, dy: INTEGER); - BEGIN - org := v.org; dy := v.dy - END PollOrigin; - - PROCEDURE (v: StdView) SetDefaults (r: TextRulers.Ruler; a: TextModels.Attributes); - VAR op: SetOp; - BEGIN - ASSERT(r # NIL, 20); ASSERT(r.style.attr.init, 21); - ASSERT(a # NIL, 22); ASSERT(a.init, 23); - IF (v.defRuler # r) OR (v.defAttr # a) THEN -(* - (*IF (v.context # NIL) & (r # v.defRuler) THEN*) - IF (v.Domain() # NIL) & (r # v.defRuler) THEN - Stores.InitDomain(r, v.Domain()) - END; -*) - IF r # v.defRuler THEN Stores.Join(v, r) END; - NEW(op); op.defRuler := r; op.defAttr := a; DoSet(op, setDefs, v) - END - END SetDefaults; - - PROCEDURE (v: StdView) PollDefaults (OUT r: TextRulers.Ruler; OUT a: TextModels.Attributes); - BEGIN - r := v.defRuler; a := v.defAttr - END PollDefaults; - -(* - PROCEDURE (v: StdView) PropagateDomain; - VAR m: Models.Model; - BEGIN - ASSERT(v.setter # NIL, 20); ASSERT(v.text # NIL, 21); - ASSERT(v.defRuler # NIL, 22); ASSERT(v.defAttr # NIL, 23); - v.PropagateDomain^; - m := v.ThisModel(); - IF m # NIL THEN Stores.InitDomain(m, v.Domain()) END; - Stores.InitDomain(v.defRuler, v.Domain()) - END PropagateDomain; - *) -(* - PROCEDURE (v: StdView) Flush, NEW; - BEGIN - v.trailer := NIL; v.bot := 0; v.setter0 := NIL - END Flush; -*) - PROCEDURE (v: StdView) HandleModelMsg2 (VAR msg: Models.Message); - BEGIN - IF msg.model = v.text THEN - WITH msg: Models.UpdateMsg DO - WITH msg: TextModels.UpdateMsg DO - IF msg.op IN {TextModels.insert, TextModels.delete, TextModels.replace} THEN - UpdateView(v, msg.beg, msg.end, msg.delta) - ELSE (* unknown text op happened *) - RebuildView(v) - END - ELSE (* unknown text update happened *) - RebuildView(v) - END - | msg: PositionMsg DO - v.ShowRange(msg.beg, msg.end, msg.focusOnly) - ELSE - END - ELSE (* domaincast received *) - WITH msg: TextRulers.UpdateMsg DO - StyleUpdate(v, msg.oldAttr) - | msg: Models.UpdateMsg DO (* forced rebuild *) - RebuildView(v) - ELSE - END - END - END HandleModelMsg2; - - PROCEDURE (v: StdView) HandleViewMsg2 (f: Views.Frame; VAR msg: Views.Message); - BEGIN - IF msg.view = v THEN - WITH msg: FindAnyFrameMsg DO - IF (msg.frame = NIL) OR (msg.frame.b - msg.frame.t > f.b - f.t) THEN msg.frame := f END - ELSE - END - ELSE - WITH msg: Views.UpdateCachesMsg DO (* display view in new frame *) - IF Views.Era(v) # Models.Era(v.text) THEN - (* view/setter caches outdated - possible if v previous to this notification had no frame open *) - v.setter0 := NIL; v.trailer := NIL; v.bot := 0 - END - ELSE - END - END - END HandleViewMsg2; - - PROCEDURE (v: StdView) HandleCtrlMsg2 (f: Views.Frame; - VAR msg: Controllers.Message; VAR focus: Views.View - ); - BEGIN - WITH msg: Controllers.PollSectionMsg DO - IF (focus = NIL) OR ~msg.focus THEN - PollSection(v, f, msg); - focus := NIL - END - | msg: FindFocusFrameMsg DO - IF (msg.view = v) & (msg.frame = NIL) THEN msg.frame := f END - | msg: Controllers.ScrollMsg DO - IF (focus = NIL) OR ~msg.focus THEN - Scroll(v, f, msg); - focus := NIL - END - | msg: Controllers.PageMsg DO - Page(v, f.b - f.t, msg.op, msg.pageY, msg.done, msg.eoy); - focus := NIL - ELSE - END - END HandleCtrlMsg2; - - PROCEDURE (v: StdView) HandlePropMsg2 (VAR p: Properties.Message); - CONST minW = 5 * point; maxW = maxHeight; minH = 5 * point; maxH = maxHeight; - VAR st: TextSetters.Setter; - BEGIN - WITH p: Properties.SizePref DO - IF p.w = Views.undefined THEN p.w := v.defRuler.style.attr.right END; - IF p.h = Views.undefined THEN p.h := MAX(INTEGER) END - | p: Properties.BoundsPref DO - st := v.ThisSetter(); - st.GetBox(0, v.text.Length(), maxW, maxH, p.w, p.h); - IF p.w < minW THEN p.w := minW END; - IF p.h < minH THEN p.h := minH END - | p: Properties.ResizePref DO - p.fixed := FALSE; - p.horFitToPage := ~(TextRulers.rightFixed IN v.defRuler.style.attr.opts); - p.verFitToWin := TRUE - | p: Properties.TypePref DO - IF Services.Is(v, p.type) THEN p.view := v END - | p: Containers.DropPref DO - p.okToDrop := TRUE - ELSE - END - END HandlePropMsg2; - - - PROCEDURE (v: StdView) GetThisLocation (f: Views.Frame; pos: INTEGER; OUT loc: Location); - (* pre: f must be displayed *) - (* if position lies outside view, the next best location inside will be taken *) - VAR rd: TextSetters.Reader; t: Line; p1, y, w, h: INTEGER; - BEGIN - ValidateLines(v, f.b); - y := v.dy; - IF pos < v.org THEN - t := v.trailer.next; - loc.start := t.start; loc.pos := t.start; - loc.x := 0; loc.y := y; loc.asc := t.asc; loc.dsc := t.h - t.asc; loc.view := NIL; - RETURN - ELSIF pos < v.trailer.start THEN - t := v.trailer.next; - WHILE ~t.box.eot & ~((t.start <= pos) & (pos < t.next.start)) DO - INC(y, t.h); t := t.next - END - ELSE (* pos >= v.trailer.start *) - t := v.trailer.next; WHILE ~t.box.eot DO INC(y, t.h); t := t.next END; - IF t = v.trailer THEN - loc.start := t.start; loc.pos := t.start; - loc.x := 0; loc.y := y; loc.asc := t.asc; loc.dsc := t.h - t.asc; loc.view := NIL; - RETURN - END - END; - p1 := t.start; - rd := GetReader(v, p1, t.box); rd.Read; - WHILE rd.pos < pos DO - p1 := rd.pos; rd.AdjustWidth(t.start, p1, t.box, rd.w); INC(rd.x, rd.w); rd.Read - END; - IF LEN(rd.string$) > 1 THEN (* collated subsequence *) - rd.x := f.CharPos(rd.x, pos - p1, rd.string, rd.attr.font); - IF rd.pos = pos THEN rd.Read END - ELSIF rd.pos = pos THEN - rd.AdjustWidth(t.start, pos, t.box, rd.w); INC(rd.x, rd.w); rd.Read - ELSE - ASSERT(p1 = pos, 100) - END; - loc.view := rd.view; - loc.start := t.start; loc.pos := pos; - loc.x := rd.x; loc.y := y; loc.asc := t.asc; loc.dsc := t.h - t.asc; - IF loc.view # NIL THEN - v.context.GetSize(w, h); - IF rd.x + rd.w > w THEN rd.w := w - rd.x END; - loc.l := rd.x; loc.t := y - rd.attr.offset + t.asc + rd.dsc - rd.h; - loc.r := loc.l + rd.w; loc.b := loc.t + rd.h - END; - CacheReader(v, rd) - END GetThisLocation; - - PROCEDURE (v: StdView) GetRange (f: Views.Frame; OUT beg, end: INTEGER); - VAR t: Line; - BEGIN - ValidateLines(v, f.b); - t := ThisViewLine(v, f.t); beg := t.start; end := Limit(v, f.b, TRUE) - END GetRange; - - PROCEDURE (v: StdView) ThisPos (f: Views.Frame; x, y: INTEGER): INTEGER; - (* pre: f must be displayed *) - (* post: f.org <= result <= v.text.Length() *) - VAR rd: TextSetters.Reader; t: Line; p1, end, py: INTEGER; - BEGIN - ValidateLines(v, f.b); - t := v.trailer.next; py := v.dy; - WHILE ~t.box.eot & (py + t.h <= y) DO INC(py, t.h); t := t.next END; - p1 := t.start; end := p1 + t.box.len; - IF py + t.h > y THEN - IF (end > p1) & (y >= v.dy) THEN - IF t.box.eot THEN INC(end) END; - rd := GetReader(v, p1, t.box); - rd.Read; rd.AdjustWidth(t.start, rd.pos, t.box, rd.w); - WHILE (rd.x + rd.SplitWidth(rd.w) < x) & (rd.pos < end) DO - p1 := rd.pos; INC(rd.x, rd.w); - rd.Read; rd.AdjustWidth(t.start, rd.pos, t.box, rd.w) - END; - IF LEN(rd.string$) > 1 THEN (* collated subsequence *) - INC(p1, f.CharIndex(rd.x, x, rd.string, rd.attr.font)) - END; - CacheReader(v, rd) - END - ELSE p1 := end - END; - RETURN p1 - END ThisPos; - - PROCEDURE (v: StdView) ShowRangeIn (f: Views.Frame; beg, end: INTEGER); - CONST minH = 12 * point; - VAR c: Models.Context; st: TextSetters.Setter; t, t1: Line; - org0, last, len, org, dy, p, q: INTEGER; y, h, mh: INTEGER; - box, box0: TextSetters.LineBox; loc, loc1: Location; - focus: BOOLEAN; - BEGIN - focus := f = Controllers.FocusFrame(); - c := v.context; - st := v.ThisSetter(); ValidateLines(v, f.b); org0 := v.org; - last := Limit(v, f.b, FALSE); len := v.text.Length(); - IF last = len THEN p := st.ThisLine(last); LocateThisLine(v, p, t1, y); h := f.b - y END; - IF (beg > last) - OR (beg = last) & ((last < len) OR (len > 0) & (h < t1.h) & (h < minH)) - OR (end < org0) - OR (beg < end) & (end = org0) THEN - org := -1; dy := 0; - IF beg <= org0 THEN (* try to adjust by scrolling up *) - p := st.PreviousLine(v.org); - IF p <= beg THEN (* reveal one line at top *) - org := p; st.GetLine(org, box); - h := box.asc + box.dsc + st.GridOffset(-1, box); - IF h > maxScrollHeight + fuseScrollHeight THEN - dy := -(h - h MOD maxScrollHeight); - IF h + dy < fuseScrollHeight THEN INC(dy, maxScrollHeight) END - END - END - END; - IF (org = -1) & (beg >= last) THEN (* try to adjust by scrolling down *) - p := st.ThisLine(last); q := st.NextLine(p); st.GetLine(q, box); - IF (beg < q + box.len) OR (p = q) THEN (* reveal one line at bottom *) - LocateThisLine(v, p, t1, y); - h := box.asc + box.dsc + st.GridOffset(t1.box.dsc, box); - IF h > maxScrollHeight + fuseScrollHeight THEN h := maxScrollHeight END; - mh := y + t1.h - f.b + h; - t := v.trailer.next; h := v.dy; - WHILE (t # v.trailer) & (h < mh) DO INC(h, t.h); t := t.next END; - IF t.start > v.org THEN org := t.start END - END - END; - IF org = -1 THEN (* adjust by moving into "nice" position *) - mh := f.b DIV 3; - org := st.ThisLine(beg); st.GetLine(org, box0); - h := box0.asc + box0.dsc + st.GridOffset(-1, box0); p := org; - WHILE (p > 0) & (h < mh) DO - DEC(h, st.GridOffset(-1, box0)); org := p; - p := st.PreviousLine(org); st.GetLine(p, box); - INC(h, box.asc + box.dsc + st.GridOffset(box.dsc, box0)); - box0 := box - END; - IF (org = len) & (len > 0) THEN org := st.PreviousLine(org) END - END; - DoSetOrigin(v, org, dy, FALSE) - END; - IF focus THEN - f := Controllers.FocusFrame(); - IF (f # NIL) & (f.view = v) THEN - - v.GetThisLocation(f, beg, loc); - v.GetThisLocation(f, end, loc1); - IF (loc.y = loc1.y) & (loc.x <= loc1.x) THEN - c.MakeVisible(loc.x, loc.y, loc1.x, loc1.y) - END - ELSE - HALT(100); (* this should not happen *) - END - END; -(* - IF c IS Documents.Context THEN - v.GetThisLocation(f, beg, loc); - v.GetThisLocation(f, end, loc1); - IF (loc.y = loc1.y) & (loc.x <= loc1.x) THEN - Documents.MakeVisible(c(Documents.Context).ThisDoc(), f, loc.x, loc.y, loc1.x, loc1.y) - END - END -*) - END ShowRangeIn; - - PROCEDURE (v: StdView) ShowRange (beg, end: INTEGER; focusOnly: BOOLEAN); - VAR fmsg: FindFocusFrameMsg; amsg: FindAnyFrameMsg; f: Views.Frame; - BEGIN - IF focusOnly THEN - fmsg.view := v; fmsg.frame := NIL; Controllers.Forward(fmsg); f := fmsg.frame - ELSE - amsg.frame := NIL; Views.Broadcast(v, amsg); f := amsg.frame - END; - IF f # NIL THEN v.ShowRangeIn(f, beg, end) END - END ShowRange; - - - (* StdDirectory *) - - PROCEDURE (d: StdDirectory) New (text: TextModels.Model): View; - VAR v: StdView; c: Controllers.Controller; r: TextRulers.Ruler; - BEGIN - r := TextRulers.dir.New(NIL); - IF text = NIL THEN text := TextModels.dir.New() END; - (* IF text.Domain() # NIL THEN Stores.InitDomain(r, text.Domain()) END; *) - Stores.Join(text, r); - NEW(v); v.hideMarks := FALSE; v.bot := 0; v.org := 0; v.dy := 0; - v.InitModel(text); - v.SetDefaults(r, d.defAttr); - v.SetSetter(TextSetters.dir.New()); - v.DisplayMarks(hide); - IF ctrlDir # NIL THEN v.SetController(ctrlDir.New()) END; - (* Stores.InitDomain(v, text.Domain()); *) - Stores.Join(v, text); - RETURN v - END New; - - - PROCEDURE Init; - VAR d: StdDirectory; a: TextModels.Attributes; res: INTEGER; - BEGIN - Dialog.Call("TextControllers.Install", "#Text:CntrlInstallFailed", res); - NEW(a); a.InitFromProp(NIL); (* use defaults *) - NEW(d); d.defAttr := a; - stdDir := d; dir := d - END Init; - -BEGIN - Init -END TextViews. diff --git a/new/_LinuxOpenBSD_/Host/Mod/Lang.txt b/new/_LinuxOpenBSD_/Host/Mod/Lang.txt deleted file mode 100644 index c565553..0000000 --- a/new/_LinuxOpenBSD_/Host/Mod/Lang.txt +++ /dev/null @@ -1,121 +0,0 @@ -MODULE HostLang; - - (* THIS IS TEXT COPY OF Lang.odc *) - (* DO NOT EDIT *) - - (* - A. V. Shiryaev, 2012.10 - - LANG environment variable support - Dialog.LanguageHook implementation - *) - - IMPORT Dialog, Libc := LinLibc; - - CONST - defLang = ""; - defCountry = ""; - defEnc = "ASCII"; - - TYPE - LanguageHook = POINTER TO RECORD (Dialog.LanguageHook) END; - - Country = ARRAY 3 OF SHORTCHAR; - Encoding = ARRAY 32 OF SHORTCHAR; - - VAR - lang-: Dialog.Language; - enc-: Encoding; - - PROCEDURE ParseLang (OUT lang: Dialog.Language; OUT country: Country; OUT enc: Encoding); - VAR env: Libc.PtrSTR; - i, j: INTEGER; - - PROCEDURE Default; - BEGIN - lang := defLang; - country := defCountry; - enc := defEnc - END Default; - - PROCEDURE IsValidEncChar (x: SHORTCHAR): BOOLEAN; - BEGIN - RETURN ((x >= 'A') & (x <= 'Z')) OR ((x >= '0') & (x <= '9')) OR (x = '-') OR (x = '_') - OR ((x >= 'a') & (x <= 'z')) - END IsValidEncChar; - - BEGIN - env := Libc.getenv("LANG"); - IF env # NIL THEN - IF env$ = "C" THEN - lang := ""; country := ""; enc := "ASCII" - ELSE - i := 0; - WHILE (i < 2) & (env[i] >= 'a') & (env[i] <= 'z') & (i < LEN(lang) - 1) DO - lang[i] := env[i]; - INC(i) - END; - IF (i = 2) & (env[i] = '_') & (i < LEN(lang)) THEN - lang[i] := 0X; - INC(i); - j := 0; - WHILE (i < 5) & (env[i] >= 'A') & (env[i] <= 'Z') & (j < LEN(country) - 1) DO - country[j] := env[i]; - INC(j); INC(i) - END; - IF (i = 5) & (env[i] = '.') & (j < LEN(country)) THEN - country[j] := 0X; - INC(i); - j := 0; - WHILE IsValidEncChar(env[i]) & (j < LEN(enc) - 1) DO - enc[j] := env[i]; - INC(j); INC(i) - END; - IF (env[i] = 0X) & (j < LEN(enc)) THEN - enc[j] := 0X - ELSE Default - END - ELSE Default - END - ELSE Default - END - END - ELSE Default - END - END ParseLang; - - PROCEDURE (hook: LanguageHook) SetLanguage ( - lang: Dialog.Language; persistent: BOOLEAN; OUT ok: BOOLEAN - ); - BEGIN - ok := (lang = "") OR (LEN(lang$) = 2); -(* - IF ok & persistent THEN HostRegistry.WriteString("language", lang) END -*) - END SetLanguage; - - PROCEDURE (hook: LanguageHook) GetPersistentLanguage (OUT l: Dialog.Language); - VAR res: INTEGER; s: ARRAY 32 OF CHAR; - BEGIN -(* - HostRegistry.ReadString("language", s, res); - IF res = 0 THEN - ASSERT((s = "") OR (LEN(s$) = 2), 100); - lang := s$ - ELSE lang := "" - END -*) - l := lang - END GetPersistentLanguage; - - PROCEDURE Init; - VAR languageHook: LanguageHook; - country: Country; - BEGIN - ParseLang(lang, country, enc); - NEW(languageHook); Dialog.SetLanguageHook(languageHook); Dialog.ResetLanguage - END Init; - -BEGIN - Init -END HostLang. diff --git a/new/_LinuxOpenBSD_/Host/Mod/TextConv.txt b/new/_LinuxOpenBSD_/Host/Mod/TextConv.txt deleted file mode 100644 index f539a8f..0000000 --- a/new/_LinuxOpenBSD_/Host/Mod/TextConv.txt +++ /dev/null @@ -1,1155 +0,0 @@ -MODULE HostTextConv; - - (* THIS IS TEXT COPY OF TextConv.odc *) - (* DO NOT EDIT *) - - IMPORT - SYSTEM, (* WinApi, WinOle, COM, *) - Files, Fonts, Ports, Stores, Views, Properties, - HostFonts, (* HostClipboard, *) TextModels, - TextRulers, TextViews, TextMappers; - - CONST - CR = 0DX; LF = 0AX; FF = 0EX; TAB = 09X; - halfpoint = Ports.point DIV 2; - twips = Ports.point DIV 20; - - TYPE - Context = POINTER TO RECORD - next: Context; - dest: INTEGER; - uniCnt : INTEGER; - attr: TextModels.Attributes; - pattr: TextRulers.Attributes - END; - MemReader = POINTER TO RECORD (Files.Reader) - adr, pos: INTEGER - END; - - VAR - debug*: BOOLEAN; - - - (* MemReader *) - - PROCEDURE (r: MemReader) Base (): Files.File; - BEGIN - RETURN NIL - END Base; - - PROCEDURE (r: MemReader) Pos (): INTEGER; - BEGIN - RETURN r.pos - END Pos; - - PROCEDURE (r: MemReader) SetPos (pos: INTEGER); - BEGIN - r.pos := pos - END SetPos; - - PROCEDURE (r: MemReader) ReadByte (OUT x: BYTE); - BEGIN - SYSTEM.GET(r.adr + r.pos, x); INC(r.pos) - END ReadByte; - - PROCEDURE (r: MemReader) ReadBytes (VAR x: ARRAY OF BYTE; beg, len: INTEGER); - BEGIN - HALT(126) - END ReadBytes; - -(* - PROCEDURE GenGlobalMedium (hg: WinApi.HGLOBAL; unk: COM.IUnknown; VAR sm: WinOle.STGMEDIUM); - BEGIN - sm.tymed := WinOle.TYMED_HGLOBAL; - sm.u.hGlobal := hg; - sm.pUnkForRelease := unk - END GenGlobalMedium; - - PROCEDURE MediumGlobal (VAR sm: WinOle.STGMEDIUM): WinApi.HGLOBAL; - BEGIN - ASSERT(sm.tymed = WinOle.TYMED_HGLOBAL, 20); - RETURN sm.u.hGlobal - END MediumGlobal; -*) - - PROCEDURE WriteWndChar (wr: TextModels.Writer; ch: CHAR); - BEGIN - CASE ch OF - | CR, TAB, " "..7EX, 0A0X..0FFX: wr.WriteChar(ch) - | LF: - | 80X: wr.WriteChar(20ACX) (* euro *) - | 82X: wr.WriteChar(201AX) - | 83X: wr.WriteChar(0192X) - | 84X: wr.WriteChar(201EX) - | 85X: wr.WriteChar(2026X) - | 86X: wr.WriteChar(2020X) - | 87X: wr.WriteChar(2021X) - | 88X: wr.WriteChar(02C6X) - | 89X: wr.WriteChar(2030X) - | 8AX: wr.WriteChar(0160X) - | 8BX: wr.WriteChar(2039X) - | 8CX: wr.WriteChar(0152X) - | 91X: wr.WriteChar(2018X) - | 92X: wr.WriteChar(2019X) - | 93X: wr.WriteChar(201CX) - | 94X: wr.WriteChar(201DX) - | 95X: wr.WriteChar(2022X) - | 96X: wr.WriteChar(2013X) - | 97X: wr.WriteChar(2014X) - | 98X: wr.WriteChar(02DCX) - | 99X: wr.WriteChar(2122X) - | 9AX: wr.WriteChar(0161X) - | 9BX: wr.WriteChar(203AX) - | 9CX: wr.WriteChar(0153X) - | 9FX: wr.WriteChar(0178X) - | 0X..8X, 0BX, 0CX, 0EX..1FX, 7FX, 81X, 8DX..90X, 9DX, 9EX: - wr.WriteChar(CHR(0EF00H + ORD(ch))) - END - END WriteWndChar; - - PROCEDURE ThisWndChar (ch: CHAR): CHAR; - BEGIN - IF ch >= 100X THEN - IF (ch >= 0EF00X) & (ch <= 0EFFFX) THEN ch := CHR(ORD(ch) - 0EF00H) - ELSIF ch = 20ACX THEN ch := 80X (* euro *) - ELSIF ch = 201AX THEN ch := 82X - ELSIF ch = 0192X THEN ch := 83X - ELSIF ch = 201EX THEN ch := 84X - ELSIF ch = 2026X THEN ch := 85X - ELSIF ch = 2020X THEN ch := 86X - ELSIF ch = 2021X THEN ch := 87X - ELSIF ch = 02C6X THEN ch := 88X - ELSIF ch = 2030X THEN ch := 89X - ELSIF ch = 0160X THEN ch := 8AX - ELSIF ch = 2039X THEN ch := 8BX - ELSIF ch = 0152X THEN ch := 8CX - ELSIF ch = 2018X THEN ch := 91X - ELSIF ch = 2019X THEN ch := 92X - ELSIF ch = 201CX THEN ch := 93X - ELSIF ch = 201DX THEN ch := 94X - ELSIF ch = 2022X THEN ch := 95X - ELSIF ch = 2013X THEN ch := 96X - ELSIF ch = 2014X THEN ch := 97X - ELSIF ch = 02DCX THEN ch := 98X - ELSIF ch = 2122X THEN ch := 99X - ELSIF ch = 0161X THEN ch := 9AX - ELSIF ch = 203AX THEN ch := 9BX - ELSIF ch = 0153X THEN ch := 9CX - ELSIF ch = 0178X THEN ch := 9FX - ELSE ch := "?" - END - ELSIF ch = 08FX THEN ch := " " (* digit space *) - END; - RETURN ch - END ThisWndChar; - - PROCEDURE ParseRichText (rd: Files.Reader; wr: TextModels.Writer; VAR defRuler: TextRulers.Ruler); - TYPE - FontInfo = POINTER TO RECORD id: INTEGER; f: Fonts.Typeface; next: FontInfo END; - ColorInfo = POINTER TO RECORD id: INTEGER; c: Ports.Color; next: ColorInfo END; - CONST text = 0; fonttab = 1; colortab = 2; skip = 3; - VAR ch: CHAR; tabStyle: SET; - fact, val, defFont, dest, idx, fnum, cnum, paraPos, i: INTEGER; - fonts, font: FontInfo; colors: ColorInfo; - hasNum, remPar, skipDest: BOOLEAN; - f: Fonts.Font; comm: ARRAY 32 OF CHAR; - c, con: Context; p0: Properties.Property; p: TextRulers.Prop; - ruler: TextRulers.Ruler; - pattr: TextRulers.Attributes; - skipCnt, uniCnt : INTEGER; - - PROCEDURE Color(i: INTEGER): ColorInfo; - VAR c: ColorInfo; - BEGIN - ASSERT(colors # NIL, 20); - c := colors; - WHILE (c # NIL) & (c.id # i) DO c := c.next END; - ASSERT(c # NIL, 100); - RETURN c - END Color; - - PROCEDURE SetColor(i: INTEGER; c: Ports.Color); - VAR ci: ColorInfo; - BEGIN - NEW(ci); ci.id := i; ci.c := c; ci.next := colors; colors := ci - END SetColor; - - PROCEDURE Font(i: INTEGER): FontInfo; - VAR f: FontInfo; - BEGIN - ASSERT(fonts # NIL, 20); - f := fonts; - WHILE (f # NIL) & (f.id # i) DO f := f.next END; - ASSERT(f # NIL, 100); - RETURN f - END Font; - - PROCEDURE SetFont(i: INTEGER; tf: Fonts.Typeface); - VAR f: FontInfo; - BEGIN - NEW(f); f.id := i; f.f := tf; f.next := fonts; fonts := f - END SetFont; - - PROCEDURE Next (VAR ch: CHAR); - VAR b: BYTE; - BEGIN - rd.ReadByte(b); ch := CHR(b MOD 256) - END Next; - - PROCEDURE Write (ch: CHAR); - BEGIN - IF skipCnt > 0 THEN - DEC(skipCnt) - ELSIF dest = text THEN - IF ch < 100X THEN WriteWndChar(wr, ch) - ELSE wr.WriteChar(ch) - END - ELSIF dest = fonttab THEN - ASSERT(font # NIL, 20); - font.f[idx] := ch; INC(idx); font.f[idx] := 0X - END - END Write; - - PROCEDURE Paragraph; - VAR v: Views.View; - BEGIN - IF ~pattr.Equals(ruler.style.attr) THEN (* new ruler needed *) - wr.SetPos(paraPos); - v := Views.CopyOf(ruler, Views.deep); ruler := v(TextRulers.Ruler); - ruler.style.SetAttr(pattr); - wr.WriteView(ruler, Views.undefined, Views.undefined); - wr.SetPos(wr.Base().Length()) - ELSIF (pattr.first # pattr.left) - OR (pattr.lead > 0) - OR (TextRulers.pageBreak IN pattr.opts) THEN (* paragraph marker needed *) - wr.SetPos(paraPos); - wr.WriteChar(FF); - wr.SetPos(wr.Base().Length()) - END; - wr.WriteChar(CR); - paraPos := wr.Pos() - END Paragraph; - - BEGIN - defFont := 0; fnum := 1; f := Fonts.dir.Default(); NEW(fonts); fonts.f := f.typeface; skipCnt := 0; uniCnt := 1; - cnum := 1; NEW(colors); SetColor(0, Ports.defaultColor); - dest := text; con := NIL; paraPos := 0; remPar := FALSE; skipDest := FALSE; - defRuler := TextRulers.dir.New(NIL); ruler := defRuler; pattr := defRuler.style.attr; tabStyle := {}; - Next(ch); - WHILE ch # 0X DO - IF ch = "{" THEN - skipCnt := 0; - NEW(c); c.dest := dest; c.attr := wr.attr; c.pattr := pattr; c.uniCnt := uniCnt; c.next := con; con := c; - Next(ch) - ELSIF ch = "}" THEN - skipCnt := 0; - IF con # NIL THEN - dest := con.dest; uniCnt := con.uniCnt; wr.SetAttr(con.attr); pattr := con.pattr; con := con.next - END; - Next(ch) - ELSIF ch = "\" THEN - Next(ch); i := 0; val := 0; - IF (ch >= "a") & (ch <= "z") THEN - WHILE (ch >= "a") & (ch <= "z") DO comm[i] := ch; INC(i); Next(ch) END; - comm[i] := 0X; fact := 1; hasNum := FALSE; - IF ch = "-" THEN fact := -1; Next(ch) END; - WHILE (ch >= "0") & (ch <= "9") DO - val := 10 * val + ORD(ch) - ORD("0"); Next(ch); hasNum := TRUE - END; - val := val * fact; - IF ch = " " THEN Next(ch) END; - (* special characters *) - IF skipCnt > 0 THEN DEC(skipCnt) (* command skipped as single character *) - ELSIF comm = "tab" THEN Write(TAB) - ELSIF comm = "line" THEN Write(CR) - ELSIF comm = "par" THEN Paragraph - ELSIF comm = "sect" THEN Paragraph - ELSIF comm = "ldblquote" THEN Write(201CX) (* unicode: left double quote *) - ELSIF comm = "rdblquote" THEN Write(201DX) (* unicode: right double quote *) - ELSIF comm = "lquote" THEN Write(2018X) (* unicode: left single quote *) - ELSIF comm = "rquote" THEN Write(2019X) (* unicode: right single quote *) - ELSIF comm = "enspace" THEN Write(2002X) (* unicode: en space *) - ELSIF comm = "emspace" THEN Write(2003X) (* unicode: em space *) - ELSIF comm = "endash" THEN Write(2013X) (* unicode: en dash *) - ELSIF comm = "emdash" THEN Write(2014X) (* unicode: em dash *) - ELSIF comm = "page" THEN - Paragraph; NEW(p); - p.valid := {TextRulers.opts}; p.opts.val := {TextRulers.pageBreak}; p.opts.mask := p.opts.val; - pattr := TextRulers.ModifiedAttr(pattr, p) - (* character attributes *) - ELSIF comm = "plain" THEN - wr.SetAttr(TextModels.NewWeight(wr.attr, Fonts.normal)); - wr.SetAttr(TextModels.NewStyle(wr.attr, {})); - wr.SetAttr(TextModels.NewTypeface(wr.attr, Font(defFont).f)); - wr.SetAttr(TextModels.NewSize(wr.attr, 24 * halfpoint)); - wr.SetAttr(TextModels.NewColor(wr.attr, Ports.defaultColor)); - wr.SetAttr(TextModels.NewOffset(wr.attr, 0)) - ELSIF comm = "b" THEN - IF hasNum & (val = 0) THEN wr.SetAttr(TextModels.NewWeight(wr.attr, Fonts.normal)) - ELSE wr.SetAttr(TextModels.NewWeight(wr.attr, Fonts.bold)) - END - ELSIF comm = "i" THEN - IF hasNum & (val = 0) THEN - wr.SetAttr(TextModels.NewStyle(wr.attr, wr.attr.font.style - {Fonts.italic})) - ELSE wr.SetAttr(TextModels.NewStyle(wr.attr, wr.attr.font.style + {Fonts.italic})) - END - ELSIF comm = "ul" THEN - IF hasNum & (val = 0) THEN - wr.SetAttr(TextModels.NewStyle(wr.attr, wr.attr.font.style - {Fonts.underline})) - ELSE wr.SetAttr(TextModels.NewStyle(wr.attr, wr.attr.font.style + {Fonts.underline})) - END - ELSIF comm = "strike" THEN - IF hasNum & (val = 0) THEN - wr.SetAttr(TextModels.NewStyle(wr.attr, wr.attr.font.style - {Fonts.strikeout})) - ELSE wr.SetAttr(TextModels.NewStyle(wr.attr, wr.attr.font.style + {Fonts.strikeout})) - END - ELSIF comm = "f" THEN - IF ~hasNum THEN val := defFont END; - IF dest = fonttab THEN - fnum := val; idx := 0; NEW(font); font.id := val; font.next := fonts; fonts := font - ELSE - wr.SetAttr(TextModels.NewTypeface(wr.attr, Font(val).f)) - END - ELSIF comm = "fs" THEN - IF ~hasNum THEN val := 24 END; - wr.SetAttr(TextModels.NewSize(wr.attr, val * halfpoint)) - ELSIF comm = "cf" THEN - wr.SetAttr(TextModels.NewColor(wr.attr, Color(val).c)) - ELSIF comm = "dn" THEN - IF ~hasNum THEN val := 6 END; - wr.SetAttr(TextModels.NewOffset(wr.attr, -(val * halfpoint))) - ELSIF comm = "up" THEN - IF ~hasNum THEN val := 6 END; - wr.SetAttr(TextModels.NewOffset(wr.attr, val * halfpoint)) - (* paragraph attributes *) - ELSIF comm = "pard" THEN - pattr := defRuler.style.attr; tabStyle := {} - ELSIF comm = "fi" THEN - NEW(p); - p.valid := {TextRulers.first}; p.first := pattr.left + val * twips; - IF p.first < 0 THEN (* change left indent to make the value legal *) - p.valid := {TextRulers.left, TextRulers.first}; - p.left := pattr.left - p.first; p.first := 0 - END; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "li" THEN - NEW(p); - p.valid := {TextRulers.left, TextRulers.first}; - p.left := val * twips; p.first := p.left + pattr.first - pattr.left; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "ql" THEN - NEW(p); - p.valid := {TextRulers.opts}; p.opts.val := {TextRulers.leftAdjust}; - p.opts.mask := {TextRulers.leftAdjust, TextRulers.rightAdjust}; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "qr" THEN - NEW(p); - p.valid := {TextRulers.opts}; p.opts.val := {TextRulers.rightAdjust}; - p.opts.mask := {TextRulers.leftAdjust, TextRulers.rightAdjust}; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "qc" THEN - NEW(p); - p.valid := {TextRulers.opts}; p.opts.val := {}; - p.opts.mask := {TextRulers.leftAdjust, TextRulers.rightAdjust}; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "qj" THEN - NEW(p); - p.valid := {TextRulers.opts}; p.opts.val := {TextRulers.leftAdjust, TextRulers.rightAdjust}; - p.opts.mask := {TextRulers.leftAdjust, TextRulers.rightAdjust}; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "sb" THEN - NEW(p); - p.valid := {TextRulers.lead}; p.lead := val * twips; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "sl" THEN - NEW(p); - p.valid := {TextRulers.grid}; p.grid := val * twips; - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "tqc" THEN - tabStyle := {TextRulers.centerTab} - ELSIF (comm = "tqr") OR (comm="tqdec") THEN - tabStyle := {TextRulers.rightTab} - ELSIF comm = "tb" THEN - p0 := pattr.Prop(); p := p0(TextRulers.Prop); - p.valid := {TextRulers.tabs}; - p.tabs.tab[p.tabs.len].stop := val * twips; - p.tabs.tab[p.tabs.len].type := {TextRulers.barTab}; tabStyle := {}; - INC(p.tabs.len); - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "tx" THEN - p0 := pattr.Prop(); p := p0(TextRulers.Prop); - p.valid := {TextRulers.tabs}; - p.tabs.tab[p.tabs.len].stop := val * twips; - p.tabs.tab[p.tabs.len].type := tabStyle; tabStyle := {}; - INC(p.tabs.len); - pattr := TextRulers.ModifiedAttr(pattr, p) - ELSIF comm = "pagebb" THEN - NEW(p); - p.valid := {TextRulers.opts}; p.opts.val := {TextRulers.pageBreak}; p.opts.mask := p.opts.val; - pattr := TextRulers.ModifiedAttr(pattr, p) - (* header *) - ELSIF comm = "deff" THEN - IF hasNum THEN defFont := val END - ELSIF comm = "fonttbl" THEN - IF dest # skip THEN dest := fonttab END - ELSIF comm = "colortbl" THEN - IF dest # skip THEN dest := colortab; cnum := 0; SetColor(0, 0) END - ELSIF comm = "red" THEN - IF dest = colortab THEN SetColor(cnum, Color(cnum).c + val MOD 256) END - ELSIF comm = "green" THEN - IF dest = colortab THEN SetColor(cnum, Color(cnum).c + val MOD 256 * 256) END - ELSIF comm = "blue" THEN - IF dest = colortab THEN SetColor(cnum, Color(cnum).c + val MOD 256 * 65536) END - ELSIF comm = "rtf" THEN - ELSIF comm = "ansi" THEN - ELSIF comm = "lang" THEN - ELSIF comm = "langfe" THEN - ELSIF comm = "loch" THEN - ELSIF comm = "ltrch" THEN - ELSIF comm = "rtlch" THEN - ELSIF comm = "ansicpg" THEN - (* misc *) - ELSIF comm = "bin" THEN rd.SetPos(rd.Pos() + val - 1); Next(ch) - (* unicode *) - ELSIF comm = "u" THEN Write(CHR(val)); skipCnt := uniCnt - ELSIF comm = "uc" THEN IF hasNum THEN uniCnt := val END - ELSIF comm = "upr" THEN dest := skip (* skip ANSI part *) - ELSIF comm = "ud" THEN dest := text (* use Unicode part *) - (* unhandled destinations *) - ELSIF comm = "author" THEN dest := skip - ELSIF comm = "buptim" THEN dest := skip - ELSIF comm = "comment" THEN dest := skip - ELSIF comm = "creatim" THEN dest := skip - ELSIF comm = "doccomm" THEN dest := skip - ELSIF comm = "footer" THEN dest := skip - ELSIF comm = "footerl" THEN dest := skip - ELSIF comm = "footerr" THEN dest := skip - ELSIF comm = "footerf" THEN dest := skip - ELSIF comm = "footnote" THEN dest := skip - ELSIF comm = "ftnsep" THEN dest := skip - ELSIF comm = "ftnsepc" THEN dest := skip - ELSIF comm = "ftncn" THEN dest := skip - ELSIF comm = "header" THEN dest := skip - ELSIF comm = "headerl" THEN dest := skip - ELSIF comm = "headerr" THEN dest := skip - ELSIF comm = "headerf" THEN dest := skip - ELSIF comm = "info" THEN dest := skip - ELSIF comm = "keywords" THEN dest := skip - ELSIF comm = "object" THEN dest := skip - ELSIF comm = "operator" THEN dest := skip - ELSIF comm = "pict" THEN dest := skip - ELSIF comm = "printim" THEN dest := skip - ELSIF comm = "private1" THEN dest := skip - ELSIF comm = "revtim" THEN dest := skip - ELSIF comm = "rxe" THEN dest := skip - ELSIF comm = "stylesheet" THEN dest := skip - ELSIF comm = "subject" THEN dest := skip - ELSIF comm = "tc" THEN dest := skip - ELSIF comm = "title" THEN dest := skip - ELSIF comm = "txe" THEN dest := skip - ELSIF comm = "xe" THEN dest := skip - ELSE (* unknown *) - IF skipDest & (con # NIL) & (con.next # NIL) THEN dest := skip END - END; - skipDest := FALSE - ELSIF ch = "'" THEN - Next(ch); - IF ch <= "9" THEN val := ORD(ch) - ORD("0") ELSE val := ORD(CAP(ch)) - ORD("A") + 10 END; - Next(ch); - IF ch <= "9" THEN val := 16 * val + ORD(ch) - ORD("0") - ELSE val := 16 * val + ORD(CAP(ch)) - ORD("A") + 10 - END; - Write(CHR(val)); Next(ch) - ELSE - IF ch = "~" THEN Write(0A0X) (* nonbreaking space *) - ELSIF ch = "-" THEN Write(0ADX) (* soft hyphen *) - ELSIF ch = "_" THEN Write(2011X) (* nonbreaking hyphen *) - ELSIF ch = "*" THEN skipDest := TRUE - ELSIF (ch = LF) OR (ch = CR) THEN Paragraph - ELSIF (ch = "{") OR (ch = "}") OR (ch = "\") THEN Write(ch) - END; - Next(ch) - END - ELSIF ch = ";" THEN - IF dest = fonttab THEN font := Font(fnum); font.f[idx] := 0X; INC(idx) - ELSIF dest = colortab THEN INC(cnum); SetColor(cnum, 0) - ELSIF dest = text THEN Write(";") - END; - Next(ch) - ELSIF ch >= " " THEN - Write(ch); Next(ch) - ELSE - Next(ch) - END - END - END ParseRichText; - - PROCEDURE ConvertToRichText (in: TextViews.View; beg, end: INTEGER; VAR out: TextModels.Model); - VAR r: TextModels.Reader; w: TextMappers.Formatter; ch: CHAR; f: Fonts.Font; - attr, attr0: TextModels.Attributes; col: Ports.Color; tf, atf: Fonts.Typeface; p, size, asize, offs: INTEGER; - style, astyle: SET; weight, aweight: INTEGER; rattr, rattr0: TextRulers.Attributes; ruler: TextRulers.Ruler; - text: TextModels.Model; firstLine, firstLine0: BOOLEAN; fonts: ARRAY 256 OF Fonts.Typeface; - colors: ARRAY 256 OF Ports.Color; fnum, cnum, i: INTEGER; - BEGIN - out := TextModels.dir.New(); w.ConnectTo(out); - f := Fonts.dir.Default(); tf := f.typeface; - fnum := 1; fonts[0] := tf; - cnum := 1; colors[0] := Ports.defaultColor; - col := Ports.defaultColor; size := 12 * Ports.point; - offs := 0; style := {}; weight := Fonts.normal; - attr0 := NIL; rattr0 := NIL; firstLine := TRUE; firstLine0 := FALSE; - text := in.ThisModel(); r := text.NewReader(NIL); - ruler := TextViews.ThisRuler(in, beg); rattr := ruler.style.attr; - r.SetPos(beg); r.ReadChar(ch); - WHILE ~r.eot & (r.Pos() <= end) DO - attr := r.attr; - IF (r.view # NIL) & (r.view IS TextRulers.Ruler) THEN - ruler := r.view(TextRulers.Ruler); rattr := ruler.style.attr; - firstLine := TRUE - ELSIF ch = FF THEN firstLine := TRUE - END; - IF (rattr # rattr0) OR (firstLine # firstLine0) THEN - IF (rattr # rattr0) OR (rattr.first # rattr.left) OR (rattr.lead # 0) OR (TextRulers.pageBreak IN rattr.opts) - THEN - w.WriteSString("\pard"); - IF rattr.left # 0 THEN - w.WriteSString("\li"); w.WriteInt(rattr.left DIV twips) - END; - IF firstLine & (rattr.first # rattr.left) THEN - w.WriteSString("\fi"); w.WriteInt((rattr.first - rattr.left) DIV twips) - END; - IF firstLine & (rattr.lead # 0) THEN - w.WriteSString("\sb"); w.WriteInt(rattr.lead DIV twips) - END; - IF rattr.grid > Ports.point THEN - w.WriteSString("\sl"); w.WriteInt(rattr.grid DIV twips); w.WriteSString("\slmult1") - END; - IF {TextRulers.leftAdjust, TextRulers.rightAdjust} - rattr.opts = {} THEN w.WriteSString("\qj") - ELSIF TextRulers.rightAdjust IN rattr.opts THEN w.WriteSString("\qr") - ELSIF ~(TextRulers.leftAdjust IN rattr.opts) THEN w.WriteSString("\qc") - END; - IF firstLine & (TextRulers.pageBreak IN rattr.opts) THEN - w.WriteSString("\pagebb") - END; - i := 0; - WHILE i < rattr.tabs.len DO - IF TextRulers.centerTab IN rattr.tabs.tab[i].type THEN w.WriteSString("\tqc") END; - IF TextRulers.rightTab IN rattr.tabs.tab[i].type THEN w.WriteSString("\tqr") END; - IF TextRulers.barTab IN rattr.tabs.tab[i].type THEN w.WriteSString("\tb") END; - w.WriteSString("\tx"); w.WriteInt(rattr.tabs.tab[i].stop DIV twips); - INC(i) - END; - w.WriteChar(" ") - END; - rattr0 := rattr; firstLine0 := firstLine - END; - IF attr # attr0 THEN - p := w.Pos(); - IF attr.color # col THEN - i := 0; WHILE (i < cnum) & (colors[i] # attr.color) DO INC(i) END; - IF i = cnum THEN colors[i] := attr.color; INC(cnum) END; - w.WriteSString("\cf"); w.WriteInt(i); - col := attr.color - END; - atf := attr.font.typeface$; asize := attr.font.size; astyle := attr.font.style; aweight := attr.font.weight; - IF atf # tf THEN - i := 0; WHILE (i < fnum) & (fonts[i] # atf) DO INC(i) END; - IF i = fnum THEN fonts[i] := atf; INC(fnum) END; - w.WriteSString("\f"); w.WriteInt(i); - tf := atf - END; - IF asize # size THEN - w.WriteSString("\fs"); w.WriteInt(asize DIV halfpoint); - size := asize - END; - IF astyle # style THEN - IF (Fonts.italic IN astyle) & ~(Fonts.italic IN style) THEN w.WriteSString("\i") - ELSIF ~(Fonts.italic IN astyle) & (Fonts.italic IN style) THEN w.WriteSString("\i0") - END; - IF (Fonts.underline IN astyle) & ~(Fonts.underline IN style) THEN w.WriteSString("\ul") - ELSIF ~(Fonts.underline IN astyle) & (Fonts.underline IN style) THEN w.WriteSString("\ul0") - END; - IF (Fonts.strikeout IN astyle) & ~(Fonts.strikeout IN style) THEN w.WriteSString("\strike") - ELSIF ~(Fonts.strikeout IN astyle) & (Fonts.strikeout IN style) THEN w.WriteSString("\strike0") - END; - style := astyle - END; - IF aweight # weight THEN - IF (aweight > Fonts.normal) & (weight = Fonts.normal) THEN w.WriteSString("\b") - ELSIF (aweight = Fonts.normal) & (weight > Fonts.normal) THEN w.WriteSString("\b0") - END; - weight := aweight - END; - IF attr.offset # offs THEN - IF attr.offset > 0 THEN w.WriteSString("\up"); w.WriteInt(attr.offset DIV halfpoint) - ELSIF attr.offset < 0 THEN w.WriteSString("\dn"); w.WriteInt(-(attr.offset DIV halfpoint)) - ELSIF offs > 0 THEN w.WriteSString("\up0") - ELSE w.WriteSString("\dn0") - END; - offs := attr.offset - END; - IF w.Pos() # p THEN w.WriteChar(" ") END; - attr0 := attr - END; - IF ch >= 100X THEN - IF ch = 2002X THEN w.WriteSString("\enspace ") - ELSIF ch = 2003X THEN w.WriteSString("\emspace ") - ELSIF ch = 2013X THEN w.WriteSString("\endash ") - ELSIF ch = 2014X THEN w.WriteSString("\emdash ") - ELSIF ch = 2010X THEN w.WriteChar("-") - ELSIF ch = 2011X THEN w.WriteSString("\_") - ELSIF ch = 201CX THEN (* unicode: left double quote *) w.WriteSString("\ldblquote ") - ELSIF ch = 201DX THEN (* unicode: right double quote *) w.WriteSString("\rdblquote ") - ELSIF ch = 2018X THEN (* unicode: left single quote *) w.WriteSString("\lquote ") - ELSIF ch = 2019X THEN (* unicode: right single quote *) w.WriteSString("\rquote ") - ELSE - w.WriteSString("\u"); w.WriteInt(ORD(ch)); - ch := ThisWndChar(ch); - IF ch >= 80X THEN - w.WriteSString("\'"); - w.WriteIntForm(ORD(ch), TextMappers.hexadecimal, 2, "0", FALSE) - ELSE - w.WriteChar(ch) - END - END - ELSE - CASE ch OF - | TAB: w.WriteSString("\tab ") - | CR: w.WriteSString("\par "); w.WriteLn; firstLine := FALSE - | " ".."[", "]".."z", "|", "~": w.WriteChar(ch) - | "\": w.WriteSString("\\") - | "{": w.WriteSString("\{") - | "}": w.WriteSString("\}") - | 8FX: (* digit space *) w.WriteChar(" ") - | 90X: (* hyphen *) w.WriteChar("-") - | 91X: (* non-breaking hyphen *) w.WriteSString("\_") - | 0A0X: (* non-breaking space *) w.WriteSString("\~") - | 0ADX: (* soft hyphen *) w.WriteSString("\-") - | 0A1X..0ACX, 0AEX..0FFX: - w.WriteSString("\'"); w.WriteIntForm(ORD(ch), TextMappers.hexadecimal, 2, "0", FALSE) - ELSE - END - END; - r.ReadChar(ch) - END; - w.WriteChar("}"); - (* header *) - w.SetPos(0); - w.WriteSString("{\rtf1\ansi\ansicpg1252\deff0"); - w.WriteSString("{\fonttbl"); i := 0; - WHILE i < fnum DO - IF fonts[i] = Fonts.default THEN fonts[i] := HostFonts.defFont.alias$ END; - w.WriteSString("{\f"); w.WriteInt(i); w.WriteSString("\fnil "); w.WriteString(fonts[i]); w.WriteSString(";}"); - INC(i) - END; - w.WriteChar("}"); w.WriteLn; - w.WriteSString("{\colortbl;"); i := 1; - WHILE i < cnum DO - w.WriteSString("\red"); w.WriteInt(colors[i] MOD 256); - w.WriteSString("\green"); w.WriteInt(colors[i] DIV 256 MOD 256); - w.WriteSString("\blue"); w.WriteInt(colors[i] DIV 65536 MOD 256); - w.WriteChar(";"); INC(i) - END; - w.WriteChar("}"); w.WriteLn; - w.WriteSString("\deftab216 "); - w.WriteSString("\plain") - END ConvertToRichText; - -(* - PROCEDURE ImportDText* (VAR med: WinOle.STGMEDIUM; OUT v: Views.View; - OUT w, h: INTEGER; OUT isSingle: BOOLEAN); - VAR t: TextModels.Model; res, adr: INTEGER; wr: TextModels.Writer; ch: SHORTCHAR; - hnd: WinApi.HANDLE; attr: TextModels.Attributes; p: Properties.StdProp; pref: Properties.BoundsPref; - BEGIN - hnd := MediumGlobal(med); - ASSERT(hnd # 0, 20); - adr := WinApi.GlobalLock(hnd); - t := TextModels.dir.New(); wr := t.NewWriter(NIL); - IF HostClipboard.cloneAttributes THEN - Properties.CollectStdProp(p); - NEW(attr); attr.InitFromProp(p); - wr.SetAttr(attr) - END; - SYSTEM.GET(adr, ch); - WHILE ch # 0X DO - WriteWndChar(wr, ch); - INC(adr); SYSTEM.GET(adr, ch) - END; - res := WinApi.GlobalUnlock(hnd); - v := TextViews.dir.New(t); - pref.w := Views.undefined; pref.h := Views.undefined; - Views.HandlePropMsg(v, pref); - w := pref.w; h := pref.h; isSingle := FALSE - END ImportDText; - - PROCEDURE ImportDRichText* (VAR med: WinOle.STGMEDIUM; OUT v: Views.View; - OUT w, h: INTEGER; OUT isSingle: BOOLEAN); - VAR t: TextModels.Model; res, adr: INTEGER; wr: TextModels.Writer; rd: MemReader; - hnd: WinApi.HANDLE; ruler: TextRulers.Ruler; pref: Properties.BoundsPref; - BEGIN - IF debug THEN - ImportDText(med, v, w, h, isSingle); - RETURN - END; - hnd := MediumGlobal(med); - ASSERT(hnd # 0, 20); - adr := WinApi.GlobalLock(hnd); - NEW(rd); rd.adr := adr; rd.pos := 0; - t := TextModels.dir.New(); wr := t.NewWriter(NIL); - ParseRichText(rd, wr, ruler); - res := WinApi.GlobalUnlock(hnd); - v := TextViews.dir.New(t); - v(TextViews.View).SetDefaults(ruler, TextModels.dir.attr); - pref.w := Views.undefined; pref.h := Views.undefined; - Views.HandlePropMsg(v, pref); - w := pref.w; h := pref.h; isSingle := FALSE - END ImportDRichText; - - PROCEDURE ImportDUnicode* (VAR med: WinOle.STGMEDIUM; OUT v: Views.View; - OUT w, h: INTEGER; OUT isSingle: BOOLEAN); - VAR t: TextModels.Model; res, adr: INTEGER; wr: TextModels.Writer; uc: CHAR; - hnd: WinApi.HANDLE; attr: TextModels.Attributes; p: Properties.StdProp; pref: Properties.BoundsPref; - BEGIN - hnd := MediumGlobal(med); - ASSERT(hnd # 0, 20); - adr := WinApi.GlobalLock(hnd); - t := TextModels.dir.New(); wr := t.NewWriter(NIL); - IF HostClipboard.cloneAttributes THEN - Properties.CollectStdProp(p); - NEW(attr); attr.InitFromProp(p); - wr.SetAttr(attr) - END; - SYSTEM.GET(adr, uc); - WHILE uc # 0X DO - ASSERT(uc # 0FFFEX, 100); - IF uc < 100X THEN WriteWndChar(wr, uc) - ELSIF uc # 0FEFFX THEN wr.WriteChar(uc) - END; - INC(adr, 2); SYSTEM.GET(adr, uc) - END; - res := WinApi.GlobalUnlock(hnd); - v := TextViews.dir.New(t); - pref.w := Views.undefined; pref.h := Views.undefined; - Views.HandlePropMsg(v, pref); - w := pref.w; h := pref.h; isSingle := FALSE - END ImportDUnicode; - - PROCEDURE ExportDText* ( - v: Views.View; w, h, x, y: INTEGER; isSingle: BOOLEAN; VAR med: WinOle.STGMEDIUM - ); - VAR t: TextModels.Model; r: TextModels.Reader; ch: CHAR; - res, len, adr: INTEGER; hnd: WinApi.HANDLE; - BEGIN - ASSERT(v # NIL, 20); - WITH v: TextViews.View DO - t := v.ThisModel(); - hnd := WinApi.GlobalAlloc({1, 13}, 2 * t.Length() + 1); (* movable, sharable *) - IF hnd # 0 THEN - adr := WinApi.GlobalLock(hnd); len := 0; - r := t.NewReader(NIL); r.ReadChar(ch); - WHILE ~r.eot DO - IF (ch # TextModels.viewcode) & (ch # TextModels.para) THEN - ch := ThisWndChar(ch); - SYSTEM.PUT(adr, SHORT(ch)); INC(adr); INC(len); - IF ch = CR THEN SYSTEM.PUT(adr, LF); INC(adr); INC(len) END - END; - r.ReadChar(ch) - END; - SYSTEM.PUT(adr, 0X); INC(len); - res := WinApi.GlobalUnlock(hnd); - hnd := WinApi.GlobalReAlloc(hnd, len, {}); - GenGlobalMedium(hnd, NIL, med) - END - ELSE - END - END ExportDText; - - PROCEDURE ExportDRichText* ( - v: Views.View; w, h, x, y: INTEGER; isSingle: BOOLEAN; VAR med: WinOle.STGMEDIUM - ); - VAR t: TextModels.Model; r: TextModels.Reader; ch: CHAR; res, adr: INTEGER; hnd: WinApi.HANDLE; - BEGIN - ASSERT(v # NIL, 20); - WITH v: TextViews.View DO - ConvertToRichText(v, 0, MAX(INTEGER), t); - hnd := WinApi.GlobalAlloc({1, 13}, t.Length() + 1); (* movable, sharable *) - IF hnd # 0 THEN - adr := WinApi.GlobalLock(hnd); - r := t.NewReader(NIL); r.ReadChar(ch); - WHILE ~r.eot DO - SYSTEM.PUT(adr, SHORT(ch)); INC(adr); - r.ReadChar(ch) - END; - SYSTEM.PUT(adr, 0X); - res := WinApi.GlobalUnlock(hnd); - GenGlobalMedium(hnd, NIL, med) - END - ELSE - END - END ExportDRichText; - - PROCEDURE ExportDUnicode* ( - v: Views.View; w, h, x, y: INTEGER; isSingle: BOOLEAN; VAR med: WinOle.STGMEDIUM - ); - VAR t: TextModels.Model; r: TextModels.Reader; ch: CHAR; res, len, adr: INTEGER; hnd: WinApi.HANDLE; - BEGIN - ASSERT(v # NIL, 20); - WITH v: TextViews.View DO - t := v.ThisModel(); - hnd := WinApi.GlobalAlloc({1, 13}, 4 * t.Length() + 2); (* movable, sharable *) - IF hnd # 0 THEN - adr := WinApi.GlobalLock(hnd); len := 0; - r := t.NewReader(NIL); r.ReadChar(ch); - WHILE ~r.eot DO - IF ch = CR THEN - SYSTEM.PUT(adr, LONG(CR)); INC(adr, 2); INC(len, 2); - SYSTEM.PUT(adr, LONG(LF)); INC(adr, 2); INC(len, 2) - ELSIF (ch >= " ") OR (ch = TAB) THEN - IF (ch >= 0EF00X) & (ch <= 0EFFFX) THEN ch := CHR(ORD(ch) - 0EF00H) END; - SYSTEM.PUT(adr, ch); INC(adr, 2); INC(len, 2) - END; - r.ReadChar(ch) - END; - SYSTEM.PUT(adr, LONG(0X)); INC(len, 2); - res := WinApi.GlobalUnlock(hnd); - hnd := WinApi.GlobalReAlloc(hnd, len, {}); - GenGlobalMedium(hnd, NIL, med) - END - ELSE - END - END ExportDUnicode; -*) - - PROCEDURE ImportText* (f: Files.File; OUT s: Stores.Store); - VAR r: Stores.Reader; t: TextModels.Model; wr: TextModels.Writer; ch, nch: SHORTCHAR; - BEGIN - ASSERT(f # NIL, 20); - r.ConnectTo(f); r.SetPos(0); - t := TextModels.dir.New(); wr := t.NewWriter(NIL); - r.ReadSChar(ch); - WHILE ~r.rider.eof DO - r.ReadSChar(nch); - IF (ch = CR) & (nch = LF) THEN r.ReadSChar(nch) - ELSIF ch = LF THEN ch := CR - END; - WriteWndChar(wr, ch); ch := nch - END; - s := TextViews.dir.New(t) - END ImportText; - - PROCEDURE ImportTabText* (f: Files.File; OUT s: Stores.Store); - VAR r: Stores.Reader; t: TextModels.Model; wr: TextModels.Writer; ch, nch: SHORTCHAR; - BEGIN - ASSERT(f # NIL, 20); - r.ConnectTo(f); r.SetPos(0); - t := TextModels.dir.New(); wr := t.NewWriter(NIL); - r.ReadSChar(ch); - WHILE ~r.rider.eof DO - r.ReadSChar(nch); - IF (ch = CR) & (nch = LF) THEN r.ReadSChar(nch) - ELSIF ch = LF THEN ch := CR - ELSIF (ch = " ") & (nch = " ") THEN ch := TAB; r.ReadSChar(nch) - END; - WriteWndChar(wr, ch); ch := nch - END; - s := TextViews.dir.New(t) - END ImportTabText; - - PROCEDURE ImportRichText* (f: Files.File; OUT s: Stores.Store); - VAR t: TextModels.Model; wr: TextModels.Writer; rd: Files.Reader; ruler: TextRulers.Ruler; - BEGIN - rd := f.NewReader(NIL); rd.SetPos(0); - t := TextModels.dir.New(); wr := t.NewWriter(NIL); - ParseRichText(rd, wr, ruler); - s := TextViews.dir.New(t); - s(TextViews.View).SetDefaults(ruler, TextModels.dir.attr) - END ImportRichText; - - PROCEDURE ImportUnicode* (f: Files.File; OUT s: Stores.Store); - VAR r: Stores.Reader; t: TextModels.Model; v: TextViews.View; w: TextModels.Writer; - ch0, ch1: SHORTCHAR; len, res: INTEGER; uc: CHAR; rev: BOOLEAN; - BEGIN - ASSERT(f # NIL, 20); - r.ConnectTo(f); r.SetPos(0); - len := f.Length(); rev := FALSE; - t := TextModels.dir.New(); w := t.NewWriter(NIL); w.SetPos(0); - WHILE len > 0 DO - r.ReadSChar(ch0); r.ReadSChar(ch1); - IF rev THEN uc := CHR(ORD(ch1) + 256 * ORD(ch0)) - ELSE uc := CHR(ORD(ch0) + 256 * ORD(ch1)) - END; - DEC(len, 2); - IF uc = 0FFFEX THEN rev := ~rev - ELSIF uc < 100X THEN WriteWndChar(w, uc) - ELSIF uc # 0FEFFX THEN w.WriteChar(uc) - END - END; - v := TextViews.dir.New(t); - s := v - END ImportUnicode; - - PROCEDURE ImportDosText* (f: Files.File; OUT s: Stores.Store); - VAR r: Stores.Reader; t: TextModels.Model; wr: TextModels.Writer; ch, nch: SHORTCHAR; - - PROCEDURE ConvertChar (wr: TextModels.Writer; ch: CHAR); - (* PC Code Page Mappings M4 (Latin) to Unicode Encoding *) - (* Reference: The Unicode Standard, Version 1.0, Vol 1, Addison Wesley, p. 536 *) - BEGIN - CASE ch OF - | CR, TAB, " "..7EX: wr.WriteChar(ch) - | LF: - | 080X: wr.WriteChar(0C7X) - | 081X: wr.WriteChar(0FCX) - | 082X: wr.WriteChar(0E9X) - | 083X: wr.WriteChar(0E2X) - | 084X: wr.WriteChar(0E4X) - | 085X: wr.WriteChar(0E0X) - | 086X: wr.WriteChar(0E5X) - | 087X: wr.WriteChar(0E7X) - | 088X: wr.WriteChar(0EAX) - | 089X: wr.WriteChar(0EBX) - | 08AX: wr.WriteChar(0E8X) - | 08BX: wr.WriteChar(0EFX) - | 08CX: wr.WriteChar(0EEX) - | 08DX: wr.WriteChar(0ECX) - | 08EX: wr.WriteChar(0C4X) - | 08FX: wr.WriteChar(0C5X) - | 090X: wr.WriteChar(0C9X) - | 091X: wr.WriteChar(0E6X) - | 092X: wr.WriteChar(0C6X) - | 093X: wr.WriteChar(0F4X) - | 094X: wr.WriteChar(0F6X) - | 095X: wr.WriteChar(0F2X) - | 096X: wr.WriteChar(0FBX) - | 097X: wr.WriteChar(0F9X) - | 098X: wr.WriteChar(0FFX) - | 099X: wr.WriteChar(0D6X) - | 09AX: wr.WriteChar(0DCX) - | 09BX: wr.WriteChar(0F8X) - | 09CX: wr.WriteChar(0A3X) - | 09DX: wr.WriteChar(0D8X) - | 09EX: wr.WriteChar(0D7X) - | 09FX: wr.WriteChar(0192X) - | 0A0X: wr.WriteChar(0E1X) - | 0A1X: wr.WriteChar(0EDX) - | 0A2X: wr.WriteChar(0F3X) - | 0A3X: wr.WriteChar(0FAX) - | 0A4X: wr.WriteChar(0F1X) - | 0A5X: wr.WriteChar(0D1X) - | 0A6X: wr.WriteChar(0AAX) - | 0A7X: wr.WriteChar(0BAX) - | 0A8X: wr.WriteChar(0BFX) - | 0A9X: wr.WriteChar(0AEX) - | 0AAX: wr.WriteChar(0ACX) - | 0ABX: wr.WriteChar(0BDX) - | 0ACX: wr.WriteChar(0BCX) - | 0ADX: wr.WriteChar(0A1X) - | 0AEX: wr.WriteChar(0ABX) - | 0AFX: wr.WriteChar(0BBX) - | 0B5X: wr.WriteChar(0C1X) - | 0B6X: wr.WriteChar(0C2X) - | 0B7X: wr.WriteChar(0C0X) - | 0B8X: wr.WriteChar(0A9X) - | 0BDX: wr.WriteChar(0A2X) - | 0BEX: wr.WriteChar(0A5X) - | 0C6X: wr.WriteChar(0E3X) - | 0C7X: wr.WriteChar(0C3X) - | 0CFX: wr.WriteChar(0A4X) - | 0D0X: wr.WriteChar(0F0X) - | 0D1X: wr.WriteChar(0D0X) - | 0D2X: wr.WriteChar(0CAX) - | 0D3X: wr.WriteChar(0CBX) - | 0D4X: wr.WriteChar(0C8X) - | 0D5X: wr.WriteChar(0131X) - | 0D6X: wr.WriteChar(0CDX) - | 0D7X: wr.WriteChar(0CEX) - | 0D8X: wr.WriteChar(0CFX) - | 0DDX: wr.WriteChar(0A6X) - | 0DEX: wr.WriteChar(0CCX) - | 0E0X: wr.WriteChar(0D3X) - | 0E1X: wr.WriteChar(0DFX) - | 0E2X: wr.WriteChar(0D4X) - | 0E3X: wr.WriteChar(0D2X) - | 0E4X: wr.WriteChar(0F5X) - | 0E5X: wr.WriteChar(0D5X) - | 0E6X: wr.WriteChar(0B5X) - | 0E7X: wr.WriteChar(0FEX) - | 0E8X: wr.WriteChar(0DEX) - | 0E9X: wr.WriteChar(0DAX) - | 0EAX: wr.WriteChar(0DBX) - | 0EBX: wr.WriteChar(0D9X) - | 0ECX: wr.WriteChar(0FDX) - | 0EDX: wr.WriteChar(0DDX) - | 0EEX: wr.WriteChar(0AFX) - | 0EFX: wr.WriteChar(0B4X) - | 0F0X: wr.WriteChar(0ADX) - | 0F1X: wr.WriteChar(0B1X) - | 0F2X: wr.WriteChar(02017X) - | 0F3X: wr.WriteChar(0BEX) - | 0F4X: wr.WriteChar(0B6X) - | 0F5X: wr.WriteChar(0A7X) - | 0F6X: wr.WriteChar(0F7X) - | 0F7X: wr.WriteChar(0B8X) - | 0F8X: wr.WriteChar(0B0X) - | 0F9X: wr.WriteChar(0A8X) - | 0FAX: wr.WriteChar(0B7X) - | 0FBX: wr.WriteChar(0B9X) - | 0FCX: wr.WriteChar(0B3X) - | 0FDX: wr.WriteChar(0B2X) - | 0X..8X, 0BX, 0CX, 0EX..1FX, 7FX, - 0B0X..0B4X, 0B9X..0BCX, 0BFX..0C5X, 0C8X..0CEX, 0D9X..0DCX, 0DFX, 0FEX, 0FFX: - wr.WriteChar(CHR(0EF00H + ORD(ch))) - END - END ConvertChar; - - BEGIN - ASSERT(f # NIL, 20); - r.ConnectTo(f); r.SetPos(0); - t := TextModels.dir.New(); wr := t.NewWriter(NIL); - r.ReadSChar(ch); - WHILE ~r.rider.eof DO - r.ReadSChar(nch); - IF (ch = CR) & (nch = LF) THEN r.ReadSChar(nch) - ELSIF ch = LF THEN ch := CR - END; - ConvertChar(wr, ch); ch := nch - END; - s := TextViews.dir.New(t) - END ImportDosText; - - PROCEDURE TextView(s: Stores.Store): Stores.Store; - BEGIN - IF s IS Views.View THEN RETURN Properties.ThisType(s(Views.View), "TextViews.View") - ELSE RETURN NIL - END - END TextView; - - PROCEDURE ExportText* (s: Stores.Store; f: Files.File); - VAR w: Stores.Writer; t: TextModels.Model; r: TextModels.Reader; ch: CHAR; - BEGIN - ASSERT(s # NIL, 20); ASSERT(f # NIL, 21); - s := TextView(s); - IF s # NIL THEN - w.ConnectTo(f); w.SetPos(0); - t := s(TextViews.View).ThisModel(); - IF t # NIL THEN - r := t.NewReader(NIL); - r.ReadChar(ch); - WHILE ~r.eot DO - IF (ch # TextModels.viewcode) & (ch # TextModels.para) THEN - ch := ThisWndChar(ch); - w.WriteSChar(SHORT(ch)); - IF ch = CR THEN w.WriteSChar(LF) END - END; - r.ReadChar(ch) - END - END - END - END ExportText; - - PROCEDURE ExportTabText* (s: Stores.Store; f: Files.File); - VAR w: Stores.Writer; t: TextModels.Model; r: TextModels.Reader; ch: CHAR; - BEGIN - ASSERT(s # NIL, 20); ASSERT(f # NIL, 21); - s := TextView(s); - IF s # NIL THEN - w.ConnectTo(f); w.SetPos(0); - t := s(TextViews.View).ThisModel(); - IF t # NIL THEN - r := t.NewReader(NIL); - r.ReadChar(ch); - WHILE ~r.eot DO - IF (ch # TextModels.viewcode) & (ch # TextModels.para) THEN - ch := ThisWndChar(ch); - IF ch = CR THEN w.WriteSChar(CR); w.WriteSChar(LF) - ELSIF ch = TAB THEN w.WriteSChar(" "); w.WriteSChar(" ") - ELSE w.WriteSChar(SHORT(ch)) - END - END; - r.ReadChar(ch) - END - END - END - END ExportTabText; - - PROCEDURE ExportRichText* (s: Stores.Store; f: Files.File); - VAR t: TextModels.Model; r: TextModels.Reader; ch: CHAR; w: Stores.Writer; - BEGIN - ASSERT(s # NIL, 20); ASSERT(f # NIL, 21); - WITH s: TextViews.View DO - ConvertToRichText(s, 0, MAX(INTEGER), t); - w.ConnectTo(f); w.SetPos(0); - r := t.NewReader(NIL); r.ReadChar(ch); - WHILE ~r.eot DO - w.WriteSChar(SHORT(ch)); r.ReadChar(ch) - END -(* - w.WriteSChar(0X) -*) - ELSE - END - END ExportRichText; - - PROCEDURE ExportUnicode* (s: Stores.Store; f: Files.File); - VAR w: Stores.Writer; t: TextModels.Model; r: TextModels.Reader; ch: CHAR; - BEGIN - ASSERT(s # NIL, 20); ASSERT(f # NIL, 21); - s := TextView(s); - IF s # NIL THEN - w.ConnectTo(f); w.SetPos(0); - w.WriteChar(0FEFFX); (* little endian *) - t := s(TextViews.View).ThisModel(); - IF t # NIL THEN - r := t.NewReader(NIL); - r.ReadChar(ch); - WHILE ~r.eot DO - IF ch = CR THEN - w.WriteChar(CR); w.WriteChar(LF) - ELSIF (ch >= " ") OR (ch = TAB) THEN - IF (ch >= 0EF00X) & (ch <= 0EFFFX) THEN ch := CHR(ORD(ch) - 0EF00H) END; - w.WriteChar(ch) - END; - r.ReadChar(ch) - END - END - END - END ExportUnicode; - - PROCEDURE ImportHex* (f: Files.File; OUT s: Stores.Store); - VAR r: Stores.Reader; t: TextModels.Model; w: TextMappers.Formatter; ch: SHORTCHAR; a: INTEGER; - i: INTEGER; str: ARRAY 17 OF CHAR; - BEGIN - ASSERT(f # NIL, 20); - r.ConnectTo(f); r.SetPos(0); - t := TextModels.dir.New(); - w.ConnectTo(t); w.SetPos(0); - r.ReadSChar(ch); a := 0; - WHILE ~r.rider.eof DO - IF a MOD 16 = 0 THEN - w.WriteChar("["); - w.WriteIntForm(a, TextMappers.hexadecimal, 8, "0", FALSE); - w.WriteSString("]") - END; - w.WriteIntForm(ORD(ch), TextMappers.hexadecimal, 2, "0", FALSE); - IF ch > 20X THEN str[a MOD 16] := ch ELSE str[a MOD 16] := "" END; - INC(a); - IF a MOD 16 = 0 THEN - str[16] := 0X; w.WriteString(""); w.WriteString(str); - w.WriteLn - ELSIF a MOD 4 = 0 THEN - w.WriteString("") - ELSE - w.WriteChar("") - END; - r.ReadSChar(ch) - END; - IF a MOD 16 # 0 THEN - str[a MOD 16] := 0X; - i := (16 - a MOD 16) * 3 + (3 - a MOD 16 DIV 4) + 3; - WHILE i # 0 DO w.WriteChar(""); DEC(i) END; - w.WriteString(str) - END; - s := TextViews.dir.New(t) - END ImportHex; - -END HostTextConv. diff --git a/new/_LinuxOpenBSD_/System/Mod/Config.txt b/new/_LinuxOpenBSD_/System/Mod/Config.txt deleted file mode 100644 index bc2049e..0000000 --- a/new/_LinuxOpenBSD_/System/Mod/Config.txt +++ /dev/null @@ -1,27 +0,0 @@ -MODULE Config; - - (* THIS IS TEXT COPY OF Config.odc *) - (* DO NOT EDIT *) - - IMPORT Dialog, Converters; - - PROCEDURE Setup*; - VAR res: INTEGER; - BEGIN - Converters.Register("HostTextConv.ImportText", "HostTextConv.ExportText", "TextViews.View", "txt", {Converters.importAll}); - Converters.Register("HostTextConv.ImportRichText", "HostTextConv.ExportRichText", "TextViews.View", "rtf", {}); - Converters.Register("HostTextConv.ImportUnicode", "HostTextConv.ExportUnicode", "TextViews.View", "utf", {}); - Converters.Register("HostTextConv.ImportDosText", "", "TextViews.View", "txt", {}); - Converters.Register("HostTextConv.ImportHex", "", "TextViews.View", "dat", {Converters.importAll}); - Converters.Register("HostTextConv.ImportText", "HostTextConv.ExportText", "TextViews.View", "xml", {}); - Converters.Register("HostTextConv.ImportText", "HostTextConv.ExportText", "TextViews.View", "html", {}); - Converters.Register("DevBrowser.ImportSymFile", "", "TextViews.View", "osf", {}); - Converters.Register("DevBrowser.ImportCodeFile", "", "TextViews.View", "ocf", {}); - Converters.Register("HostBitmaps.ImportBitmap", "HostBitmaps.ExportBitmap", "HostBitmaps.StdView", "bmp", {}); - Converters.Register("StdETHConv.ImportETHDoc", "", "TextViews.View", "eth", {Converters.importAll}); - Converters.Register("", "XhtmlExporter.ExportText", "TextViews.View", "html", {}); - - Dialog.Call("StdLog.Open", "", res) - END Setup; - -END Config. diff --git a/new/_LinuxOpenBSD_/System/Mod/Kernel_so_init.txt b/new/_LinuxOpenBSD_/System/Mod/Kernel_so_init.txt deleted file mode 100644 index bb5bba2..0000000 --- a/new/_LinuxOpenBSD_/System/Mod/Kernel_so_init.txt +++ /dev/null @@ -1,27 +0,0 @@ -MODULE Kernel_so_init; - - (* THIS IS TEXT COPY OF Kernel_so_init.odc *) - (* DO NOT EDIT *) - - IMPORT Kernel, SYSTEM; - - PROCEDURE SetKernelBaseStack* (x: INTEGER); - VAR - m: Kernel.Module; - ref, adr: INTEGER; mode, form: SHORTCHAR; desc: Kernel.Type; name: Kernel.Name; - BEGIN - m := Kernel.modList; - WHILE (m # NIL) & ~(m.name = "Kernel") DO - m := m.next - END; - ASSERT(m # NIL, 100); - ref := m.refs; Kernel.GetRefProc(ref, adr, name); ASSERT(adr # 0, 101); - Kernel.GetRefVar(ref, mode, form, desc, adr, name); - WHILE (mode = 1X) & ~(name = "baseStack") DO - Kernel.GetRefVar(ref, mode, form, desc, adr, name) - END; - ASSERT(mode = 1X, 102); ASSERT(form = 6X, 103); - SYSTEM.PUT(m.data + adr, x) - END SetKernelBaseStack; - -END Kernel_so_init. diff --git a/new/_Linux_/Host/Mod/Console.odc b/new/_Linux_/Host/Mod/Console.odc index 8b94bedb5d932705bd2d788112abda8e97226d25..51590a7e5302a2dadef834981857a9c7a090790a 100644 GIT binary patch delta 65 zcmX@2enNdhJ)`TyhB(g2LJSO?3=9n26Q8>>noibbwCA)JU|`?}3YkwXWjxFHV6!t* UC^LtVfr*8Ju7cs_IjkCd07`lgcK`qY delta 61 zcmX@1enfpjJ)`5qhB(fCAqECc1_p-qiO*db4JYd|+H+b9Ffi}~g^VYcGM;6;v)P#` Ql$piQz{q&>0#*$^00@f@wEzGB diff --git a/new/_Linux_/Host/Mod/Console.txt b/new/_Linux_/Host/Mod/Console.txt deleted file mode 100644 index da1e9a5..0000000 --- a/new/_Linux_/Host/Mod/Console.txt +++ /dev/null @@ -1,156 +0,0 @@ -MODULE HostConsole; - - (* THIS IS TEXT COPY OF Console.odc *) - (* DO NOT EDIT *) - - IMPORT SYSTEM, Console, Libc := LinLibc, Iconv := LinIconv, HostLang, Kernel; - - CONST - defCh = '?'; - - TYPE - Cons = POINTER TO RECORD (Console.Console) END; - - VAR - cons: Cons; - e, d: Iconv.iconv_t; - - PROCEDURE ResetCodec (c: Iconv.iconv_t): BOOLEAN; - VAR res, fLen, tLen: Iconv.size_t; - BEGIN - fLen := 0; tLen := 0; - res := Iconv.iconv(c, NIL, fLen, NIL, tLen); - RETURN res # -1 - END ResetCodec; - - PROCEDURE (cons: Cons) ReadLn (OUT s: ARRAY OF CHAR); - CONST - maxLineLen = 1023; (* without null terminating shortchar *) - VAR - i: INTEGER; - str: Libc.PtrSTR; - ss: ARRAY maxLineLen+1 OF SHORTCHAR; - fR, fLen, tW, tLen: INTEGER; - st: BOOLEAN; - res: Iconv.size_t; - from: Iconv.PtrSTR; to: Iconv.PtrLSTR; - BEGIN - ss[LEN(ss)-1] := 0X; - str := Libc.fgets(ss, LEN(ss), Libc.stdin); - IF (str # NIL) & (ss[LEN(ss)-1] = 0X) THEN - fLen := LEN(ss$); - IF fLen < LEN(s) THEN - IF d # -1 THEN - IF ResetCodec(d) THEN - from := ss; to := s; tLen := (LEN(s) - 1) * SIZE(CHAR) (* 2 *); - res := Iconv.iconv_decode(d, from, fLen, to, tLen); - IF (res >= 0) & (fLen = 0) & (tLen >= 0) THEN to[0] := 0X - ELSE s[0] := 0X - END - ELSE s[0] := 0X - END - ELSE - i := 0; - WHILE (ss[i] > 0X) & (ss[i] < 80X) DO s[i] := ss[i]; INC(i) END; - IF ss[i] = 0X THEN s[i] := 0X - ELSE s[0] := 0X - END - END - ELSE s[0] := 0X - END - ELSE s[0] := 0X - END - END ReadLn; - - PROCEDURE Printf (IN s: ARRAY OF CHAR; len: INTEGER); - CONST - maxShortCharsPerChar = 4; - ssLen = 128; (* >= maxShortCharsPerChar + 1 *) - VAR - ss: ARRAY ssLen OF SHORTCHAR; - fR, fLen, tW, tLen, n: INTEGER; - res: INTEGER; - res1: Iconv.size_t; - from: Iconv.PtrLSTR; to: Iconv.PtrSTR; - BEGIN - fR := 0; from := s; - WHILE len > 0 DO - tW := 0; to := ss; - IF e # -1 THEN - tLen := LEN(ss) - 1; - n := MIN(len, tLen DIV maxShortCharsPerChar); - fLen := n * SIZE(CHAR) (* 2 *); - REPEAT - res1 := Iconv.iconv_encode(e, from, fLen, to, tLen); - IF ~((res1 >= 0) & (fLen = 0) & (tLen >= 0)) THEN - ASSERT(tLen >= 0, 100); - ASSERT(fLen >= SIZE(CHAR), 101); - ASSERT(ResetCodec(e), 102); - to[0] := defCh; to := SYSTEM.VAL(Iconv.PtrSTR, SYSTEM.VAL(INTEGER, to) + 1); - DEC(tLen); - from := SYSTEM.VAL(Iconv.PtrLSTR, SYSTEM.VAL(INTEGER, from) + SIZE(CHAR)); - DEC(fLen, SIZE(CHAR)) - END - UNTIL fLen = 0; - to[0] := 0X - ELSE - fLen := MIN(len, LEN(ss) - 1); n := fLen; - WHILE fLen > 0 DO - IF s[fR] < 80X THEN ss[tW] := SHORT(s[fR]) - ELSE ss[tW] := defCh - END; - INC(tW); - INC(fR); DEC(fLen) - END; - ss[tW] := 0X - END; - res := Libc.printf(ss); - res := Libc.fflush(Libc.NULL); - - len := len - n - END - END Printf; - - PROCEDURE (cons: Cons) WriteChar (c: CHAR); - VAR s: ARRAY 1 OF CHAR; - BEGIN - s[0] := c; - Printf(s, 1) - END WriteChar; - - PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR); - BEGIN - Printf(text, LEN(text$)) - END WriteStr; - - PROCEDURE (cons: Cons) WriteLn; - BEGIN - Printf(0AX, 1) - END WriteLn; - - PROCEDURE Init; - BEGIN - IF Kernel.littleEndian THEN - e := Iconv.iconv_open(HostLang.enc, "UCS-2LE"); - d := Iconv.iconv_open("UCS-2LE", HostLang.enc) - ELSE - e := Iconv.iconv_open(HostLang.enc, "UCS-2BE"); - d := Iconv.iconv_open("UCS-2BE", HostLang.enc) - END; - - NEW(cons); - Console.SetConsole(cons) - END Init; - - PROCEDURE Close; - VAR res: INTEGER; - BEGIN - IF e # -1 THEN res := Iconv.iconv_close(e); e := -1 END; - IF d # -1 THEN res := Iconv.iconv_close(d); d := -1 END - END Close; - -BEGIN - Init -CLOSE - Close -END HostConsole. diff --git a/new/_Linux_/Host/Mod/Dates.txt b/new/_Linux_/Host/Mod/Dates.txt deleted file mode 100644 index 16e8621..0000000 --- a/new/_Linux_/Host/Mod/Dates.txt +++ /dev/null @@ -1,92 +0,0 @@ -MODULE HostDates; - - (* THIS IS TEXT COPY OF Dates.odc *) - (* DO NOT EDIT *) - - IMPORT - SYSTEM, LinLibc, Dates; - - (* Dates Hook *) - - TYPE - DatesHook = POINTER TO RECORD (Dates.Hook) END; - - (* - - Some conversions are needed between the Linux and the BlackBox representations of dates. The following - table shows the differences: - -(!) Linux BlackBox - year from year 1900 from year 0000 - month range 0-11 range 1-12 - weekday 0:sunday - 6:satruday 0:monday - 6:sunday - (!) *) - - PROCEDURE (h: DatesHook) DateToString (d: Dates.Date; format: INTEGER; OUT str: ARRAY OF CHAR); - VAR tm: LinLibc.tmDesc; sstr: ARRAY 64 OF SHORTCHAR; res: LinLibc.size_t; - BEGIN - ASSERT(format IN {Dates.short, Dates.abbreviated, Dates.long, Dates.plainAbbreviated, Dates.plainLong}, 20); - tm.tm_year := d.year - 1900; (* Linux counts years from 1900 but BlackBox from 0000 *) - tm.tm_mon := d.month - 1; tm.tm_mday := d.day; - tm.tm_wday := (Dates.DayOfWeek(d) + 1) MOD 7; - IF format = Dates.short THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%x", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSIF format = Dates.abbreviated THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%a, %b %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSIF format = Dates.long THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%A, %B %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSIF format = Dates.plainAbbreviated THEN - res := LinLibc.strftime(sstr, LEN(sstr), "%b %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - ELSE (* format = Dates.plainLong *) - res := LinLibc.strftime(sstr, LEN(sstr), "%B %d, %Y", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))) - END; - IF res > 0 THEN str := sstr$ELSE str := "invalid date" END - END DateToString; - - PROCEDURE (h: DatesHook) GetTime (OUT d: Dates.Date; OUT t: Dates.Time); - VAR time: LinLibc.time_t; tm: LinLibc.tm; - BEGIN - time := LinLibc.time(NIL); - tm := LinLibc.localtime(time); - d.year := tm.tm_year + 1900; (* Linux counts years from 1900 but BlackBox from 0000 *) - d.month := tm.tm_mon + 1; d.day := tm.tm_mday; - t.hour := tm.tm_hour; t.minute := tm.tm_min; t.second := tm.tm_sec - END GetTime; - - PROCEDURE (h: DatesHook) GetUTCBias (OUT bias: INTEGER); - VAR time: LinLibc.time_t; tm: LinLibc.tm; - BEGIN - time := LinLibc.time(NIL); - tm := LinLibc.localtime(time); (* call to localtime needed to make sure that timezone is set *) - bias := LinLibc.timezone DIV 60; - END GetUTCBias; - - PROCEDURE (h: DatesHook) GetUTCTime (OUT d: Dates.Date; OUT t: Dates.Time); - VAR time: LinLibc.time_t; tm: LinLibc.tm; - BEGIN - time := LinLibc.time(NIL); - tm := LinLibc.gmtime(time); - d.year := tm.tm_year + 1900; (* Linux counts years from 1900 but BlackBox from 0000 *) - d.month := tm.tm_mon + 1; d.day := tm.tm_mday; - t.hour := tm.tm_hour; t.minute := tm.tm_min; t.second := tm.tm_sec - END GetUTCTime; - - PROCEDURE (h: DatesHook) TimeToString (t: Dates.Time; OUT str: ARRAY OF CHAR); - VAR tm: LinLibc.tmDesc; sstr: ARRAY 64 OF SHORTCHAR; res: LinLibc.size_t; - BEGIN - tm.tm_hour := t.hour; tm.tm_min := t.minute; tm.tm_sec := t.second; - res := LinLibc.strftime(sstr, LEN(sstr), "%X", SYSTEM.VAL(LinLibc.tm, SYSTEM.ADR(tm))); - IF res > 0 THEN str := sstr$ELSE str := "invalid time" END - END TimeToString; - - - PROCEDURE Init; - VAR - datesHook: DatesHook; - BEGIN - NEW(datesHook); Dates.SetHook(datesHook); - END Init; - -BEGIN - Init -END HostDates. diff --git a/new/_Linux_/Host/Mod/Files.txt b/new/_Linux_/Host/Mod/Files.txt deleted file mode 100644 index 3aa3382..0000000 --- a/new/_Linux_/Host/Mod/Files.txt +++ /dev/null @@ -1,1501 +0,0 @@ -MODULE HostFiles; - - (* THIS IS TEXT COPY OF Files.odc *) - (* DO NOT EDIT *) - - (* - A. V. Shiryaev, 2012.11: filenames encoding translation implemented - *) - - IMPORT SYSTEM, Kernel, Files, LinLibc, Iconv := LinIconv; - - CONST - tempName = "odcxxxxx"; - docType = "odc"; - - serverVersion = TRUE; - - pathLen* = 260; - - nofbufs = 4; (* max number of buffers per file *) - bufsize = 2 * 1024; (* size of each buffer *) - - invalid = LinLibc.NULL; - - temp = 0; new = 1; shared = 2; hidden = 3; exclusive = 4; closed = 5; (* file states *) - create = -1; - - ok = 0; - invalidName = 1; - invalidNameErr = MAX(INTEGER); (* On Windows this is 123 *) - notFound = 2; - fileNotFoundErr = LinLibc.ENOENT; - pathNotFoundErr = LinLibc.ENOENT; - existsAlready = 3; - fileExistsErr = LinLibc.EEXIST; - alreadyExistsErr = LinLibc.EEXIST; (* is alreadyExistsErr needed? *) - writeProtected = 4; - writeProtectedErr = LinLibc.EACCES; - ioError = 5; (* same as LinLibc.EIO *) - accessDenied = 6; - accessDeniedErr = LinLibc.EACCES; - sharingErr = LinLibc.EACCES; - netAccessDeniedErr = LinLibc.EACCES; - notEnoughMem = 80; - notEnoughMemoryErr = LinLibc.ENOMEM; - notEnoughDisk = 81; - diskFullErr = LinLibc.EDQUOT; - tooManyOpenFilesErr = LinLibc.EMFILE; - - noMoreFilesErr = 18; - - cancel = -8; retry = -9; - - TYPE - FullName* = ARRAY pathLen OF CHAR; - - Locator* = POINTER TO RECORD (Files.Locator) - path-: FullName; (* without trailing "/" *) - maxLen-: INTEGER; (* maximum name length *) - caseSens-: BOOLEAN; (* case sensitive file compares *) - rootLen-: INTEGER (* for network version *) - END; - - Buffer = POINTER TO RECORD - dirty: BOOLEAN; - org, len: INTEGER; - data: ARRAY bufsize OF BYTE - END; - - File = POINTER TO RECORD (Files.File) - state: INTEGER; - name: FullName; - ref: LinLibc.PtrFILE; - loc: Locator; - swapper: INTEGER; (* index into file table / next buffer to swap *) - len: INTEGER; - bufs: ARRAY nofbufs OF Buffer; - t: LONGINT (* time stamp of last file operation *) - END; - - Reader = POINTER TO RECORD (Files.Reader) - base: File; - org, offset: INTEGER; - buf: Buffer - END; - - Writer = POINTER TO RECORD (Files.Writer) - base: File; - org, offset: INTEGER; - buf: Buffer - END; - - Directory = POINTER TO RECORD (Files.Directory) - temp, startup: Locator - END; - - Identifier = RECORD (Kernel.Identifier) - name: FullName - END; - - Searcher = RECORD (Kernel.Identifier) - t0: INTEGER; - f: File - END; - - Counter = RECORD (Kernel.Identifier) - count: INTEGER - END; - - ShortName = ARRAY pathLen * 4 OF SHORTCHAR; - - Encoding = ARRAY 32 OF SHORTCHAR; - - VAR - MapParamString*: PROCEDURE(in, p0, p1, p2: ARRAY OF CHAR; OUT out: ARRAY OF CHAR); - dir: Directory; - wildcard: Files.Type; - startupDir: FullName; - startupLen: INTEGER; - res: INTEGER; - e, d: Iconv.iconv_t; - - (* debugging functions *) - - PROCEDURE Msg (IN str: ARRAY OF CHAR); - VAR ss: ARRAY 1024 OF SHORTCHAR; res, l: INTEGER; - BEGIN - ss := SHORT(str); - l := LEN(ss$); - ss[l] := 0AX; ss[l + 1] := 0X; - res := LinLibc.printf(ss); - res := LinLibc.fflush(0) - END Msg; - - PROCEDURE Int (x: LONGINT); - VAR j, k: INTEGER; ch: CHAR; a, s: ARRAY 32 OF CHAR; - BEGIN - IF x # MIN(LONGINT) THEN - IF x < 0 THEN s[0] := "-"; k := 1; x := -x ELSE k := 0 END; - j := 0; REPEAT a[j] := CHR(x MOD 10 + ORD("0")); x := x DIV 10; INC(j) UNTIL x = 0 - ELSE - a := "8085774586302733229"; s[0] := "-"; k := 1; - j := 0; WHILE a[j] # 0X DO INC(j) END - END; - ASSERT(k + j < LEN(s), 20); - REPEAT DEC(j); ch := a[j]; s[k] := ch; INC(k) UNTIL j = 0; - s[k] := 0X; - Msg(s); - END Int; - - (* end of debugging functions *) - - (* encoding translation *) - - PROCEDURE GetEnc (OUT enc: Encoding; OUT ok: BOOLEAN); - VAR env: LinLibc.PtrSTR; - i, j: INTEGER; - - PROCEDURE IsSLetter (c: SHORTCHAR): BOOLEAN; - BEGIN - RETURN (c >= 'a') & (c <= 'z') - END IsSLetter; - - PROCEDURE IsBLetter (c: SHORTCHAR): BOOLEAN; - BEGIN - RETURN (c >= 'A') & (c <= 'Z') - END IsBLetter; - - PROCEDURE IsValidEncChar (x: SHORTCHAR): BOOLEAN; - BEGIN - RETURN ((x >= 'A') & (x <= 'Z')) OR ((x >= '0') & (x <= '9')) OR (x = '-') OR (x = '_') - OR ((x >= 'a') & (x <= 'z')) - END IsValidEncChar; - - BEGIN - env := LinLibc.getenv("LANG"); - IF env # NIL THEN - IF env$ = "C" THEN - enc := "ASCII"; ok := TRUE - ELSE - IF IsSLetter(env[0]) & IsSLetter(env[1]) & (env[2] = '_') - & IsBLetter(env[3]) & IsBLetter(env[4]) & (env[5] = '.') THEN - i := 6; j := 0; - WHILE IsValidEncChar(env[i]) & (j < LEN(enc) - 1) DO - enc[j] := env[i]; - INC(j); INC(i) - END; - IF (env[i] = 0X) & (j < LEN(enc)) THEN - enc[j] := 0X; ok := TRUE - ELSE ok := FALSE - END - ELSE ok := FALSE - END - END - ELSE ok := FALSE - END - END GetEnc; - - PROCEDURE InitConv; - VAR enc: Encoding; ok: BOOLEAN; - BEGIN - GetEnc(enc, ok); - IF ok THEN - IF Kernel.littleEndian THEN - e := Iconv.iconv_open(enc, "UCS-2LE"); - d := Iconv.iconv_open("UCS-2LE", enc) - ELSE - e := Iconv.iconv_open(enc, "UCS-2BE"); - d := Iconv.iconv_open("UCS-2BE", enc) - END - ELSE e := -1; d := -1 - END - END InitConv; - - PROCEDURE CloseConv; - VAR res: INTEGER; - BEGIN - IF e # -1 THEN res := Iconv.iconv_close(e); e := -1 END; - IF d # -1 THEN res := Iconv.iconv_close(d); d := -1 END - END CloseConv; - - PROCEDURE ResetCodec (c: Iconv.iconv_t): BOOLEAN; - VAR res, fLen, tLen: Iconv.size_t; - BEGIN - ASSERT(c # -1, 20); - fLen := 0; tLen := 0; - res := Iconv.iconv(c, NIL, fLen, NIL, tLen); - RETURN res # -1 - END ResetCodec; - - PROCEDURE Short (IN f: FullName; OUT t: ShortName; OUT ok: BOOLEAN); - VAR fR, fLen, tLen: INTEGER; - from: Iconv.PtrLSTR; to: Iconv.PtrSTR; res: Iconv.size_t; - BEGIN - (* do not use encoder for basic set of chars *) - fR := 0; WHILE (f[fR] >= ' ') & (f[fR] <= '~') DO t[fR] := SHORT(f[fR]); INC(fR) END; - IF f[fR] = 0X THEN t[fR] := 0X; ok := TRUE - ELSIF (e # -1) & ResetCodec(e) THEN - from := f; to := t; fLen := LEN(f$) * SIZE(CHAR) (* 2 *); tLen := LEN(t) - 1; - res := Iconv.iconv_encode(e, from, fLen, to, tLen); - IF (res >= 0) & (fLen = 0) & (tLen >= 0) THEN to[0] := 0X; ok := TRUE - ELSE t[0] := 0X; ok := FALSE - END - ELSE t[0] := 0X; ok := FALSE - END - END Short; - - PROCEDURE Long (IN f: ShortName; OUT t: FullName; OUT ok: BOOLEAN); - VAR fR, fLen, tLen: INTEGER; - from: Iconv.PtrSTR; to: Iconv.PtrLSTR; res: Iconv.size_t; - BEGIN - (* do not use decoder for basic set of chars *) - fR := 0; WHILE (f[fR] >= ' ') & (f[fR] <= '~') & (fR < LEN(t) - 1) DO t[fR] := f[fR]; INC(fR) END; - IF f[fR] = 0X THEN - IF fR < LEN(t) THEN t[fR] := 0X; ok := TRUE - ELSE t[0] := 0X; ok := FALSE (* f is too long *) - END - ELSIF (d # -1) & ResetCodec(d) THEN - from := f; to := t; fLen := LEN(f$); tLen := (LEN(t) - 1) * SIZE(CHAR) (* 2 *); - res := Iconv.iconv_decode(d, from, fLen, to, tLen); - IF (res >= 0) & (fLen = 0) & (tLen >= 0) THEN to[0] := 0X; ok := TRUE - ELSE t[0] := 0X; ok := FALSE - END - ELSE t[0] := 0X; ok := FALSE - END - END Long; - - (* end of encoding translation *) - - - (* get error num from linux *) - PROCEDURE LinLibc_errno (): INTEGER; - VAR - addr, errno: INTEGER; - BEGIN - addr := LinLibc.__errno_location(); - SYSTEM.GET(addr, errno); - RETURN errno - END LinLibc_errno; - - PROCEDURE Error (n: INTEGER): INTEGER; - VAR res: INTEGER; - BEGIN - IF n = ok THEN res := ok - ELSIF n = invalidNameErr THEN res := invalidName - ELSIF (n = fileNotFoundErr) OR (n = pathNotFoundErr) THEN res := notFound - ELSIF (n = fileExistsErr) OR (n = alreadyExistsErr) THEN res := existsAlready - ELSIF n = writeProtectedErr THEN res := writeProtected - ELSIF (n = sharingErr) OR (n = accessDeniedErr) OR (n = netAccessDeniedErr) THEN res := accessDenied - ELSIF n = notEnoughMemoryErr THEN res := notEnoughMem - ELSIF (n = diskFullErr) OR (n = tooManyOpenFilesErr) THEN res := notEnoughDisk - ELSE res := -n - END; - RETURN res - END Error; - - PROCEDURE Diff (IN a, b: ARRAY OF CHAR; caseSens: BOOLEAN): INTEGER; - VAR i: INTEGER; cha, chb: CHAR; - BEGIN - i := 0; - REPEAT - cha := a[i]; chb := b[i]; INC(i); - IF cha # chb THEN - IF ~caseSens THEN - IF (cha >= "a") & ((cha <= "z") OR (cha >= 0E0X) & (cha <= 0FEX) & (cha # 0F7X)) THEN - cha := CAP(cha) - END; - IF (chb >= "a") & ((chb <= "z") OR (chb >= 0E0X) & (chb <= 0FEX) & (chb # 0F7X)) THEN - chb := CAP(chb) - END - END; - IF cha = "\" THEN cha := "/" END; - IF chb = "\" THEN chb := "/" END; - IF cha # chb THEN RETURN ORD(cha) - ORD(chb) END - END - UNTIL cha = 0X; - RETURN 0 - END Diff; - - PROCEDURE Stat (IN fname: FullName; VAR buf: LinLibc.stat_t; OUT res: INTEGER); - VAR s: ShortName; ok1: BOOLEAN; - BEGIN - Short(fname, s, ok1); - res := LinLibc.__xstat(3, s, buf); (* macro expansion of "stat" *) - END Stat; - - PROCEDURE ModeToAttr (mode: SET; OUT attr: SET; OUT isDir: BOOLEAN); - CONST read = 8; write = 7; execute = 6; file = 15; (* bits for permissions for the current user (see man chmod) *) - BEGIN - attr := {}; - IF ~(write IN mode) THEN INCL(attr, Files.readOnly) END; - isDir := ~(file IN mode) (* see "man 2 stat" for details *) - END ModeToAttr; - - PROCEDURE NewLocator* (IN fname: ARRAY OF CHAR): Locator; - VAR loc: Locator; i: INTEGER; - BEGIN - NEW(loc); loc.path := fname$; i := 0; - WHILE loc.path[i] # 0X DO INC(i) END; - IF (loc.path[i-1] = "/") OR (loc.path[i-1] = "\") THEN loc.path[i-1] := 0X END; - loc.maxLen := LinLibc.NAME_MAX; loc.caseSens := TRUE; - RETURN loc - END NewLocator; - - PROCEDURE GetType (IN name: ARRAY OF CHAR; VAR type: Files.Type); - VAR i, j: INTEGER; ch: CHAR; - BEGIN - i := 0; j := 0; - WHILE name[i] # 0X DO INC(i) END; - WHILE (i > 0) & (name[i] # ".") DO DEC(i) END; - IF i > 0 THEN - INC(i); ch := name[i]; - WHILE (j < LEN(type) - 1) & (ch # 0X) DO - IF (ch >= "A") & (ch <= "Z") THEN ch := CHR(ORD(ch) + (ORD("a") - ORD("A"))) END; - type[j] := ch; INC(j); - INC(i); ch := name[i] - END - END; - type[j] := 0X - END GetType; - - PROCEDURE Append (IN path, name: ARRAY OF CHAR; type: Files.Type; max: INTEGER; - VAR res: ARRAY OF CHAR - ); - VAR i, j, n, m, dot: INTEGER; ch: CHAR; - BEGIN - i := 0; - WHILE path[i] # 0X DO res[i] := path[i]; INC(i) END; - IF path # "" THEN - ASSERT((res[i-1] # "/") & (res[i-1] # "\"), 100); - res[i] := "/"; INC(i) - END; - j := 0; ch := name[0]; n := 0; m := max; dot := -1; - IF max = 12 THEN m := 8 END; - WHILE (i < LEN(res) - 1) & (ch # 0X) DO - IF (ch = "/") OR (ch = "\") THEN - res[i] := ch; INC(i); n := 0; m := max; dot := -1; - IF max = 12 THEN m := 8 END - ELSIF (n < m) OR (ch = ".") & (n = 8) THEN - res[i] := ch; INC(i); INC(n); - IF ch = "." THEN dot := n; - IF max = 12 THEN m := n + 3 END - END - END; - INC(j); ch := name[j] - END; - IF (dot = -1) & (type # "") THEN - IF max = 12 THEN m := n + 4 END; - IF (n < m) & (i < LEN(res) - 1) THEN res[i] := "."; INC(i); INC(n); dot := n END - END; - IF n = dot THEN j := 0; - WHILE (n < m) & (i < LEN(res) - 1) & (type[j] # 0X) DO res[i] := type[j]; INC(i); INC(j) END - END; - res[i] := 0X - END Append; - - PROCEDURE CloseFileHandle (f: File; VAR res: INTEGER); - BEGIN - IF (f.ref = invalid) OR (LinLibc.fclose(f.ref) = 0) THEN res := ok (* !!! *) - ELSE res := LinLibc_errno() - END; - f.ref := invalid - END CloseFileHandle; - - PROCEDURE CloseFile (f: File; VAR res: INTEGER); - VAR s: INTEGER; n: ShortName; ok1: BOOLEAN; - BEGIN - IF f.state = exclusive THEN - f.Flush; - res := LinLibc.fflush(f.ref) - END; - s := f.state; f.state := closed; - CloseFileHandle (f, res); - IF (s IN {temp, new, hidden}) & (f.name # "") THEN - Short(f.name, n, ok1); - res := LinLibc.remove(n) - END - END CloseFile; - - PROCEDURE (f: File) FINALIZE; - VAR res: INTEGER; - BEGIN - IF f.state # closed THEN CloseFile(f, res) END - END FINALIZE; - - PROCEDURE (VAR id: Identifier) Identified (): BOOLEAN; - VAR f: File; - BEGIN - f := id.obj(File); - RETURN (f.state IN {shared, exclusive}) & (Diff(f.name, id.name, f.loc.caseSens) = 0) - END Identified; - - PROCEDURE ThisFile (IN name: FullName): File; - VAR id: Identifier; p: ANYPTR; - BEGIN - id.typ := SYSTEM.TYP(File); id.name := name$; - p := Kernel.ThisFinObj(id); - IF p # NIL THEN RETURN p(File) - ELSE RETURN NIL - END - END ThisFile; - - PROCEDURE (VAR s: Searcher) Identified (): BOOLEAN; - VAR f: File; - BEGIN - f := s.obj(File); - IF (f.ref # invalid) & ((s.f = NIL) OR (f.t < s.f.t)) THEN s.f := f END; - RETURN FALSE - END Identified; - - PROCEDURE SearchFileToClose; - VAR s: Searcher; p: ANYPTR; (* res: LONGINT; *) - BEGIN - s.typ := SYSTEM.TYP(File); s.f := NIL; - p := Kernel.ThisFinObj(s); - IF s.f # NIL THEN - res := LinLibc.fclose(s.f.ref); s.f.ref := invalid; - IF res = 0 THEN res := LinLibc_errno(); HALT(100) END - END - END SearchFileToClose; - - PROCEDURE ExistingFile (VAR n: ShortName): BOOLEAN; - VAR f: LinLibc.PtrFILE; ret: BOOLEAN; res: INTEGER; - BEGIN - f := LinLibc.fopen(n, "r"); - IF f # LinLibc.NULL THEN - res := LinLibc.fclose(f); - ret := TRUE - ELSE - ret := FALSE - END; - RETURN ret - END ExistingFile; - - PROCEDURE MoveFile (VAR old, new: ShortName; VAR res: INTEGER); (* as the WinApi.MoveFile *) - BEGIN - IF ExistingFile(new) THEN - res := fileExistsErr - ELSE - IF LinLibc.rename(old, new) = 0 THEN res := ok - ELSE res := LinLibc_errno(); - END - END - END MoveFile; - - PROCEDURE NewFileRef (state: INTEGER; VAR name: FullName; VAR ref, res: INTEGER); - VAR n: ShortName; ok1: BOOLEAN; - BEGIN - Short(name, n, ok1); - IF state = create THEN (* Create should fail if file already exists *) - IF ExistingFile(n) THEN - ref := invalid; res := fileExistsErr - ELSE - ref := LinLibc.fopen(n, "w+"); - IF ref = invalid THEN res := LinLibc_errno() ELSE res := ok END - END - ELSIF state = shared THEN - ref := LinLibc.fopen(n, "r"); - IF ref = invalid THEN res := LinLibc_errno() ELSE res := ok END - ELSE - ref := LinLibc.fopen(n, "r+"); - IF ref = invalid THEN res := LinLibc_errno() ELSE res := ok END - END - END NewFileRef; - - PROCEDURE OpenFile (state: INTEGER; VAR name: FullName; VAR ref, res: INTEGER); - BEGIN - NewFileRef(state, name, ref, res); - IF ref = invalid THEN - IF res = tooManyOpenFilesErr THEN - Kernel.Collect; - NewFileRef(state, name, ref, res); - IF ref = invalid THEN - res := LinLibc_errno(); - IF res = tooManyOpenFilesErr THEN - SearchFileToClose; - NewFileRef(state, name, ref, res); - END - ELSE res := ok - END - END - ELSE res := ok - END - END OpenFile; - - PROCEDURE GetTempFileName (IN path: FullName; OUT name: FullName; num: INTEGER); - VAR i: INTEGER; str: ARRAY 16 OF CHAR; - BEGIN - str := tempName; i := 7; - WHILE i > 2 DO - str[i] := CHR(num MOD 10 + ORD("0")); DEC(i); num := num DIV 10 - END; - Append(path, str, "", 8, name) - END GetTempFileName; - - PROCEDURE CreateFile (f: File; VAR res: INTEGER); - VAR num, n: INTEGER; - BEGIN - IF f.name = "" THEN - num := LinLibc.clock(); n := 200; - REPEAT - GetTempFileName(f.loc.path, f.name, num); INC(num); DEC(n); - OpenFile(create, f.name, f.ref, res) - UNTIL (res # fileExistsErr) OR (n = 0) - ELSE - OpenFile(f.state, f.name, f.ref, res) - END - END CreateFile; - - PROCEDURE Delete (IN fname, path: FullName; VAR res: INTEGER); - VAR num, n: INTEGER; f: File; new: FullName; attr: SET; fn, nn: ShortName; buf: LinLibc.stat_t; isDir: BOOLEAN; - ok1: BOOLEAN; - BEGIN - ASSERT(fname # "", 100); - f := ThisFile(fname); Short(fname, fn, ok1); - IF f = NIL THEN - IF LinLibc.remove(fn) = 0 THEN - res := ok - ELSE - res := LinLibc.fflush(0); - IF LinLibc.remove(fn) = 0 THEN res := ok ELSE res := LinLibc_errno() END - END - ELSE (* still in use => make it anonymous *) - IF f.ref # invalid THEN res := LinLibc.fclose(f.ref); f.ref := invalid END; (* !!! *) - Stat(f.name, buf, res); - ModeToAttr(buf.st_mode, attr, isDir); - IF (res = ok) & ~(Files.readOnly IN attr) THEN - num := LinLibc.clock(); n := 200; - REPEAT - GetTempFileName(path, new, num); INC(num); DEC(n); - Short(new, nn, ok1); - MoveFile(fn, nn, res); - UNTIL (res # fileExistsErr) OR (n = 0); - IF res = ok THEN - f.state := hidden; f.name := new$ - END - ELSE - res := writeProtectedErr - END - END - END Delete; - - PROCEDURE FlushBuffer (f: File; i: INTEGER); - VAR buf: Buffer; res: INTEGER; - BEGIN - buf := f.bufs[i]; - IF (buf # NIL) & buf.dirty THEN - IF f.ref = invalid THEN CreateFile(f, res) (* ASSERT(res = ok, 100) *) END; - IF f.ref # invalid THEN - res := LinLibc.fseek(f.ref, buf.org, LinLibc.SEEK_SET); - IF LinLibc.fwrite(SYSTEM.ADR(buf.data), 1, buf.len, f.ref) < buf.len THEN - res := LinLibc_errno(); HALT(101) - END; - res := LinLibc.fflush(f.ref); - buf.dirty := FALSE; f.t := Kernel.Time() - END - END - END FlushBuffer; - - (* File *) - - PROCEDURE (f: File) NewReader (old: Files.Reader): Files.Reader; - VAR r: Reader; - BEGIN (* portable *) - ASSERT(f.state # closed, 20); - IF (old # NIL) & (old IS Reader) THEN r := old(Reader) ELSE NEW(r) END; - IF r.base # f THEN - r.base := f; r.buf := NIL; r.SetPos(0) - END; - r.eof := FALSE; - RETURN r - END NewReader; - - PROCEDURE (f: File) NewWriter (old: Files.Writer): Files.Writer; - VAR w: Writer; - BEGIN (* portable *) - ASSERT(f.state # closed, 20); ASSERT(f.state # shared, 21); - IF (old # NIL) & (old IS Writer) THEN w := old(Writer) ELSE NEW(w) END; - IF w.base # f THEN - w.base := f; w.buf := NIL; w.SetPos(f.len) - END; - RETURN w - END NewWriter; - - PROCEDURE (f: File) Length (): INTEGER; - BEGIN (* portable *) - RETURN f.len - END Length; - - PROCEDURE (f: File) Flush; - VAR i: INTEGER; - BEGIN (* portable *) - i := 0; WHILE i # nofbufs DO FlushBuffer(f, i); INC(i) END - END Flush; - - PROCEDURE GetPath (IN fname: FullName; OUT path: FullName); - VAR i: INTEGER; - BEGIN - path := fname$; i := LEN(path$); - WHILE (i > 0) & (path[i] # "\") & (path[i] # "/") & (path[i-1] # ":") DO DEC(i) END; - path[i] := 0X - END GetPath; - - PROCEDURE CreateDir (VAR path: FullName; VAR res: INTEGER); - VAR (*sec: KERNEL32.SecurityAttributes;*) p: FullName; s: ShortName; ok1: BOOLEAN; - BEGIN - ASSERT(path # "", 100); - Short(path, s, ok1); - res := LinLibc.mkdir(s, {0..MAX(SET)}); (* full rights are masked with the umask, is this correct? *) - IF res # ok THEN - res := LinLibc_errno(); - IF (res = LinLibc.ENOTDIR) OR (res = LinLibc.ENOENT) THEN - GetPath(path, p); - CreateDir(p, res); (* recursive call *) - IF res = ok THEN - res := LinLibc.mkdir(s, {0..MAX(SET)}); (* full rights are masked with the umask, is this correct? *) - IF res # ok THEN res := LinLibc_errno() END - END - END - END - END CreateDir; - - PROCEDURE CheckPath (VAR path: FullName; ask: BOOLEAN; VAR res: INTEGER); - VAR s: ARRAY 300 OF CHAR; t: ARRAY 32 OF CHAR; - BEGIN - (*IF ask THEN - IF MapParamString # NIL THEN - MapParamString("#Host:CreateDir", path, "", "", s); - MapParamString("#Host:MissingDirectory", "", "", "", t) - ELSE - s := path$; t := "Missing Directory" - END; - res := Kernel.MessageBox(t, s, {Kernel.mbOk, Kernel.mbCancel}) - ELSE - res := Kernel.mbOk - END;*) - (*IF res = Kernel.mbOk THEN*) CreateDir(path, res) - (*ELSIF res = Kernel.mbCancel THEN res := cancel - END*) - END CheckPath; - - PROCEDURE CheckDelete (IN fname, path: FullName; ask: BOOLEAN; VAR res: INTEGER); - VAR s: ARRAY 300 OF CHAR; t: ARRAY 16 OF CHAR; - BEGIN - REPEAT - Delete(fname, path, res); - IF (res = writeProtectedErr) - OR (res = sharingErr) - OR (res = accessDeniedErr) - OR (res = netAccessDeniedErr) - THEN - (*IF ask THEN - IF MapParamString # NIL THEN - IF res = writeProtectedErr THEN - MapParamString("#Host:ReplaceWriteProtected", fname, 0DX, "", s) - ELSIF (res = accessDeniedErr) OR (res = netAccessDeniedErr) THEN - MapParamString("#Host:ReplaceAccessDenied", fname, 0DX, "", s) - ELSE - MapParamString("#Host:ReplaceInUse", fname, 0DX, "", s) - END; - MapParamString("#Host:FileError", "", "", "", t) - ELSE - s := fname$; t := "File Error" - END; - res := Kernel.MessageBox(t, s, {Kernel.mbRetry, Kernel.mbCancel}); - IF res = Kernel.mbCancel THEN res := cancel - ELSIF res = Kernel.mbRetry THEN res := retry - END - ELSE*) - res := cancel - (*END*) - ELSE - res := ok - END - UNTIL res # retry - END CheckDelete; - - PROCEDURE (f: File) Register (name: Files.Name; type: Files.Type; ask: BOOLEAN; OUT res: INTEGER); - VAR b: INTEGER; fname: FullName; fn, nn: ShortName; ok1: BOOLEAN; - BEGIN - ASSERT(f.state = new, 20); ASSERT(name # "", 21); - Append(f.loc.path, name, type, f.loc.maxLen, fname); - CheckDelete(fname, f.loc.path, ask, res); - ASSERT(res # 87, 100); - IF res = ok THEN - IF f.name = "" THEN - f.name := fname$; - OpenFile(create, f.name, f.ref, res); - IF res = ok THEN - f.state := exclusive; CloseFile(f, res); - Short(f.name, fn, ok1); - END - ELSE - f.state := exclusive; CloseFile(f, res); - Short(f.name, fn, ok1); Short(fname, nn, ok1); - MoveFile(fn, nn, res); - IF res = ok THEN - f.name := fname$; - Short(f.name, fn, ok1); - ELSE - ASSERT(res # 87, 101); - Short(f.name, fn, ok1); - b := LinLibc.remove(fn); - END - END - END; - res := Error(res) - END Register; - - PROCEDURE (f: File) Close; - VAR res: INTEGER; - BEGIN (* portable *) - IF f.state # closed THEN -(* - IF f.state = exclusive THEN - CloseFile(f, res) - ELSE - CloseFileHandle(f, res) - END -*) - CloseFile(f, res) - END - END Close; - - - (* Locator *) - - PROCEDURE (loc: Locator) This* (IN path: ARRAY OF CHAR): Locator; - VAR new: Locator; i: INTEGER; - BEGIN - IF path = "" THEN - NEW(new); new^ := loc^ - ELSIF path[0] = "/" THEN (* absolute path *) - new := NewLocator(path); - new.rootLen := 0 - ELSIF (path[0] = "\") OR (path[0] = "/") THEN - IF (path[1] = "\") OR (path[1] = "/") THEN (* network path *) - new := NewLocator(path); - new.rootLen := 0 - ELSE - NEW(new); new^ := dir.startup^; - new.res := invalidName; - RETURN new - END - ELSE - NEW(new); Append(loc.path, path, "", loc.maxLen, new.path); - i := 0; WHILE new.path[i] # 0X DO INC(i) END; - IF (new.path[i-1] = "/") OR (new.path[i-1] = "\") THEN new.path[i-1] := 0X END; - new.maxLen := loc.maxLen; - new.caseSens := loc.caseSens; - new.rootLen := loc.rootLen - END; - new.res := ok; - RETURN new - END This; - - (* Reader *) - - PROCEDURE (r: Reader) Base (): Files.File; - BEGIN (* portable *) - RETURN r.base - END Base; - - PROCEDURE (r: Reader) SetPos (pos: INTEGER); - VAR f: File; org, offset, i, count, res: INTEGER; buf: Buffer; - BEGIN - f := r.base; ASSERT(f # NIL, 20); ASSERT(f.state # closed, 25); - ASSERT(pos >= 0, 22); ASSERT(pos <= f.len, 21); - offset := pos MOD bufsize; org := pos - offset; - i := 0; WHILE (i # nofbufs) & (f.bufs[i] # NIL) & (org # f.bufs[i].org) DO INC(i) END; - IF i # nofbufs THEN - buf := f.bufs[i]; - IF buf = NIL THEN (* create new buffer *) - NEW(buf); f.bufs[i] := buf; buf.org := -1 - END - ELSE (* choose an existing buffer *) - f.swapper := (f.swapper + 1) MOD nofbufs; - FlushBuffer(f, f.swapper); buf := f.bufs[f.swapper]; buf.org := -1 - END; - IF buf.org # org THEN - IF org + bufsize > f.len THEN buf.len := f.len - org ELSE buf.len := bufsize END; - count := buf.len; - IF count > 0 THEN - IF f.ref = invalid THEN CreateFile(f, res) (* ASSERT(res = ok, 100) *) END; - IF f.ref # invalid THEN - IF LinLibc.fseek(f.ref, org, LinLibc.SEEK_SET) # 0 THEN - res := LinLibc_errno(); HALT(101) - END; - IF LinLibc.fread(SYSTEM.ADR(buf.data), 1, count, f.ref) < count THEN - res := LinLibc_errno(); HALT(102) - END; - f.t := Kernel.Time() - END - END; - buf.org := org; buf.dirty := FALSE - END; - r.buf := buf; r.org := org; r.offset := offset; r.eof := FALSE - (* 0<= r.org <= r.base.len *) - (* 0 <= r.offset < bufsize *) - (* 0 <= r.buf.len <= bufsize *) - (* r.offset <= r.base.len *) - (* r.offset <= r.buf.len *) - END SetPos; - - PROCEDURE (r: Reader) Pos (): INTEGER; - BEGIN (* portable *) - ASSERT(r.base # NIL, 20); - RETURN r.org + r.offset - END Pos; - - PROCEDURE (r: Reader) ReadByte (OUT x: BYTE); - BEGIN (* portable *) - IF (r.org # r.buf.org) OR (r.offset >= bufsize) THEN r.SetPos(r.org + r.offset) END; - IF r.offset < r.buf.len THEN - x := r.buf.data[r.offset]; INC(r.offset) - ELSE - x := 0; r.eof := TRUE - END - END ReadByte; - - PROCEDURE (r: Reader) ReadBytes (VAR x: ARRAY OF BYTE; beg, len: INTEGER); - VAR from, to, count, restInBuf: INTEGER; - BEGIN (* portable *) - ASSERT(beg >= 0, 21); - IF len > 0 THEN - ASSERT(beg + len <= LEN(x), 23); - WHILE len # 0 DO - IF (r.org # r.buf.org) OR (r.offset >= bufsize) THEN r.SetPos(r.org + r.offset) END; - restInBuf := r.buf.len - r.offset; - IF restInBuf = 0 THEN r.eof := TRUE; RETURN - ELSIF restInBuf <= len THEN count := restInBuf - ELSE count := len - END; - from := SYSTEM.ADR(r.buf.data[r.offset]); to := SYSTEM.ADR(x) + beg; - SYSTEM.MOVE(from, to, count); - INC(r.offset, count); INC(beg, count); DEC(len, count) - END; - r.eof := FALSE - ELSE ASSERT(len = 0, 22) - END - END ReadBytes; - - (* Writer *) - - PROCEDURE (w: Writer) Base (): Files.File; - BEGIN (* portable *) - RETURN w.base - END Base; - - PROCEDURE (w: Writer) SetPos (pos: INTEGER); - VAR f: File; org, offset, i, count, res: INTEGER; buf: Buffer; - BEGIN - f := w.base; ASSERT(f # NIL, 20); ASSERT(f.state # closed, 25); - ASSERT(pos >= 0, 22); ASSERT(pos <= f.len, 21); - offset := pos MOD bufsize; org := pos - offset; - i := 0; WHILE (i # nofbufs) & (f.bufs[i] # NIL) & (org # f.bufs[i].org) DO INC(i) END; - IF i # nofbufs THEN - buf := f.bufs[i]; - IF buf = NIL THEN (* create new buffer *) - NEW(buf); f.bufs[i] := buf; buf.org := -1 - END - ELSE (* choose an existing buffer *) - f.swapper := (f.swapper + 1) MOD nofbufs; - FlushBuffer(f, f.swapper); buf := f.bufs[f.swapper]; buf.org := -1 - END; - IF buf.org # org THEN - IF org + bufsize > f.len THEN buf.len := f.len - org ELSE buf.len := bufsize END; - count := buf.len; - IF count > 0 THEN - IF f.ref = invalid THEN CreateFile(f, res) (* ASSERT(res = ok, 100) *) END; - IF f.ref # invalid THEN - IF LinLibc.fseek(f.ref, org, LinLibc.SEEK_SET) # 0 THEN - res := LinLibc_errno(); HALT(101) - END; - IF LinLibc.fread(SYSTEM.ADR(buf.data), 1, count, f.ref) < count THEN - res := LinLibc_errno(); HALT(102) - END; - f.t := Kernel.Time() - END - END; - buf.org := org; buf.dirty := FALSE - END; - w.buf := buf; w.org := org; w.offset := offset - (* 0<= w.org <= w.base.len *) - (* 0 <= w.offset < bufsize *) - (* 0 <= w.buf.len <= bufsize *) - (* w.offset <= w.base.len *) - (* w.offset <= w.buf.len *) - END SetPos; - - PROCEDURE (w: Writer) Pos (): INTEGER; - BEGIN (* portable *) - ASSERT(w.base # NIL, 20); - RETURN w.org + w.offset - END Pos; - - PROCEDURE (w: Writer) WriteByte (x: BYTE); - BEGIN (* portable *) - ASSERT(w.base.state # closed, 25); - IF (w.org # w.buf.org) OR (w.offset >= bufsize) THEN w.SetPos(w.org + w.offset) END; - w.buf.data[w.offset] := x; w.buf.dirty := TRUE; - IF w.offset = w.buf.len THEN INC(w.buf.len); INC(w.base.len) END; - INC(w.offset) - END WriteByte; - - PROCEDURE (w: Writer) WriteBytes (IN x: ARRAY OF BYTE; beg, len: INTEGER); - VAR from, to, count, restInBuf: INTEGER; - BEGIN (* portable *) - ASSERT(beg >= 0, 21); ASSERT(w.base.state # closed, 25); - IF len > 0 THEN - ASSERT(beg + len <= LEN(x), 23); - WHILE len # 0 DO - IF (w.org # w.buf.org) OR (w.offset >= bufsize) THEN w.SetPos(w.org + w.offset) END; - restInBuf := bufsize - w.offset; - IF restInBuf <= len THEN count := restInBuf ELSE count := len END; - from := SYSTEM.ADR(x) + beg; to := SYSTEM.ADR(w.buf.data[w.offset]); - SYSTEM.MOVE(from, to, count); - INC(w.offset, count); INC(beg, count); DEC(len, count); - IF w.offset > w.buf.len THEN INC(w.base.len, w.offset - w.buf.len); w.buf.len := w.offset END; - w.buf.dirty := TRUE - END - ELSE ASSERT(len = 0, 22) - END - END WriteBytes; - - (* Directory *) - - PROCEDURE (d: Directory) This (IN path: ARRAY OF CHAR): Files.Locator; - BEGIN - RETURN d.startup.This(path) - END This; - - PROCEDURE (d: Directory) New (loc: Files.Locator; ask: BOOLEAN): Files.File; - VAR f: File; res: INTEGER; attr: SET; isDir: BOOLEAN; buf: LinLibc.stat_t; - BEGIN - ASSERT(loc # NIL, 20); f := NIL; res := ok; - WITH loc: Locator DO - IF loc.path # "" THEN - Stat(loc.path, buf, res); - IF res # ok THEN - IF loc.res = 76 THEN CreateDir(loc.path, res) - ELSE CheckPath(loc.path, ask, res) - END - ELSE - ModeToAttr(buf.st_mode, attr, isDir); - IF ~isDir THEN res := fileExistsErr END - END - END; - IF res = ok THEN - NEW(f); f.loc := loc; f.name := ""; - f.state := new; f.swapper := -1; f.len := 0; f.ref := invalid - END - ELSE res := invalidNameErr - END; - loc.res := Error(res); - RETURN f - END New; - - PROCEDURE (d: Directory) Temp (): Files.File; - VAR f: File; - BEGIN - NEW(f); f.loc := d.temp; f.name := ""; - f.state := temp; f.swapper := -1; f.len := 0; f.ref := invalid; - RETURN f - END Temp; - - PROCEDURE GetShadowDir (loc: Locator; OUT dir: FullName); - VAR i, j: INTEGER; - BEGIN - dir := startupDir$; i := startupLen; j := loc.rootLen; - WHILE loc.path[j] # 0X DO dir[i] := loc.path[j]; INC(i); INC(j) END; - dir[i] := 0X - END GetShadowDir; - - PROCEDURE (d: Directory) Old (loc: Files.Locator; name: Files.Name; shrd: BOOLEAN): Files.File; - VAR res: INTEGER; f: File; ref: LinLibc.PtrFILE; fname: FullName; type: Files.Type; s: BYTE; buf: LinLibc.stat_t; - BEGIN - ASSERT(loc # NIL, 20); ASSERT(name # "", 21); - res := ok; f := NIL; - WITH loc: Locator DO - Append(loc.path, name, "", loc.maxLen, fname); - f := ThisFile(fname); - IF f # NIL THEN - IF ~shrd OR (f.state = exclusive) THEN loc.res := Error(sharingErr); RETURN NIL - ELSE loc.res := ok; RETURN f - END - END; - IF shrd THEN s := shared ELSE s := exclusive END; - OpenFile(s, fname, ref, res); - IF ((res = fileNotFoundErr) OR (res = pathNotFoundErr)) & (loc.rootLen > 0) THEN - GetShadowDir(loc, fname); - Append(fname, name, "", loc.maxLen, fname); - f := ThisFile(fname); - IF f # NIL THEN - IF ~shrd OR (f.state = exclusive) THEN loc.res := Error(sharingErr); RETURN NIL - ELSE loc.res := ok; RETURN f - END - END; - OpenFile(s, fname, ref, res) - END; - IF res = ok THEN - NEW(f); f.loc := loc; - f.swapper := -1; - GetType(name, type); - f.InitType(type); - ASSERT(ref # invalid, 107); - f.ref := ref; f.name := fname$; f.state := s; f.t := Kernel.Time(); - Stat(f.name, buf, res); - f.len := buf.st_size; - res := LinLibc.fseek(ref, 0, LinLibc.SEEK_SET); - END - END; - loc.res := Error(res); - RETURN f - END Old; - - PROCEDURE (d: Directory) Delete* (loc: Files.Locator; name: Files.Name); - VAR res: INTEGER; fname: FullName; - BEGIN - ASSERT(loc # NIL, 20); - WITH loc: Locator DO - Append(loc.path, name, "", loc.maxLen, fname); - Delete(fname, loc.path, res) - ELSE res := invalidNameErr - END; - loc.res := Error(res) - END Delete; - - PROCEDURE (d: Directory) Rename* (loc: Files.Locator; old, new: Files.Name; ask: BOOLEAN); - VAR res, i: INTEGER; oldname, newname: FullName; f: File; on, nn, tn: ShortName; buf: LinLibc.stat_t; - ok1: BOOLEAN; tName: FullName; - BEGIN - ASSERT(loc # NIL, 20); - WITH loc: Locator DO - Append(loc.path, old, "", loc.maxLen, oldname); Append(loc.path, new, "", loc.maxLen, newname); - Short(oldname, on, ok1); Short(newname, nn, ok1); - Stat(oldname, buf, res); - IF res = ok THEN - f := ThisFile(oldname); - IF (f # NIL) & (f.ref # invalid) THEN res := LinLibc.fclose(f.ref); f.ref := invalid END; - IF Diff(oldname, newname, loc.caseSens) # 0 THEN - CheckDelete(newname, loc.path, ask, res); - IF res = ok THEN - IF LinLibc.rename(on, nn) = 0 THEN - IF f # NIL THEN (* still in use => update file table *) - f.name := newname$ - END - ELSE res := LinLibc_errno() - END - END - ELSE (* destination is same file as source *) - tName := oldname; i := LEN(tName$) - 1; - REPEAT - tName[i] := CHR(ORD(tName[i]) + 1); - Short(tName, tn, ok1); - MoveFile(on, tn, res); - UNTIL (res # fileExistsErr) & (res # alreadyExistsErr) & (res # 87); - IF res = ok THEN - MoveFile(tn, nn, res) - END - END - ELSE res := fileNotFoundErr - END - ELSE res := invalidNameErr - END; - loc.res := Error(res) - END Rename; - - PROCEDURE (d: Directory) SameFile* (loc0: Files.Locator; name0: Files.Name; - loc1: Files.Locator; name1: Files.Name - ): BOOLEAN; - VAR p0, p1: FullName; - BEGIN - ASSERT(loc0 # NIL, 20); ASSERT(loc1 # NIL, 21); - WITH loc0: Locator DO Append(loc0.path, name0, "", loc0.maxLen, p0) END; - WITH loc1: Locator DO Append(loc1.path, name1, "", loc1.maxLen, p1) END; - RETURN Diff(p0, p1, loc0(Locator).caseSens) = 0 - END SameFile; - - PROCEDURE (d: Directory) FileList* (loc: Files.Locator): Files.FileInfo; - VAR diff, res: INTEGER; first, last, info: Files.FileInfo; s: FullName; - ss, fname: ShortName; dirp: LinLibc.PtrDIR; dp: LinLibc.PtrDirent; buf: LinLibc.stat_t; tm: LinLibc.tm; - isDir: BOOLEAN; attr: SET; ok1: BOOLEAN; dName: FullName; - BEGIN - ASSERT(loc # NIL, 20); - first := NIL; last :=NIL; - WITH loc: Locator DO - Short(loc.path, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.__xstat(3, fname, buf); (* macro expansion of "stat" *) - ModeToAttr(buf.st_mode, attr, isDir); - IF ~isDir THEN - info := first; last := NIL; s := dName; - WHILE (info # NIL) & (Diff(info.name, s, loc.caseSens) < 0) DO last := info; info := info.next END; - NEW(info); - info.name := dName$; - GetType(info.name, info.type); - info.length := buf.st_size; - tm := LinLibc.localtime(buf.st_mtime); - IF tm # NIL THEN - info.modified.year := tm.tm_year + 1900; - info.modified.month := tm.tm_mon + 1; - info.modified.day := tm.tm_mday; - info.modified.hour := tm.tm_hour; - info.modified.minute := tm.tm_min; - info.modified.second := tm.tm_sec - END; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END; - (* check startup directory *) - IF (loc.rootLen > 0) & ((res = ok) OR (res = fileNotFoundErr) OR (res = pathNotFoundErr)) THEN - GetShadowDir(loc, s); - Short(s, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.__xstat(3, fname, buf); (* macro expansion of "stat" *) - ModeToAttr(buf.st_mode, attr, isDir); - IF ~isDir THEN - info := first; last := NIL; s := dName; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END; - WHILE (info # NIL) & (diff < 0) DO - last := info; info := info.next; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END - END; - IF (info = NIL) OR (diff # 0) THEN - NEW(info); - info.name := dName$; - GetType(info.name, info.type); - info.length := buf.st_size; - tm := LinLibc.localtime(buf.st_mtime); - IF tm # NIL THEN - info.modified.year := tm.tm_year + 1900; - info.modified.month := tm.tm_mon + 1; - info.modified.day := tm.tm_mday; - info.modified.hour := tm.tm_hour; - info.modified.minute := tm.tm_min; - info.modified.second := tm.tm_sec - END; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END - END; - loc.res := Error(res) - ELSE loc.res := invalidName - END; - RETURN first - END FileList; - - PROCEDURE (d: Directory) LocList* (loc: Files.Locator): Files.LocInfo; - VAR diff, res: INTEGER; first, last, info: Files.LocInfo; s: FullName; isDir: BOOLEAN; attr: SET; - ss, fname: ShortName; dirp: LinLibc.PtrDIR; dp: LinLibc.PtrDirent; buf: LinLibc.stat_t; - ok1: BOOLEAN; dName: FullName; - BEGIN - ASSERT(loc # NIL, 20); - first := NIL; last :=NIL; - WITH loc: Locator DO - Short(loc.path, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.__xstat(3, fname, buf); (* macro expansion of "stat" *) - ModeToAttr(buf.st_mode, attr, isDir); - IF isDir THEN - info := first; last := NIL; s := dName; - WHILE (info # NIL) & (Diff(info.name, s, loc.caseSens) < 0) DO last := info; info := info.next END; - NEW(info); - info.name := dName$; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END; - (* check startup directory *) - IF (loc.rootLen > 0) & ((res = ok) OR (res = fileNotFoundErr) OR (res = pathNotFoundErr)) THEN - GetShadowDir(loc, s); - Short(s, ss, ok1); - dirp := LinLibc.opendir(ss); - IF dirp # LinLibc.NULL THEN - dp := LinLibc.readdir(dirp); - WHILE dp # NIL DO - Long(dp.d_name$, dName, ok1); - IF ok1 & (dp.d_name # ".") & (dp.d_name # "..") & (LEN(dName$) < LEN(info.name)) THEN - fname := ss + "/" + dp.d_name; - res := LinLibc.__xstat(3, fname, buf); (* macro expansion of "stat" *) - ModeToAttr(buf.st_mode, attr, isDir); - IF isDir THEN - info := first; last := NIL; s := dName; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END; - WHILE (info # NIL) & (diff < 0) DO - last := info; info := info.next; - IF info # NIL THEN diff := Diff(info.name, s, loc.caseSens) END - END; - IF (info = NIL) OR (diff # 0) THEN - NEW(info); - info.name := dName$; - info.attr := attr; - IF last = NIL THEN info.next := first; first := info ELSE info.next := last.next; last.next := info END - END - END - END; - dp := LinLibc.readdir(dirp) - END; - res := LinLibc.closedir(dirp) - ELSE res := LinLibc_errno() - END - END; - loc.res := Error(res) - ELSE loc.res := invalidName - END; - RETURN first - END LocList; - - PROCEDURE (d: Directory) GetFileName (name: Files.Name; type: Files.Type; OUT filename: Files.Name); - BEGIN - Append("", name, type, LEN(filename), filename) - END GetFileName; - - (** Miscellaneous **) - - PROCEDURE (VAR id: Counter) Identified (): BOOLEAN; - VAR f: File; - BEGIN - f := id.obj(File); - IF f.state # closed THEN INC(id.count) END; - RETURN FALSE - END Identified; - - PROCEDURE NofFiles* (): INTEGER; - VAR p: ANYPTR; cnt: Counter; - BEGIN - cnt.typ := SYSTEM.TYP(File); - cnt.count := 0; p := Kernel.ThisFinObj(cnt); - RETURN cnt.count - END NofFiles; - - PROCEDURE GetModDate* (f: Files.File; VAR year, month, day, hour, minute, second: INTEGER); - VAR buf: LinLibc.stat_t; tm: LinLibc.tm; - BEGIN - ASSERT(f IS File, 20); - Stat(f(File).name, buf, res); - IF res = ok THEN - tm := LinLibc.localtime(buf.st_mtime); - IF tm # NIL THEN - year := tm.tm_year + 1900; month := tm.tm_mon + 1; day := tm.tm_mday; - hour := tm.tm_hour; minute := tm.tm_min; second := tm.tm_sec - ELSE - res := -1 - END - END; - IF res # ok THEN year := 0; month := 0; day := 0; hour := 0; minute := 0; second := 0 END - END GetModDate; - - PROCEDURE SetRootDir* (path: ARRAY OF CHAR); - VAR i: INTEGER; - BEGIN - dir.startup := NewLocator(path); - dir.startup.rootLen := 0; i := 0; - WHILE startupDir[i] # 0X DO INC(i) END; - startupLen := i - END SetRootDir; - -(* - PROCEDURE GetName (VAR p: ARRAY OF CHAR; VAR i: INTEGER; OUT name, opt: FullName); - VAR ch, tch: CHAR; j: INTEGER; - BEGIN - j := 0; ch := p[i]; tch := " "; - WHILE ch = " " DO INC(i); ch := p[i] END; - IF (ch = "'") OR (ch = '"') THEN tch := ch; INC(i); ch := p[i] END; - WHILE (ch >= " ") & (ch # tch) DO - name[j] := ch; - IF (ch >= "a") & (ch <= "z") OR (ch >= "à") & (ch <= "ö") OR (ch >= "ø") & (ch <= "þ") THEN ch := CAP(ch) - ELSIF ch = "-" THEN ch := "/" - END; - opt[j] := ch; INC(j); INC(i); ch := p[i] - END; - IF ch > " " THEN INC(i); ch := p[i] END; - WHILE (ch # 0X) & (ch <= " ") DO INC(i); ch := p[i] END; - name[j] := 0X; opt[j] := 0X - END GetName; - - PROCEDURE Init; - VAR res, i, slp: INTEGER; path, opt: FullName; attr: SET; p: LinLibc.PtrSTR; str: ARRAY 256 OF CHAR; - buf: LinLibc.stat_t; isDir: BOOLEAN; - BEGIN -(* - TODO: - Instead of using getcwd below to find the local path it would be better to use Kernel.bootinfo.argv[0]. - But this only works if the PATH variable of the shell is not set to hold the BlackBox directory. In that - case all directories in the PATH variable has to be searched for the blackbox executable: - if (argv[0][0] == '/') - s = argv[0] - else { - str = getenv( "PATH" ); len = strlen( str ); - for ( i = 0, s = 0; i < len; i++ ) - if ( str[i] == ':' ) { - str[i] = '\0'; - if ( checkpath( str + s, argv[0] ) ) break; - else s = i + 1; - } - } -*) - wildcard := "*"; NEW(dir); - str := Kernel.cmdLine$; - i := 0; slp := -1; - WHILE (str[i] # " ") & (str[i] # 0X) DO - startupDir[i] := str[i]; - IF str[i] = "/" THEN slp := i END; - INC(i) - END; - startupDir[i] := 0X; - IF slp < 0 THEN - appName := startupDir; - p := NIL; - p := LinLibc.getcwd(p, 0); - startupDir := p$; - LinLibc.free(SYSTEM.VAL(LinLibc.PtrVoid, p)); - i := 0; - WHILE startupDir[i] # 0X DO INC(i) END; - startupLen := i; - ELSE - i := slp + 1; - WHILE startupDir[i] # 0X DO appName[i - slp - 1] := startupDir[i]; INC(i) END; - startupDir[slp] := 0X; - startupLen := slp; - END; - dir.startup := NewLocator(startupDir); - dir.startup.rootLen := 0; -(* - p := NIL; - p := LinLibc.getcwd(p, 0); - startupDir := p$; LinLibc.free(SYSTEM.VAL(LinLibc.PtrVoid, p)); - dir.startup := NewLocator(startupDir); - dir.startup.rootLen := 0; i := 0; - WHILE startupDir[i] # 0X DO INC(i) END; - startupLen := i; - str := Kernel.cmdLine$; -*) -(* - i := 0; - WHILE (str[i] # " ") & (str[i] # 0X) DO appName[i] := str[i]; INC(i) END; - appName[i] := 0X; -*) - i := 0; res := 1; - REPEAT - GetName(str, i, path, opt); - IF opt = "/USE" THEN - GetName(str, i, path, opt); - Stat(path, buf, res); - IF res =ok THEN - ModeToAttr(buf.st_mode, attr, isDir); - IF isDir THEN res := ok ELSE res := invalidName END - END - END - UNTIL (res = 0) OR (str[i] < " "); - IF serverVersion & (res = 0) THEN - i := 0; WHILE path[i] # 0X DO INC(i) END; - IF (path[i-1] = "/") OR (path[i-1] = "\") THEN DEC(i); path[i] := 0X END; - dir.startup := NewLocator(path); - dir.startup.rootLen := SHORT(i) - END; - dir.temp := NewLocator(LinLibc.P_tmpdir); - Files.SetDir(dir) - END Init; -*) - - PROCEDURE Init; - CONST bbServerDir = "BB_PRIMARY_DIR"; bbWorkDir = "BB_SECONDARY_DIR"; - VAR res: INTEGER; attr: SET; p: LinLibc.PtrSTR; - buf: LinLibc.stat_t; isDir, def1: BOOLEAN; - ok1: BOOLEAN; fname: FullName; - BEGIN - InitConv; - - wildcard := "*"; NEW(dir); - - p := LinLibc.getenv(bbServerDir); (* p = NIL -> undefined *) - def1 := FALSE; - IF p # NIL THEN - Long(p$, fname, ok1); - IF ok1 THEN - Stat(fname, buf, res); - IF res = ok THEN - ModeToAttr(buf.st_mode, attr, isDir); - def1 := isDir - END - END; - IF ~def1 THEN Msg("HostFiles: Value of " + bbServerDir + " isn't directory, using cwd") END - END; - IF ~def1 THEN - p := NIL; - p := LinLibc.getcwd(p, 0); - Long(p$, fname, ok1); - IF ~ok1 THEN fname := "." END; - LinLibc.free(SYSTEM.VAL(LinLibc.PtrVoid, p)) - END; - startupDir := fname; startupLen := LEN(startupDir$); - dir.startup := NewLocator(startupDir); - dir.startup.rootLen := 0; - - p := LinLibc.getenv(bbWorkDir); (* p = NIL -> undefined *) - IF def1 & (p # NIL) THEN - Long(p$, fname, ok1); - IF ok1 THEN - Stat(fname, buf, res); - ok1 := res = ok; - IF ok1 THEN - ModeToAttr(buf.st_mode, attr, isDir); - ok1 := isDir - END - END; - IF ~serverVersion THEN - (* - *) - ELSIF ok1 THEN - dir.startup := NewLocator(fname); dir.startup.rootLen := LEN(fname$) - ELSE - Msg("HostFiles: Value of " + bbWorkDir + " isn't directory, server configuration isn't enabled") - END - END; - - dir.temp := NewLocator(LinLibc.P_tmpdir); - Files.SetDir(dir) - END Init; - -BEGIN - Init -CLOSE - CloseConv -END HostFiles. diff --git a/new/_Linux_/libBB.so b/new/_Linux_/libBB.so index 3fff21a3cc86920726c444de1d60d2295516b457..45d34c390cd2b9c0e7ab9099279ce466c097e93b 100644 GIT binary patch delta 122 zcmbQUk#){S)(w$!nU0^?96h(wjQb8dH-i9!I0F*{=jQj9mH3#hNN*N?G?NusVxpty z<}=S@S(x@c+^qfPr2>*1*LHbc#(8W^U(RjcFU)w814)VpsBQ9x9W2}T$S^*z1^}qW BCV&6{ delta 103 zcmbQUk#){S)(w$!nfgy}j-K0T#(JHdl|gc%qxhyPf_zMSq&5pbn#l?il;3>ec_a%{ s--FHCZ(b_EM8&ro@G|zYG2J`6eZMf{O%9m2^yCjaShnwxVSHc>0OnRE8~^|S diff --git a/new/_Linux_/libBB0.so b/new/_Linux_/libBB0.so index 8702c824e848a84b06657633edac2a350ef2465f..af998b7729d54b5fc1b19df68d087ff7f78f0247 100644 GIT binary patch literal 1452536 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